Java tutorial
/* * Copyright 2008 JRimum Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by * applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS * OF ANY KIND, either express or implied. See the License for the specific * language governing permissions and limitations under the License. * * Created at: 30/03/2008 - 18:17:40 * * ================================================================================ * * Direitos autorais 2008 JRimum Project * * Licenciado sob a Licena Apache, Verso 2.0 ("LICENA"); voc no pode usar * esse arquivo exceto em conformidade com a esta LICENA. Voc pode obter uma * cpia desta LICENA em http://www.apache.org/licenses/LICENSE-2.0 A menos que * haja exigncia legal ou acordo por escrito, a distribuio de software sob * esta LICENA se dar COMO EST??, SEM GARANTIAS OU CONDIES DE QUALQUER * TIPO, sejam expressas ou tcitas. Veja a LICENA para a redao especfica a * reger permisses e limitaes sob esta LICENA. * * Criado em: 30/03/2008 - 18:17:40 * */ package br.com.nordestefomento.jrimum.utilix; import static br.com.nordestefomento.jrimum.utilix.ObjectUtil.isNull; import java.io.Serializable; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import org.apache.commons.lang.time.DateUtils; /** * <p> * Servios utilitrios do universo bancrio, como por exemplo calcular o fator * de vencimento de boletos.</code> * </p> * * @author <a href="http://gilmatryx.googlepages.com/">Gilmar P.S.L</a> * @author Misael Barreto * @author Rmulo Augusto * @author <a href="http://www.nordeste-fomento.com.br">Nordeste Fomento * Mercantil</a> * * @since 0.2 * * @version 0.2 */ public class BancoUtil implements Serializable { /** * */ private static final long serialVersionUID = -9041865935492749542L; /** * <p> * Data base para o clculo do fator de vencimento fixada em 07/10/1997 pela * FEBRABAN. * </p> */ private static final Date DATA_BASE_DO_FATOR_DE_VENCIMENTO = new GregorianCalendar(1997, Calendar.OCTOBER, 7) .getTime(); /** *<p> * Data mxima alcanada pelo fator de vencimento com base fixada em * 07/10/1997. * </p> */ private static final Date DATA_LIMITE_DO_FATOR_DE_VENCIMENTO = new GregorianCalendar(2025, Calendar.FEBRUARY, 21).getTime(); /** * <p> * Calcula o fator de vencimento a partir da subtrao entre a DATA DE * VENCIMENTO de um ttulo e a DATA BASE fixada em 07/10/1997. * </p> * * <p> * O fator de vencimento nada mais que um referencial numrico de 4 * dgitos que representa a quantidade de dias decorridos desde a data base * (07/10/1997) at a data de vencimento do ttulo. Ou seja, a diferena em * dias entre duas datas. * </p> * * <p> * Exemplos: * </p> * <ul type="circule"> <li>07/10/1997 (Fator = 0);</li> <li>03/07/2000 * (Fator = 1000);</li> <li>05/07/2000 (Fator = 1002);</li> <li>01/05/2002 * (Fator = 1667);</li> <li>21/02/2025 (Fator = 9999).</li> </ul> * * <p> * Funcionamento: * </p> * * <ul type="square"> <li>Caso a data de vencimento seja anterior a data * base (Teoricamente fator negativo), uma exceo do tipo * IllegalArgumentException ser lanada.</li> <li>A data limite para o * clculo do fator de vencimento 21/02/2025 (Fator de vencimento = 9999). * Caso a data de vencimento seja posterior a data limite, uma exceo do * tipo IllegalArgumentException ser lanada.</li> </ul> * * <p> * <strong>ATENO</strong>, esse clculo se refere a ttulos em cobrana, * ou melhor: BOLETOS. Desta forma, lembramos que a DATA BASE uma norma da * FEBRABAN. Essa norma diz que todos os boletos emitidos a partir de 1 de * setembro de 2000 (primeiro dia til = 03/07/2000 - SEGUNDA) devem seguir * esta regra de clculo para compor a informao de vencimento no cdigo de * barras. Portanto, boletos no padro FEBRABAN quando capturados por * sistemas da rede bancria permitem que se possa realizar a operao * inversa, ou seja, adicionar data base o fator de vencimento capturado. * Obtendo ento a data de vencimento deste boleto. * </p> * * @param dataVencimento * data de vencimento de um ttulo * @return fator de vencimento calculado * @throws IllegalArgumentException * * @since 0.2 */ public static int calculceFatorDeVencimento(Date dataVencimento) throws IllegalArgumentException { Date dataVencTruncada = null; int fator; if (isNull(dataVencimento)) { throw new IllegalArgumentException( "Impossvel realizar o clculo do fator" + " de vencimento de uma data nula."); } else { dataVencTruncada = DateUtils.truncate(dataVencimento, Calendar.DATE); if (dataVencTruncada.before(DATA_BASE_DO_FATOR_DE_VENCIMENTO) || dataVencTruncada.after(DATA_LIMITE_DO_FATOR_DE_VENCIMENTO)) { throw new IllegalArgumentException( "Para o clculo do fator de" + " vencimento se faz necessrio informar uma data entre" + " " + DateUtil.FORMAT_DD_MM_YYYY.format(DATA_BASE_DO_FATOR_DE_VENCIMENTO) + " e " + DateUtil.FORMAT_DD_MM_YYYY.format(DATA_LIMITE_DO_FATOR_DE_VENCIMENTO)); } else { fator = (int) DateUtil.calculeDiferencaEmDias(DATA_BASE_DO_FATOR_DE_VENCIMENTO, dataVencTruncada); } } return fator; } }