From f18412b1eec92353742e64f24fda8027a03c0cb2 Mon Sep 17 00:00:00 2001 From: Braully Silva Date: Mon, 20 Jun 2022 15:34:30 -0300 Subject: [PATCH] =?UTF-8?q?Corre=C3=A7=C3=B5es=20javadoc.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/jrimum/JRimumException.java | 4 +- .../org/jrimum/bopepo/BancosSuportados.java | 954 +++--- .../java/org/jrimum/bopepo/BoletoUtil.java | 1786 +++++------ .../org/jrimum/bopepo/LinhaDigitavel.java | 28 +- .../bopepo/campolivre/AbstractCampoLivre.java | 1584 +++++----- .../campolivre/CLBancoDoNordesteDoBrasil.java | 436 +-- .../jrimum/bopepo/campolivre/CLBancoReal.java | 388 +-- .../jrimum/bopepo/campolivre/CLBanestes.java | 2 +- ...ixaEconomicaFederalSICOBNossoNumero10.java | 434 +-- ...ixaEconomicaFederalSICOBNossoNumero14.java | 444 +-- .../bopepo/campolivre/CLItauPadrao.java | 594 ++-- .../campolivre/CLMercantilDoBrasil.java | 322 +- .../CLUnibancoCobrancaNaoRegistrada.java | 322 +- .../CLUnibancoCobrancaRegistrada.java | 384 +-- .../jrimum/bopepo/pdf/PdfDateConverter.java | 326 +- .../org/jrimum/bopepo/pdf/PdfDocInfo.java | 820 ++--- .../bopepo/view/BoletoInfoViewCecred.java | 4 +- .../bopepo/view/BoletoInfoViewSicredi.java | 16 +- .../org/jrimum/bopepo/view/BoletoViewer.java | 2698 ++++++++--------- .../org/jrimum/bopepo/view/GuiaViewer.java | 881 +++--- .../bopepo/view/PdfViewerMultiProcessor.java | 528 ++-- .../java/org/jrimum/domkee/banco/Agencia.java | 236 +- .../java/org/jrimum/domkee/banco/Banco.java | 886 +++--- .../org/jrimum/domkee/banco/Contribuinte.java | 148 +- .../java/org/jrimum/domkee/banco/IBanco.java | 244 +- .../domkee/banco/IEntidadeDeCobranca.java | 110 +- .../jrimum/domkee/banco/OrgaoRecebedor.java | 259 +- .../jrimum/domkee/banco/TipoDeCobranca.java | 132 +- .../java/org/jrimum/domkee/banco/Titulo.java | 2 +- src/main/java/org/jrimum/overview.html | 42 +- src/main/java/org/jrimum/texgit/Filler.java | 864 +++--- src/main/java/org/jrimum/texgit/IFiller.java | 2 +- src/main/java/org/jrimum/texgit/IFixed.java | 104 +- .../java/org/jrimum/utilix/BancoUtil.java | 300 +- .../java/org/jrimum/utilix/DateFormat.java | 494 +-- src/main/java/org/jrimum/utilix/DateUtil.java | 456 +-- src/main/java/org/jrimum/utilix/Dates.java | 562 ++-- .../java/org/jrimum/utilix/DecimalFormat.java | 258 +- .../java/org/jrimum/utilix/StringUtil.java | 6 +- src/main/java/org/jrimum/utilix/Strings.java | 4 +- .../jrimum/vallia/AbstractCPRFValidator.java | 724 ++--- .../jrimum/vallia/BoletoCodigoDeBarrasDV.java | 240 +- .../jrimum/vallia/BoletoLinhaDigitavelDV.java | 300 +- src/main/java/org/jrimum/vallia/CNPJDV.java | 398 +-- src/main/java/org/jrimum/vallia/CPFDV.java | 384 +-- .../jrimum/vallia/GuiaCodigoDeBarrasDV.java | 200 +- .../jrimum/vallia/GuiaLinhaDigitavelDV.java | 214 +- src/main/java/org/jrimum/vallia/Modulo.java | 1044 +++---- .../org/jrimum/bopepo/TestCodigoDeBarras.java | 280 +- .../TestCLUnibancoCobrancaNaoRegistrada.java | 280 +- .../TestCLUnibancoCobrancaRegistrada.java | 292 +- 51 files changed, 11207 insertions(+), 11213 deletions(-) diff --git a/src/main/java/org/jrimum/JRimumException.java b/src/main/java/org/jrimum/JRimumException.java index 08b42c0a..f5181018 100644 --- a/src/main/java/org/jrimum/JRimumException.java +++ b/src/main/java/org/jrimum/JRimumException.java @@ -31,12 +31,12 @@ /** *

* Classe que representa um problema ocorrido dentro de qualquer parte (pacote) - * do projeto JRimum + * do projeto JRimum *

* * *

- * Qualquer exceção que ocorra dentro do componente JRimum é sempre + * Qualquer exceção que ocorra dentro do componente JRimum é sempre * wrapped por uma instância de uma JRimumException. *

* diff --git a/src/main/java/org/jrimum/bopepo/BancosSuportados.java b/src/main/java/org/jrimum/bopepo/BancosSuportados.java index a1e43b6b..e8a2d1db 100644 --- a/src/main/java/org/jrimum/bopepo/BancosSuportados.java +++ b/src/main/java/org/jrimum/bopepo/BancosSuportados.java @@ -1,477 +1,477 @@ -/* - * 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 - 19:08:39 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 19:08:39 - * - */ -package org.jrimum.bopepo; - -import java.util.HashMap; -import java.util.Map; - -import org.jrimum.domkee.pessoa.CNPJ; -import org.jrimum.domkee.banco.Banco; -import org.jrimum.domkee.banco.CodigoDeCompensacaoBACEN; - -/** - *

- * Enumeração dos bancos segundo o supervisão da BACEN em - * funcionamento no país e que possuem pelo menos uma implementação de - * ICampoLivre. - *

- * - *

- * A partir de um EnumBanco específico, como o - * BANCO_DO_BRASIL, você pode solicitar um nova instância de um - * banco representado por IBanco ou utilizar as costantes - * enumeradas e não enumeradas como melhor for o caso. - *

- * - *
EXEMPLOS:
- * - *

- * Para uma nova instância do Banco do Brasil faça:
- *
- * - * IBanco bancoDoBrasil = EnumBancos.BANCO_DO_BRASIL.newInstance(); - * - *

- * - *

- * Para utilizar somento o código de compensação:
- *
- * - * EnumBancos.BANCO_DO_BRASIL.getCodigoDeCompensacao(); - * - *

- * - *

- * Para saber se um banco é suportado pelo componete, veja a lista antes - * (LinkParaLista) ou faça:
- *
- * - * EnumBancos.isSuportado(banco.getCodigoDeCompensacao) - * - *

- * - * @author Gilmar P.S.L. - * @author Misael Barreto - * @author Rômulo Augusto - * @author Samuel Valério - * @author Lukas - * Antunes - Colaborador com o banco Intermedium (077) - * @author Fernando Dias - - * Colaborador com o banco Rural (453) - * @author Paulo Porto - Colaborador com o - * Banco do Nordeste do Brasil (004). - * @author Fabiano Carrijo - - * Colaborador com o Banco Citibank (756). - * @author Douglas Ramiro - - * Colaborador com o Banco de Brasília (070). - * - * @see org.jrimum.bopepo.campolivre.CampoLivre - * @see org.jrimum.domkee.banco.Banco - * - * @since 0.2 - * - * @version 0.2 - */ -public enum BancosSuportados { - - /* - * <=====================================================================> - * Observe que toda a enumeração segue a ORDEM dos códigos de compensação. - * Caso queira modificar alguma coisa, leve sempre em consideração essa - * ORDEM. - * <=====================================================================> - */ - /** - * Tipo enumerado que representa o Banco do Brasil, código - * de compensação 001 site. - * - * @since 0.2 - */ - BANCO_DO_BRASIL("001", "00000000000191", "BANCO DO BRASIL S.A.", "Banco do Brasil - Banco Múltiplo"), - /** - * Tipo enumerado que representa o Banco do Nordeste do - * Brasil, código de compensação 004 - * (site). - * - * @since 0.2-Helio - */ - BANCO_DO_NORDESTE_DO_BRASIL("004", "07237373000120", "BANCO DO NORDESTE DO BRASIL S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Banestes, Banco do Estado do - * Espírito Santo, código de compensação - * 021 - * - * site. - * - * @since 0.2 - */ - BANCO_DO_ESTADO_DO_ESPIRITO_SANTO("021", "28127603000178", "BANCO DO ESTADO DO ESPIRITO SANTO S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Santander Banco Santander - * (Brasil) S. A., código de compensação 033 - * site. - * - * @since 0.2 - */ - BANCO_SANTANDER("033", "90400888000142", "BANCO SANTANDER (BRASIL) S. A.", "Banco Mútiplo"), - /** - * Tipo enumerado que representa o Banrisul, Banco do Estado do Rio - * Grande do Sul, código de compensação - * 041 - * site. - * - * @since 0.2 - */ - BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL("041", "92702067000196", "BANCO DO ESTADO DO RIO GRANDE DO SUL S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Banco BRB - Banco de - * Brasília, código de compensação 070 site. - * - * @since 0.2 - */ - BANCO_DE_BRASILIA("070", "00000208000100", "BRB- Banco de Brasília S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o BANISA, Banco - * Intermedium, código de compensação - * 077 - * - * site. - * - * @since 0.2 - */ - BANCO_INTEMEDIUM("077", "00416968000101", "BANCO INTERMEDIUM S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o CECRED, Cooperativa Central de - * Crédito Urbano, código de compensação - * 085 - * site. - * - * @since 0.2 - */ - CECRED("085", "05.463.212/0001-29", "COOPERATIVA CENTRAL DE CRÉDITO URBANO - CECRED", "Cooperativa de Crédito"), - /** - * Tipo enumerado que representa o Banco Caixa Econômica - * Federal, código de compensação 104 site. - * - * @since 0.2 - */ - CAIXA_ECONOMICA_FEDERAL("104", "00360305000104", "CAIXA ECONOMICA FEDERAL", "Caixa Econômica Federal"), - /** - * Tipo enumerado que representa o Banco Bradesco, código - * de compensação 237 site. - * - * @since 0.2 - */ - BANCO_BRADESCO("237", "60746948000112", "BANCO BRADESCO S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Banco Itaú, código de - * compensação 341 site. - * - * @since 0.2 - */ - BANCO_ITAU("341", "60701190000104", "BANCO ITAÚ S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Banco ABN AMRO Real - * (http://www.bancoreal.com.br), - * código de compensação 356.
- *

- * Obs: Os bancos Sudameris e Bandepe - * foram incorporados ao Banco Real, portanto para gerar boletos bancários - * dos bancos citados utilize este tipo enumerado. - *

- * - * @since 0.2 - */ - BANCO_ABN_AMRO_REAL("356", "33066408000115", "BANCO ABN AMRO REAL S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Banco Mercantil do - * Brasil - * (http://www.mercantildobrasil.com.br), - * código de compensação 389. - * - * @since 0.2 - */ - MERCANTIL_DO_BRASIL("389", "17184037000110", "BANCO MERCANTIL DO BRASIL S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o HSBC, código de - * compensação 399 site. - * - * @since 0.2 - */ - HSBC("399", "01701201000189", "HSBC BANK BRASIL S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Unibanco, código de - * compensação 409 site. - * - * @since 0.2 - */ - UNIBANCO("409", "33700394000140", "UNIBANCO-UNIAO DE BANCOS BRASILEIROS S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Unibanco, código de - * compensação 422 site. - * - * @since 0.2 - */ - BANCO_SAFRA("422", "58160789000128", "BANCO SAFRA S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Citibank, código de - * compensação 756 site. - * - * @since 0.2 - */ - CITIBANK("745", "33479023000180", "BANCO CITIBANK S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Banco Sicredi, código de - * compensação 748 site. - * - * @since 0.2 - */ - BANCO_SICREDI("748", "01181521000155", "BANCO COOPERATIVO SICREDI S.A.", "Banco Mútiplo Cooperativo"), - /** - * Tipo enumerado que representa o Banco Rural, código de - * compensação 453 site. - * - * @since 0.2 - */ - BANCO_RURAL("453", "58160789000128", "BANCO RURAL S.A.", "Banco Múltiplo"), - /** - * Tipo enumerado que representa o Bancoob, código de - * compensação 756 site. - * - * @since 0.2 - */ - BANCOOB("756", "02038232000164", "BANCO COOPERATIVO DO BRASIL S.A. - BANCOOB", "Banco Comercial Cooperativo"); - - /** - * Singleton Map para pesquisa por bancos suportados no - * componente. - * - * @since 0.2 - */ - public static final Map suportados = new HashMap( - BancosSuportados.values().length); - - static { - - suportados.put(BANCO_DO_BRASIL.codigoDeCompensacaoBACEN, BANCO_DO_BRASIL); - suportados.put(BANCO_DO_NORDESTE_DO_BRASIL.codigoDeCompensacaoBACEN, BANCO_DO_NORDESTE_DO_BRASIL); - suportados.put(CAIXA_ECONOMICA_FEDERAL.codigoDeCompensacaoBACEN, CAIXA_ECONOMICA_FEDERAL); - suportados.put(BANCO_BRADESCO.codigoDeCompensacaoBACEN, BANCO_BRADESCO); - suportados.put(BANCO_ABN_AMRO_REAL.codigoDeCompensacaoBACEN, BANCO_ABN_AMRO_REAL); - suportados.put(UNIBANCO.codigoDeCompensacaoBACEN, UNIBANCO); - suportados.put(HSBC.codigoDeCompensacaoBACEN, HSBC); - suportados.put(BANCO_ITAU.codigoDeCompensacaoBACEN, BANCO_ITAU); - suportados.put(BANCO_SAFRA.codigoDeCompensacaoBACEN, BANCO_SAFRA); - suportados.put(BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL.codigoDeCompensacaoBACEN, BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL); - suportados.put(MERCANTIL_DO_BRASIL.codigoDeCompensacaoBACEN, MERCANTIL_DO_BRASIL); - suportados.put(BANCO_DO_ESTADO_DO_ESPIRITO_SANTO.codigoDeCompensacaoBACEN, BANCO_DO_ESTADO_DO_ESPIRITO_SANTO); - suportados.put(BANCO_RURAL.codigoDeCompensacaoBACEN, BANCO_RURAL); - suportados.put(BANCO_SANTANDER.codigoDeCompensacaoBACEN, BANCO_SANTANDER); - suportados.put(BANCO_INTEMEDIUM.codigoDeCompensacaoBACEN, BANCO_INTEMEDIUM); - suportados.put(BANCO_SICREDI.codigoDeCompensacaoBACEN, BANCO_SICREDI); - suportados.put(BANCOOB.codigoDeCompensacaoBACEN, BANCOOB); - suportados.put(CITIBANK.codigoDeCompensacaoBACEN, CITIBANK); - suportados.put(BANCO_DE_BRASILIA.codigoDeCompensacaoBACEN, BANCO_DE_BRASILIA); - suportados.put(CECRED.codigoDeCompensacaoBACEN, CECRED); - } - - /** - * Códigos de instituições bancárias na compensação - COMPE BACEN. - * - * @since 0.2 - */ - private String codigoDeCompensacaoBACEN; - - /** - * CNPJ registrado na - * BACEN. - * - * @since 0.2 - */ - private String cNPJ; - - /** - * Nome da instituição registrado na BACEN. - * - * @since 0.2 - */ - private String instituicao; - - /** - * Segmento bancário da instituição registrado na BACEN. - * - * @since 0.2 - */ - private String segmento; - - /** - *

- * Construtor naturalmente private responsável por criar uma - * única instância para cada banco. - *

- * - * @param codigoDeCompensacaoBACEN - * @param cNPJ - * @param instituicao - * @param segmento - * - * @see java.lang.Enum - * @see Enum - * Guide - * - * @since 0.2 - * - */ - private BancosSuportados(String codigoDeCompensacaoBACEN, String cnpj, - String instituicao, String segmento) { - - this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; - this.cNPJ = cnpj; - this.instituicao = instituicao; - this.segmento = segmento; - } - - /** - *

- * Verifica se exite suporte (implementação) de "Campos Livres" para o banco - * representado pelo codigoDeCompensacao. - *

- * - * @param codigoDeCompensacao - * @return verdadeiro se existe implementação para o banco em questão. - * - * @since 0.2 - */ - public static boolean isSuportado(String codigoDeCompensacao) { - return suportados.containsKey(codigoDeCompensacao); - } - - /** - *

- * Cria uma instância para o banco representado pelo tipo enumerado. - *

- *

- * Cada instância retornada por este método contém: - *

    - *
  • Código de componsação
  • - *
  • Nome da instituição
  • - *
  • CNPJ da instituição
  • - *
  • Segmento da instituição bancária
  • - *
- *

- * - * @return Uma instância do respectivo banco. - * - * @see - * org.jrimum.domkee.financeiro.banco.febraban.Banco#Banco(CodigoDeCompensacaoBACEN, - * String, CNPJ, String) - * @see Bancos supervisionados - * pela BACEN - * - * @since 0.2 - */ - public Banco create() { - return new Banco(new CodigoDeCompensacaoBACEN(this.codigoDeCompensacaoBACEN), this.instituicao, new CNPJ( - this.cNPJ), this.segmento); - } - - /** - * @return the codigoDeCompensacaoBACEN - * - * @since 0.2 - */ - public String getCodigoDeCompensacao() { - return codigoDeCompensacaoBACEN; - } - - /** - * @return the cNPJ - * - * @since 0.2 - */ - public String getCNPJ() { - return cNPJ; - } - - /** - * @return the instituicao - * - * @since 0.2 - */ - public String getInstituicao() { - return instituicao; - } - - /** - * @return the segmento - * - * @since 0.2 - */ - public String getSegmento() { - return segmento; - } - - private static final Map CACHE_INSTANCE = new HashMap<>(); - - public static Banco instancia(String numero) { - Banco banco = CACHE_INSTANCE.get(numero); - if (banco == null) { - BancosSuportados suportado = suportados.get(numero); - if (suportado != null) { - banco = suportado.create(); - } - CACHE_INSTANCE.put(numero, banco); - } - return banco; - } - -} +/* + * 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 - 19:08:39 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 19:08:39 + * + */ +package org.jrimum.bopepo; + +import java.util.HashMap; +import java.util.Map; + +import org.jrimum.domkee.pessoa.CNPJ; +import org.jrimum.domkee.banco.Banco; +import org.jrimum.domkee.banco.CodigoDeCompensacaoBACEN; + +/** + *

+ * Enumeração dos bancos segundo o supervisão da BACEN em + * funcionamento no país e que possuem pelo menos uma implementação de + * ICampoLivre. + *

+ * + *

+ * A partir de um EnumBanco específico, como o + * BANCO_DO_BRASIL, você pode solicitar um nova instância de um + * banco representado por IBanco ou utilizar as costantes + * enumeradas e não enumeradas como melhor for o caso. + *

+ * + *
EXEMPLOS:
+ * + *

+ * Para uma nova instância do Banco do Brasil faça: + * + * + * IBanco bancoDoBrasil = EnumBancos.BANCO_DO_BRASIL.newInstance(); + * + *

+ * + *

+ * Para utilizar somento o código de compensação: + * + * + * EnumBancos.BANCO_DO_BRASIL.getCodigoDeCompensacao(); + * + *

+ * + *

+ * Para saber se um banco é suportado pelo componete, veja a lista antes + * (LinkParaLista) ou faça: + * + * + * EnumBancos.isSuportado(banco.getCodigoDeCompensacao) + * + *

+ * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério + * @author Lukas + * Antunes - Colaborador com o banco Intermedium (077) + * @author Fernando Dias - + * Colaborador com o banco Rural (453) + * @author Paulo Porto - Colaborador com o + * Banco do Nordeste do Brasil (004). + * @author Fabiano Carrijo - + * Colaborador com o Banco Citibank (756). + * @author Douglas Ramiro - + * Colaborador com o Banco de Brasília (070). + * + * @see org.jrimum.bopepo.campolivre.CampoLivre + * @see org.jrimum.domkee.banco.Banco + * + * @since 0.2 + * + * @version 0.2 + */ +public enum BancosSuportados { + + /* + * <=====================================================================> + * Observe que toda a enumeração segue a ORDEM dos códigos de compensação. + * Caso queira modificar alguma coisa, leve sempre em consideração essa + * ORDEM. + * <=====================================================================> + */ + /** + * Tipo enumerado que representa o Banco do Brasil, código + * de compensação 001 site. + * + * @since 0.2 + */ + BANCO_DO_BRASIL("001", "00000000000191", "BANCO DO BRASIL S.A.", "Banco do Brasil - Banco Múltiplo"), + /** + * Tipo enumerado que representa o Banco do Nordeste do + * Brasil, código de compensação 004 + * (site). + * + * @since 0.2-Helio + */ + BANCO_DO_NORDESTE_DO_BRASIL("004", "07237373000120", "BANCO DO NORDESTE DO BRASIL S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Banestes, Banco do Estado do + * Espírito Santo, código de compensação + * 021 + * + * site. + * + * @since 0.2 + */ + BANCO_DO_ESTADO_DO_ESPIRITO_SANTO("021", "28127603000178", "BANCO DO ESTADO DO ESPIRITO SANTO S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Santander Banco Santander + * (Brasil) S. A., código de compensação 033 + * site. + * + * @since 0.2 + */ + BANCO_SANTANDER("033", "90400888000142", "BANCO SANTANDER (BRASIL) S. A.", "Banco Mútiplo"), + /** + * Tipo enumerado que representa o Banrisul, Banco do Estado do Rio + * Grande do Sul, código de compensação + * 041 + * site. + * + * @since 0.2 + */ + BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL("041", "92702067000196", "BANCO DO ESTADO DO RIO GRANDE DO SUL S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Banco BRB - Banco de + * Brasília, código de compensação 070 site. + * + * @since 0.2 + */ + BANCO_DE_BRASILIA("070", "00000208000100", "BRB- Banco de Brasília S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o BANISA, Banco + * Intermedium, código de compensação + * 077 + * + * site. + * + * @since 0.2 + */ + BANCO_INTEMEDIUM("077", "00416968000101", "BANCO INTERMEDIUM S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o CECRED, Cooperativa Central de + * Crédito Urbano, código de compensação + * 085 + * site. + * + * @since 0.2 + */ + CECRED("085", "05.463.212/0001-29", "COOPERATIVA CENTRAL DE CRÉDITO URBANO - CECRED", "Cooperativa de Crédito"), + /** + * Tipo enumerado que representa o Banco Caixa Econômica + * Federal, código de compensação 104 site. + * + * @since 0.2 + */ + CAIXA_ECONOMICA_FEDERAL("104", "00360305000104", "CAIXA ECONOMICA FEDERAL", "Caixa Econômica Federal"), + /** + * Tipo enumerado que representa o Banco Bradesco, código + * de compensação 237 + * site. + * + * @since 0.2 + */ + BANCO_BRADESCO("237", "60746948000112", "BANCO BRADESCO S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Banco Itaú, código de + * compensação 341 + * site. + * + * @since 0.2 + */ + BANCO_ITAU("341", "60701190000104", "BANCO ITAÚ S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Banco ABN AMRO Real + * (http://www.bancoreal.com.br), + * código de compensação 356.
+ *

+ * Obs: Os bancos Sudameris e Bandepe + * foram incorporados ao Banco Real, portanto para gerar boletos bancários + * dos bancos citados utilize este tipo enumerado. + *

+ * + * @since 0.2 + */ + BANCO_ABN_AMRO_REAL("356", "33066408000115", "BANCO ABN AMRO REAL S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Banco Mercantil do + * Brasil + * (http://www.mercantildobrasil.com.br), + * código de compensação 389. + * + * @since 0.2 + */ + MERCANTIL_DO_BRASIL("389", "17184037000110", "BANCO MERCANTIL DO BRASIL S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o HSBC, código de + * compensação 399 site. + * + * @since 0.2 + */ + HSBC("399", "01701201000189", "HSBC BANK BRASIL S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Unibanco, código de + * compensação 409 site. + * + * @since 0.2 + */ + UNIBANCO("409", "33700394000140", "UNIBANCO-UNIAO DE BANCOS BRASILEIROS S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Unibanco, código de + * compensação 422 site. + * + * @since 0.2 + */ + BANCO_SAFRA("422", "58160789000128", "BANCO SAFRA S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Citibank, código de + * compensação 756 site. + * + * @since 0.2 + */ + CITIBANK("745", "33479023000180", "BANCO CITIBANK S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Banco Sicredi, código de + * compensação 748 site. + * + * @since 0.2 + */ + BANCO_SICREDI("748", "01181521000155", "BANCO COOPERATIVO SICREDI S.A.", "Banco Mútiplo Cooperativo"), + /** + * Tipo enumerado que representa o Banco Rural, código de + * compensação 453 site. + * + * @since 0.2 + */ + BANCO_RURAL("453", "58160789000128", "BANCO RURAL S.A.", "Banco Múltiplo"), + /** + * Tipo enumerado que representa o Bancoob, código de + * compensação 756 site. + * + * @since 0.2 + */ + BANCOOB("756", "02038232000164", "BANCO COOPERATIVO DO BRASIL S.A. - BANCOOB", "Banco Comercial Cooperativo"); + + /** + * Singleton Map para pesquisa por bancos suportados no + * componente. + * + * @since 0.2 + */ + public static final Map suportados = new HashMap( + BancosSuportados.values().length); + + static { + + suportados.put(BANCO_DO_BRASIL.codigoDeCompensacaoBACEN, BANCO_DO_BRASIL); + suportados.put(BANCO_DO_NORDESTE_DO_BRASIL.codigoDeCompensacaoBACEN, BANCO_DO_NORDESTE_DO_BRASIL); + suportados.put(CAIXA_ECONOMICA_FEDERAL.codigoDeCompensacaoBACEN, CAIXA_ECONOMICA_FEDERAL); + suportados.put(BANCO_BRADESCO.codigoDeCompensacaoBACEN, BANCO_BRADESCO); + suportados.put(BANCO_ABN_AMRO_REAL.codigoDeCompensacaoBACEN, BANCO_ABN_AMRO_REAL); + suportados.put(UNIBANCO.codigoDeCompensacaoBACEN, UNIBANCO); + suportados.put(HSBC.codigoDeCompensacaoBACEN, HSBC); + suportados.put(BANCO_ITAU.codigoDeCompensacaoBACEN, BANCO_ITAU); + suportados.put(BANCO_SAFRA.codigoDeCompensacaoBACEN, BANCO_SAFRA); + suportados.put(BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL.codigoDeCompensacaoBACEN, BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL); + suportados.put(MERCANTIL_DO_BRASIL.codigoDeCompensacaoBACEN, MERCANTIL_DO_BRASIL); + suportados.put(BANCO_DO_ESTADO_DO_ESPIRITO_SANTO.codigoDeCompensacaoBACEN, BANCO_DO_ESTADO_DO_ESPIRITO_SANTO); + suportados.put(BANCO_RURAL.codigoDeCompensacaoBACEN, BANCO_RURAL); + suportados.put(BANCO_SANTANDER.codigoDeCompensacaoBACEN, BANCO_SANTANDER); + suportados.put(BANCO_INTEMEDIUM.codigoDeCompensacaoBACEN, BANCO_INTEMEDIUM); + suportados.put(BANCO_SICREDI.codigoDeCompensacaoBACEN, BANCO_SICREDI); + suportados.put(BANCOOB.codigoDeCompensacaoBACEN, BANCOOB); + suportados.put(CITIBANK.codigoDeCompensacaoBACEN, CITIBANK); + suportados.put(BANCO_DE_BRASILIA.codigoDeCompensacaoBACEN, BANCO_DE_BRASILIA); + suportados.put(CECRED.codigoDeCompensacaoBACEN, CECRED); + } + + /** + * Códigos de instituições bancárias na compensação - COMPE BACEN. + * + * @since 0.2 + */ + private String codigoDeCompensacaoBACEN; + + /** + * CNPJ registrado na + * BACEN. + * + * @since 0.2 + */ + private String cNPJ; + + /** + * Nome da instituição registrado na BACEN. + * + * @since 0.2 + */ + private String instituicao; + + /** + * Segmento bancário da instituição registrado na BACEN. + * + * @since 0.2 + */ + private String segmento; + + /** + *

+ * Construtor naturalmente private responsável por criar uma + * única instância para cada banco. + *

+ * + * @param codigoDeCompensacaoBACEN + * @param cNPJ + * @param instituicao + * @param segmento + * + * @see java.lang.Enum + * @see Enum + * Guide + * + * @since 0.2 + * + */ + private BancosSuportados(String codigoDeCompensacaoBACEN, String cnpj, + String instituicao, String segmento) { + + this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; + this.cNPJ = cnpj; + this.instituicao = instituicao; + this.segmento = segmento; + } + + /** + *

+ * Verifica se exite suporte (implementação) de "Campos Livres" para o banco + * representado pelo codigoDeCompensacao. + *

+ * + * @param codigoDeCompensacao + * @return verdadeiro se existe implementação para o banco em questão. + * + * @since 0.2 + */ + public static boolean isSuportado(String codigoDeCompensacao) { + return suportados.containsKey(codigoDeCompensacao); + } + + /** + *

+ * Cria uma instância para o banco representado pelo tipo enumerado. + *

+ *

+ * Cada instância retornada por este método contém: + *

    + *
  • Código de componsação
  • + *
  • Nome da instituição
  • + *
  • CNPJ da instituição
  • + *
  • Segmento da instituição bancária
  • + *
+ *

+ * + * @return Uma instância do respectivo banco. + * + * @see + * org.jrimum.domkee.financeiro.banco.febraban.Banco#Banco(CodigoDeCompensacaoBACEN, + * String, CNPJ, String) + * @see Bancos supervisionados + * pela BACEN + * + * @since 0.2 + */ + public Banco create() { + return new Banco(new CodigoDeCompensacaoBACEN(this.codigoDeCompensacaoBACEN), this.instituicao, new CNPJ( + this.cNPJ), this.segmento); + } + + /** + * @return the codigoDeCompensacaoBACEN + * + * @since 0.2 + */ + public String getCodigoDeCompensacao() { + return codigoDeCompensacaoBACEN; + } + + /** + * @return the cNPJ + * + * @since 0.2 + */ + public String getCNPJ() { + return cNPJ; + } + + /** + * @return the instituicao + * + * @since 0.2 + */ + public String getInstituicao() { + return instituicao; + } + + /** + * @return the segmento + * + * @since 0.2 + */ + public String getSegmento() { + return segmento; + } + + private static final Map CACHE_INSTANCE = new HashMap<>(); + + public static Banco instancia(String numero) { + Banco banco = CACHE_INSTANCE.get(numero); + if (banco == null) { + BancosSuportados suportado = suportados.get(numero); + if (suportado != null) { + banco = suportado.create(); + } + CACHE_INSTANCE.put(numero, banco); + } + return banco; + } + +} diff --git a/src/main/java/org/jrimum/bopepo/BoletoUtil.java b/src/main/java/org/jrimum/bopepo/BoletoUtil.java index ddedd21d..aef828d9 100644 --- a/src/main/java/org/jrimum/bopepo/BoletoUtil.java +++ b/src/main/java/org/jrimum/bopepo/BoletoUtil.java @@ -1,893 +1,893 @@ -/* - * Copyright 2010 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: 27/01/2010 - 00:53:43 - * - * ================================================================================ - * - * Direitos autorais 2010 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Criado em: 27/01/2010 - 00:53:43 - * - */ - - -package org.jrimum.bopepo; - -import static org.apache.commons.lang3.StringUtils.EMPTY; -import static org.apache.commons.lang3.StringUtils.isBlank; -import static org.apache.commons.lang3.StringUtils.isNotBlank; -import static org.apache.commons.lang3.StringUtils.trim; -import static org.jrimum.utilix.Objects.checkNotNull; -import static org.jrimum.utilix.Strings.WHITE_SPACE; - -import org.jrimum.utilix.Exceptions; -import org.jrimum.vallia.BoletoLinhaDigitavelDV; - -/** - *

- * Utilitário para recuperar informações de strings de códigos de barras e - * linhas digitáveis de boletos. - *

- * - * @author Gilmar P.S.L. - * - * @since 0.2 - * - * @version 0.2 - */ -public final class BoletoUtil { - - /* - * Regras REGEX. - */ - private static final String CODIGO_DE_BARRAS_REGEX = "\\d{44}"; - private static final String LINHA_DIGITAVEL_NUMERICA_REGEX = "\\d{47}"; - private static final String LINHA_DIGITAVEL_FORMATADA_REGEX = "\\d{5}\\.\\d{5} \\d{5}\\.\\d{6} \\d{5}\\.\\d{6} \\d{1} \\d{14}"; - /* - * Mensagens. - */ - private static final String MSG_CODIGO_DE_BARRAS = "Código de barras inválido!"; - private static final String MSG_LINHA_INVALIDA = "Linha digitável inválida!"; - private static final String MSG_STR_VAZIA = "String vazia [ \"%s\" ] tamanho [ %d ]."; - private static final String MSG_NAO_FORMATADA = "String formatada [ \"%s\" ] de tamanho [ %d ] está fora do padrão [ \"ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd\" ] tamanho = 54."; - private static final String MSG_STR_NUMERICA = "String numérica [ \"%s\" ] de tamanho [ %d ] está fora do padrão [ \"ddddddddddddddddddddddddddddddddddddddddddddddd\" ] tamanho = 47."; - - /** - * Utility class pattern: classe não instanciável - * - * @throws AssertionError - * caso haja alguma tentativa de utilização deste construtor. - */ - private BoletoUtil(){ - - Exceptions.throwIllegalStateException("Instanciação não permitida!"); - } - - /** - *

- * Retorna o campo livre de uma dada linha digitável. - *

- * - * @see #checkFormatoLinhaDigitavelFormatada(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String getCampoLivreDaLinhaDigitavelFormatada( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkFormatoLinhaDigitavelFormatada(linhaDigitavel); - - final String linhaNumerica = linhaDigitavelFormatadaEmNumerica(linhaDigitavel); - - return new StringBuilder().append(linhaNumerica.substring(4, 9)) - .append(linhaNumerica.substring(10, 20)).append( - linhaNumerica.substring(21, 31)).toString(); - } - - /** - *

- * Retorna o valor do título de uma dada linha digitável. - *

- * - * @see #checkFormatoLinhaDigitavelFormatada(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String getValorDoTituloDaLinhaDigitavelFormatada( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkFormatoLinhaDigitavelFormatada(linhaDigitavel); - - return linhaDigitavelFormatadaEmNumerica(linhaDigitavel).substring(37, - 47); - } - - /** - *

- * Retorna o fator de vencimento de uma dada linha digitável. - *

- * - * @see #checkFormatoLinhaDigitavelFormatada(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String getFatorDeVencimentoDaLinhaDigitavelFormatada( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkFormatoLinhaDigitavelFormatada(linhaDigitavel); - - return linhaDigitavelFormatadaEmNumerica(linhaDigitavel).substring(33, - 37); - } - - /** - *

- * Retorna o dígito verificador geral de uma dada linha digitável. - *

- * - * @see #checkFormatoLinhaDigitavelFormatada(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String getDigitoVerificadorGeralDaLinhaDigitavelFormatada( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkFormatoLinhaDigitavelFormatada(linhaDigitavel); - - return linhaDigitavelFormatadaEmNumerica(linhaDigitavel).substring(32, - 33); - } - - /** - *

- * Retorna o código da moeda de uma dada linha digitável. - *

- * - * @see #checkFormatoLinhaDigitavelFormatada(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String getCodigoDaMoedaDaLinhaDigitavelFormatada( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkFormatoLinhaDigitavelFormatada(linhaDigitavel); - - return linhaDigitavelFormatadaEmNumerica(linhaDigitavel) - .substring(3, 4); - } - - /** - *

- * Retorna o código do banco de uma dada linha digitável. - *

- * - * @see #checkFormatoLinhaDigitavelFormatada(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String getCodigoDoBancoDaLinhaDigitavelFormatada( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkFormatoLinhaDigitavelFormatada(linhaDigitavel); - - return linhaDigitavelFormatadaEmNumerica(linhaDigitavel) - .substring(0, 3); - } - - /** - *

- * Retorna o campo livre de um dado código de barras. - *

- * - * @see #checkFormatoCodigoDeBarras(String) - * - * @param codigoDeBarras - * string contendo somente números - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws CodigoDeBarrasException - * quando a string não está no formato válido - */ - public static String getCampoLivreDoCodigoDeBarras( - String codigoDeBarras) throws - IllegalArgumentException, CodigoDeBarrasException { - - checkFormatoCodigoDeBarras(codigoDeBarras); - - return trim(codigoDeBarras).substring(19, 44); - } - - /** - *

- * Retorna o valor do título de um dado código de barras. - *

- * - * @see #checkFormatoCodigoDeBarras(String) - * - * @param codigoDeBarras - * string contendo somente números - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws CodigoDeBarrasException - * quando a string não está no formato válido - */ - public static String getValorDoTituloDoCodigoDeBarras( - String codigoDeBarras) throws - IllegalArgumentException, CodigoDeBarrasException { - - checkFormatoCodigoDeBarras(codigoDeBarras); - - return trim(codigoDeBarras).substring(9, 19); - } - - /** - *

- * Retorna o fator de vencimento de um dado código de barras. - *

- * - * @see #checkFormatoCodigoDeBarras(String) - * - * @param codigoDeBarras - * string contendo somente números - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws CodigoDeBarrasException - * quando a string não está no formato válido - */ - public static String getFatorDeVencimentoDoCodigoDeBarras( - String codigoDeBarras) throws - IllegalArgumentException, CodigoDeBarrasException { - - checkFormatoCodigoDeBarras(codigoDeBarras); - - return trim(codigoDeBarras).substring(5, 9); - } - - /** - *

- * Retorna o dígito verificador de um dado código de barras. - *

- * - * @see #checkFormatoCodigoDeBarras(String) - * - * @param codigoDeBarras - * string contendo somente números - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws CodigoDeBarrasException - * quando a string não está no formato válido - */ - public static String getDigitoVerificadorGeralDoCodigoDeBarras( - String codigoDeBarras) throws - IllegalArgumentException, CodigoDeBarrasException { - - checkFormatoCodigoDeBarras(codigoDeBarras); - - return trim(codigoDeBarras).substring(4, 5); - } - - /** - *

- * Retorna o código da moeda de um dado código de barras. - *

- * - * @see #checkFormatoCodigoDeBarras(String) - * - * @param codigoDeBarras - * string contendo somente números - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws CodigoDeBarrasException - * quando a string não está no formato válido - */ - public static String getCodigoDaMoedaDoCodigoDeBarras( - String codigoDeBarras) throws - IllegalArgumentException, CodigoDeBarrasException { - - checkFormatoCodigoDeBarras(codigoDeBarras); - - return trim(codigoDeBarras).substring(3, 4); - } - - /** - *

- * Retorna o código do banco de um dado código de barras. - *

- * - * @see #checkFormatoCodigoDeBarras(String) - * - * @param codigoDeBarras - * string contendo somente números - * @return código do banco em string - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws CodigoDeBarrasException - * quando a string não está no formato válido - */ - public static String getCodigoDoBancoDoCodigoDeBarras( - String codigoDeBarras) throws - IllegalArgumentException, CodigoDeBarrasException { - - checkFormatoCodigoDeBarras(codigoDeBarras); - - return trim(codigoDeBarras).substring(0, 3); - } - - /** - *

- * Transforma um código de barras em uma linha digitável no formato - * FEBRABAN. - *

- *

- * "dddddddddddddddddddddddddddddddddddddddddddd"
- *
- * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" - *

- * - * @see #checkFormatoCodigoDeBarras(String) - * - * @param codigoDeBarras - * string contendo somente números - * @return linha digitável contendo somente números - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws CodigoDeBarrasException - * quando a string não está no formato válido - */ - public static String codigoDeBarrasEmLinhaDigitavelFormatada( - String codigoDeBarras) throws - IllegalArgumentException, CodigoDeBarrasException { - - return linhaDigitavelNumericaEmFormatada(codigoDeBarrasEmLinhaDigitavelNumerica(codigoDeBarras)); - } - - /** - *

- * Transforma um código de barras em uma linha digitável numérica. - *

- *

- * "dddddddddddddddddddddddddddddddddddddddddddd"
- *
- * "ddddddddddddddddddddddddddddddddddddddddddddddd" - *

- * - * @see #checkFormatoCodigoDeBarras(String) - * - * @param codigoDeBarras - * string contendo somente números - * @return linha digitável contendo somente números - * - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws CodigoDeBarrasException - * quando a string não está no formato válido - */ - public static String codigoDeBarrasEmLinhaDigitavelNumerica( - String codigoDeBarras) throws - IllegalArgumentException, CodigoDeBarrasException { - - checkFormatoCodigoDeBarras(codigoDeBarras); - - final BoletoLinhaDigitavelDV calculadorDV = new BoletoLinhaDigitavelDV(); - - final StringBuilder linhaDigitavel = new StringBuilder(); - - final String c = trim(codigoDeBarras); - - // campo1 - // banco - linhaDigitavel.append(c.substring(0, 3)); - // moeda - linhaDigitavel.append(c.substring(3, 4)); - linhaDigitavel.append(c.substring(19, 24)); - linhaDigitavel.append(calculadorDV.calcule(linhaDigitavel.toString())); - - // campo2 - linhaDigitavel.append(c.substring(24, 34)); - linhaDigitavel.append(calculadorDV.calcule(c.substring(24, 34))); - - // campo3 - linhaDigitavel.append(c.substring(34, 44)); - linhaDigitavel.append(calculadorDV.calcule(c.substring(34, 44))); - - // campo4=DV_Geral - linhaDigitavel.append(c.substring(4, 5)); - - // campo5 - linhaDigitavel.append(c.substring(5, 19)); - - return linhaDigitavel.toString(); - } - - /** - *

- * Transforma uma linha digitável no formato FEBRABAN em um código de - * barras. - *

- *

- * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" - *
- *
- * "dddddddddddddddddddddddddddddddddddddddddddd" - *

- * - * @see #checkExistsLinhaDigitavel(String) - * @see #checkFormatoLinhaDigitavelFormatada(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return linha digitável contendo somente números - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String linhaDigitavelFormatadaEmCodigoDeBarras( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - return linhaDigitavelNumericaEmCodigoDeBarras(linhaDigitavelFormatadaEmNumerica(linhaDigitavel)); - } - - /** - *

- * Transforma uma linha digitável não formatada em um código de barras. - *

- *

- * "ddddddddddddddddddddddddddddddddddddddddddddddd"
- *
- * "dddddddddddddddddddddddddddddddddddddddddddd" - *

- * - * @see #checkExistsLinhaDigitavel(String) - * @see #checkFormatoLinhaDigitavelFormatada(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return linha digitável contendo somente números - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String linhaDigitavelNumericaEmCodigoDeBarras( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkFormatoLinhaDigitavelNumerica(linhaDigitavel); - - final StringBuilder codigoDeBarras = new StringBuilder(); - - final String l = trim(linhaDigitavel); - - // banco - codigoDeBarras.append(l.substring(0, 3)); - // moeda - codigoDeBarras.append(l.substring(3, 4)); - - codigoDeBarras.append(l.substring(32, 33)); - codigoDeBarras.append(l.substring(33, 47)); - codigoDeBarras.append(l.substring(4, 9)); - codigoDeBarras.append(l.substring(10, 20)); - codigoDeBarras.append(l.substring(21, 31)); - - return codigoDeBarras.toString(); - } - - /** - *

- * Remove formatação e espaços de uma linha digitável no formato FEBRABAN: - *

- *

- * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" - *
- *
- * "ddddddddddddddddddddddddddddddddddddddddddddddd" - *

- * - * @see #checkExistsLinhaDigitavel(String) - * @see #checkFormatoLinhaDigitavelFormatada(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return linha digitável contendo somente números - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String linhaDigitavelFormatadaEmNumerica( - String linhaDigitavel) throws IllegalArgumentException, - LinhaDigitavelException { - - checkFormatoLinhaDigitavelFormatada(linhaDigitavel); - - return linhaDigitavel.replaceAll(WHITE_SPACE, EMPTY).replaceAll("\\.", - EMPTY); - } - - /** - *

- * Transforma linha digitável númerica em FEBRABAN: - *

- *

- * "ddddddddddddddddddddddddddddddddddddddddddddddd"
- *
- * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" - *

- * - * @see #checkExistsLinhaDigitavel(String) - * @see #checkFormatoLinhaDigitavelNumerica(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @return linha digitável contendo somente números - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static String linhaDigitavelNumericaEmFormatada( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkFormatoLinhaDigitavelNumerica(linhaDigitavel); - - final StringBuilder linhaFormatada = new StringBuilder(); - - final String l = trim(linhaDigitavel); - - linhaFormatada.append(l.substring(0, 5)); - linhaFormatada.append("."); - linhaFormatada.append(l.substring(5, 10)); - linhaFormatada.append(WHITE_SPACE); - linhaFormatada.append(l.substring(10, 15)); - linhaFormatada.append("."); - linhaFormatada.append(l.substring(15, 21)); - linhaFormatada.append(WHITE_SPACE); - linhaFormatada.append(l.substring(21, 26)); - linhaFormatada.append("."); - linhaFormatada.append(l.substring(26, 32)); - linhaFormatada.append(WHITE_SPACE); - linhaFormatada.append(l.substring(32, 33)); - linhaFormatada.append(WHITE_SPACE); - linhaFormatada.append(l.substring(33)); - - return linhaFormatada.toString(); - } - - /** - *

- * Informa se um dado código de barras é válido ou não. - *

- * - * @param codigoDeBarras - * @return true = valida - */ - public static boolean isCodigoDeBarrasValido(String codigoDeBarras) { - - if (isNotBlank(codigoDeBarras)) { - - return codigoDeBarras.trim().matches(CODIGO_DE_BARRAS_REGEX); - } else { - - return false; - } - } - - /** - *

- * Informa se uma dada linha digitável formatada é válida ou não. - *

- * - * @param linhaDigitavel - * @return true = valida - */ - public static boolean isLinhaDigitavelFormatadaValida( - String linhaDigitavel) { - - if (isNotBlank(linhaDigitavel)) { - - return linhaDigitavel.trim().matches( - LINHA_DIGITAVEL_FORMATADA_REGEX); - } else { - - return false; - } - } - - /** - *

- * Informa se uma dada linha digitável é válida ou não. - *

- * - * @param linhaDigitavel - * @return true = valida - */ - public static boolean isLinhaDigitavelNumericaValida( - String linhaDigitavel) { - - if (isNotBlank(linhaDigitavel)) { - - return linhaDigitavel.trim() - .matches(LINHA_DIGITAVEL_NUMERICA_REGEX); - } else { - - return false; - } - } - - /** - *

- * Verifica se a linha digitável não é nula, não é - * vazia e é numérica, obedecendo o seguinte - * FEBRABAN: - *

- *

- * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" - *

- *

- * Onde o número de dígitos é igual a 54 e o número de espaços é igual a 4. - *

- *

- *

    - *
  • Caso a string seja nula, lança uma IllegalArgumentException; - *
  • - *
  • Caso seja vazia, lança uma IllegalArgumentException;
  • - *
  • Caso não esteja no formato especificado, lança uma - * LinhaDigitavelException.
  • - *
- *

- * - * @see #checkExistsLinhaDigitavel(String) - * - * @param linhaDigitavel - * string no formato FEBRABAN - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static void checkFormatoLinhaDigitavelFormatada( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkExistsLinhaDigitavel(linhaDigitavel); - - if (!linhaDigitavel.contains(".")) { - throw new LinhaDigitavelException(MSG_LINHA_INVALIDA - + " " - + String.format(MSG_NAO_FORMATADA, linhaDigitavel, - linhaDigitavel.length()) - + " A linha digitável formatada deve conter pontos!"); - } - - if (!linhaDigitavel.trim().contains(" ")) { - throw new LinhaDigitavelException(MSG_LINHA_INVALIDA - + " " - + String.format(MSG_NAO_FORMATADA, linhaDigitavel, - linhaDigitavel.length()) - + " A linha digitável formatada deve conter espaços!"); - } - - if (!isLinhaDigitavelFormatadaValida(linhaDigitavel)) { - throw new LinhaDigitavelException(MSG_LINHA_INVALIDA - + " " - + String.format(MSG_NAO_FORMATADA, linhaDigitavel, - linhaDigitavel.length())); - } - } - - /** - *

- * Verifica se a linha digitável não é nula, não é - * vazia e é numérica, obedecendo o seguinte - * formato: - *

- *

- * "ddddddddddddddddddddddddddddddddddddddddddddddd" - *

- *

- * Onde o número de dígitos é igual a 47. - *

- *

- *

    - *
  • Caso a string seja nula, lança uma IllegalArgumentException; - *
  • - *
  • Caso seja vazia, lança uma IllegalArgumentException;
  • - *
  • Caso não esteja no formato especificado, lança uma - * LinhaDigitavelException.
  • - *
- *

- * - * @see #checkExistsLinhaDigitavel(String) - * - * @param linhaDigitavel - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws LinhaDigitavelException - * quando a string não está no formato válido - */ - public static void checkFormatoLinhaDigitavelNumerica( - String linhaDigitavel) throws - IllegalArgumentException, LinhaDigitavelException { - - checkExistsLinhaDigitavel(linhaDigitavel); - - if (!isLinhaDigitavelNumericaValida(linhaDigitavel)) { - throw new LinhaDigitavelException(MSG_LINHA_INVALIDA - + " " - + String.format(MSG_STR_NUMERICA, linhaDigitavel, - linhaDigitavel.length()) - + " A linha deve conter apenas 47 dígitos númericos [0-9]!"); - } - - } - - /** - *

- * Verifica se o código de barras não é nulo, não é - * vazio e é numérico, obedecendo o seguinte - * formato: - *

- *

- * "dddddddddddddddddddddddddddddddddddddddddddd" - *

- *

- * Onde o número de dígitos é igual a 44. - *

- *

- *

    - *
  • Caso a string seja nula, lança uma IllegalArgumentException; - *
  • - *
  • Caso seja vazia, lança uma IllegalArgumentException;
  • - *
  • Caso não esteja no formato especificado, lança uma - * LinhaDigitavelException.
  • - *
- *

- * - * @see #checkExistsLinhaDigitavel(String) - * - * @param codigoDeBarras - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - * @throws CodigoDeBarrasException - * quando a string não está no formato válido - */ - public static void checkFormatoCodigoDeBarras(String codigoDeBarras) - throws IllegalArgumentException, - CodigoDeBarrasException { - - checkExistsCodigoDeBarras(codigoDeBarras); - - if (!isCodigoDeBarrasValido(codigoDeBarras)) { - throw new CodigoDeBarrasException( - MSG_CODIGO_DE_BARRAS - + " " - + String.format(MSG_STR_NUMERICA, codigoDeBarras, - codigoDeBarras.length()) - + " O código de barras deve conter apenas 44 dígitos númericos [0-9]!"); - } - - } - - /** - *

- * Verifica se a linha digitável não é nula e não é - * vazia. Caso nula lança uma IllegalArgumentException, - * caso vazia lança uma IllegalArgumentException. - *

- *

- * Considera-se vazia se linhaDigitavel.trim().length() == 0. - *

- * - * @param linhaDigitavel - * - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - */ - public static void checkExistsLinhaDigitavel(String linhaDigitavel) - throws IllegalArgumentException { - - checkNotNull(linhaDigitavel, MSG_LINHA_INVALIDA); - - if (isBlank(linhaDigitavel)) { - Exceptions.throwIllegalArgumentException(MSG_LINHA_INVALIDA - + " " - + String.format(MSG_STR_VAZIA, linhaDigitavel, - linhaDigitavel.length())); - } - } - - /** - *

- * Verifica se código de barras não é nulo e não é - * vazio. Caso nula lança uma IllegalArgumentException, - * caso vazia lança uma IllegalArgumentException. - *

- *

- * Considera-se vazia se linhaDigitavel.trim().length() == 0. - *

- * - * @param codigoDeBarras - * @throws IllegalArgumentException - * quando a string é nula ou quando a string é vazia - */ - public static void checkExistsCodigoDeBarras(String codigoDeBarras) - throws IllegalArgumentException { - - checkNotNull(codigoDeBarras, MSG_LINHA_INVALIDA); - - if (isBlank(codigoDeBarras)) { - Exceptions.throwIllegalArgumentException(MSG_CODIGO_DE_BARRAS - + " " - + String.format(MSG_STR_VAZIA, codigoDeBarras, - codigoDeBarras.length())); - } - } -} +/* + * Copyright 2010 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: 27/01/2010 - 00:53:43 + * + * ================================================================================ + * + * Direitos autorais 2010 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 27/01/2010 - 00:53:43 + * + */ + + +package org.jrimum.bopepo; + +import static org.apache.commons.lang3.StringUtils.EMPTY; +import static org.apache.commons.lang3.StringUtils.isBlank; +import static org.apache.commons.lang3.StringUtils.isNotBlank; +import static org.apache.commons.lang3.StringUtils.trim; +import static org.jrimum.utilix.Objects.checkNotNull; +import static org.jrimum.utilix.Strings.WHITE_SPACE; + +import org.jrimum.utilix.Exceptions; +import org.jrimum.vallia.BoletoLinhaDigitavelDV; + +/** + *

+ * Utilitário para recuperar informações de strings de códigos de barras e + * linhas digitáveis de boletos. + *

+ * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public final class BoletoUtil { + + /* + * Regras REGEX. + */ + private static final String CODIGO_DE_BARRAS_REGEX = "\\d{44}"; + private static final String LINHA_DIGITAVEL_NUMERICA_REGEX = "\\d{47}"; + private static final String LINHA_DIGITAVEL_FORMATADA_REGEX = "\\d{5}\\.\\d{5} \\d{5}\\.\\d{6} \\d{5}\\.\\d{6} \\d{1} \\d{14}"; + /* + * Mensagens. + */ + private static final String MSG_CODIGO_DE_BARRAS = "Código de barras inválido!"; + private static final String MSG_LINHA_INVALIDA = "Linha digitável inválida!"; + private static final String MSG_STR_VAZIA = "String vazia [ \"%s\" ] tamanho [ %d ]."; + private static final String MSG_NAO_FORMATADA = "String formatada [ \"%s\" ] de tamanho [ %d ] está fora do padrão [ \"ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd\" ] tamanho = 54."; + private static final String MSG_STR_NUMERICA = "String numérica [ \"%s\" ] de tamanho [ %d ] está fora do padrão [ \"ddddddddddddddddddddddddddddddddddddddddddddddd\" ] tamanho = 47."; + + /** + * Utility class pattern: classe não instanciável + * + * @throws AssertionError + * caso haja alguma tentativa de utilização deste construtor. + */ + private BoletoUtil(){ + + Exceptions.throwIllegalStateException("Instanciação não permitida!"); + } + + /** + *

+ * Retorna o campo livre de uma dada linha digitável. + *

+ * + * @see #checkFormatoLinhaDigitavelFormatada(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String getCampoLivreDaLinhaDigitavelFormatada( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkFormatoLinhaDigitavelFormatada(linhaDigitavel); + + final String linhaNumerica = linhaDigitavelFormatadaEmNumerica(linhaDigitavel); + + return new StringBuilder().append(linhaNumerica.substring(4, 9)) + .append(linhaNumerica.substring(10, 20)).append( + linhaNumerica.substring(21, 31)).toString(); + } + + /** + *

+ * Retorna o valor do título de uma dada linha digitável. + *

+ * + * @see #checkFormatoLinhaDigitavelFormatada(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String getValorDoTituloDaLinhaDigitavelFormatada( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkFormatoLinhaDigitavelFormatada(linhaDigitavel); + + return linhaDigitavelFormatadaEmNumerica(linhaDigitavel).substring(37, + 47); + } + + /** + *

+ * Retorna o fator de vencimento de uma dada linha digitável. + *

+ * + * @see #checkFormatoLinhaDigitavelFormatada(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String getFatorDeVencimentoDaLinhaDigitavelFormatada( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkFormatoLinhaDigitavelFormatada(linhaDigitavel); + + return linhaDigitavelFormatadaEmNumerica(linhaDigitavel).substring(33, + 37); + } + + /** + *

+ * Retorna o dígito verificador geral de uma dada linha digitável. + *

+ * + * @see #checkFormatoLinhaDigitavelFormatada(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String getDigitoVerificadorGeralDaLinhaDigitavelFormatada( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkFormatoLinhaDigitavelFormatada(linhaDigitavel); + + return linhaDigitavelFormatadaEmNumerica(linhaDigitavel).substring(32, + 33); + } + + /** + *

+ * Retorna o código da moeda de uma dada linha digitável. + *

+ * + * @see #checkFormatoLinhaDigitavelFormatada(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String getCodigoDaMoedaDaLinhaDigitavelFormatada( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkFormatoLinhaDigitavelFormatada(linhaDigitavel); + + return linhaDigitavelFormatadaEmNumerica(linhaDigitavel) + .substring(3, 4); + } + + /** + *

+ * Retorna o código do banco de uma dada linha digitável. + *

+ * + * @see #checkFormatoLinhaDigitavelFormatada(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String getCodigoDoBancoDaLinhaDigitavelFormatada( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkFormatoLinhaDigitavelFormatada(linhaDigitavel); + + return linhaDigitavelFormatadaEmNumerica(linhaDigitavel) + .substring(0, 3); + } + + /** + *

+ * Retorna o campo livre de um dado código de barras. + *

+ * + * @see #checkFormatoCodigoDeBarras(String) + * + * @param codigoDeBarras + * string contendo somente números + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws CodigoDeBarrasException + * quando a string não está no formato válido + */ + public static String getCampoLivreDoCodigoDeBarras( + String codigoDeBarras) throws + IllegalArgumentException, CodigoDeBarrasException { + + checkFormatoCodigoDeBarras(codigoDeBarras); + + return trim(codigoDeBarras).substring(19, 44); + } + + /** + *

+ * Retorna o valor do título de um dado código de barras. + *

+ * + * @see #checkFormatoCodigoDeBarras(String) + * + * @param codigoDeBarras + * string contendo somente números + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws CodigoDeBarrasException + * quando a string não está no formato válido + */ + public static String getValorDoTituloDoCodigoDeBarras( + String codigoDeBarras) throws + IllegalArgumentException, CodigoDeBarrasException { + + checkFormatoCodigoDeBarras(codigoDeBarras); + + return trim(codigoDeBarras).substring(9, 19); + } + + /** + *

+ * Retorna o fator de vencimento de um dado código de barras. + *

+ * + * @see #checkFormatoCodigoDeBarras(String) + * + * @param codigoDeBarras + * string contendo somente números + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws CodigoDeBarrasException + * quando a string não está no formato válido + */ + public static String getFatorDeVencimentoDoCodigoDeBarras( + String codigoDeBarras) throws + IllegalArgumentException, CodigoDeBarrasException { + + checkFormatoCodigoDeBarras(codigoDeBarras); + + return trim(codigoDeBarras).substring(5, 9); + } + + /** + *

+ * Retorna o dígito verificador de um dado código de barras. + *

+ * + * @see #checkFormatoCodigoDeBarras(String) + * + * @param codigoDeBarras + * string contendo somente números + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws CodigoDeBarrasException + * quando a string não está no formato válido + */ + public static String getDigitoVerificadorGeralDoCodigoDeBarras( + String codigoDeBarras) throws + IllegalArgumentException, CodigoDeBarrasException { + + checkFormatoCodigoDeBarras(codigoDeBarras); + + return trim(codigoDeBarras).substring(4, 5); + } + + /** + *

+ * Retorna o código da moeda de um dado código de barras. + *

+ * + * @see #checkFormatoCodigoDeBarras(String) + * + * @param codigoDeBarras + * string contendo somente números + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws CodigoDeBarrasException + * quando a string não está no formato válido + */ + public static String getCodigoDaMoedaDoCodigoDeBarras( + String codigoDeBarras) throws + IllegalArgumentException, CodigoDeBarrasException { + + checkFormatoCodigoDeBarras(codigoDeBarras); + + return trim(codigoDeBarras).substring(3, 4); + } + + /** + *

+ * Retorna o código do banco de um dado código de barras. + *

+ * + * @see #checkFormatoCodigoDeBarras(String) + * + * @param codigoDeBarras + * string contendo somente números + * @return código do banco em string + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws CodigoDeBarrasException + * quando a string não está no formato válido + */ + public static String getCodigoDoBancoDoCodigoDeBarras( + String codigoDeBarras) throws + IllegalArgumentException, CodigoDeBarrasException { + + checkFormatoCodigoDeBarras(codigoDeBarras); + + return trim(codigoDeBarras).substring(0, 3); + } + + /** + *

+ * Transforma um código de barras em uma linha digitável no formato + * FEBRABAN. + *

+ *

+ * "dddddddddddddddddddddddddddddddddddddddddddd" + * + * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" + *

+ * + * @see #checkFormatoCodigoDeBarras(String) + * + * @param codigoDeBarras + * string contendo somente números + * @return linha digitável contendo somente números + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws CodigoDeBarrasException + * quando a string não está no formato válido + */ + public static String codigoDeBarrasEmLinhaDigitavelFormatada( + String codigoDeBarras) throws + IllegalArgumentException, CodigoDeBarrasException { + + return linhaDigitavelNumericaEmFormatada(codigoDeBarrasEmLinhaDigitavelNumerica(codigoDeBarras)); + } + + /** + *

+ * Transforma um código de barras em uma linha digitável numérica. + *

+ *

+ * "dddddddddddddddddddddddddddddddddddddddddddd" + * + * "ddddddddddddddddddddddddddddddddddddddddddddddd" + *

+ * + * @see #checkFormatoCodigoDeBarras(String) + * + * @param codigoDeBarras + * string contendo somente números + * @return linha digitável contendo somente números + * + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws CodigoDeBarrasException + * quando a string não está no formato válido + */ + public static String codigoDeBarrasEmLinhaDigitavelNumerica( + String codigoDeBarras) throws + IllegalArgumentException, CodigoDeBarrasException { + + checkFormatoCodigoDeBarras(codigoDeBarras); + + final BoletoLinhaDigitavelDV calculadorDV = new BoletoLinhaDigitavelDV(); + + final StringBuilder linhaDigitavel = new StringBuilder(); + + final String c = trim(codigoDeBarras); + + // campo1 + // banco + linhaDigitavel.append(c.substring(0, 3)); + // moeda + linhaDigitavel.append(c.substring(3, 4)); + linhaDigitavel.append(c.substring(19, 24)); + linhaDigitavel.append(calculadorDV.calcule(linhaDigitavel.toString())); + + // campo2 + linhaDigitavel.append(c.substring(24, 34)); + linhaDigitavel.append(calculadorDV.calcule(c.substring(24, 34))); + + // campo3 + linhaDigitavel.append(c.substring(34, 44)); + linhaDigitavel.append(calculadorDV.calcule(c.substring(34, 44))); + + // campo4=DV_Geral + linhaDigitavel.append(c.substring(4, 5)); + + // campo5 + linhaDigitavel.append(c.substring(5, 19)); + + return linhaDigitavel.toString(); + } + + /** + *

+ * Transforma uma linha digitável no formato FEBRABAN em um código de + * barras. + *

+ *

+ * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" + * + * + * "dddddddddddddddddddddddddddddddddddddddddddd" + *

+ * + * @see #checkExistsLinhaDigitavel(String) + * @see #checkFormatoLinhaDigitavelFormatada(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return linha digitável contendo somente números + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String linhaDigitavelFormatadaEmCodigoDeBarras( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + return linhaDigitavelNumericaEmCodigoDeBarras(linhaDigitavelFormatadaEmNumerica(linhaDigitavel)); + } + + /** + *

+ * Transforma uma linha digitável não formatada em um código de barras. + *

+ *

+ * "ddddddddddddddddddddddddddddddddddddddddddddddd" + * + * "dddddddddddddddddddddddddddddddddddddddddddd" + *

+ * + * @see #checkExistsLinhaDigitavel(String) + * @see #checkFormatoLinhaDigitavelFormatada(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return linha digitável contendo somente números + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String linhaDigitavelNumericaEmCodigoDeBarras( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkFormatoLinhaDigitavelNumerica(linhaDigitavel); + + final StringBuilder codigoDeBarras = new StringBuilder(); + + final String l = trim(linhaDigitavel); + + // banco + codigoDeBarras.append(l.substring(0, 3)); + // moeda + codigoDeBarras.append(l.substring(3, 4)); + + codigoDeBarras.append(l.substring(32, 33)); + codigoDeBarras.append(l.substring(33, 47)); + codigoDeBarras.append(l.substring(4, 9)); + codigoDeBarras.append(l.substring(10, 20)); + codigoDeBarras.append(l.substring(21, 31)); + + return codigoDeBarras.toString(); + } + + /** + *

+ * Remove formatação e espaços de uma linha digitável no formato FEBRABAN: + *

+ *

+ * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" + * + * + * "ddddddddddddddddddddddddddddddddddddddddddddddd" + *

+ * + * @see #checkExistsLinhaDigitavel(String) + * @see #checkFormatoLinhaDigitavelFormatada(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return linha digitável contendo somente números + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String linhaDigitavelFormatadaEmNumerica( + String linhaDigitavel) throws IllegalArgumentException, + LinhaDigitavelException { + + checkFormatoLinhaDigitavelFormatada(linhaDigitavel); + + return linhaDigitavel.replaceAll(WHITE_SPACE, EMPTY).replaceAll("\\.", + EMPTY); + } + + /** + *

+ * Transforma linha digitável númerica em FEBRABAN: + *

+ *

+ * "ddddddddddddddddddddddddddddddddddddddddddddddd" + * + * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" + *

+ * + * @see #checkExistsLinhaDigitavel(String) + * @see #checkFormatoLinhaDigitavelNumerica(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @return linha digitável contendo somente números + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static String linhaDigitavelNumericaEmFormatada( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkFormatoLinhaDigitavelNumerica(linhaDigitavel); + + final StringBuilder linhaFormatada = new StringBuilder(); + + final String l = trim(linhaDigitavel); + + linhaFormatada.append(l.substring(0, 5)); + linhaFormatada.append("."); + linhaFormatada.append(l.substring(5, 10)); + linhaFormatada.append(WHITE_SPACE); + linhaFormatada.append(l.substring(10, 15)); + linhaFormatada.append("."); + linhaFormatada.append(l.substring(15, 21)); + linhaFormatada.append(WHITE_SPACE); + linhaFormatada.append(l.substring(21, 26)); + linhaFormatada.append("."); + linhaFormatada.append(l.substring(26, 32)); + linhaFormatada.append(WHITE_SPACE); + linhaFormatada.append(l.substring(32, 33)); + linhaFormatada.append(WHITE_SPACE); + linhaFormatada.append(l.substring(33)); + + return linhaFormatada.toString(); + } + + /** + *

+ * Informa se um dado código de barras é válido ou não. + *

+ * + * @param codigoDeBarras + * @return true = valida + */ + public static boolean isCodigoDeBarrasValido(String codigoDeBarras) { + + if (isNotBlank(codigoDeBarras)) { + + return codigoDeBarras.trim().matches(CODIGO_DE_BARRAS_REGEX); + } else { + + return false; + } + } + + /** + *

+ * Informa se uma dada linha digitável formatada é válida ou não. + *

+ * + * @param linhaDigitavel + * @return true = valida + */ + public static boolean isLinhaDigitavelFormatadaValida( + String linhaDigitavel) { + + if (isNotBlank(linhaDigitavel)) { + + return linhaDigitavel.trim().matches( + LINHA_DIGITAVEL_FORMATADA_REGEX); + } else { + + return false; + } + } + + /** + *

+ * Informa se uma dada linha digitável é válida ou não. + *

+ * + * @param linhaDigitavel + * @return true = valida + */ + public static boolean isLinhaDigitavelNumericaValida( + String linhaDigitavel) { + + if (isNotBlank(linhaDigitavel)) { + + return linhaDigitavel.trim() + .matches(LINHA_DIGITAVEL_NUMERICA_REGEX); + } else { + + return false; + } + } + + /** + *

+ * Verifica se a linha digitável não é nula, não é + * vazia e é numérica, obedecendo o seguinte + * FEBRABAN: + *

+ *

+ * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd" + *

+ *

+ * Onde o número de dígitos é igual a 54 e o número de espaços é igual a 4. + *

+ *

+ *

    + *
  • Caso a string seja nula, lança uma IllegalArgumentException; + *
  • + *
  • Caso seja vazia, lança uma IllegalArgumentException;
  • + *
  • Caso não esteja no formato especificado, lança uma + * LinhaDigitavelException.
  • + *
+ *

+ * + * @see #checkExistsLinhaDigitavel(String) + * + * @param linhaDigitavel + * string no formato FEBRABAN + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static void checkFormatoLinhaDigitavelFormatada( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkExistsLinhaDigitavel(linhaDigitavel); + + if (!linhaDigitavel.contains(".")) { + throw new LinhaDigitavelException(MSG_LINHA_INVALIDA + + " " + + String.format(MSG_NAO_FORMATADA, linhaDigitavel, + linhaDigitavel.length()) + + " A linha digitável formatada deve conter pontos!"); + } + + if (!linhaDigitavel.trim().contains(" ")) { + throw new LinhaDigitavelException(MSG_LINHA_INVALIDA + + " " + + String.format(MSG_NAO_FORMATADA, linhaDigitavel, + linhaDigitavel.length()) + + " A linha digitável formatada deve conter espaços!"); + } + + if (!isLinhaDigitavelFormatadaValida(linhaDigitavel)) { + throw new LinhaDigitavelException(MSG_LINHA_INVALIDA + + " " + + String.format(MSG_NAO_FORMATADA, linhaDigitavel, + linhaDigitavel.length())); + } + } + + /** + *

+ * Verifica se a linha digitável não é nula, não é + * vazia e é numérica, obedecendo o seguinte + * formato: + *

+ *

+ * "ddddddddddddddddddddddddddddddddddddddddddddddd" + *

+ *

+ * Onde o número de dígitos é igual a 47. + *

+ *

+ *

    + *
  • Caso a string seja nula, lança uma IllegalArgumentException; + *
  • + *
  • Caso seja vazia, lança uma IllegalArgumentException;
  • + *
  • Caso não esteja no formato especificado, lança uma + * LinhaDigitavelException.
  • + *
+ *

+ * + * @see #checkExistsLinhaDigitavel(String) + * + * @param linhaDigitavel + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws LinhaDigitavelException + * quando a string não está no formato válido + */ + public static void checkFormatoLinhaDigitavelNumerica( + String linhaDigitavel) throws + IllegalArgumentException, LinhaDigitavelException { + + checkExistsLinhaDigitavel(linhaDigitavel); + + if (!isLinhaDigitavelNumericaValida(linhaDigitavel)) { + throw new LinhaDigitavelException(MSG_LINHA_INVALIDA + + " " + + String.format(MSG_STR_NUMERICA, linhaDigitavel, + linhaDigitavel.length()) + + " A linha deve conter apenas 47 dígitos númericos [0-9]!"); + } + + } + + /** + *

+ * Verifica se o código de barras não é nulo, não é + * vazio e é numérico, obedecendo o seguinte + * formato: + *

+ *

+ * "dddddddddddddddddddddddddddddddddddddddddddd" + *

+ *

+ * Onde o número de dígitos é igual a 44. + *

+ *

+ *

    + *
  • Caso a string seja nula, lança uma IllegalArgumentException; + *
  • + *
  • Caso seja vazia, lança uma IllegalArgumentException;
  • + *
  • Caso não esteja no formato especificado, lança uma + * LinhaDigitavelException.
  • + *
+ *

+ * + * @see #checkExistsLinhaDigitavel(String) + * + * @param codigoDeBarras + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + * @throws CodigoDeBarrasException + * quando a string não está no formato válido + */ + public static void checkFormatoCodigoDeBarras(String codigoDeBarras) + throws IllegalArgumentException, + CodigoDeBarrasException { + + checkExistsCodigoDeBarras(codigoDeBarras); + + if (!isCodigoDeBarrasValido(codigoDeBarras)) { + throw new CodigoDeBarrasException( + MSG_CODIGO_DE_BARRAS + + " " + + String.format(MSG_STR_NUMERICA, codigoDeBarras, + codigoDeBarras.length()) + + " O código de barras deve conter apenas 44 dígitos númericos [0-9]!"); + } + + } + + /** + *

+ * Verifica se a linha digitável não é nula e não é + * vazia. Caso nula lança uma IllegalArgumentException, + * caso vazia lança uma IllegalArgumentException. + *

+ *

+ * Considera-se vazia se linhaDigitavel.trim().length() == 0. + *

+ * + * @param linhaDigitavel + * + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + */ + public static void checkExistsLinhaDigitavel(String linhaDigitavel) + throws IllegalArgumentException { + + checkNotNull(linhaDigitavel, MSG_LINHA_INVALIDA); + + if (isBlank(linhaDigitavel)) { + Exceptions.throwIllegalArgumentException(MSG_LINHA_INVALIDA + + " " + + String.format(MSG_STR_VAZIA, linhaDigitavel, + linhaDigitavel.length())); + } + } + + /** + *

+ * Verifica se código de barras não é nulo e não é + * vazio. Caso nula lança uma IllegalArgumentException, + * caso vazia lança uma IllegalArgumentException. + *

+ *

+ * Considera-se vazia se linhaDigitavel.trim().length() == 0. + *

+ * + * @param codigoDeBarras + * @throws IllegalArgumentException + * quando a string é nula ou quando a string é vazia + */ + public static void checkExistsCodigoDeBarras(String codigoDeBarras) + throws IllegalArgumentException { + + checkNotNull(codigoDeBarras, MSG_LINHA_INVALIDA); + + if (isBlank(codigoDeBarras)) { + Exceptions.throwIllegalArgumentException(MSG_CODIGO_DE_BARRAS + + " " + + String.format(MSG_STR_VAZIA, codigoDeBarras, + codigoDeBarras.length())); + } + } +} diff --git a/src/main/java/org/jrimum/bopepo/LinhaDigitavel.java b/src/main/java/org/jrimum/bopepo/LinhaDigitavel.java index f96a6a3d..ef0450a5 100644 --- a/src/main/java/org/jrimum/bopepo/LinhaDigitavel.java +++ b/src/main/java/org/jrimum/bopepo/LinhaDigitavel.java @@ -43,10 +43,10 @@ * * Representa a linha digitável do boleto, embora a linha digitável contenha a * mesma informação do código de barras, essa informação é disposta de uma forma - * diferente e são acrescentados 3 dígitos verificadores.
- *
- * Modelo:
- *
+ * diferente e são acrescentados 3 dígitos verificadores. + * + * Modelo: + * * * @@ -116,12 +116,12 @@ * *
* - *
- *
+ * + * * * Observações: * - *
+ * *
    * *
  • Em cada um dos três primeiros campos, após a 5a posição, deve ser @@ -129,7 +129,7 @@ * quando necessário;
  • *
  • Quinto campo: *
      - *
      + * *
    • preenchimento com zeros entre o fator de vencimento e o valor até * completar 14 posições; *
    • a existência de “0000” no campo “fator de vencimento” da linha digitável @@ -141,7 +141,7 @@ * barras, a representação deverá ser com zeros;
    • *
    • não deverá conter separação por pontos, vírgulas ou espaços;
    • *
    - *
    + * *
  • *
  • Os dígitos verificadores referentes aos 1º, 2º e 3º campos não são * representados no código de barras;
  • @@ -315,7 +315,7 @@ protected InnerCampoFormatado(final Integer fieldsLength, final Integer stringLe /** *

    * - * Aplicação do seguinte requisito da FEBRABAN:
    + * Aplicação do seguinte requisito da FEBRABAN: * Em cada um dos três primeiros campos, após a quinta (5) posição, deve ser * inserido um ponto “.”, a fim de facilitar a visualização, para a * digitação, quando necessário. @@ -342,7 +342,7 @@ public String write(){ } /** - * Componhe o campo 1 da linha digitável com os seguintes dados:
    + * Componhe o campo 1 da linha digitável com os seguintes dados: *

      *
    • Identificação do banco
    • *
    • Código de moeda (9 – Real)
    • @@ -394,7 +394,7 @@ private void load(CodigoDeBarras codigoDeBarras){ } /** - * Componhe o campo 2 da linha digitável com os seguintes dados:
      + * Componhe o campo 2 da linha digitável com os seguintes dados: *
        *
      • 6ª a 15ª posições do campo livre (posições 25 a 34 do código de * barras)
      • @@ -441,7 +441,7 @@ private void load(CodigoDeBarras codigoDeBarras){ } /** - * Componhe o campo 3 da linha digitável com os seguintes dados:
        + * Componhe o campo 3 da linha digitável com os seguintes dados: *
          *
        • 16ª a 25ª posições do campo livre (posições 35 a 44 do código de * barras)
        • @@ -488,7 +488,7 @@ private void load(CodigoDeBarras codigoDeBarras){ } /** - * Componhe o campo 5 da linha digitável com os seguintes dados:
          + * Componhe o campo 5 da linha digitável com os seguintes dados: *
            *
          • Posições 34 a 37 – fator de vencimento (posições 6 a 9 do código de * barras)
          • diff --git a/src/main/java/org/jrimum/bopepo/campolivre/AbstractCampoLivre.java b/src/main/java/org/jrimum/bopepo/campolivre/AbstractCampoLivre.java index ad2ae09b..7788af1b 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/AbstractCampoLivre.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/AbstractCampoLivre.java @@ -1,792 +1,792 @@ -/* - * 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:07:11 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:07:11 - * - */ -package org.jrimum.bopepo.campolivre; - -import static java.lang.String.format; -import static java.math.BigDecimal.ZERO; -import static org.jrimum.domkee.banco.Banco.isCodigoDeCompensacaoOK; - -import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; -import org.jrimum.bopepo.BancosSuportados; -import org.jrimum.domkee.banco.ParametroBancario; -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.BlockOfFields; -import org.jrimum.utilix.Objects; -import org.jrimum.utilix.Strings; -import org.jrimum.texgit.IFixedField; - -/** - *

            - * Esta classe é responsável por determinar a interface campo livre e também - * determinar qual implementação de campo livre se aplica a um determinado - * título. - *

            - * - *

            - * Uma outra forma de analisar esta classe é sob o prisma de uma Abstract - * Factory. - *

            - * - *

            - *

            - *
            Field Livre: - *
            É um espaço reservado no código de barras e a sua implementação varia de - * banco para banco.
            - *
            - *

            - * - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Lukas - * Antunes - Colaborador com o banco Intermedium (077) - * @author Fernando Dias - - * Colaborador com o banco Rural (453) - * @author Paulo Porto - Colaborador com o - * Banco do Nordeste do Brasil (004). - * @author Fabiano Carrijo - - * Colaborador com o Banco Citibank (756). - * @author Douglas Ramiro - - * Colaborador com o Banco de Brasília (070). - * - * @since 0.2 - * - * @version 0.2 - */ -abstract class AbstractCampoLivre extends BlockOfFields implements CampoLivre { - - /** - * {@code serialVersionUID = 4605730904122445595L} - */ - private static final long serialVersionUID = 4605730904122445595L; - - /** - * Looger. - */ - protected static Logger log = Logger.getLogger(Objects.class); - - /** - * Nosso número com 7 posições. - */ - static final int NN7 = 7; - - /** - * Nosso número com 8 posições. - */ - static final int NN8 = 8; - - /** - * Nosso número com 9 posições. - */ - static final int NN9 = 9; - - /** - * Nosso número com 10 posições. - */ - static final int NN10 = 10; - - /** - * Nosso número com 11 posições. - */ - static final int NN11 = 11; - - /** - * Nosso número com 14 posições. - */ - static final int NN14 = 14; - - /** - * Nosso número com 15 posições. - */ - static final int NN15 = 15; - - /** - * Nosso número com 17 posições. - */ - static final int NN17 = 17; - - /** - * Subclasses não precisam definir o tamanho. - */ - @SuppressWarnings("unused") - private AbstractCampoLivre(Integer fieldsLength, Integer stringLength) { - super(null, null); - } - - /** - * Cria um campo livre com um determinado número de campos - * - * @param fieldsLength - Número de campos - */ - protected AbstractCampoLivre(Integer fieldsLength) { - super(); - setLength(CampoLivre.STRING_LENGTH); - setSize(fieldsLength); - } - - /** - * Cria um campo livre a partir dos dados contidos no título fornecido. - * - * @param titulo com todos os dados para a geração do campo livre - * @return instância de campo livre ou nulo. - * @throws NotSupportedBancoException Caso o banco informado na conta - * bancária não tenha nenhuma implementação de campo livre. - * @throws NotSupportedCampoLivreException Caso exista implementações de - * campo livre para o banco informa na conta bancária, mas nenhuma dessas - * implementações foram adequadas para os dados do título. - * @throws CampoLivreException Caso ocorra algum problema na geração do - * campo livre. - */ - protected static CampoLivre create(Titulo titulo) throws NotSupportedBancoException, - NotSupportedCampoLivreException, CampoLivreException { - - if (log.isTraceEnabled()) { - - log.trace("Instanciando Campo livre"); - } - if (log.isDebugEnabled()) { - - log.debug("titulo instance : " + titulo); - } - - try { - - checkTituloNotNull(titulo); - checkContaBancariaNotNull(titulo); - checkBancoNotNull(titulo); - - if (log.isDebugEnabled()) { - - log.debug(format("Campo Livre do Banco: %s", titulo.getContaBancaria().getBanco().getNome())); - } - - if (BancosSuportados.isSuportado(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado())) { - - final BancosSuportados banco = BancosSuportados.suportados.get(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado()); - - switch (banco) { - - case BANCO_BRADESCO: - return AbstractCLBradesco.create(titulo); - case BANCO_DO_BRASIL: - return AbstractCLBancoDoBrasil.create(titulo); - case BANCO_DO_NORDESTE_DO_BRASIL: - return AbstractCLBancoDoNordesteDoBrasil.create(titulo); - case BANCO_ABN_AMRO_REAL: - return AbstractCLBancoReal.create(titulo); - case CAIXA_ECONOMICA_FEDERAL: - return AbstractCLCaixaEconomicaFederal.create(titulo); - case HSBC: - return AbstractCLHSBC.create(titulo); - case UNIBANCO: - return AbstractCLUnibanco.create(titulo); - case BANCO_ITAU: - return AbstractCLItau.create(titulo); - case BANCO_SAFRA: - return AbstractCLBancoSafra.create(titulo); - case BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL: - return AbstractCLBanrisul.create(titulo); - case MERCANTIL_DO_BRASIL: - return AbstractCLMercantilDoBrasil.create(titulo); - case BANCO_DO_ESTADO_DO_ESPIRITO_SANTO: - return AbstractCLBanestes.create(titulo); - case BANCO_RURAL: - return AbstractCLBancoRural.create(titulo); - case BANCO_SANTANDER: - return AbstractCLSantander.create(titulo); - case BANCO_INTEMEDIUM: - return AbstractCLBancoIntermedium.create(titulo); - case BANCO_SICREDI: - return AbstractCLSicredi.create(titulo); - case BANCOOB: - return AbstractCLBancoob.create(titulo); - case CITIBANK: - return AbstractCLBancoCitibank.create(titulo); - case BANCO_DE_BRASILIA: - return AbstractCLBancoDeBrasilia.create(titulo); - case CECRED: - return AbstractCLCecred.create(titulo); - - default: - /* - * Se chegar neste ponto e nenhum campo livre foi definido, então é - * sinal de que existe implementações de campo livre para o banco em - * questão, só que nenhuma destas implementações serviu e a classe - * abstrata responsável por fornecer o campo livre não gerou a - * exceção NotSupportedCampoLivreException. Trata-se de uma mensagem - * genérica que será utilizada somente em último caso. - */ - throw new NotSupportedCampoLivreException( - "Não há implementações de campo livre para o banco " - + titulo.getContaBancaria().getBanco() - .getCodigoDeCompensacaoBACEN().getCodigoFormatado() - + " compatíveis com as " - + "caracteríticas do título informado."); - } - } else { - /* - * Se chegar até este ponto, é sinal de que para o banco em - * questão, apesar de estar definido no EnumBancos, não há - * implementações de campo livre, logo considera-se o banco com - * não suportado. - */ - throw new NotSupportedBancoException(); - } - } catch (CampoLivreException e) { - /* - * Caso seja uma exceção esperada. - */ - throw e; - - } catch (Exception e) { - /* - * Encapsula-se qualquer outra exceção. - */ - throw new CampoLivreException(e); - } - } - - /** - *

            - * Constrói um campo livre após executar os métodos - * {@link AbstractCampoLivre#checkValues(Titulo)} e - * {@link AbstractCampoLivre#addFields(Titulo)}, retornando em seguida esta - * instância pronta para escrita. - *

            - * - * @param titulo - * - * @return a instância pronta para escrita - * - * @since 0.2 - */ - protected final CampoLivre build(Titulo titulo) { - - checkValues(titulo); - - addFields(titulo); - - return this; - } - - /** - *

            - * Usado pelo método {@link AbstractCampoLivre#build(Titulo)} para verificar - * a consistência do campo livre. Se algum inconsistência for verificada, - * este método deverá lança-la. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected abstract void checkValues(Titulo titulo); - - /** - *

            - * Usado pelo método {@link AbstractCampoLivre#build(Titulo)}, adiciona os - * campos do campo livre deixando-o pronto para escrita. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected abstract void addFields(Titulo titulo); - - /** - *

            - * Gera o campo livre a parir dos campos armazenados sem verificar se está - * compatível com número de fields declarado pelo campo livre. Isso implica - * que a string retornada poderá ser menor do que 25 caracteres. - *

            - * - * @return string a partir dos campos contidos até o momento. - * - * @since 0.2 - */ - protected final String writeFields() { - - StringBuilder campoLivreAtual = new StringBuilder(); - - for (IFixedField f : this) { - campoLivreAtual.append(f.write()); - } - - return campoLivreAtual.toString(); - } - - /* - * Validações inicias. - */ - /** - *

            - * Verifica se o título não é nulo, senão lança uma {@code - * IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - private static void checkTituloNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo, "Título não pode ser nulo!"); - } - - /** - *

            - * Verifica se a conta bancária do título não é nula, senão lança uma - * {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - private static void checkContaBancariaNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria(), "Conta bancária do título não pode ser nula!"); - } - - /** - *

            - * Verifica se o banco da conta bancária do título não é nulo, senão lança - * uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - private static void checkBancoNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getBanco(), "Banco da conta bancária do título não pode ser nulo!"); - - boolean expression = isCodigoDeCompensacaoOK(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado()); - - Objects.checkArgument(expression, format("Código de compensação [%s] inválido!", titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado())); - } - - /* - * Validações para subclasses. - */ - /** - *

            - * Verifica se a carteira da conta bancária do título não é nula, senão - * lança uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkCarteiraNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getCarteira(), "Carteira da conta bancária do título não pode ser nula!"); - } - - /** - *

            - * Verifica se o tipo da carteira da conta bancária do título não é nulo, - * senão lança uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkRegistroDaCarteiraNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getCarteira().getTipoCobranca(), "Tipo de cobrança (COM ou SEM registro) da carteira não pode ser nulo!"); - } - - /** - *

            - * Verifica se o código da carteira da conta bancária do título não é nulo e - * se é um número > 0, caso contrário lança uma {@code - * IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkCodigoDaCarteira(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getCarteira().getCodigo(), "Código da carteira não pode ser nulo!"); - - boolean expression = titulo.getContaBancaria().getCarteira().getCodigo() > 0; - - Objects.checkArgument(expression, format("Código da carteira deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getCarteira().getCodigo())); - } - - /** - *

            - * Verifica se o código da carteira da conta bancária do título é um número - * menor que ou igual ao limite informado, caso contrário lança uma {@code - * IllegalArgumentException}. - *

            - * - * @param titulo - * @param limite - Limite máximo permitido - * - * @since 0.2 - */ - protected final static void checkCodigoDaCarteiraMenorOuIgualQue(Titulo titulo, int limite) { - - boolean expression = titulo.getContaBancaria().getCarteira().getCodigo() <= limite; - - Objects.checkArgument(expression, format("Código [%s] da carteira deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getCarteira().getCodigo(), limite)); - } - - /** - *

            - * Verifica se a agência da conta bancária do título não é nula, senão lança - * uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkAgenciaNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getAgencia(), "Agência bancária do título não pode ser nula!"); - } - - /** - *

            - * Verifica se o código do número da agência bancária não é nulo e se é um - * número > 0, caso contrário lança uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkCodigoDaAgencia(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getAgencia().getCodigo(), "Código da agência bancária não pode ser nulo!"); - - boolean expression = titulo.getContaBancaria().getAgencia().getCodigo() > 0; - - Objects.checkArgument(expression, format("Código da agência bancária deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getAgencia().getCodigo())); - } - - /** - *

            - * Verifica se o código do número da agência da conta bancária do título é - * um número menor que ou igual ao limite informado, caso contrário lança - * uma {@code - * IllegalArgumentException}. - *

            - * - * @param titulo - * @param limite - Limite máximo permitido - * - * @since 0.2 - */ - protected final static void checkCodigoDaAgenciaMenorOuIgualQue(Titulo titulo, int limite) { - - boolean expression = titulo.getContaBancaria().getAgencia().getCodigo() <= limite; - - Objects.checkArgument(expression, format("Código [%s] da agência deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getAgencia().getCodigo(), limite)); - } - - /** - *

            - * Verifica se o dígito verificador da agência da conta bancária não é nulo, - * não é vazio e se é numérico, caso contrário lança uma {@code - * IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkDigitoDoCodigoDaAgencia(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), "Dígito verificador da agência bancária não pode ser nulo!"); - Strings.checkNotBlank(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), format("Dígito verificador [\"%s\"] da agência bancária não pode ser vazio!", titulo.getContaBancaria().getAgencia().getDigitoVerificador())); - Strings.checkNotNumeric(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), format("Nesse contexto o dígito verificador [\"%s\"] da agência bancária deve ser numérico!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); - } - - /** - *

            - * Verifica se o número da conta da conta bancária do título não é nulo, - * senão lança uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkNumeroDaContaNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta(), "Número da conta bancária do título não pode ser nulo!"); - } - - /** - *

            - * Verifica se o código do do número da conta bancária não é nulo e se é um - * número > 0, caso contrário lança uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkCodigoDoNumeroDaConta(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), "Código do número da conta bancária não pode ser nulo!"); - - boolean expression = titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta() > 0; - - Objects.checkArgument(expression, format("Código do número da conta bancária deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta())); - } - - /** - *

            - * Verifica se o código do número da conta bancária do título é um número - * menor que ou igual ao limite informado, caso contrário lança uma {@code - * IllegalArgumentException}. - *

            - * - * @param titulo - * @param limite - Limite máximo permitido - * - * @since 0.2 - */ - protected final static void checkCodigoDoNumeroDaContaMenorOuIgualQue(Titulo titulo, int limite) { - - boolean expression = titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta() <= limite; - - Objects.checkArgument(expression, format("Código [%s] do número da conta deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), limite)); - } - - /** - *

            - * Verifica se o dígito verificador do número da conta bancária não é nulo, - * não é vazio e se é numérico, caso contrário lança uma {@code - * IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkDigitoDoCodigoDoNumeroDaConta(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), "Dígito verificador do número da conta bancária não pode ser nulo!"); - Strings.checkNotBlank(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), format("Dígito verificador [\"%s\"] do número da conta bancária não pode ser vazio!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); - Strings.checkNotNumeric(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), format("Nesse contexto o dígito verificador [\"%s\"] do número da conta deve ser numérico!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); - } - - /** - *

            - * Verifica se onosso número do título não é nulo, não é vazio e se é - * numérico, caso contrário lança uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkNossoNumero(Titulo titulo) { - - Objects.checkNotNull(titulo.getNossoNumero(), "Nosso número do título não pode ser nulo!"); - Strings.checkNotBlank(titulo.getNossoNumero(), format("Nosso número [\"%s\"] do título não pode ser vazio!", titulo.getNossoNumero())); - Strings.checkNotNumeric(titulo.getNossoNumero(), format("Nosso número [\"%s\"] do título deve conter somente dígitos numéricos!", titulo.getNossoNumero())); - } - - /** - *

            - * Verifica se o nosso número do título tem o tamanho determinado, caso - * contrário lança uma {@code IllegalArgumentException} com a mensagem - * "Tamanho do nosso número [%s] diferente do esperado [%s]!". - *

            - * - * @param titulo - * @param length - Tamanho que deve ser - * - * @since 0.2 - */ - protected final static void checkTamanhoDoNossoNumero(Titulo titulo, int length) { - - checkTamanhoNossoNumero(titulo, length, format( - "Tamanho [%s] do nosso número [\"%s\"] diferente do esperado [%s]!", - StringUtils.length(titulo.getNossoNumero()), titulo.getNossoNumero(), length)); - } - - /** - *

            - * Verifica se o nosso número do título tem o tamanho determinado, caso - * contrário lança uma {@code IllegalArgumentException} com a mensagem - * determinada. - *

            - * - * @param titulo - * @param length - Tamanho que deve ser - * @param msg - Mensagem para erro - * - * @since 0.2 - */ - protected final static void checkTamanhoNossoNumero(Titulo titulo, int length, String msg) { - - Objects.checkArgument(titulo.getNossoNumero().length() == length, msg); - } - - /** - *

            - * Verifica se o dígito verificador do nosso número do título não é nulo, - * não é vazio e se é numérico (natural positivo), caso contrário lança uma - * {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkDigitoDoNossoNumero(Titulo titulo) { - - Objects.checkNotNull(titulo.getDigitoDoNossoNumero(), "Dígito verificador do nosso número do título não pode ser nulo!"); - Strings.checkNotBlank(titulo.getDigitoDoNossoNumero(), format("Dígito verificador [\"%s\"] do nosso número do título não pode ser vazio!", titulo.getDigitoDoNossoNumero())); - Strings.checkNotNumeric(titulo.getDigitoDoNossoNumero(), format("Nesse contexto o dígito verificador [\"%s\"] do nosso número deve ser um número inteiro positivo!", titulo.getDigitoDoNossoNumero())); - } - - /** - *

            - * Verifica se o dígito do nosso número do título tem o tamanho determinado, - * caso contrário lança uma {@code IllegalArgumentException} com a mensagem - * "Tamanho [%s] do dígito do nosso número [\"%s\"] diferente do - * esperado [%s]!". - *

            - * - * @param titulo - * @param length - Tamanho que deve ser - * - * @since 0.2 - */ - protected final static void checkTamanhoDigitoDoNossoNumero(Titulo titulo, int length) { - - checkTamanhoDigitoDoNossoNumero(titulo, length, format( - "Tamanho [%s] do dígito do nosso número [\"%s\"] diferente do esperado [%s]!", - StringUtils.length(titulo.getDigitoDoNossoNumero()), titulo.getDigitoDoNossoNumero(), length)); - } - - /** - *

            - * Verifica se o dígito do nosso número do título tem o tamanho determinado, - * caso contrário lança uma {@code IllegalArgumentException} com a mensagem - * determinada. - *

            - * - * @param titulo - * @param length - Tamanho que deve ser - * @param msg - Mensagem para erro - * - * @since 0.2 - */ - protected final static void checkTamanhoDigitoDoNossoNumero(Titulo titulo, int length, String msg) { - - Objects.checkArgument(titulo.getDigitoDoNossoNumero().length() == length, msg); - } - - /** - *

            - * Verifica se o valor do título não é nulo e é positivo, caso contrário - * lança uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkValor(Titulo titulo) { - - Objects.checkNotNull(titulo.getValor(), "Valor do título não pode ser nulo!"); - Objects.checkArgument(titulo.getValor().compareTo(ZERO) >= 0, format("O valor do título deve ser um número positivo ou zero e não [%s].", titulo.getValor())); - } - - /** - *

            - * Verifica se o título contém {@code ParametrosBancariosMap} e se este - * contém um valor não é nulo do parâmetro determinado, caso contrário lança - * uma {@code IllegalArgumentException}. - *

            - * - * @param titulo - * @param param Parâmetro a ser validado - * - * @since 0.2 - */ - protected final static void checkParametroBancario(Titulo titulo, ParametroBancario param) { - - Objects.checkNotNull(titulo.getParametrosBancarios(), format("O parâmetro bancário [\"%s\"] é necessário! [titulo.getParametrosBancarios() == null]", param)); - Objects.checkArgument(titulo.getParametrosBancarios().contemComNome(param), format("Parâmetro bancário [\"%s\"] não encontrado!", param)); - Objects.checkNotNull(titulo.getParametrosBancarios().getValor(param), format("Parâmetro bancário [\"%s\"] não contém valor!", param)); - } - - /** - *

            - * Verifica se o título com o parâmetro informado é um número inteiro menor - * que ou igual ao limite informado, caso contrário lança uma - * {@code IllegalArgumentException}. - *

            - * - * @param titulo - * @param param Parâmetro a ser validado - * @param limite Limite máximo permitido - * - * @since 0.2 - */ - protected final static void checkParametroBancarioMenorOuIgualQue(Titulo titulo, ParametroBancario param, int limite) { - - checkParametroBancario(titulo, param); - - int valor = titulo.getParametrosBancarios().getValor(param).intValue(); - - boolean expression = valor <= limite; - - Objects.checkArgument(expression, format("Parâmetro [%s] com valor [%s] deve ser um número menor que ou igual a [%s].", param, valor, limite)); - } - - /** - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - - return Objects.toString(this); - } - -} +/* + * 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:07:11 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:07:11 + * + */ +package org.jrimum.bopepo.campolivre; + +import static java.lang.String.format; +import static java.math.BigDecimal.ZERO; +import static org.jrimum.domkee.banco.Banco.isCodigoDeCompensacaoOK; + +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.banco.ParametroBancario; +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.BlockOfFields; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.Strings; +import org.jrimum.texgit.IFixedField; + +/** + *

            + * Esta classe é responsável por determinar a interface campo livre e também + * determinar qual implementação de campo livre se aplica a um determinado + * título. + *

            + * + *

            + * Uma outra forma de analisar esta classe é sob o prisma de uma Abstract + * Factory. + *

            + * + *

            + *

            + *
            Field Livre: + *
            É um espaço reservado no código de barras e a sua implementação varia de + * banco para banco.
            + *
            + *

            + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Lukas + * Antunes - Colaborador com o banco Intermedium (077) + * @author Fernando Dias - + * Colaborador com o banco Rural (453) + * @author Paulo Porto - Colaborador com o + * Banco do Nordeste do Brasil (004). + * @author Fabiano Carrijo - + * Colaborador com o Banco Citibank (756). + * @author Douglas Ramiro - + * Colaborador com o Banco de Brasília (070). + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCampoLivre extends BlockOfFields implements CampoLivre { + + /** + * {@code serialVersionUID = 4605730904122445595L} + */ + private static final long serialVersionUID = 4605730904122445595L; + + /** + * Looger. + */ + protected static Logger log = Logger.getLogger(Objects.class); + + /** + * Nosso número com 7 posições. + */ + static final int NN7 = 7; + + /** + * Nosso número com 8 posições. + */ + static final int NN8 = 8; + + /** + * Nosso número com 9 posições. + */ + static final int NN9 = 9; + + /** + * Nosso número com 10 posições. + */ + static final int NN10 = 10; + + /** + * Nosso número com 11 posições. + */ + static final int NN11 = 11; + + /** + * Nosso número com 14 posições. + */ + static final int NN14 = 14; + + /** + * Nosso número com 15 posições. + */ + static final int NN15 = 15; + + /** + * Nosso número com 17 posições. + */ + static final int NN17 = 17; + + /** + * Subclasses não precisam definir o tamanho. + */ + @SuppressWarnings("unused") + private AbstractCampoLivre(Integer fieldsLength, Integer stringLength) { + super(null, null); + } + + /** + * Cria um campo livre com um determinado número de campos + * + * @param fieldsLength - Número de campos + */ + protected AbstractCampoLivre(Integer fieldsLength) { + super(); + setLength(CampoLivre.STRING_LENGTH); + setSize(fieldsLength); + } + + /** + * Cria um campo livre a partir dos dados contidos no título fornecido. + * + * @param titulo com todos os dados para a geração do campo livre + * @return instância de campo livre ou nulo. + * @throws NotSupportedBancoException Caso o banco informado na conta + * bancária não tenha nenhuma implementação de campo livre. + * @throws NotSupportedCampoLivreException Caso exista implementações de + * campo livre para o banco informa na conta bancária, mas nenhuma dessas + * implementações foram adequadas para os dados do título. + * @throws CampoLivreException Caso ocorra algum problema na geração do + * campo livre. + */ + protected static CampoLivre create(Titulo titulo) throws NotSupportedBancoException, + NotSupportedCampoLivreException, CampoLivreException { + + if (log.isTraceEnabled()) { + + log.trace("Instanciando Campo livre"); + } + if (log.isDebugEnabled()) { + + log.debug("titulo instance : " + titulo); + } + + try { + + checkTituloNotNull(titulo); + checkContaBancariaNotNull(titulo); + checkBancoNotNull(titulo); + + if (log.isDebugEnabled()) { + + log.debug(format("Campo Livre do Banco: %s", titulo.getContaBancaria().getBanco().getNome())); + } + + if (BancosSuportados.isSuportado(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado())) { + + final BancosSuportados banco = BancosSuportados.suportados.get(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado()); + + switch (banco) { + + case BANCO_BRADESCO: + return AbstractCLBradesco.create(titulo); + case BANCO_DO_BRASIL: + return AbstractCLBancoDoBrasil.create(titulo); + case BANCO_DO_NORDESTE_DO_BRASIL: + return AbstractCLBancoDoNordesteDoBrasil.create(titulo); + case BANCO_ABN_AMRO_REAL: + return AbstractCLBancoReal.create(titulo); + case CAIXA_ECONOMICA_FEDERAL: + return AbstractCLCaixaEconomicaFederal.create(titulo); + case HSBC: + return AbstractCLHSBC.create(titulo); + case UNIBANCO: + return AbstractCLUnibanco.create(titulo); + case BANCO_ITAU: + return AbstractCLItau.create(titulo); + case BANCO_SAFRA: + return AbstractCLBancoSafra.create(titulo); + case BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL: + return AbstractCLBanrisul.create(titulo); + case MERCANTIL_DO_BRASIL: + return AbstractCLMercantilDoBrasil.create(titulo); + case BANCO_DO_ESTADO_DO_ESPIRITO_SANTO: + return AbstractCLBanestes.create(titulo); + case BANCO_RURAL: + return AbstractCLBancoRural.create(titulo); + case BANCO_SANTANDER: + return AbstractCLSantander.create(titulo); + case BANCO_INTEMEDIUM: + return AbstractCLBancoIntermedium.create(titulo); + case BANCO_SICREDI: + return AbstractCLSicredi.create(titulo); + case BANCOOB: + return AbstractCLBancoob.create(titulo); + case CITIBANK: + return AbstractCLBancoCitibank.create(titulo); + case BANCO_DE_BRASILIA: + return AbstractCLBancoDeBrasilia.create(titulo); + case CECRED: + return AbstractCLCecred.create(titulo); + + default: + /* + * Se chegar neste ponto e nenhum campo livre foi definido, então é + * sinal de que existe implementações de campo livre para o banco em + * questão, só que nenhuma destas implementações serviu e a classe + * abstrata responsável por fornecer o campo livre não gerou a + * exceção NotSupportedCampoLivreException. Trata-se de uma mensagem + * genérica que será utilizada somente em último caso. + */ + throw new NotSupportedCampoLivreException( + "Não há implementações de campo livre para o banco " + + titulo.getContaBancaria().getBanco() + .getCodigoDeCompensacaoBACEN().getCodigoFormatado() + + " compatíveis com as " + + "caracteríticas do título informado."); + } + } else { + /* + * Se chegar até este ponto, é sinal de que para o banco em + * questão, apesar de estar definido no EnumBancos, não há + * implementações de campo livre, logo considera-se o banco com + * não suportado. + */ + throw new NotSupportedBancoException(); + } + } catch (CampoLivreException e) { + /* + * Caso seja uma exceção esperada. + */ + throw e; + + } catch (Exception e) { + /* + * Encapsula-se qualquer outra exceção. + */ + throw new CampoLivreException(e); + } + } + + /** + *

            + * Constrói um campo livre após executar os métodos + * {@link AbstractCampoLivre#checkValues(Titulo)} e + * {@link AbstractCampoLivre#addFields(Titulo)}, retornando em seguida esta + * instância pronta para escrita. + *

            + * + * @param titulo + * + * @return a instância pronta para escrita + * + * @since 0.2 + */ + protected final CampoLivre build(Titulo titulo) { + + checkValues(titulo); + + addFields(titulo); + + return this; + } + + /** + *

            + * Usado pelo método {@link AbstractCampoLivre#build(Titulo)} para verificar + * a consistência do campo livre. Se algum inconsistência for verificada, + * este método deverá lança-la. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected abstract void checkValues(Titulo titulo); + + /** + *

            + * Usado pelo método {@link AbstractCampoLivre#build(Titulo)}, adiciona os + * campos do campo livre deixando-o pronto para escrita. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected abstract void addFields(Titulo titulo); + + /** + *

            + * Gera o campo livre a parir dos campos armazenados sem verificar se está + * compatível com número de fields declarado pelo campo livre. Isso implica + * que a string retornada poderá ser menor do que 25 caracteres. + *

            + * + * @return string a partir dos campos contidos até o momento. + * + * @since 0.2 + */ + protected final String writeFields() { + + StringBuilder campoLivreAtual = new StringBuilder(); + + for (IFixedField f : this) { + campoLivreAtual.append(f.write()); + } + + return campoLivreAtual.toString(); + } + + /* + * Validações inicias. + */ + /** + *

            + * Verifica se o título não é nulo, senão lança uma {@code + * IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + private static void checkTituloNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo, "Título não pode ser nulo!"); + } + + /** + *

            + * Verifica se a conta bancária do título não é nula, senão lança uma + * {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + private static void checkContaBancariaNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria(), "Conta bancária do título não pode ser nula!"); + } + + /** + *

            + * Verifica se o banco da conta bancária do título não é nulo, senão lança + * uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + private static void checkBancoNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getBanco(), "Banco da conta bancária do título não pode ser nulo!"); + + boolean expression = isCodigoDeCompensacaoOK(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado()); + + Objects.checkArgument(expression, format("Código de compensação [%s] inválido!", titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado())); + } + + /* + * Validações para subclasses. + */ + /** + *

            + * Verifica se a carteira da conta bancária do título não é nula, senão + * lança uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkCarteiraNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getCarteira(), "Carteira da conta bancária do título não pode ser nula!"); + } + + /** + *

            + * Verifica se o tipo da carteira da conta bancária do título não é nulo, + * senão lança uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkRegistroDaCarteiraNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getCarteira().getTipoCobranca(), "Tipo de cobrança (COM ou SEM registro) da carteira não pode ser nulo!"); + } + + /** + *

            + * Verifica se o código da carteira da conta bancária do título não é nulo e + * se é um número > 0, caso contrário lança uma {@code + * IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkCodigoDaCarteira(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getCarteira().getCodigo(), "Código da carteira não pode ser nulo!"); + + boolean expression = titulo.getContaBancaria().getCarteira().getCodigo() > 0; + + Objects.checkArgument(expression, format("Código da carteira deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getCarteira().getCodigo())); + } + + /** + *

            + * Verifica se o código da carteira da conta bancária do título é um número + * menor que ou igual ao limite informado, caso contrário lança uma {@code + * IllegalArgumentException}. + *

            + * + * @param titulo + * @param limite - Limite máximo permitido + * + * @since 0.2 + */ + protected final static void checkCodigoDaCarteiraMenorOuIgualQue(Titulo titulo, int limite) { + + boolean expression = titulo.getContaBancaria().getCarteira().getCodigo() <= limite; + + Objects.checkArgument(expression, format("Código [%s] da carteira deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getCarteira().getCodigo(), limite)); + } + + /** + *

            + * Verifica se a agência da conta bancária do título não é nula, senão lança + * uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkAgenciaNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getAgencia(), "Agência bancária do título não pode ser nula!"); + } + + /** + *

            + * Verifica se o código do número da agência bancária não é nulo e se é um + * número > 0, caso contrário lança uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkCodigoDaAgencia(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getAgencia().getCodigo(), "Código da agência bancária não pode ser nulo!"); + + boolean expression = titulo.getContaBancaria().getAgencia().getCodigo() > 0; + + Objects.checkArgument(expression, format("Código da agência bancária deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getAgencia().getCodigo())); + } + + /** + *

            + * Verifica se o código do número da agência da conta bancária do título é + * um número menor que ou igual ao limite informado, caso contrário lança + * uma {@code + * IllegalArgumentException}. + *

            + * + * @param titulo + * @param limite - Limite máximo permitido + * + * @since 0.2 + */ + protected final static void checkCodigoDaAgenciaMenorOuIgualQue(Titulo titulo, int limite) { + + boolean expression = titulo.getContaBancaria().getAgencia().getCodigo() <= limite; + + Objects.checkArgument(expression, format("Código [%s] da agência deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getAgencia().getCodigo(), limite)); + } + + /** + *

            + * Verifica se o dígito verificador da agência da conta bancária não é nulo, + * não é vazio e se é numérico, caso contrário lança uma {@code + * IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkDigitoDoCodigoDaAgencia(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), "Dígito verificador da agência bancária não pode ser nulo!"); + Strings.checkNotBlank(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), format("Dígito verificador [\"%s\"] da agência bancária não pode ser vazio!", titulo.getContaBancaria().getAgencia().getDigitoVerificador())); + Strings.checkNotNumeric(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), format("Nesse contexto o dígito verificador [\"%s\"] da agência bancária deve ser numérico!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); + } + + /** + *

            + * Verifica se o número da conta da conta bancária do título não é nulo, + * senão lança uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkNumeroDaContaNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta(), "Número da conta bancária do título não pode ser nulo!"); + } + + /** + *

            + * Verifica se o código do do número da conta bancária não é nulo e se é um + * número > 0, caso contrário lança uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkCodigoDoNumeroDaConta(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), "Código do número da conta bancária não pode ser nulo!"); + + boolean expression = titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta() > 0; + + Objects.checkArgument(expression, format("Código do número da conta bancária deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta())); + } + + /** + *

            + * Verifica se o código do número da conta bancária do título é um número + * menor que ou igual ao limite informado, caso contrário lança uma {@code + * IllegalArgumentException}. + *

            + * + * @param titulo + * @param limite - Limite máximo permitido + * + * @since 0.2 + */ + protected final static void checkCodigoDoNumeroDaContaMenorOuIgualQue(Titulo titulo, int limite) { + + boolean expression = titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta() <= limite; + + Objects.checkArgument(expression, format("Código [%s] do número da conta deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), limite)); + } + + /** + *

            + * Verifica se o dígito verificador do número da conta bancária não é nulo, + * não é vazio e se é numérico, caso contrário lança uma {@code + * IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkDigitoDoCodigoDoNumeroDaConta(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), "Dígito verificador do número da conta bancária não pode ser nulo!"); + Strings.checkNotBlank(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), format("Dígito verificador [\"%s\"] do número da conta bancária não pode ser vazio!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); + Strings.checkNotNumeric(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), format("Nesse contexto o dígito verificador [\"%s\"] do número da conta deve ser numérico!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); + } + + /** + *

            + * Verifica se onosso número do título não é nulo, não é vazio e se é + * numérico, caso contrário lança uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkNossoNumero(Titulo titulo) { + + Objects.checkNotNull(titulo.getNossoNumero(), "Nosso número do título não pode ser nulo!"); + Strings.checkNotBlank(titulo.getNossoNumero(), format("Nosso número [\"%s\"] do título não pode ser vazio!", titulo.getNossoNumero())); + Strings.checkNotNumeric(titulo.getNossoNumero(), format("Nosso número [\"%s\"] do título deve conter somente dígitos numéricos!", titulo.getNossoNumero())); + } + + /** + *

            + * Verifica se o nosso número do título tem o tamanho determinado, caso + * contrário lança uma {@code IllegalArgumentException} com a mensagem + * "Tamanho do nosso número [%s] diferente do esperado [%s]!". + *

            + * + * @param titulo + * @param length - Tamanho que deve ser + * + * @since 0.2 + */ + protected final static void checkTamanhoDoNossoNumero(Titulo titulo, int length) { + + checkTamanhoNossoNumero(titulo, length, format( + "Tamanho [%s] do nosso número [\"%s\"] diferente do esperado [%s]!", + StringUtils.length(titulo.getNossoNumero()), titulo.getNossoNumero(), length)); + } + + /** + *

            + * Verifica se o nosso número do título tem o tamanho determinado, caso + * contrário lança uma {@code IllegalArgumentException} com a mensagem + * determinada. + *

            + * + * @param titulo + * @param length - Tamanho que deve ser + * @param msg - Mensagem para erro + * + * @since 0.2 + */ + protected final static void checkTamanhoNossoNumero(Titulo titulo, int length, String msg) { + + Objects.checkArgument(titulo.getNossoNumero().length() == length, msg); + } + + /** + *

            + * Verifica se o dígito verificador do nosso número do título não é nulo, + * não é vazio e se é numérico (natural positivo), caso contrário lança uma + * {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkDigitoDoNossoNumero(Titulo titulo) { + + Objects.checkNotNull(titulo.getDigitoDoNossoNumero(), "Dígito verificador do nosso número do título não pode ser nulo!"); + Strings.checkNotBlank(titulo.getDigitoDoNossoNumero(), format("Dígito verificador [\"%s\"] do nosso número do título não pode ser vazio!", titulo.getDigitoDoNossoNumero())); + Strings.checkNotNumeric(titulo.getDigitoDoNossoNumero(), format("Nesse contexto o dígito verificador [\"%s\"] do nosso número deve ser um número inteiro positivo!", titulo.getDigitoDoNossoNumero())); + } + + /** + *

            + * Verifica se o dígito do nosso número do título tem o tamanho determinado, + * caso contrário lança uma {@code IllegalArgumentException} com a mensagem + * "Tamanho [%s] do dígito do nosso número [\"%s\"] diferente do + * esperado [%s]!". + *

            + * + * @param titulo + * @param length - Tamanho que deve ser + * + * @since 0.2 + */ + protected final static void checkTamanhoDigitoDoNossoNumero(Titulo titulo, int length) { + + checkTamanhoDigitoDoNossoNumero(titulo, length, format( + "Tamanho [%s] do dígito do nosso número [\"%s\"] diferente do esperado [%s]!", + StringUtils.length(titulo.getDigitoDoNossoNumero()), titulo.getDigitoDoNossoNumero(), length)); + } + + /** + *

            + * Verifica se o dígito do nosso número do título tem o tamanho determinado, + * caso contrário lança uma {@code IllegalArgumentException} com a mensagem + * determinada. + *

            + * + * @param titulo + * @param length - Tamanho que deve ser + * @param msg - Mensagem para erro + * + * @since 0.2 + */ + protected final static void checkTamanhoDigitoDoNossoNumero(Titulo titulo, int length, String msg) { + + Objects.checkArgument(titulo.getDigitoDoNossoNumero().length() == length, msg); + } + + /** + *

            + * Verifica se o valor do título não é nulo e é positivo, caso contrário + * lança uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkValor(Titulo titulo) { + + Objects.checkNotNull(titulo.getValor(), "Valor do título não pode ser nulo!"); + Objects.checkArgument(titulo.getValor().compareTo(ZERO) >= 0, format("O valor do título deve ser um número positivo ou zero e não [%s].", titulo.getValor())); + } + + /** + *

            + * Verifica se o título contém {@code ParametrosBancariosMap} e se este + * contém um valor não é nulo do parâmetro determinado, caso contrário lança + * uma {@code IllegalArgumentException}. + *

            + * + * @param titulo + * @param param Parâmetro a ser validado + * + * @since 0.2 + */ + protected final static void checkParametroBancario(Titulo titulo, ParametroBancario param) { + + Objects.checkNotNull(titulo.getParametrosBancarios(), format("O parâmetro bancário [\"%s\"] é necessário! [titulo.getParametrosBancarios() == null]", param)); + Objects.checkArgument(titulo.getParametrosBancarios().contemComNome(param), format("Parâmetro bancário [\"%s\"] não encontrado!", param)); + Objects.checkNotNull(titulo.getParametrosBancarios().getValor(param), format("Parâmetro bancário [\"%s\"] não contém valor!", param)); + } + + /** + *

            + * Verifica se o título com o parâmetro informado é um número inteiro menor + * que ou igual ao limite informado, caso contrário lança uma + * {@code IllegalArgumentException}. + *

            + * + * @param titulo + * @param param Parâmetro a ser validado + * @param limite Limite máximo permitido + * + * @since 0.2 + */ + protected final static void checkParametroBancarioMenorOuIgualQue(Titulo titulo, ParametroBancario param, int limite) { + + checkParametroBancario(titulo, param); + + int valor = titulo.getParametrosBancarios().getValor(param).intValue(); + + boolean expression = valor <= limite; + + Objects.checkArgument(expression, format("Parâmetro [%s] com valor [%s] deve ser um número menor que ou igual a [%s].", param, valor, limite)); + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + return Objects.toString(this); + } + +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java b/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java index fad80283..727fd8f8 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java @@ -1,218 +1,218 @@ -/* - * Copyright 2010 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: 16/12/2010 - 13:24:00 - * - * ================================================================================ - * - * Direitos autorais 2010 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Created at: 16/12/2010 - 13:24:00 - * - */ - - -package org.jrimum.bopepo.campolivre; - -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; - -/** - *

            - * O campo livre do Banco do Nordeste deve seguir esta forma: - *

            - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
            PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
            20-2349(4)Agência Cedente (sem o digito verificador, completar com zeros à esquerda quando necessário)Código da Agência (sem dígito)
            24-3079(7)Conta do Cedente (sem o dígito verificador, completar com zeros à esquerda quando necessário)Conta do Cedente (sem dígito)
            31-3119(1)Dígito da Conta do CedenteDígito da Conta do Cedente
            32-3879(7)Nosso Número (sem o dígito verificador, completar com zeros à esquerda quando necessário)Nosso Número (No. Bancário) (sem dígito)
            39-3919(1)Dígito do Nosso NúmeroDígito do Nosso Número (No. Bancário)
            40-4129(2)Carteira (utilizar o código da carteira)Carteira (Tipo de Operação)
            42-4439(3)Preenchar campo com ZEROS.Campo zerado
            - *
            - * - * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre - * - * @author Gilmar P.S.L. - * @author Misael Barreto - * @author Paulo Porto - * - * @since 0.2 - * - * @version 0.2 - */ -class CLBancoDoNordesteDoBrasil extends AbstractCLBancoDoNordesteDoBrasil { - - /** - * {@code serialVersionUID = 5203223333877548162L} - */ - private static final long serialVersionUID = 5203223333877548162L; - - /** - * Número de campos = 7. - */ - private static final Integer FIELDS_LENGTH = Integer.valueOf(7); - - /** - * Tamanho do campo Agência = 4. - */ - private static final Integer AGENCIA_LENGTH = Integer.valueOf(4); - - /** - * Tamanho do campo Conta = 7. - */ - private static final Integer CONTA_LENGTH = Integer.valueOf(7); - - /** - * Tamanho do campo Dígito da Conta = 1. - */ - private static final Integer DIGITO_CONTA_LENGTH = Integer.valueOf(1); - - - /** - * Tamanho do campo Nosso Número = 7. - */ - private static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(7); - - /** - * Tamanho do campo Dígito do Nosso Número = 1. - */ - private static final Integer DIGITO_NOSSO_NUMERO_LENGTH = Integer.valueOf(1); - - /** - * Tamanho do campo Carteira = 2. - */ - private static final Integer CARTEIRA_LENGTH = Integer.valueOf(2); - - - /** - * Tamanho do campo "Campo Zerado" = 3. - */ - private static final Integer CAMPO_ZERADO_LENGTH = Integer.valueOf(3); - - /** - * Valor do campo "Campo Zerado" = 0. - */ - protected static final Integer CAMPO_ZERADO_VALUE = Integer.valueOf(0); - - /** - *

            - * Cria um campo livre instanciando o número de fields ({@code FIELDS_LENGTH}) deste campo. - *

            - * - * @since 0.2 - */ - protected CLBancoDoNordesteDoBrasil() { - super(FIELDS_LENGTH); - } - - /** - * {@inheritDoc} - * - * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#checkValues(org.jrimum.domkee.financeiro.banco.febraban.Titulo) - */ - @Override - protected void checkValues(Titulo titulo){ - - checkAgenciaNotNull(titulo); - checkCodigoDaAgencia(titulo); - checkCodigoDaAgenciaMenorOuIgualQue(titulo, 9999); - checkNumeroDaContaNotNull(titulo); - checkCodigoDoNumeroDaConta(titulo); - checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 9999999); - checkDigitoDoCodigoDoNumeroDaConta(titulo); - checkNossoNumero(titulo); - checkDigitoDoNossoNumero(titulo); - checkCarteiraNotNull(titulo); - checkCodigoDaCarteira(titulo); - checkCodigoDaCarteiraMenorOuIgualQue(titulo, 99); - } - - /** - * {@inheritDoc} - * - * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#addFields(org.jrimum.domkee.financeiro.banco.febraban.Titulo) - */ - @Override - protected void addFields(Titulo titulo) { - - this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), AGENCIA_LENGTH, Fillers.ZERO_LEFT)); - this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), CONTA_LENGTH, Fillers.ZERO_LEFT)); - this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), DIGITO_CONTA_LENGTH, Fillers.ZERO_LEFT)); - this.add(new FixedField(titulo.getNossoNumero(), NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); - this.add(new FixedField(titulo.getDigitoDoNossoNumero(), DIGITO_NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); - this.add(new FixedField(titulo.getContaBancaria().getCarteira().getCodigo(), CARTEIRA_LENGTH, Fillers.ZERO_LEFT)); - this.add(new FixedField(CAMPO_ZERADO_VALUE, CAMPO_ZERADO_LENGTH, Fillers.ZERO_LEFT)); - } -} +/* + * Copyright 2010 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: 16/12/2010 - 13:24:00 + * + * ================================================================================ + * + * Direitos autorais 2010 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Created at: 16/12/2010 - 13:24:00 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; + +/** + *

            + * O campo livre do Banco do Nordeste deve seguir esta forma: + *

            + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
            PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
            20-2349(4)Agência Cedente (sem o digito verificador, completar com zeros à esquerda quando necessário)Código da Agência (sem dígito)
            24-3079(7)Conta do Cedente (sem o dígito verificador, completar com zeros à esquerda quando necessário)Conta do Cedente (sem dígito)
            31-3119(1)Dígito da Conta do CedenteDígito da Conta do Cedente
            32-3879(7)Nosso Número (sem o dígito verificador, completar com zeros à esquerda quando necessário)Nosso Número (No. Bancário) (sem dígito)
            39-3919(1)Dígito do Nosso NúmeroDígito do Nosso Número (No. Bancário)
            40-4129(2)Carteira (utilizar o código da carteira)Carteira (Tipo de Operação)
            42-4439(3)Preenchar campo com ZEROS.Campo zerado
            + *
            + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Paulo Porto + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBancoDoNordesteDoBrasil extends AbstractCLBancoDoNordesteDoBrasil { + + /** + * {@code serialVersionUID = 5203223333877548162L} + */ + private static final long serialVersionUID = 5203223333877548162L; + + /** + * Número de campos = 7. + */ + private static final Integer FIELDS_LENGTH = Integer.valueOf(7); + + /** + * Tamanho do campo Agência = 4. + */ + private static final Integer AGENCIA_LENGTH = Integer.valueOf(4); + + /** + * Tamanho do campo Conta = 7. + */ + private static final Integer CONTA_LENGTH = Integer.valueOf(7); + + /** + * Tamanho do campo Dígito da Conta = 1. + */ + private static final Integer DIGITO_CONTA_LENGTH = Integer.valueOf(1); + + + /** + * Tamanho do campo Nosso Número = 7. + */ + private static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(7); + + /** + * Tamanho do campo Dígito do Nosso Número = 1. + */ + private static final Integer DIGITO_NOSSO_NUMERO_LENGTH = Integer.valueOf(1); + + /** + * Tamanho do campo Carteira = 2. + */ + private static final Integer CARTEIRA_LENGTH = Integer.valueOf(2); + + + /** + * Tamanho do campo "Campo Zerado" = 3. + */ + private static final Integer CAMPO_ZERADO_LENGTH = Integer.valueOf(3); + + /** + * Valor do campo "Campo Zerado" = 0. + */ + protected static final Integer CAMPO_ZERADO_VALUE = Integer.valueOf(0); + + /** + *

            + * Cria um campo livre instanciando o número de fields ({@code FIELDS_LENGTH}) deste campo. + *

            + * + * @since 0.2 + */ + protected CLBancoDoNordesteDoBrasil() { + super(FIELDS_LENGTH); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#checkValues(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + */ + @Override + protected void checkValues(Titulo titulo){ + + checkAgenciaNotNull(titulo); + checkCodigoDaAgencia(titulo); + checkCodigoDaAgenciaMenorOuIgualQue(titulo, 9999); + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 9999999); + checkDigitoDoCodigoDoNumeroDaConta(titulo); + checkNossoNumero(titulo); + checkDigitoDoNossoNumero(titulo); + checkCarteiraNotNull(titulo); + checkCodigoDaCarteira(titulo); + checkCodigoDaCarteiraMenorOuIgualQue(titulo, 99); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#addFields(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + */ + @Override + protected void addFields(Titulo titulo) { + + this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), AGENCIA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), CONTA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), DIGITO_CONTA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getNossoNumero(), NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getDigitoDoNossoNumero(), DIGITO_NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getCarteira().getCodigo(), CARTEIRA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(CAMPO_ZERADO_VALUE, CAMPO_ZERADO_LENGTH, Fillers.ZERO_LEFT)); + } +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLBancoReal.java b/src/main/java/org/jrimum/bopepo/campolivre/CLBancoReal.java index 4c088afb..da134a26 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLBancoReal.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLBancoReal.java @@ -1,194 +1,194 @@ -/* - * 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:09:11 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:09:11 - * - */ - - -package org.jrimum.bopepo.campolivre; - -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Strings; -import org.jrimum.vallia.Modulo; -import org.jrimum.vallia.TipoDeModulo; - -/** - *

            *** COBRANÇA SEM REGISTRO ***

            - * O campo livre do Banco Real deve seguir esta forma: - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
            Posição TamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
            20-2349(4)Código da agência (sem dígito)Agência - Código da agência do cedente
            24-3079(7) Código da conta (sem dígito)Conta - Número da conta do cedente
            31-3119(1) Dígito verificadorDigitão - Dígito de cobrança
            32-44139(13) Número do título(máximo de 13 posições numéricas)Número do banco - Número do título no banco
            - * - * @author Gilmar P.S.L. - * @author Misael Barreto - * @author Rômulo Augusto - * - * @since 0.2 - * - * @version 0.2 - */ - -class CLBancoReal extends AbstractCLBancoReal { - - /** - * - */ - private static final long serialVersionUID = -5294809022535972391L; - - private static final Modulo modulo10 = new Modulo(TipoDeModulo.MODULO10); - - /** - * Tamanho deste campo. - */ - private static final Integer FIELDS_LENGTH = 4; - - /** - *

            - * Dado um título, cria um campo livre para o padrão do Banco Real. - *

            - * @param titulo título com as informações para geração do campo livre - */ - CLBancoReal(Titulo titulo) { - - super(FIELDS_LENGTH); - - this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); - this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), 7, Fillers.ZERO_LEFT)); - this.add(new FixedField(calculeDigitoDaPosicao31(titulo.getNossoNumero(), titulo.getContaBancaria().getAgencia().getCodigo(), titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta()), 1, Fillers.ZERO_LEFT)); - this.add(new FixedField(Strings.eliminateSymbols(titulo.getNossoNumero()), 13, Fillers.ZERO_LEFT)); - } - - /** - *

            - * Calcula o Dígito da posição 31 deste campo livre (CLBancoReal). - *

            - * - *

            - * No cálculo do dígito da posição 31 são considerados, para a obtenção do - * dígito, os dados {[NOSSO NÚMERO],[AGÊNCIA],[CONTA]} calculado pelos - * critérios do Módulo 10. - *

            - *
            Exemplo:
            - * - *
            - * - * - * - * - * - * - * - * - * - * - * - * - *
            Nosso Número1234567890123
            Agência4444
            Conta Corrente7777777
            - * - * @param nossoNumero - * @param agencia - * @param contaCorrente - * @return Dígito verficador calculado - * - * @see org.jrimum.vallia.Modulo - * - * @since 0.2 - */ - private String calculeDigitoDaPosicao31(String nossoNumero, - Integer agencia, Integer contaCorrente) { - - StringBuilder formula = new StringBuilder(); - String dV = null; - - formula.append(Fillers.ZERO_LEFT.fill(nossoNumero, 13)); - formula.append(Fillers.ZERO_LEFT.fill(agencia, 4)); - formula.append(Fillers.ZERO_LEFT.fill(contaCorrente, 7)); - - int restoDivisao = modulo10.calcule(formula.toString()); - - int restoSubtracao = (10 - restoDivisao); - - if (restoSubtracao == 10) { - dV = "0"; - } else { - - dV = "" + restoSubtracao; - } - - return dV; - } - - @Override - protected void addFields(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - @Override - protected void checkValues(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } -} +/* + * 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:09:11 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:09:11 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Strings; +import org.jrimum.vallia.Modulo; +import org.jrimum.vallia.TipoDeModulo; + +/** + *

            *** COBRANÇA SEM REGISTRO ***

            + * O campo livre do Banco Real deve seguir esta forma: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
            Posição TamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
            20-2349(4)Código da agência (sem dígito)Agência - Código da agência do cedente
            24-3079(7) Código da conta (sem dígito)Conta - Número da conta do cedente
            31-3119(1) Dígito verificadorDigitão - Dígito de cobrança
            32-44139(13) Número do título(máximo de 13 posições numéricas)Número do banco - Número do título no banco
            + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ + +class CLBancoReal extends AbstractCLBancoReal { + + /** + * + */ + private static final long serialVersionUID = -5294809022535972391L; + + private static final Modulo modulo10 = new Modulo(TipoDeModulo.MODULO10); + + /** + * Tamanho deste campo. + */ + private static final Integer FIELDS_LENGTH = 4; + + /** + *

            + * Dado um título, cria um campo livre para o padrão do Banco Real. + *

            + * @param titulo título com as informações para geração do campo livre + */ + CLBancoReal(Titulo titulo) { + + super(FIELDS_LENGTH); + + this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), 7, Fillers.ZERO_LEFT)); + this.add(new FixedField(calculeDigitoDaPosicao31(titulo.getNossoNumero(), titulo.getContaBancaria().getAgencia().getCodigo(), titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta()), 1, Fillers.ZERO_LEFT)); + this.add(new FixedField(Strings.eliminateSymbols(titulo.getNossoNumero()), 13, Fillers.ZERO_LEFT)); + } + + /** + *

            + * Calcula o Dígito da posição 31 deste campo livre (CLBancoReal). + *

            + * + *

            + * No cálculo do dígito da posição 31 são considerados, para a obtenção do + * dígito, os dados {[NOSSO NÚMERO],[AGÊNCIA],[CONTA]} calculado pelos + * critérios do Módulo 10. + *

            + *
            Exemplo:
            + * + *
            + * + * + * + * + * + * + * + * + * + * + * + * + *
            Nosso Número1234567890123
            Agência4444
            Conta Corrente7777777
            + * + * @param nossoNumero + * @param agencia + * @param contaCorrente + * @return Dígito verficador calculado + * + * @see org.jrimum.vallia.Modulo + * + * @since 0.2 + */ + private String calculeDigitoDaPosicao31(String nossoNumero, + Integer agencia, Integer contaCorrente) { + + StringBuilder formula = new StringBuilder(); + String dV = null; + + formula.append(Fillers.ZERO_LEFT.fill(nossoNumero, 13)); + formula.append(Fillers.ZERO_LEFT.fill(agencia, 4)); + formula.append(Fillers.ZERO_LEFT.fill(contaCorrente, 7)); + + int restoDivisao = modulo10.calcule(formula.toString()); + + int restoSubtracao = (10 - restoDivisao); + + if (restoSubtracao == 10) { + dV = "0"; + } else { + + dV = "" + restoSubtracao; + } + + return dV; + } + + @Override + protected void addFields(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + @Override + protected void checkValues(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLBanestes.java b/src/main/java/org/jrimum/bopepo/campolivre/CLBanestes.java index 604d948d..f84520bb 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLBanestes.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLBanestes.java @@ -49,7 +49,7 @@ *

            * *

            - * Layout:
            + * Layout: *

            *

            * Cobrança Normal - CAMPO LIVRE - Chave ASBACE diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java b/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java index b1975661..5db3635f 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java @@ -1,217 +1,217 @@ -package org.jrimum.bopepo.campolivre; - -import static java.lang.String.format; -import static org.jrimum.bopepo.parametro.ParametroCaixaEconomicaFederal.CODIGO_OPERACAO; - -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Objects; - -/** - *

            - * O campo livre da Caixa Econômica Federal para cobrança simples (CS), rápida(CR) e sem registro (SR) - * - SICOB, deve seguir esta forma: - *

            - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
            PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
            20-29109(10)Nosso Número - * Nosso Número no padrão de uma das - * três cobranças (simples, rápida ou sem registro) - * - *

            Exemplos:
            - * Cobrança Simples - Nosso número inicia com 3. Ex: Carteira 11
            - * Cobrança Rápida - Nosso número inicia com 9. Ex: Carteira 12
            - * Cobrança Sem Registro - Nosso número inicia com 80, 81 ou 82. Ex: Carteira 14. - *

            - * - *
            30-3349(4)Código da AgênciaCódigo da Agência Cedente
            34-3639(3)Código da OperaçãoOperação Código
            37-4489(8)Código do número da contaCódigo fornecido pela Agência
            - * - * @author Gilmar P.S.L. - * @author Misael Barreto - - * @see Manuais SICOB - Caixa - * @see Especificação código barras com nosso número de 11 posições - * @see Leiaute de Arquivo Eletrônico Padrão CNAB 240 - Cobrança Bancária CAIXA - SICOB - * - * @since 0.2 - * - * @version 0.2 - */ -class CLCaixaEconomicaFederalSICOBNossoNumero10 extends AbstractCLCaixaEconomicaFederal { - - /** - * - */ - private static final long serialVersionUID = 5585190685525441426L; - - /** - * - */ - private static final Integer FIELDS_LENGTH = 4; - - /** - *

            - * Dado um título, cria um campo livre para o padrão do Banco Caixa Econômica - * Federal que tenha o serviço SINCO. - *

            - * - * @param titulo - Título com as informações para geração do campo livre - */ - CLCaixaEconomicaFederalSICOBNossoNumero10(Titulo titulo) { - - super(FIELDS_LENGTH); - - Objects.checkNotNull(titulo.getParametrosBancarios(), "Parâmetros bancários necessários [titulo.getParametrosBancarios()==null]!"); - checkPadraoNossoNumero(titulo.getNossoNumero()); - - // TODO: Testar checkPadraoNossoNumeroPorCodigoDaCarteira; - /* - Integer codigoDaCarteira = titulo.getContaBancaria().getCarteira().getCodigo(); - if (Objects.isNotNull(codigoDaCarteira)) { - checkPadraoNossoNumeroPorCodigoDaCarteira(titulo.getNossoNumero(), codigoDaCarteira); - } - */ - - this.add(new FixedField(titulo.getNossoNumero(), 10)); - - this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); - - if(titulo.getParametrosBancarios().contemComNome(CODIGO_OPERACAO)){ - - Integer cnpv = titulo.getParametrosBancarios().getValor(CODIGO_OPERACAO); - - Objects.checkNotNull(titulo.getParametrosBancarios(), "Parâmetro bancário código operação inválido [CodigoOperacao==null]!"); - - this.add(new FixedField(cnpv, 3, Fillers.ZERO_LEFT)); - - this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), 8, Fillers.ZERO_LEFT)); - - }else{ - - throw new CampoLivreException("Parâmetro bancário código operação (\"CodigoOperacao\") não encontrado!"); - } - - } - - /** - *

            - * Verifica se o nosso número do título começa com 3 (identificador da - * Carteira Simples), 9 (identificador da Carteira Rápida) ou 80, 81 ou 82 - * (que são identificadores da Carteira Sem Registro); Caso contrário gera - * uma {@code IllegalArgumentException}. - *

            - * - *

            - * Padrões aceitos de 10 dígitos: - *

              - *
            • 3NNNNNNNNN (a ser validado com os colegas da Neogrid)
            • - *
            • 9NNNNNNNNN
            • - *
            • 80NNNNNNNN
            • - *
            • 81NNNNNNNN
            • - *
            • 82NNNNNNNN
            • - *
            - *

            - * - * @param nn - * - Nosso Número - */ - private void checkPadraoNossoNumero(String nn){ - if(!nn.startsWith("3") && !nn.startsWith("9") && !nn.startsWith("80") && !nn.startsWith("81") && !nn.startsWith("82")){ - Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB o nosso número [%s] deve começar com 3 que é o identificador da \"carteira siples\" [3NNNNNNNNN] ou 9 que é o identificador da \"carteira rápida\" [9NNNNNNNNN] ou 80, 81 e 82 para \"carteira sem registro\" [82NNNNNNNN]!", nn)); - } - } - - /** - *

            - * Verifica se o nosso número informado tem o padrão esperado de acordo com - * o código da carteira informada. - *

            - *

            - * Obs: Como não há uma garantia documental de que todo nosso número que - * começa com "3" pertencerá somente a carteira 11, então o mais - * coerente é não amarrar o início do nosso número a determinada carteira, - * mas sim o contrário, ou seja, amarrar que toda carteira 11 tem de ter o - * nosso número iniciando com 3". O mesmo raciocíno serve para as outras - * carteiras. - *

            - * - * @param nossoNumero - * - Nosso Número - * @param codigoDaCarteira - * - Código da carteira - */ - private void checkPadraoNossoNumeroPorCodigoDaCarteira(String nossoNumero, Integer codigoDaCarteira){ - switch (codigoDaCarteira) { - case 11: - if(!nossoNumero.startsWith("3")){ - Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 11 (cobrança simples), o nosso número [%s] deve começar com 3!", nossoNumero)); - } - break; - - case 12: - if(!nossoNumero.startsWith("9")){ - Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 12 (cobrança rápida), o nosso número [%s] deve começar com 9!", nossoNumero)); - } - break; - - case 14: - if(!nossoNumero.startsWith("80") && !nossoNumero.startsWith("81") && !nossoNumero.startsWith("82")){ - Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 14 (cobrança sem registro), o nosso número [%s] deve começar com 80, 81 ou 82!", nossoNumero)); - } - break; - } - } - - - @Override - protected void addFields(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - @Override - protected void checkValues(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } -} +package org.jrimum.bopepo.campolivre; + +import static java.lang.String.format; +import static org.jrimum.bopepo.parametro.ParametroCaixaEconomicaFederal.CODIGO_OPERACAO; + +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; + +/** + *

            + * O campo livre da Caixa Econômica Federal para cobrança simples (CS), rápida(CR) e sem registro (SR) + * - SICOB, deve seguir esta forma: + *

            + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
            PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
            20-29109(10)Nosso Número + * Nosso Número no padrão de uma das + * três cobranças (simples, rápida ou sem registro) + * + *

            Exemplos:
            + * Cobrança Simples - Nosso número inicia com 3. Ex: Carteira 11
            + * Cobrança Rápida - Nosso número inicia com 9. Ex: Carteira 12
            + * Cobrança Sem Registro - Nosso número inicia com 80, 81 ou 82. Ex: Carteira 14. + *

            + * + *
            30-3349(4)Código da AgênciaCódigo da Agência Cedente
            34-3639(3)Código da OperaçãoOperação Código
            37-4489(8)Código do número da contaCódigo fornecido pela Agência
            + * + * @author Gilmar P.S.L. + * @author Misael Barreto + + * @see Manuais SICOB - Caixa + * @see Especificação código barras com nosso número de 11 posições + * @see Leiaute de Arquivo Eletrônico Padrão CNAB 240 - Cobrança Bancária CAIXA - SICOB + * + * @since 0.2 + * + * @version 0.2 + */ +class CLCaixaEconomicaFederalSICOBNossoNumero10 extends AbstractCLCaixaEconomicaFederal { + + /** + * + */ + private static final long serialVersionUID = 5585190685525441426L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 4; + + /** + *

            + * Dado um título, cria um campo livre para o padrão do Banco Caixa Econômica + * Federal que tenha o serviço SINCO. + *

            + * + * @param titulo - Título com as informações para geração do campo livre + */ + CLCaixaEconomicaFederalSICOBNossoNumero10(Titulo titulo) { + + super(FIELDS_LENGTH); + + Objects.checkNotNull(titulo.getParametrosBancarios(), "Parâmetros bancários necessários [titulo.getParametrosBancarios()==null]!"); + checkPadraoNossoNumero(titulo.getNossoNumero()); + + // TODO: Testar checkPadraoNossoNumeroPorCodigoDaCarteira; + /* + Integer codigoDaCarteira = titulo.getContaBancaria().getCarteira().getCodigo(); + if (Objects.isNotNull(codigoDaCarteira)) { + checkPadraoNossoNumeroPorCodigoDaCarteira(titulo.getNossoNumero(), codigoDaCarteira); + } + */ + + this.add(new FixedField(titulo.getNossoNumero(), 10)); + + this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); + + if(titulo.getParametrosBancarios().contemComNome(CODIGO_OPERACAO)){ + + Integer cnpv = titulo.getParametrosBancarios().getValor(CODIGO_OPERACAO); + + Objects.checkNotNull(titulo.getParametrosBancarios(), "Parâmetro bancário código operação inválido [CodigoOperacao==null]!"); + + this.add(new FixedField(cnpv, 3, Fillers.ZERO_LEFT)); + + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), 8, Fillers.ZERO_LEFT)); + + }else{ + + throw new CampoLivreException("Parâmetro bancário código operação (\"CodigoOperacao\") não encontrado!"); + } + + } + + /** + *

            + * Verifica se o nosso número do título começa com 3 (identificador da + * Carteira Simples), 9 (identificador da Carteira Rápida) ou 80, 81 ou 82 + * (que são identificadores da Carteira Sem Registro); Caso contrário gera + * uma {@code IllegalArgumentException}. + *

            + * + *

            + * Padrões aceitos de 10 dígitos: + *

              + *
            • 3NNNNNNNNN (a ser validado com os colegas da Neogrid)
            • + *
            • 9NNNNNNNNN
            • + *
            • 80NNNNNNNN
            • + *
            • 81NNNNNNNN
            • + *
            • 82NNNNNNNN
            • + *
            + *

            + * + * @param nn + * - Nosso Número + */ + private void checkPadraoNossoNumero(String nn){ + if(!nn.startsWith("3") && !nn.startsWith("9") && !nn.startsWith("80") && !nn.startsWith("81") && !nn.startsWith("82")){ + Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB o nosso número [%s] deve começar com 3 que é o identificador da \"carteira siples\" [3NNNNNNNNN] ou 9 que é o identificador da \"carteira rápida\" [9NNNNNNNNN] ou 80, 81 e 82 para \"carteira sem registro\" [82NNNNNNNN]!", nn)); + } + } + + /** + *

            + * Verifica se o nosso número informado tem o padrão esperado de acordo com + * o código da carteira informada. + *

            + *

            + * Obs: Como não há uma garantia documental de que todo nosso número que + * começa com "3" pertencerá somente a carteira 11, então o mais + * coerente é não amarrar o início do nosso número a determinada carteira, + * mas sim o contrário, ou seja, amarrar que toda carteira 11 tem de ter o + * nosso número iniciando com 3". O mesmo raciocíno serve para as outras + * carteiras. + *

            + * + * @param nossoNumero + * - Nosso Número + * @param codigoDaCarteira + * - Código da carteira + */ + private void checkPadraoNossoNumeroPorCodigoDaCarteira(String nossoNumero, Integer codigoDaCarteira){ + switch (codigoDaCarteira) { + case 11: + if(!nossoNumero.startsWith("3")){ + Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 11 (cobrança simples), o nosso número [%s] deve começar com 3!", nossoNumero)); + } + break; + + case 12: + if(!nossoNumero.startsWith("9")){ + Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 12 (cobrança rápida), o nosso número [%s] deve começar com 9!", nossoNumero)); + } + break; + + case 14: + if(!nossoNumero.startsWith("80") && !nossoNumero.startsWith("81") && !nossoNumero.startsWith("82")){ + Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 14 (cobrança sem registro), o nosso número [%s] deve começar com 80, 81 ou 82!", nossoNumero)); + } + break; + } + } + + + @Override + protected void addFields(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + @Override + protected void checkValues(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java b/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java index e53e7b6b..8d3a9230 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java @@ -1,222 +1,222 @@ -/* - * Copyright 2011 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: 14/04/2011 - 20:16:07 - * - * ================================================================================ - * - * Direitos autorais 2011 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 14/04/2011 - 20:16:07 - * - */ - -package org.jrimum.bopepo.campolivre; - -import static java.lang.String.format; - -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Objects; - -/** - *

            - * O campo livre da Caixa para Cobrança Sem Registro SICOB - Nosso Número 16 - * posições, deve seguir esta forma: - *

            - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
            PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
            20-2459(5)Código do Cliente(sem dígito - * verificador)Código do Cliente Cedente - * fornecido pela CAIXA
            25-2849(4)Código da Agência(sem dígito - * verificador)CNPJ da Agência da Conta do - * Cliente Cedente
            29-2919(1)Código da Carteira = 8Código da Carteira = 8
            30-3019(1)Constante = 7Constante = 7
            31-4414 9(14)Nosso Número(sem dígito - * verificador)Nosso Número do Cliente com 14 - * posições
            - * - * - * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre - * - * @author Gilmar P.S.L - * - * @since 0.2 - * - * @version 0.2.3 - */ -class CLCaixaEconomicaFederalSICOBNossoNumero14 extends AbstractCLCaixaEconomicaFederal { - - /** - * {@code serialVersionUID = 4219053358562778591L} - */ - private static final long serialVersionUID = 4219053358562778591L; - - /** - * Número de campos = 5. - */ - private static final Integer FIELDS_LENGTH = Integer.valueOf(5); - - /** - * Tamanho do campo Conta = 5. - */ - private static final Integer CONTA_LENGTH = Integer.valueOf(5); - - /** - * Tamanho do campo Agência = 4. - */ - private static final Integer AGENCIA_LENGTH = Integer.valueOf(4); - - /** - * Tamanho do campo Nosso Número = 14. - */ - protected static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(14); - - /** - * Constante "7". - */ - private static final FixedField CONSTANT_FIELD = new FixedField(7, 1); - - /** - * Valor constante do campo "Carteira" = 8 - Carteira Sem Registro Eletrônica. - */ - private static final Integer CARTEIRA_SEM_REGISTRO = Integer.valueOf(8); - - /** - * Código da carteira: sempre 8. - */ - private static final FixedField CARTEIRA_FIELD = new FixedField(CARTEIRA_SEM_REGISTRO, 1); - - /** - *

            - * Cria um campo livre instanciando o número de fields ({@code FIELDS_LENGTH}) deste campo. - *

            - * - * @since 0.2 - */ - protected CLCaixaEconomicaFederalSICOBNossoNumero14() { - - super(FIELDS_LENGTH); - } - - /** - * {@inheritDoc} - * - * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#checkValues(org.jrimum.domkee.financeiro.banco.febraban.Titulo) - */ - @Override - protected void checkValues(Titulo titulo){ - - checkNumeroDaContaNotNull(titulo); - checkCodigoDoNumeroDaConta(titulo); - checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 99999); - checkAgenciaNotNull(titulo); - checkCodigoDaAgencia(titulo); - checkCodigoDaAgenciaMenorOuIgualQue(titulo, 9999); - checkCarteiraNotNull(titulo); - checkCodigoDaCarteira(titulo); - checkCodigoDaCarteiraMenorOuIgualQue(titulo, 9); - checkCarteiraSemRegistro(titulo); - checkNossoNumero(titulo); - checkTamanhoDoNossoNumero(titulo, NN14); - } - - /** - * {@inheritDoc} - * - * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#addFields(org.jrimum.domkee.financeiro.banco.febraban.Titulo) - */ - @Override - protected void addFields(Titulo titulo) { - - this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), CONTA_LENGTH, Fillers.ZERO_LEFT)); - this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), AGENCIA_LENGTH, Fillers.ZERO_LEFT)); - this.add(CARTEIRA_FIELD); - this.add(CONSTANT_FIELD); - this.add(new FixedField(titulo.getNossoNumero(), NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); - } - - /** - * Verifica se o código da carteira da conta bancária do título é igual - * (carteira simples), caso contrário lança uma {@code - * IllegalArgumentException}. - * - *

            - * Motivo extraído do manual do banco:
            - *
            - * Carteira Sem Registro Eletrônica com Nosso Número de 16 posições, - * sendo que 14 destas posições são para livre uso pelo Cedente. Apenas - * Clientes Cedentes com Código do Cedente na operação 870 podem operar com - * a Cobrança Sem Registro com 16 posições de Nosso Número. - *

            - * - * @param titulo - */ - private void checkCarteiraSemRegistro(Titulo titulo) { - - Objects.checkArgument( - titulo.getContaBancaria().getCarteira().getCodigo().equals(CARTEIRA_SEM_REGISTRO), - format("Apenas a carteira de código [8] \"Carteira Sem Registro Eletrônica\" é permitida e não o código [%s]!", titulo.getContaBancaria().getCarteira().getCodigo()) - ); - } - -} +/* + * Copyright 2011 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: 14/04/2011 - 20:16:07 + * + * ================================================================================ + * + * Direitos autorais 2011 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 14/04/2011 - 20:16:07 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static java.lang.String.format; + +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Objects; + +/** + *

            + * O campo livre da Caixa para Cobrança Sem Registro SICOB - Nosso Número 16 + * posições, deve seguir esta forma: + *

            + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
            PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
            20-2459(5)Código do Cliente(sem dígito + * verificador)Código do Cliente Cedente + * fornecido pela CAIXA
            25-2849(4)Código da Agência(sem dígito + * verificador)CNPJ da Agência da Conta do + * Cliente Cedente
            29-2919(1)Código da Carteira = 8Código da Carteira = 8
            30-3019(1)Constante = 7Constante = 7
            31-4414 9(14)Nosso Número(sem dígito + * verificador)Nosso Número do Cliente com 14 + * posições
            + * + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2.3 + */ +class CLCaixaEconomicaFederalSICOBNossoNumero14 extends AbstractCLCaixaEconomicaFederal { + + /** + * {@code serialVersionUID = 4219053358562778591L} + */ + private static final long serialVersionUID = 4219053358562778591L; + + /** + * Número de campos = 5. + */ + private static final Integer FIELDS_LENGTH = Integer.valueOf(5); + + /** + * Tamanho do campo Conta = 5. + */ + private static final Integer CONTA_LENGTH = Integer.valueOf(5); + + /** + * Tamanho do campo Agência = 4. + */ + private static final Integer AGENCIA_LENGTH = Integer.valueOf(4); + + /** + * Tamanho do campo Nosso Número = 14. + */ + protected static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(14); + + /** + * Constante "7". + */ + private static final FixedField CONSTANT_FIELD = new FixedField(7, 1); + + /** + * Valor constante do campo "Carteira" = 8 - Carteira Sem Registro Eletrônica. + */ + private static final Integer CARTEIRA_SEM_REGISTRO = Integer.valueOf(8); + + /** + * Código da carteira: sempre 8. + */ + private static final FixedField CARTEIRA_FIELD = new FixedField(CARTEIRA_SEM_REGISTRO, 1); + + /** + *

            + * Cria um campo livre instanciando o número de fields ({@code FIELDS_LENGTH}) deste campo. + *

            + * + * @since 0.2 + */ + protected CLCaixaEconomicaFederalSICOBNossoNumero14() { + + super(FIELDS_LENGTH); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#checkValues(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + */ + @Override + protected void checkValues(Titulo titulo){ + + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 99999); + checkAgenciaNotNull(titulo); + checkCodigoDaAgencia(titulo); + checkCodigoDaAgenciaMenorOuIgualQue(titulo, 9999); + checkCarteiraNotNull(titulo); + checkCodigoDaCarteira(titulo); + checkCodigoDaCarteiraMenorOuIgualQue(titulo, 9); + checkCarteiraSemRegistro(titulo); + checkNossoNumero(titulo); + checkTamanhoDoNossoNumero(titulo, NN14); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#addFields(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + */ + @Override + protected void addFields(Titulo titulo) { + + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), CONTA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), AGENCIA_LENGTH, Fillers.ZERO_LEFT)); + this.add(CARTEIRA_FIELD); + this.add(CONSTANT_FIELD); + this.add(new FixedField(titulo.getNossoNumero(), NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); + } + + /** + * Verifica se o código da carteira da conta bancária do título é igual + * (carteira simples), caso contrário lança uma {@code + * IllegalArgumentException}. + * + *

            + * Motivo extraído do manual do banco: + * + * Carteira Sem Registro Eletrônica com Nosso Número de 16 posições, + * sendo que 14 destas posições são para livre uso pelo Cedente. Apenas + * Clientes Cedentes com Código do Cedente na operação 870 podem operar com + * a Cobrança Sem Registro com 16 posições de Nosso Número. + *

            + * + * @param titulo + */ + private void checkCarteiraSemRegistro(Titulo titulo) { + + Objects.checkArgument( + titulo.getContaBancaria().getCarteira().getCodigo().equals(CARTEIRA_SEM_REGISTRO), + format("Apenas a carteira de código [8] \"Carteira Sem Registro Eletrônica\" é permitida e não o código [%s]!", titulo.getContaBancaria().getCarteira().getCodigo()) + ); + } + +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java b/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java index 9120d98a..08842a27 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java @@ -1,297 +1,297 @@ -/* - * 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: 16/04/2008 - 23:09:08 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Criado em: 16/04/2008 - 23:09:08 - * - */ - -package org.jrimum.bopepo.campolivre; - -import java.util.Arrays; - -import org.jrimum.domkee.banco.ContaBancaria; -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Exceptions; - -/** - * - * - *

            - * Campo livre padrão do Banco Itaú - *

            - * - *

            - *

            Layout do Banco Itaú para o campo livre PADRÃO

            - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
            PosiçãoTamanhoPictureConteúdo
            20 a 2239(03)Carteira
            23 a 3089(08)Nosso número
            31 a 3119(01)DAC [Agência /Conta/Carteira/Nosso Número]
            32 a 3549(04)N.º da Agência cedente
            36 a 4059(05)N.º da Conta Corrente
            41 a 4119(01)DAC [Agência/Conta Corrente]
            42 a 4439(03)Zeros
            - *

            - * - * @author Rômulo Augusto - * @author Misael Barreto - * @author Fernando Martin - * - * @since 0.2 - * - * @version 0.2 - */ -class CLItauPadrao extends AbstractCLItau { - - /** - * - */ - private static final long serialVersionUID = 1544486299245786533L; - - /** - * Tamanho deste campo. Em outras palavras, é a quantidade de partes que - * compõem este campo livre. - */ - private static final Integer FIELDS_LENGTH = 7; - - /** - *

            - * Dado um título, cria o campo livre padrão do Banco Itaú. - *

            - * @param titulo título com as informações para geração do campo livre - */ - public CLItauPadrao(Titulo titulo) { - super(FIELDS_LENGTH); - - ContaBancaria conta = titulo.getContaBancaria(); - - this.add(new FixedField(conta.getCarteira().getCodigo(), 3, Fillers.ZERO_LEFT)); - this.add(new FixedField(titulo.getNossoNumero(), 8, Fillers.ZERO_LEFT)); - - this.add(new FixedField(calculeDigitoDaPosicao31( - conta.getAgencia().getCodigo(), - conta.getNumeroDaConta().getCodigoDaConta(), - conta.getCarteira().getCodigo(), - titulo.getNossoNumero()), 1)); - - this.add(new FixedField(conta.getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); - this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 5, Fillers.ZERO_LEFT)); - - this.add(new FixedField(calculeDigitoDaPosicao41( - conta.getAgencia().getCodigo(), - conta.getNumeroDaConta().getCodigoDaConta()), 1)); - - this.add(new FixedField("000", 3)); - } - - /** - *

            - * Calcula o dígito verificador do campo 31 a partir do código da agência, - * do código da conta, do código da carteira e do nosso número. - *

            - *

            - * À exceção, estão as carteiras escriturais 104, 105, 112, 113, 114, 147, - * 166 e 212 e na modalidade direta as carteiras 126, 131, 146, 150 - * e 168, cuja obtenção está baseada apenas nos dados "CARTEIRA/NOSSO NÚMERO" - * da operação. Fonte: - * Manual ITAÚ, mais especificamente nas páginas 19 e 30. - *

            - *

            - * Exemplo do cálculo: - *
            - *

            -	 * AG / CONTA = 0057 / 12345-7 CART / NNº = 110 / 12345678-?
            -	 * 
            -	 * Sequência para Cálculo 	0 0 5 7 1 2 3 4 5 1 1 0 1 2 3 4 5 6 7 8
            -	 * Módulo 10 		1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
            -	 * 			| | | | | | | | | | | | | | | | | | | |___________8 x 2 = 16 (1+6)
            -	 * 			| | | | | | | | | | | | | | | | | | | ____________7 x 1 = 7
            -	 *			| | | | | | | | | | | | | | | | | | ______________6 x 2 = 12 (1+2)
            -	 * 			| | | | | | | | | | | | | | | | | ________________5 x 1 = 5
            -	 * 			| | | | | | | | | | | | | | | | | ________________4 x 2 = 8
            -	 *			| | | | | | | | | | | | | | | ____________________3 x 1 = 3
            -	 * 			| | | | | | | | | | | | | | ______________________2 x 2 = 4
            -	 * 			| | | | | | | | | | | | | ________________________1 x 1 = 1
            -	 * 			| | | | | | | | | | | | __________________________0 x 2 = 0
            -	 * 			| | | | | | | | | | | ____________________________1 x 1 = 1
            -	 * 			| | | | | | | | | | ______________________________1 x 2 = 2
            -	 * 			| | | | | | | | | ________________________________5 x 1 = 5
            -	 * 			| | | | | | | | __________________________________4 x 2 = 8
            -	 * 			| | | | | | | ____________________________________3 x 1 = 3
            -	 * 			| | | | | | ______________________________________2 x 2 = 4
            -	 * 			| | | | | ________________________________________1 x 1 = 1
            -	 * 			| | | | __________________________________________7 x 2 = 14 (1+4)
            -	 * 			| | | ____________________________________________5 x 1 = 5
            -	 * 			| | ______________________________________________0 x 2 = 0
            -	 * 			| ________________________________________________0 x 1 = 0
            -	 * 
            -	 * Total 								            72
            -	 * 
            -	 * Dividir o resultado da soma por 10 => 72 / 10 = 7, resto = 2
            -	 *  
            -	 * DAC = 10 - 2 = 8
            -	 * Portanto DAC = 8
            -	 * 
            - *

            - * - * @param codigoDaAgencia - * @param codigoDaConta - * @param codigoDaCarteira - * @param nossoNumero - * @return Integer dígito - * - * @since 0.2 - */ - private Integer calculeDigitoDaPosicao31(Integer codigoDaAgencia, - Integer codigoDaConta, Integer codigoDaCarteira, String nossoNumero) { - - // Carteiras "exceção". - Integer[] carteirasEscriturais = {104, 105, 112, 113, 114, 147, 166, 212}; - Integer[] carteirasModalidadeDireta = {126, 131, 146, 150, 168}; - - StringBuilder campo = new StringBuilder(); - campo.append(Fillers.ZERO_LEFT.fill(codigoDaCarteira.intValue(), 3)); - campo.append(Fillers.ZERO_LEFT.fill(nossoNumero, 8)); - - /* - * Se a carteira em questão não estiver nas lista de exceções então - * acrescenta-se a agência e a conta para compor a base para o cálculo - * do DAC. - */ - if (Arrays.binarySearch(carteirasModalidadeDireta, codigoDaCarteira) < 0 - && Arrays.binarySearch(carteirasEscriturais, codigoDaCarteira) < 0) { - - campo.insert(0, Fillers.ZERO_LEFT.fill(codigoDaConta.intValue(), 5)); - campo.insert(0, Fillers.ZERO_LEFT.fill(codigoDaAgencia.intValue(), 4)); - } - - return calculeDigitoVerificador(campo.toString()); - } - - /** - *

            - * Calcula o dígito verificador do campo 41 a partir do código da agência e - * do código da conta. - *

            - *

            - * O cálculo é feito da seguinte forma:
            - *

              - *
            1. - * Multiplica-se cada algarismo do campo pela sequência de multiplicadores - * 2, 1, 2, 1, 2, 1..., posicionados da direita para a esquerda; - *
            2. - *
            3. - * Some individualmente, os algarismos dos resultados dos produtos, obtendo-se o total (N); - *
            4. - *
            5. - * Divida o total encontrado (N) por 10, e determine o resto da divisão como MOD 10 (N); - *
            6. - *
            7. - * Encontre o DAC através da seguinte expressão: DAC = 10 – Mod 10 (N) - *
              - * OBS.: Se o resultado da etapa d for 10, considere o DAC = 0. - *
            8. - *
            - * - *

            - * - * @param codigoDaAgencia - * @param codigoDaConta - * @return Integer digito - * - * @since 0.2 - */ - private Integer calculeDigitoDaPosicao41(Integer codigoDaAgencia, - Integer codigoDaConta) { - - StringBuilder campo = new StringBuilder(); - campo.append(Fillers.ZERO_LEFT.fill(codigoDaAgencia.intValue(), 4)); - campo.append(Fillers.ZERO_LEFT.fill(codigoDaConta.intValue(), 5)); - - return calculeDigitoVerificador(campo.toString()); - } - - @Override - protected void addFields(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - @Override - protected void checkValues(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } -} - +/* + * 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: 16/04/2008 - 23:09:08 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 16/04/2008 - 23:09:08 + * + */ + +package org.jrimum.bopepo.campolivre; + +import java.util.Arrays; + +import org.jrimum.domkee.banco.ContaBancaria; +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + * + * + *

            + * Campo livre padrão do Banco Itaú + *

            + * + *

            + *

            Layout do Banco Itaú para o campo livre PADRÃO

            + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
            PosiçãoTamanhoPictureConteúdo
            20 a 2239(03)Carteira
            23 a 3089(08)Nosso número
            31 a 3119(01)DAC [Agência /Conta/Carteira/Nosso Número]
            32 a 3549(04)N.º da Agência cedente
            36 a 4059(05)N.º da Conta Corrente
            41 a 4119(01)DAC [Agência/Conta Corrente]
            42 a 4439(03)Zeros
            + *

            + * + * @author Rômulo Augusto + * @author Misael Barreto + * @author Fernando Martin + * + * @since 0.2 + * + * @version 0.2 + */ +class CLItauPadrao extends AbstractCLItau { + + /** + * + */ + private static final long serialVersionUID = 1544486299245786533L; + + /** + * Tamanho deste campo. Em outras palavras, é a quantidade de partes que + * compõem este campo livre. + */ + private static final Integer FIELDS_LENGTH = 7; + + /** + *

            + * Dado um título, cria o campo livre padrão do Banco Itaú. + *

            + * @param titulo título com as informações para geração do campo livre + */ + public CLItauPadrao(Titulo titulo) { + super(FIELDS_LENGTH); + + ContaBancaria conta = titulo.getContaBancaria(); + + this.add(new FixedField(conta.getCarteira().getCodigo(), 3, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getNossoNumero(), 8, Fillers.ZERO_LEFT)); + + this.add(new FixedField(calculeDigitoDaPosicao31( + conta.getAgencia().getCodigo(), + conta.getNumeroDaConta().getCodigoDaConta(), + conta.getCarteira().getCodigo(), + titulo.getNossoNumero()), 1)); + + this.add(new FixedField(conta.getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); + this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 5, Fillers.ZERO_LEFT)); + + this.add(new FixedField(calculeDigitoDaPosicao41( + conta.getAgencia().getCodigo(), + conta.getNumeroDaConta().getCodigoDaConta()), 1)); + + this.add(new FixedField("000", 3)); + } + + /** + *

            + * Calcula o dígito verificador do campo 31 a partir do código da agência, + * do código da conta, do código da carteira e do nosso número. + *

            + *

            + * À exceção, estão as carteiras escriturais 104, 105, 112, 113, 114, 147, + * 166 e 212 e na modalidade direta as carteiras 126, 131, 146, 150 + * e 168, cuja obtenção está baseada apenas nos dados "CARTEIRA/NOSSO NÚMERO" + * da operação. Fonte: + * Manual ITAÚ, mais especificamente nas páginas 19 e 30. + *

            + *

            + * Exemplo do cálculo: + * + *

            +	 * AG / CONTA = 0057 / 12345-7 CART / NNº = 110 / 12345678-?
            +	 * 
            +	 * Sequência para Cálculo 	0 0 5 7 1 2 3 4 5 1 1 0 1 2 3 4 5 6 7 8
            +	 * Módulo 10 		1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
            +	 * 			| | | | | | | | | | | | | | | | | | | |___________8 x 2 = 16 (1+6)
            +	 * 			| | | | | | | | | | | | | | | | | | | ____________7 x 1 = 7
            +	 *			| | | | | | | | | | | | | | | | | | ______________6 x 2 = 12 (1+2)
            +	 * 			| | | | | | | | | | | | | | | | | ________________5 x 1 = 5
            +	 * 			| | | | | | | | | | | | | | | | | ________________4 x 2 = 8
            +	 *			| | | | | | | | | | | | | | | ____________________3 x 1 = 3
            +	 * 			| | | | | | | | | | | | | | ______________________2 x 2 = 4
            +	 * 			| | | | | | | | | | | | | ________________________1 x 1 = 1
            +	 * 			| | | | | | | | | | | | __________________________0 x 2 = 0
            +	 * 			| | | | | | | | | | | ____________________________1 x 1 = 1
            +	 * 			| | | | | | | | | | ______________________________1 x 2 = 2
            +	 * 			| | | | | | | | | ________________________________5 x 1 = 5
            +	 * 			| | | | | | | | __________________________________4 x 2 = 8
            +	 * 			| | | | | | | ____________________________________3 x 1 = 3
            +	 * 			| | | | | | ______________________________________2 x 2 = 4
            +	 * 			| | | | | ________________________________________1 x 1 = 1
            +	 * 			| | | | __________________________________________7 x 2 = 14 (1+4)
            +	 * 			| | | ____________________________________________5 x 1 = 5
            +	 * 			| | ______________________________________________0 x 2 = 0
            +	 * 			| ________________________________________________0 x 1 = 0
            +	 * 
            +	 * Total 								            72
            +	 * 
            +	 * Dividir o resultado da soma por 10 => 72 / 10 = 7, resto = 2
            +	 *  
            +	 * DAC = 10 - 2 = 8
            +	 * Portanto DAC = 8
            +	 * 
            + *

            + * + * @param codigoDaAgencia + * @param codigoDaConta + * @param codigoDaCarteira + * @param nossoNumero + * @return Integer dígito + * + * @since 0.2 + */ + private Integer calculeDigitoDaPosicao31(Integer codigoDaAgencia, + Integer codigoDaConta, Integer codigoDaCarteira, String nossoNumero) { + + // Carteiras "exceção". + Integer[] carteirasEscriturais = {104, 105, 112, 113, 114, 147, 166, 212}; + Integer[] carteirasModalidadeDireta = {126, 131, 146, 150, 168}; + + StringBuilder campo = new StringBuilder(); + campo.append(Fillers.ZERO_LEFT.fill(codigoDaCarteira.intValue(), 3)); + campo.append(Fillers.ZERO_LEFT.fill(nossoNumero, 8)); + + /* + * Se a carteira em questão não estiver nas lista de exceções então + * acrescenta-se a agência e a conta para compor a base para o cálculo + * do DAC. + */ + if (Arrays.binarySearch(carteirasModalidadeDireta, codigoDaCarteira) < 0 + && Arrays.binarySearch(carteirasEscriturais, codigoDaCarteira) < 0) { + + campo.insert(0, Fillers.ZERO_LEFT.fill(codigoDaConta.intValue(), 5)); + campo.insert(0, Fillers.ZERO_LEFT.fill(codigoDaAgencia.intValue(), 4)); + } + + return calculeDigitoVerificador(campo.toString()); + } + + /** + *

            + * Calcula o dígito verificador do campo 41 a partir do código da agência e + * do código da conta. + *

            + *

            + * O cálculo é feito da seguinte forma: + *

              + *
            1. + * Multiplica-se cada algarismo do campo pela sequência de multiplicadores + * 2, 1, 2, 1, 2, 1..., posicionados da direita para a esquerda; + *
            2. + *
            3. + * Some individualmente, os algarismos dos resultados dos produtos, obtendo-se o total (N); + *
            4. + *
            5. + * Divida o total encontrado (N) por 10, e determine o resto da divisão como MOD 10 (N); + *
            6. + *
            7. + * Encontre o DAC através da seguinte expressão: DAC = 10 – Mod 10 (N) + * + * OBS.: Se o resultado da etapa d for 10, considere o DAC = 0. + *
            8. + *
            + * + *

            + * + * @param codigoDaAgencia + * @param codigoDaConta + * @return Integer digito + * + * @since 0.2 + */ + private Integer calculeDigitoDaPosicao41(Integer codigoDaAgencia, + Integer codigoDaConta) { + + StringBuilder campo = new StringBuilder(); + campo.append(Fillers.ZERO_LEFT.fill(codigoDaAgencia.intValue(), 4)); + campo.append(Fillers.ZERO_LEFT.fill(codigoDaConta.intValue(), 5)); + + return calculeDigitoVerificador(campo.toString()); + } + + @Override + protected void addFields(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + @Override + protected void checkValues(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } +} + diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLMercantilDoBrasil.java b/src/main/java/org/jrimum/bopepo/campolivre/CLMercantilDoBrasil.java index 3f87a3b2..15631c5a 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLMercantilDoBrasil.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLMercantilDoBrasil.java @@ -1,161 +1,161 @@ -/* - * 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: 25/09/2008 - 21:23:20 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Criado em: 25/09/2008 - 21:23:20 - * - */ -package org.jrimum.bopepo.campolivre; - -import java.math.BigDecimal; -import java.math.RoundingMode; - -import org.jrimum.domkee.banco.ContaBancaria; -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Exceptions; - -/** - * - *

            - * Campo Livre para o Banco Mercantil do Brasil. Segue o seguinte formato: - *
            - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
            Posição TamanhoPictureConteúdo
            20-2349Agência do Cedente(sem dígito)
            24-34119Nosso Número (com dígito)
            35-4399Código do Cedente (Contrato de Cobrança)
            44-4419Indicador de desconto:
            =2 sem desconto
            =0 com desconto
            - *

            - * - * @author Rômulo Augusto - * - * @since 0.2 - * - * @version 0.2 - */ -class CLMercantilDoBrasil extends AbstractCLMercantilDoBrasil { - - /** - * - */ - private static final long serialVersionUID = 2335934898236961987L; - - /** - * - */ - private static final Integer FIELDS_LENGTH = 4; - - /** - *

            - * Dado um título, cria um campo livre para o padrão do Banco Mercantil do - * Brasil. - *

            - * - * @param titulo título com as informações para geração do campo livre - */ - CLMercantilDoBrasil(Titulo titulo) { - super(FIELDS_LENGTH); - ContaBancaria contaBancaria = titulo.getContaBancaria(); -// int digitoDoNossoNumero = calculeDigitoVerificadorDoNossoNumero(contaBancaria.getAgencia().getCodigoDaAgencia(), nossoNumero); - //TODO Verificar de onde virá esta informação: apenas verificar se o título tem ou não valor de desconto. - int desconto; - if (titulo.getDesconto() == null || titulo.getDesconto().equals(BigDecimal.ZERO.setScale(2, RoundingMode.DOWN))) { - desconto = 2; - } else { - desconto = 0; - } - - this.add(new FixedField(contaBancaria.getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); - this.add(new FixedField(titulo.getNossoNumero() + titulo.getDigitoDoNossoNumero(), 11, Fillers.ZERO_LEFT)); - this.add(new FixedField(contaBancaria.getNumeroDaConta().getCodigoDaConta(), 9, Fillers.ZERO_LEFT)); - this.add(new FixedField(desconto, 1)); - } - -// /** -// * -// *

            -// * Calcula o dígito verificador do Nosso Número. -// *

            -// *

            -// * É calculado através do módulo 11 a partir do código da agência e do Nosso Número. -// *

            -// * -// * @param agencia Código da agência -// * @param nossoNumero Nosso Número -// * @return digito verificador -// * -// * @since 0.2 -// */ -// private int calculeDigitoVerificadorDoNossoNumero(Integer agencia, String nossoNumero) { -// -// Modulo modulo = new Modulo(EnumModulo.MODULO11); -// int resto = modulo.calcule(Fillers.ZERO_LEFT.fill(agencia, 4) + nossoNumero); -// -// int digito = modulo.valor() - resto; -// -// return digito; -// } - @Override - protected void addFields(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - @Override - protected void checkValues(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - -} +/* + * 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: 25/09/2008 - 21:23:20 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 25/09/2008 - 21:23:20 + * + */ +package org.jrimum.bopepo.campolivre; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +import org.jrimum.domkee.banco.ContaBancaria; +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + * + *

            + * Campo Livre para o Banco Mercantil do Brasil. Segue o seguinte formato: + *
            + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
            Posição TamanhoPictureConteúdo
            20-2349Agência do Cedente(sem dígito)
            24-34119Nosso Número (com dígito)
            35-4399Código do Cedente (Contrato de Cobrança)
            44-4419Indicador de desconto:
            =2 sem desconto
            =0 com desconto
            + *

            + * + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +class CLMercantilDoBrasil extends AbstractCLMercantilDoBrasil { + + /** + * + */ + private static final long serialVersionUID = 2335934898236961987L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 4; + + /** + *

            + * Dado um título, cria um campo livre para o padrão do Banco Mercantil do + * Brasil. + *

            + * + * @param titulo título com as informações para geração do campo livre + */ + CLMercantilDoBrasil(Titulo titulo) { + super(FIELDS_LENGTH); + ContaBancaria contaBancaria = titulo.getContaBancaria(); +// int digitoDoNossoNumero = calculeDigitoVerificadorDoNossoNumero(contaBancaria.getAgencia().getCodigoDaAgencia(), nossoNumero); + //TODO Verificar de onde virá esta informação: apenas verificar se o título tem ou não valor de desconto. + int desconto; + if (titulo.getDesconto() == null || titulo.getDesconto().equals(BigDecimal.ZERO.setScale(2, RoundingMode.DOWN))) { + desconto = 2; + } else { + desconto = 0; + } + + this.add(new FixedField(contaBancaria.getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getNossoNumero() + titulo.getDigitoDoNossoNumero(), 11, Fillers.ZERO_LEFT)); + this.add(new FixedField(contaBancaria.getNumeroDaConta().getCodigoDaConta(), 9, Fillers.ZERO_LEFT)); + this.add(new FixedField(desconto, 1)); + } + +// /** +// * +// *

            +// * Calcula o dígito verificador do Nosso Número. +// *

            +// *

            +// * É calculado através do módulo 11 a partir do código da agência e do Nosso Número. +// *

            +// * +// * @param agencia Código da agência +// * @param nossoNumero Nosso Número +// * @return digito verificador +// * +// * @since 0.2 +// */ +// private int calculeDigitoVerificadorDoNossoNumero(Integer agencia, String nossoNumero) { +// +// Modulo modulo = new Modulo(EnumModulo.MODULO11); +// int resto = modulo.calcule(Fillers.ZERO_LEFT.fill(agencia, 4) + nossoNumero); +// +// int digito = modulo.valor() - resto; +// +// return digito; +// } + @Override + protected void addFields(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + @Override + protected void checkValues(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java b/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java index f3af03c6..924105a0 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java @@ -1,161 +1,161 @@ -package org.jrimum.bopepo.campolivre; - -import org.apache.commons.lang3.StringUtils; -import org.jrimum.domkee.banco.ContaBancaria; -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Objects; -import org.jrimum.utilix.Strings; - -/** - * - *

            - * Representação do campo livre usado para boletos com carteiras (cobrança) - * sem registro. - *

            - * - *

            - * Layout:
            - *

            - *

            - * Cobrança Especial (sem registro) - *

            - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
            PosiçãoCampo Livre No Código De - * Barras (20 a 44)
            20Código da transação = 5
            21 a 26Número do Cliente (Espécie de conta)
            27Dígito Verificador do Número do Cliente
            28 a 29zeros
            30 a 43Referência do Cliente (Nosso Número Gerado Pelo - * Cliente)
            44Dígito Verificador da Referência do Cliente
            - *

            - * - * - * @author Gilmar P.S.L. - * - * @since 0.2 - * - * @version 0.2 - */ - -class CLUnibancoCobrancaNaoRegistrada extends AbstractCLUnibanco { - - /** - * - */ - private static final long serialVersionUID = 487906631678160993L; - - /** - * - */ - private static final Integer FIELDS_LENGTH = 6; - - private static final Integer CODIGO_TRANSACAO = 5; - - private static final Integer RESERVADO = 0; - - /** - *

            - * Dado um título, cria um campo livre para o padrão do Banco Unibanco - * que tenha o tipo de cobrança não registrada. - *

            - * @param titulo título com as informações para geração do campo livre - */ - CLUnibancoCobrancaNaoRegistrada(Titulo titulo) { - super(FIELDS_LENGTH); - - ContaBancaria conta = titulo.getContaBancaria(); - - Objects.checkNotNull(conta,"Conta Bancária NULA!"); - Objects.checkNotNull(conta.getNumeroDaConta(),"Número da Conta Bancária NULO!"); - Objects.checkNotNull(conta.getNumeroDaConta().getCodigoDaConta(),"Código da Conta Bancária NULO!"); - Objects.checkNotNull(conta.getNumeroDaConta().getDigitoDaConta(),"Dígito da Conta Bancária NULO!"); - Objects.checkNotNull(titulo.getNossoNumero(),"Nosso Número NULO!"); - - this.add(new FixedField(CODIGO_TRANSACAO, 1)); - - if(conta.getNumeroDaConta().getCodigoDaConta() > 0){ - - this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 6, Fillers.ZERO_LEFT)); - - }else{ - throw new CampoLivreException(new IllegalArgumentException("Conta bancária com valor inválido, a conta deve ser um número inteiro positivo, e não: "+conta.getNumeroDaConta().getCodigoDaConta())); - } - - if(StringUtils.isNumeric(conta.getNumeroDaConta().getDigitoDaConta())){ - - Integer digitoDaConta = Integer.valueOf(conta.getNumeroDaConta().getDigitoDaConta()); - - if(digitoDaConta >= 0){ - - this.add(new FixedField(Integer.valueOf(digitoDaConta), 1)); - }else{ - - throw new CampoLivreException(new IllegalArgumentException("O dígito da conta deve ser um número inteiro não-negativo, e não: ["+conta.getNumeroDaConta().getDigitoDaConta()+"]")); - } - - }else{ - - throw new CampoLivreException(new IllegalArgumentException("O dígito da conta deve ser numérico, e não: ["+conta.getNumeroDaConta().getDigitoDaConta()+"]")); - } - - this.add(new FixedField(RESERVADO, 2, Fillers.ZERO_LEFT)); - - if(StringUtils.isNumeric(titulo.getNossoNumero())){ - - if(Long.valueOf(Strings.removeStartWithZeros(titulo.getNossoNumero()))>0){ - - this.add(new FixedField(titulo.getNossoNumero(), 14,Fillers.ZERO_LEFT)); - - }else{ - - throw new CampoLivreException(new IllegalArgumentException("O campo (nosso número) do título deve ser um número inteiro positivo, e não: ["+titulo.getNossoNumero()+"]")); - } - }else{ - - throw new CampoLivreException(new IllegalArgumentException("O campo (nosso número) do título deve ser numérico, e não: ["+titulo.getNossoNumero()+"]")); - } - - this.add(new FixedField(calculeDigitoEmModulo11(titulo.getNossoNumero()), 1)); - } - - @Override - protected void addFields(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - @Override - protected void checkValues(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } -} +package org.jrimum.bopepo.campolivre; + +import org.apache.commons.lang3.StringUtils; +import org.jrimum.domkee.banco.ContaBancaria; +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.Strings; + +/** + * + *

            + * Representação do campo livre usado para boletos com carteiras (cobrança) + * sem registro. + *

            + * + *

            + * Layout: + *

            + *

            + * Cobrança Especial (sem registro) + *

            + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
            PosiçãoCampo Livre No Código De + * Barras (20 a 44)
            20Código da transação = 5
            21 a 26Número do Cliente (Espécie de conta)
            27Dígito Verificador do Número do Cliente
            28 a 29zeros
            30 a 43Referência do Cliente (Nosso Número Gerado Pelo + * Cliente)
            44Dígito Verificador da Referência do Cliente
            + *

            + * + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ + +class CLUnibancoCobrancaNaoRegistrada extends AbstractCLUnibanco { + + /** + * + */ + private static final long serialVersionUID = 487906631678160993L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 6; + + private static final Integer CODIGO_TRANSACAO = 5; + + private static final Integer RESERVADO = 0; + + /** + *

            + * Dado um título, cria um campo livre para o padrão do Banco Unibanco + * que tenha o tipo de cobrança não registrada. + *

            + * @param titulo título com as informações para geração do campo livre + */ + CLUnibancoCobrancaNaoRegistrada(Titulo titulo) { + super(FIELDS_LENGTH); + + ContaBancaria conta = titulo.getContaBancaria(); + + Objects.checkNotNull(conta,"Conta Bancária NULA!"); + Objects.checkNotNull(conta.getNumeroDaConta(),"Número da Conta Bancária NULO!"); + Objects.checkNotNull(conta.getNumeroDaConta().getCodigoDaConta(),"Código da Conta Bancária NULO!"); + Objects.checkNotNull(conta.getNumeroDaConta().getDigitoDaConta(),"Dígito da Conta Bancária NULO!"); + Objects.checkNotNull(titulo.getNossoNumero(),"Nosso Número NULO!"); + + this.add(new FixedField(CODIGO_TRANSACAO, 1)); + + if(conta.getNumeroDaConta().getCodigoDaConta() > 0){ + + this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 6, Fillers.ZERO_LEFT)); + + }else{ + throw new CampoLivreException(new IllegalArgumentException("Conta bancária com valor inválido, a conta deve ser um número inteiro positivo, e não: "+conta.getNumeroDaConta().getCodigoDaConta())); + } + + if(StringUtils.isNumeric(conta.getNumeroDaConta().getDigitoDaConta())){ + + Integer digitoDaConta = Integer.valueOf(conta.getNumeroDaConta().getDigitoDaConta()); + + if(digitoDaConta >= 0){ + + this.add(new FixedField(Integer.valueOf(digitoDaConta), 1)); + }else{ + + throw new CampoLivreException(new IllegalArgumentException("O dígito da conta deve ser um número inteiro não-negativo, e não: ["+conta.getNumeroDaConta().getDigitoDaConta()+"]")); + } + + }else{ + + throw new CampoLivreException(new IllegalArgumentException("O dígito da conta deve ser numérico, e não: ["+conta.getNumeroDaConta().getDigitoDaConta()+"]")); + } + + this.add(new FixedField(RESERVADO, 2, Fillers.ZERO_LEFT)); + + if(StringUtils.isNumeric(titulo.getNossoNumero())){ + + if(Long.valueOf(Strings.removeStartWithZeros(titulo.getNossoNumero()))>0){ + + this.add(new FixedField(titulo.getNossoNumero(), 14,Fillers.ZERO_LEFT)); + + }else{ + + throw new CampoLivreException(new IllegalArgumentException("O campo (nosso número) do título deve ser um número inteiro positivo, e não: ["+titulo.getNossoNumero()+"]")); + } + }else{ + + throw new CampoLivreException(new IllegalArgumentException("O campo (nosso número) do título deve ser numérico, e não: ["+titulo.getNossoNumero()+"]")); + } + + this.add(new FixedField(calculeDigitoEmModulo11(titulo.getNossoNumero()), 1)); + } + + @Override + protected void addFields(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + @Override + protected void checkValues(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaRegistrada.java b/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaRegistrada.java index 0413beca..e6141460 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaRegistrada.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaRegistrada.java @@ -1,192 +1,192 @@ -package org.jrimum.bopepo.campolivre; - -import static org.jrimum.utilix.DateFormat.YYMMDD; - -import java.util.Date; - -import org.apache.commons.lang3.StringUtils; -import org.jrimum.domkee.banco.ContaBancaria; -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Objects; -import org.jrimum.utilix.Strings; - -/** - * - *

            - * Representação do campo livre usado para boletos com carteiras (cobrança) - * com registro. - *

            - * - *

            - * Layout:
            - *

            - *

            - * Cobrança Direta (com registro) - *

            - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
            PosiçãoCampo Livre No Código De - * Barras (20 a 44)
            20 a 21Código da transação = 04
            22 a 27Data do Vencimento do Título (AAMMDD)
            28 a 31Agência do Cedente
            32Dígito Verificador da Agência do Cedente
            33 a 43Nosso Número
            44Super Digito do Nosso Número (*)
            - *

            - * - * - * @author Gilmar P.S.L. - * - * @since 0.2 - * - * @version 0.2 - */ - -class CLUnibancoCobrancaRegistrada extends AbstractCLUnibanco { - - /** - * - */ - private static final long serialVersionUID = -2740172688796212239L; - - /** - * - */ - private static final Integer FIELDS_LENGTH = 6; - - private static final String CODIGO_TRANSACAO = "04"; - - /** - *

            - * Dado um título, cria um campo livre para o padrão do Banco Unibanco - * que tenha o tipo de cobrança registrada. - *

            - * @param titulo título com as informações para geração do campo livre - */ - CLUnibancoCobrancaRegistrada(Titulo titulo) { - super(FIELDS_LENGTH); - - ContaBancaria conta = titulo.getContaBancaria(); - - Objects.checkNotNull(conta,"Conta Bancária NULA!"); - Objects.checkNotNull(titulo.getDataDoVencimento(), "Data de vencimento do título NULA!"); - Objects.checkNotNull(conta.getAgencia().getCodigo(), "Número da Agência Bancária NULO!"); - Objects.checkNotNull(conta.getAgencia().getDigitoVerificador(),"Dígito da Agência Bancária NULO!"); - Objects.checkNotNull(titulo.getNossoNumero(),"Nosso Número NULO!"); - - this.add(new FixedField(CODIGO_TRANSACAO, 2)); - this.add(new FixedField(titulo.getDataDoVencimento(), 6, YYMMDD.copy())); - - if(conta.getAgencia().getCodigo() > 0){ - - this.add(new FixedField(conta.getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); - - }else{ - - throw new CampoLivreException(new IllegalArgumentException("Agência bancária com valor inválido, a agência deve ser um número inteiro positivo, e não: "+conta.getNumeroDaConta().getCodigoDaConta())); - } - - - if (StringUtils.isNumeric(conta.getAgencia().getDigitoVerificador())) { - - Integer digitoDaAgencia = Integer.valueOf(conta.getAgencia().getDigitoVerificador()); - - if(digitoDaAgencia>=0){ - - this.add(new FixedField(Integer.valueOf(digitoDaAgencia), 1)); - }else{ - - throw new CampoLivreException(new IllegalArgumentException("O dígito da agência deve ser um número interio não-negativo, e não: ["+conta.getAgencia().getDigitoVerificador()+"]")); - } - }else{ - - throw new CampoLivreException(new IllegalArgumentException("O dígito da agência deve ser numérico, e não: ["+conta.getAgencia().getDigitoVerificador()+"]")); - } - - if(StringUtils.isNumeric(titulo.getNossoNumero())){ - - if(Long.valueOf(Strings.removeStartWithZeros(titulo.getNossoNumero()))>0){ - - this.add(new FixedField(titulo.getNossoNumero(), 11,Fillers.ZERO_LEFT)); - }else{ - - throw new CampoLivreException(new IllegalArgumentException("O campo (nosso número) do título deve ser um número natural positivo, e não: ["+titulo.getNossoNumero()+"]")); - } - }else{ - - throw new CampoLivreException(new IllegalArgumentException("O campo (nosso número) do título deve ser numérico, e não: ["+titulo.getNossoNumero()+"]")); - } - - this.add(new FixedField(calculeSuperDigito(titulo.getNossoNumero()), 1)); - } - - /** - *

            - * Calcula o Super Dígito do Nosso Número. - *

            - * - *

            - * Super dígito do “Nosso Número” [calculado com o MÓDULO 11 (de 2 a 9)] - * obtido utilizando-se os algarismos do “Nosso Número” acrescido do número - * 1 à esquerda = [1/NNNNNNNNNNN] e multiplicando-se a sequência obetem-se a - * soma dos produtos. Em seguida multiplicando-se novamente a soma por 10 e - * depois realizando-se o módulo 11. - *

            - * - * - * @param nossoNumero - * - * @return Dígito verficador calculado - * - * @see #calculeDigitoEmModulo11(String) - * @see org.jrimum.vallia.digitoverificador.Modulo - * - * @since 0.2 - */ - private String calculeSuperDigito(String nossoNumero) { - - return calculeDigitoEmModulo11("1" + nossoNumero); - } - - @Override - protected void addFields(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - @Override - protected void checkValues(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } -} +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.utilix.DateFormat.YYMMDD; + +import java.util.Date; + +import org.apache.commons.lang3.StringUtils; +import org.jrimum.domkee.banco.ContaBancaria; +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.Strings; + +/** + * + *

            + * Representação do campo livre usado para boletos com carteiras (cobrança) + * com registro. + *

            + * + *

            + * Layout: + *

            + *

            + * Cobrança Direta (com registro) + *

            + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
            PosiçãoCampo Livre No Código De + * Barras (20 a 44)
            20 a 21Código da transação = 04
            22 a 27Data do Vencimento do Título (AAMMDD)
            28 a 31Agência do Cedente
            32Dígito Verificador da Agência do Cedente
            33 a 43Nosso Número
            44Super Digito do Nosso Número (*)
            + *

            + * + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ + +class CLUnibancoCobrancaRegistrada extends AbstractCLUnibanco { + + /** + * + */ + private static final long serialVersionUID = -2740172688796212239L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 6; + + private static final String CODIGO_TRANSACAO = "04"; + + /** + *

            + * Dado um título, cria um campo livre para o padrão do Banco Unibanco + * que tenha o tipo de cobrança registrada. + *

            + * @param titulo título com as informações para geração do campo livre + */ + CLUnibancoCobrancaRegistrada(Titulo titulo) { + super(FIELDS_LENGTH); + + ContaBancaria conta = titulo.getContaBancaria(); + + Objects.checkNotNull(conta,"Conta Bancária NULA!"); + Objects.checkNotNull(titulo.getDataDoVencimento(), "Data de vencimento do título NULA!"); + Objects.checkNotNull(conta.getAgencia().getCodigo(), "Número da Agência Bancária NULO!"); + Objects.checkNotNull(conta.getAgencia().getDigitoVerificador(),"Dígito da Agência Bancária NULO!"); + Objects.checkNotNull(titulo.getNossoNumero(),"Nosso Número NULO!"); + + this.add(new FixedField(CODIGO_TRANSACAO, 2)); + this.add(new FixedField(titulo.getDataDoVencimento(), 6, YYMMDD.copy())); + + if(conta.getAgencia().getCodigo() > 0){ + + this.add(new FixedField(conta.getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); + + }else{ + + throw new CampoLivreException(new IllegalArgumentException("Agência bancária com valor inválido, a agência deve ser um número inteiro positivo, e não: "+conta.getNumeroDaConta().getCodigoDaConta())); + } + + + if (StringUtils.isNumeric(conta.getAgencia().getDigitoVerificador())) { + + Integer digitoDaAgencia = Integer.valueOf(conta.getAgencia().getDigitoVerificador()); + + if(digitoDaAgencia>=0){ + + this.add(new FixedField(Integer.valueOf(digitoDaAgencia), 1)); + }else{ + + throw new CampoLivreException(new IllegalArgumentException("O dígito da agência deve ser um número interio não-negativo, e não: ["+conta.getAgencia().getDigitoVerificador()+"]")); + } + }else{ + + throw new CampoLivreException(new IllegalArgumentException("O dígito da agência deve ser numérico, e não: ["+conta.getAgencia().getDigitoVerificador()+"]")); + } + + if(StringUtils.isNumeric(titulo.getNossoNumero())){ + + if(Long.valueOf(Strings.removeStartWithZeros(titulo.getNossoNumero()))>0){ + + this.add(new FixedField(titulo.getNossoNumero(), 11,Fillers.ZERO_LEFT)); + }else{ + + throw new CampoLivreException(new IllegalArgumentException("O campo (nosso número) do título deve ser um número natural positivo, e não: ["+titulo.getNossoNumero()+"]")); + } + }else{ + + throw new CampoLivreException(new IllegalArgumentException("O campo (nosso número) do título deve ser numérico, e não: ["+titulo.getNossoNumero()+"]")); + } + + this.add(new FixedField(calculeSuperDigito(titulo.getNossoNumero()), 1)); + } + + /** + *

            + * Calcula o Super Dígito do Nosso Número. + *

            + * + *

            + * Super dígito do “Nosso Número” [calculado com o MÓDULO 11 (de 2 a 9)] + * obtido utilizando-se os algarismos do “Nosso Número” acrescido do número + * 1 à esquerda = [1/NNNNNNNNNNN] e multiplicando-se a sequência obetem-se a + * soma dos produtos. Em seguida multiplicando-se novamente a soma por 10 e + * depois realizando-se o módulo 11. + *

            + * + * + * @param nossoNumero + * + * @return Dígito verficador calculado + * + * @see #calculeDigitoEmModulo11(String) + * @see org.jrimum.vallia.digitoverificador.Modulo + * + * @since 0.2 + */ + private String calculeSuperDigito(String nossoNumero) { + + return calculeDigitoEmModulo11("1" + nossoNumero); + } + + @Override + protected void addFields(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + @Override + protected void checkValues(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } +} diff --git a/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java b/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java index 92b3f6ec..211dda5e 100644 --- a/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java +++ b/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java @@ -1,163 +1,163 @@ -/* - * Copyright 2011 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/09/2011 - 16:07:23 - * - * ================================================================================ - * - * Direitos autorais 2011 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/09/2011 - 16:07:23 - * - */ - -package org.jrimum.bopepo.pdf; - -import static java.lang.String.format; -import static org.jrimum.texgit.Fillers.ZERO_LEFT; -import static org.jrimum.utilix.Objects.isNotNull; - -import java.util.Calendar; -import java.util.TimeZone; - -import org.jrimum.utilix.Objects; - -/** - * Converte datas para o formato usando no padrão PDF. - * - *

            - * PDF defines standard date format, which closely follows that of the - * international standard ASN.1 (Abstract Syntax Notation One), defined in - * ISO/IEC 8824. A date is a string of the form (D:YYYYMMDDHHmmSSOHH'mm') - * where:
            - *

              - *
            • YYYY is the year
            • - *
            • MM is the month
            • - *
            • DD is the day (01-31)
            • - *
            • HH is the hour (00-23)
            • - *
            • mm is the minute (00-59)
            • - *
            • SS is the second (00-59)
            • - *
            • O is the relationship of local time to Universal Time (UT), - * denoted by one of the characters +, -, or Z (see below)
            • - *
            • HH followed by ' is the absolute value of the offset from UT in - * hours (00-23)
            • - *
            • mm followed by ' is the absolute value of the offset from UT in - * minutes (00-59)
            • - *
            - * The apostrophe character (') after HH and mm is part of the syntax. All - * fields after the year are optional. (The prefix D:, although also optional, - * is strongly recommended.) - *

            - *

            - * The default values for MM and DD are both 01; all other numerical fields - * default to zero values. A plus sign (+) as the value of the O field signifies - * that local time is later than UT, a minus sign (-) that local time is earlier - * than UT, and the letter Z that local time is equal to UT. If no UT - * information is specified, the relationship of the specified time to UT is - * considered to be unknown. Whether or not the time zone is known, the rest of - * the date should be specified in local time. - *

            - *

            - * For example, April 14, 2010, at 9:50 PM, U.S. Pacific Standard Time, is - * represented by the string (D:201004142150-08'00') - *

            - * - * @author Gilmar P.S.L. - * - * @version 0.2.3 - * - * @since 0.2 - */ -public class PdfDateConverter { - - /** - * Converte a data para o formato de data do PDF: - * {@code D:YYYYMMDDHHmmSSOHH'mm'}, caso não exista um time zone, o fuso - * horário do meridiano de Greenwich então será usado, resultando em - * D:YYYYMMDDHHmm{@code "Z00'00'"}. - * - * @param date - * - * @return data no formato PDF: {@code D:YYYYMMDDHHmmSSOHH'mm'} - */ - public static String convert(final Calendar date) { - - Objects.checkNotNull(date, - "Null não pode ser convertido em uma data no formato PDF!"); - - final int NOT_INDEX = 1; - - StringBuilder dateTime = new StringBuilder("D:") - .append(date.get(Calendar.YEAR)) - .append(ZERO_LEFT.fill(date.get(Calendar.MONTH) + NOT_INDEX, 2)) - .append(ZERO_LEFT.fill(date.get(Calendar.DAY_OF_MONTH), 2)) - .append(ZERO_LEFT.fill(date.get(Calendar.HOUR_OF_DAY), 2)) - .append(ZERO_LEFT.fill(date.get(Calendar.MINUTE), 2)) - .append(ZERO_LEFT.fill(date.get(Calendar.SECOND), 2)) - .append(convertTimeZone(date)); - - return dateTime.toString(); - } - - /** - * Converte o time zone para o formato {@code "OHH'mm'"}, caso não exista um - * time zone, o fuso horário do meridiano de Greenwich então será usado, - * resultando no valor {@code "Z00'00'"}. - * - * @param date - * - * @return time zone no formato {@code "OHH'mm'"} - */ - private static String convertTimeZone(final Calendar date) { - - final int MINUTES_PER_HOUR = 60; - final int MILLISECONDS_PER_SECOND = 1000; - final int SECONDS_PER_MINUTE = 60; - - final TimeZone tz = date.getTimeZone(); - - String timeZone = "Z00'00'"; - - if (isNotNull(tz)) { - - final long offset = tz.getOffset(date.getTimeInMillis()); - - final long timeInMinutes = Math.abs(offset)/MILLISECONDS_PER_SECOND/SECONDS_PER_MINUTE; - - final String signal = offset == 0 ? "Z" : (offset > 0 ? "+" : "-"); - - long hours = 0; - long minutes = 0; - - if (timeInMinutes > MINUTES_PER_HOUR) { - - hours = timeInMinutes / MINUTES_PER_HOUR; - minutes = timeInMinutes % MINUTES_PER_HOUR; - - } else { - minutes = timeInMinutes; - } - - timeZone = format("%1$s%2$02d'%3$02d'", signal, hours, minutes); - } - - return timeZone; - } - -} +/* + * Copyright 2011 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/09/2011 - 16:07:23 + * + * ================================================================================ + * + * Direitos autorais 2011 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/09/2011 - 16:07:23 + * + */ + +package org.jrimum.bopepo.pdf; + +import static java.lang.String.format; +import static org.jrimum.texgit.Fillers.ZERO_LEFT; +import static org.jrimum.utilix.Objects.isNotNull; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.jrimum.utilix.Objects; + +/** + * Converte datas para o formato usando no padrão PDF. + * + *

            + * PDF defines standard date format, which closely follows that of the + * international standard ASN.1 (Abstract Syntax Notation One), defined in + * ISO/IEC 8824. A date is a string of the form (D:YYYYMMDDHHmmSSOHH'mm') + * where: + *

              + *
            • YYYY is the year
            • + *
            • MM is the month
            • + *
            • DD is the day (01-31)
            • + *
            • HH is the hour (00-23)
            • + *
            • mm is the minute (00-59)
            • + *
            • SS is the second (00-59)
            • + *
            • O is the relationship of local time to Universal Time (UT), + * denoted by one of the characters +, -, or Z (see below)
            • + *
            • HH followed by ' is the absolute value of the offset from UT in + * hours (00-23)
            • + *
            • mm followed by ' is the absolute value of the offset from UT in + * minutes (00-59)
            • + *
            + * The apostrophe character (') after HH and mm is part of the syntax. All + * fields after the year are optional. (The prefix D:, although also optional, + * is strongly recommended.) + *

            + *

            + * The default values for MM and DD are both 01; all other numerical fields + * default to zero values. A plus sign (+) as the value of the O field signifies + * that local time is later than UT, a minus sign (-) that local time is earlier + * than UT, and the letter Z that local time is equal to UT. If no UT + * information is specified, the relationship of the specified time to UT is + * considered to be unknown. Whether or not the time zone is known, the rest of + * the date should be specified in local time. + *

            + *

            + * For example, April 14, 2010, at 9:50 PM, U.S. Pacific Standard Time, is + * represented by the string (D:201004142150-08'00') + *

            + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public class PdfDateConverter { + + /** + * Converte a data para o formato de data do PDF: + * {@code D:YYYYMMDDHHmmSSOHH'mm'}, caso não exista um time zone, o fuso + * horário do meridiano de Greenwich então será usado, resultando em + * D:YYYYMMDDHHmm{@code "Z00'00'"}. + * + * @param date + * + * @return data no formato PDF: {@code D:YYYYMMDDHHmmSSOHH'mm'} + */ + public static String convert(final Calendar date) { + + Objects.checkNotNull(date, + "Null não pode ser convertido em uma data no formato PDF!"); + + final int NOT_INDEX = 1; + + StringBuilder dateTime = new StringBuilder("D:") + .append(date.get(Calendar.YEAR)) + .append(ZERO_LEFT.fill(date.get(Calendar.MONTH) + NOT_INDEX, 2)) + .append(ZERO_LEFT.fill(date.get(Calendar.DAY_OF_MONTH), 2)) + .append(ZERO_LEFT.fill(date.get(Calendar.HOUR_OF_DAY), 2)) + .append(ZERO_LEFT.fill(date.get(Calendar.MINUTE), 2)) + .append(ZERO_LEFT.fill(date.get(Calendar.SECOND), 2)) + .append(convertTimeZone(date)); + + return dateTime.toString(); + } + + /** + * Converte o time zone para o formato {@code "OHH'mm'"}, caso não exista um + * time zone, o fuso horário do meridiano de Greenwich então será usado, + * resultando no valor {@code "Z00'00'"}. + * + * @param date + * + * @return time zone no formato {@code "OHH'mm'"} + */ + private static String convertTimeZone(final Calendar date) { + + final int MINUTES_PER_HOUR = 60; + final int MILLISECONDS_PER_SECOND = 1000; + final int SECONDS_PER_MINUTE = 60; + + final TimeZone tz = date.getTimeZone(); + + String timeZone = "Z00'00'"; + + if (isNotNull(tz)) { + + final long offset = tz.getOffset(date.getTimeInMillis()); + + final long timeInMinutes = Math.abs(offset)/MILLISECONDS_PER_SECOND/SECONDS_PER_MINUTE; + + final String signal = offset == 0 ? "Z" : (offset > 0 ? "+" : "-"); + + long hours = 0; + long minutes = 0; + + if (timeInMinutes > MINUTES_PER_HOUR) { + + hours = timeInMinutes / MINUTES_PER_HOUR; + minutes = timeInMinutes % MINUTES_PER_HOUR; + + } else { + minutes = timeInMinutes; + } + + timeZone = format("%1$s%2$02d'%3$02d'", signal, hours, minutes); + } + + return timeZone; + } + +} diff --git a/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java b/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java index 08e7b1e6..b8c02af5 100644 --- a/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java +++ b/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java @@ -1,410 +1,410 @@ -/* - * Copyright 2011 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: 19/09/2011 - 15:43:26 - * - * ================================================================================ - * - * Direitos autorais 2011 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 19/09/2011 - 15:43:26 - * - */ -package org.jrimum.bopepo.pdf; - -import com.itextpdf.text.pdf.PdfDate; -import static org.jrimum.utilix.Objects.checkNotNull; -import static org.jrimum.utilix.Objects.isNotNull; - -import java.util.Calendar; -import java.util.HashMap; -import java.util.Map; - -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Objects; - -/** - * Pricipais informações de um documento PDF: Título, Autor, Assunto, - * Palavras-chave, Aplicativo criador, Data de criação e Data de - * modificação - * . - * - * @author Gilmar P.S.L. - * - */ -public class PdfDocInfo { - - /* - * Mesmas chaves de pesquisa usadas pelo itext. - */ - /** - * Key = Título do documento. - */ - private static final String DOC_TITLE = "Title"; - /** - * Key = Autor do documento. - */ - private static final String DOC_AUTHOR = "Author"; - /** - * Key = Assunto do documento. - */ - private static final String DOC_SUBJECT = "Subject"; - /** - * Key = Palavras-chave do documento. - */ - private static final String DOC_KEYWORDS = "Keywords"; - /** - * Key = Ferramenta/Software usada para do documento. - */ - private static final String DOC_CREATOR = "Creator"; - /** - * Key = Data de criação do documento. - */ - private static final String DOC_CREATION_DATE = "CreationDate"; - /** - * Key = Data de modificação do documento. - */ - private static final String DOC_MODIFACTION_DATE = "ModDate"; - - /** - * Key = Ferramenta/Software que de fato produziu o documento. - */ - private static final String DOC_PRODUCER = "Producer"; - - /** - * Map com informações sobre o documento: Title, Author, Subject, etc. - */ - private final Map docInfo; - - /** - * Modo de criação não utilizado e não permitido. - */ - private PdfDocInfo() { - Exceptions.throwIllegalStateException("Estado não permitido!"); - docInfo = null; - } - - /** - * Apenas para uso interno. - * - * @param info - */ - private PdfDocInfo(Map info) { - - checkNotNull(info); - - this.docInfo = info; - } - - /** - * Cria uma nova instância sem informações. - * - * @return referência prota para uso - */ - public static PdfDocInfo create() { - - return new PdfDocInfo(new HashMap(8)); - } - - /** - * Cria uma nova instância com as informações fornecidas. - * - * @param info Informações sobre um documento - * - * @return referência prota para uso - */ - public static PdfDocInfo create(Map info) { - - checkNotNull(info, "INFO INVÁLIDA!"); - - return new PdfDocInfo(info); - } - - /** - * Define o Título do documento. - * - * @param title - * - * @return Esta instância após a operação - */ - public PdfDocInfo title(String title) { - - if (isNotNull(title)) { - docInfo.put(DOC_TITLE, title); - } - - return this; - } - - /** - * Define o Autor do documento. - * - * @param author - * - * @return Esta instância após a operação - */ - public PdfDocInfo author(String author) { - - if (isNotNull(author)) { - docInfo.put(DOC_AUTHOR, author); - } - - return this; - } - - /** - * Define o Assunto do documento. - * - * @param subject - * - * @return Esta instância após a operação - */ - public PdfDocInfo subject(String subject) { - - if (isNotNull(subject)) { - docInfo.put(DOC_SUBJECT, subject); - } - - return this; - } - - /** - * Define as Palavras-chave do documento. - * - * @param keywords - * - * @return Esta instância após a operação - */ - public PdfDocInfo keywords(String keywords) { - - if (isNotNull(keywords)) { - docInfo.put(DOC_KEYWORDS, keywords); - } - - return this; - } - - /** - * Define o Software/Ferramenta de criação do documento. - * - * @param creator - * - * @return Esta instância após a operação - */ - public PdfDocInfo creator(String creator) { - - if (isNotNull(creator)) { - docInfo.put(DOC_CREATOR, creator); - } - - return this; - } - - /** - * Define a Data de criação do documento. - * - * @param date Data de criação - * - * @return Esta instância após a operação - * - * @throws IllegalArgumentException quando a date é nula - */ - public PdfDocInfo creation(Calendar date) { - - Objects.checkNotNull(date, "Valor null não permitido para data de criação do documento!"); - - docInfo.put(DOC_CREATION_DATE, PdfDateConverter.convert(date)); - - return this; - } - - /** - * Define a Data de modificação do documento. - * - * @param date Data de modificação - * - * @return Esta instância após a operação - * - * @throws IllegalArgumentException quando a date é nula - */ - public PdfDocInfo modification(Calendar date) { - - Objects.checkNotNull(date, "Valor null não permitido para data de modificação do documento!"); - Objects.checkNotNull(date); - - docInfo.put(DOC_MODIFACTION_DATE, PdfDateConverter.convert(date)); - - return this; - } - - /** - * @return Título do documento - */ - public String title() { - - return docInfo.get(DOC_TITLE); - } - - /** - * @return Autor do documento - */ - public String author() { - - return docInfo.get(DOC_AUTHOR); - } - - /** - * @return Assunto do documento - */ - public String subject() { - - return docInfo.get(DOC_SUBJECT); - } - - /** - * @return Palavras-chave do documento - */ - public String keywords() { - - return docInfo.get(DOC_KEYWORDS); - } - - /** - * @return Criador do documento - */ - public String creator() { - - return docInfo.get(DOC_CREATOR); - } - - /** - * Data de criação do documento em string, provalvelmento no seguinte - * formato: (D:YYYYMMDDHHmmSSOHH'mm'). - * - * @return Data de criação do documento - */ - public String creationRaw() { - - return docInfo.get(DOC_CREATION_DATE); - } - - /** - * @return Data de criação do documento - */ - public Calendar creation() { - - return PdfDate.decode(docInfo.get(DOC_CREATION_DATE)); - } - - /** - * Data de modificação do documento em string, provalvelmento no seguinte - * formato: (D:YYYYMMDDHHmmSSOHH'mm'). - * - * @return Data de modificação do documento - */ - public String modificationRaw() { - - return docInfo.get(DOC_MODIFACTION_DATE); - } - - /** - * @return Data de modificação do documento - */ - public Calendar modification() { - - return PdfDate.decode(docInfo.get(DOC_MODIFACTION_DATE)); - - } - - /** - * Retorna a descrição do produtor do documento. - * - *

            - * Obs: "You can’t change this without breaking the software license that - * allows you to use iText for free." - *

            - * - * @return Descrição do produtor - */ - public String producer() { - - return docInfo.get(DOC_PRODUCER); - } - - /** - * Transforma as informações do documento em um novo Map a cada chamada. - * - * @return Map de informações - */ - public Map toMap() { - - return new HashMap(docInfo); - } - - /** - * Geração a partir do {@code hashCode()} do {@linkplain #docInfo}. - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((docInfo == null) ? 0 : docInfo.hashCode()); - return result; - } - - /** - * Comparação com base no {@linkplain #docInfo}. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - PdfDocInfo other = (PdfDocInfo) obj; - if (docInfo == null) { - if (other.docInfo != null) { - return false; - } - } else if (!docInfo.equals(other.docInfo)) { - return false; - } - return true; - } - - /** - * Informação contida em {@linkplain #docInfo}. - * - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "PdfDocInfo [docInfo=" + docInfo + "]"; - } - -} +/* + * Copyright 2011 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: 19/09/2011 - 15:43:26 + * + * ================================================================================ + * + * Direitos autorais 2011 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 19/09/2011 - 15:43:26 + * + */ +package org.jrimum.bopepo.pdf; + +import com.itextpdf.text.pdf.PdfDate; +import static org.jrimum.utilix.Objects.checkNotNull; +import static org.jrimum.utilix.Objects.isNotNull; + +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; + +/** + * Pricipais informações de um documento PDF: Título, Autor, Assunto, + * Palavras-chave, Aplicativo criador, Data de criação e Data de + * modificação + * . + * + * @author Gilmar P.S.L. + * + */ +public class PdfDocInfo { + + /* + * Mesmas chaves de pesquisa usadas pelo itext. + */ + /** + * Key = Título do documento. + */ + private static final String DOC_TITLE = "Title"; + /** + * Key = Autor do documento. + */ + private static final String DOC_AUTHOR = "Author"; + /** + * Key = Assunto do documento. + */ + private static final String DOC_SUBJECT = "Subject"; + /** + * Key = Palavras-chave do documento. + */ + private static final String DOC_KEYWORDS = "Keywords"; + /** + * Key = Ferramenta/Software usada para do documento. + */ + private static final String DOC_CREATOR = "Creator"; + /** + * Key = Data de criação do documento. + */ + private static final String DOC_CREATION_DATE = "CreationDate"; + /** + * Key = Data de modificação do documento. + */ + private static final String DOC_MODIFACTION_DATE = "ModDate"; + + /** + * Key = Ferramenta/Software que de fato produziu o documento. + */ + private static final String DOC_PRODUCER = "Producer"; + + /** + * Map com informações sobre o documento: Title, Author, Subject, etc. + */ + private final Map docInfo; + + /** + * Modo de criação não utilizado e não permitido. + */ + private PdfDocInfo() { + Exceptions.throwIllegalStateException("Estado não permitido!"); + docInfo = null; + } + + /** + * Apenas para uso interno. + * + * @param info + */ + private PdfDocInfo(Map info) { + + checkNotNull(info); + + this.docInfo = info; + } + + /** + * Cria uma nova instância sem informações. + * + * @return referência prota para uso + */ + public static PdfDocInfo create() { + + return new PdfDocInfo(new HashMap(8)); + } + + /** + * Cria uma nova instância com as informações fornecidas. + * + * @param info Informações sobre um documento + * + * @return referência prota para uso + */ + public static PdfDocInfo create(Map info) { + + checkNotNull(info, "INFO INVÁLIDA!"); + + return new PdfDocInfo(info); + } + + /** + * Define o Título do documento. + * + * @param title + * + * @return Esta instância após a operação + */ + public PdfDocInfo title(String title) { + + if (isNotNull(title)) { + docInfo.put(DOC_TITLE, title); + } + + return this; + } + + /** + * Define o Autor do documento. + * + * @param author + * + * @return Esta instância após a operação + */ + public PdfDocInfo author(String author) { + + if (isNotNull(author)) { + docInfo.put(DOC_AUTHOR, author); + } + + return this; + } + + /** + * Define o Assunto do documento. + * + * @param subject + * + * @return Esta instância após a operação + */ + public PdfDocInfo subject(String subject) { + + if (isNotNull(subject)) { + docInfo.put(DOC_SUBJECT, subject); + } + + return this; + } + + /** + * Define as Palavras-chave do documento. + * + * @param keywords + * + * @return Esta instância após a operação + */ + public PdfDocInfo keywords(String keywords) { + + if (isNotNull(keywords)) { + docInfo.put(DOC_KEYWORDS, keywords); + } + + return this; + } + + /** + * Define o Software/Ferramenta de criação do documento. + * + * @param creator + * + * @return Esta instância após a operação + */ + public PdfDocInfo creator(String creator) { + + if (isNotNull(creator)) { + docInfo.put(DOC_CREATOR, creator); + } + + return this; + } + + /** + * Define a Data de criação do documento. + * + * @param date Data de criação + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException quando a date é nula + */ + public PdfDocInfo creation(Calendar date) { + + Objects.checkNotNull(date, "Valor null não permitido para data de criação do documento!"); + + docInfo.put(DOC_CREATION_DATE, PdfDateConverter.convert(date)); + + return this; + } + + /** + * Define a Data de modificação do documento. + * + * @param date Data de modificação + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException quando a date é nula + */ + public PdfDocInfo modification(Calendar date) { + + Objects.checkNotNull(date, "Valor null não permitido para data de modificação do documento!"); + Objects.checkNotNull(date); + + docInfo.put(DOC_MODIFACTION_DATE, PdfDateConverter.convert(date)); + + return this; + } + + /** + * @return Título do documento + */ + public String title() { + + return docInfo.get(DOC_TITLE); + } + + /** + * @return Autor do documento + */ + public String author() { + + return docInfo.get(DOC_AUTHOR); + } + + /** + * @return Assunto do documento + */ + public String subject() { + + return docInfo.get(DOC_SUBJECT); + } + + /** + * @return Palavras-chave do documento + */ + public String keywords() { + + return docInfo.get(DOC_KEYWORDS); + } + + /** + * @return Criador do documento + */ + public String creator() { + + return docInfo.get(DOC_CREATOR); + } + + /** + * Data de criação do documento em string, provalvelmento no seguinte + * formato: (D:YYYYMMDDHHmmSSOHH'mm'). + * + * @return Data de criação do documento + */ + public String creationRaw() { + + return docInfo.get(DOC_CREATION_DATE); + } + + /** + * @return Data de criação do documento + */ + public Calendar creation() { + + return PdfDate.decode(docInfo.get(DOC_CREATION_DATE)); + } + + /** + * Data de modificação do documento em string, provalvelmento no seguinte + * formato: (D:YYYYMMDDHHmmSSOHH'mm'). + * + * @return Data de modificação do documento + */ + public String modificationRaw() { + + return docInfo.get(DOC_MODIFACTION_DATE); + } + + /** + * @return Data de modificação do documento + */ + public Calendar modification() { + + return PdfDate.decode(docInfo.get(DOC_MODIFACTION_DATE)); + + } + + /** + * Retorna a descrição do produtor do documento. + * + *

            + * Obs: "You can’t change this without breaking the software license that + * allows you to use iText for free." + *

            + * + * @return Descrição do produtor + */ + public String producer() { + + return docInfo.get(DOC_PRODUCER); + } + + /** + * Transforma as informações do documento em um novo Map a cada chamada. + * + * @return Map de informações + */ + public Map toMap() { + + return new HashMap(docInfo); + } + + /** + * Geração a partir do {@code hashCode()} do {@linkplain #docInfo}. + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((docInfo == null) ? 0 : docInfo.hashCode()); + return result; + } + + /** + * Comparação com base no {@linkplain #docInfo}. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + PdfDocInfo other = (PdfDocInfo) obj; + if (docInfo == null) { + if (other.docInfo != null) { + return false; + } + } else if (!docInfo.equals(other.docInfo)) { + return false; + } + return true; + } + + /** + * Informação contida em {@linkplain #docInfo}. + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "PdfDocInfo [docInfo=" + docInfo + "]"; + } + +} diff --git a/src/main/java/org/jrimum/bopepo/view/BoletoInfoViewCecred.java b/src/main/java/org/jrimum/bopepo/view/BoletoInfoViewCecred.java index 42669a77..914bd982 100644 --- a/src/main/java/org/jrimum/bopepo/view/BoletoInfoViewCecred.java +++ b/src/main/java/org/jrimum/bopepo/view/BoletoInfoViewCecred.java @@ -51,7 +51,7 @@ public String getTextoFcLocalPagamento() { /** * @see - * org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoRsAgenciaCodigoCedente() + * org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoRsAgenciaCodigoCedente() */ @Override public String getTextoRsAgenciaCodigoCedente() { @@ -60,7 +60,7 @@ public String getTextoRsAgenciaCodigoCedente() { /** * @see - * org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcAgenciaCodigoCedente() + * org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoFcAgenciaCodigoCedente() */ @Override public String getTextoFcAgenciaCodigoCedente() { diff --git a/src/main/java/org/jrimum/bopepo/view/BoletoInfoViewSicredi.java b/src/main/java/org/jrimum/bopepo/view/BoletoInfoViewSicredi.java index f9631f88..f234753c 100644 --- a/src/main/java/org/jrimum/bopepo/view/BoletoInfoViewSicredi.java +++ b/src/main/java/org/jrimum/bopepo/view/BoletoInfoViewSicredi.java @@ -46,7 +46,7 @@ public class BoletoInfoViewSicredi extends AbstractBoletoInfoCampoView{ } /** - * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoRsCodigoBanco() + * @see org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoRsCodigoBanco() */ @Override public String getTextoRsCodigoBanco() { @@ -54,7 +54,7 @@ public String getTextoRsCodigoBanco() { } /** - * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcCodigoBanco() + * @see org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoFcCodigoBanco() */ @Override public String getTextoFcCodigoBanco() { @@ -62,7 +62,7 @@ public String getTextoFcCodigoBanco() { } /** - * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcLocalPagamento() + * @see org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoFcLocalPagamento() */ @Override public String getTextoFcLocalPagamento() { @@ -70,7 +70,7 @@ public String getTextoFcLocalPagamento() { } /** - * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoRsAgenciaCodigoCedente() + * @see org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoRsAgenciaCodigoCedente() */ @Override public String getTextoRsAgenciaCodigoCedente() { @@ -78,7 +78,7 @@ public String getTextoRsAgenciaCodigoCedente() { } /** - * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcAgenciaCodigoCedente() + * @see org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoFcAgenciaCodigoCedente() */ @Override public String getTextoFcAgenciaCodigoCedente() { @@ -86,7 +86,7 @@ public String getTextoFcAgenciaCodigoCedente() { } /** - * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoRsNossoNumero() + * @see org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoRsNossoNumero() */ @Override public String getTextoRsNossoNumero() { @@ -94,7 +94,7 @@ public String getTextoRsNossoNumero() { } /** - * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcNossoNumero() + * @see org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoFcNossoNumero() */ @Override public String getTextoFcNossoNumero() { @@ -102,7 +102,7 @@ public String getTextoFcNossoNumero() { } /** - * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcAceite() + * @see org.jrimum.bopepo.view.AbstractBoletoInfoCampoView#getTextoFcAceite() */ @Override public String getTextoFcAceite() { diff --git a/src/main/java/org/jrimum/bopepo/view/BoletoViewer.java b/src/main/java/org/jrimum/bopepo/view/BoletoViewer.java index 4cb6919d..7e88fff8 100644 --- a/src/main/java/org/jrimum/bopepo/view/BoletoViewer.java +++ b/src/main/java/org/jrimum/bopepo/view/BoletoViewer.java @@ -1,1349 +1,1349 @@ -/* - * 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: 08/05/2008 - 00:10:01 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Criado em: 08/05/2008 - 00:10:01 - * - */ -package org.jrimum.bopepo.view; - -import static org.apache.commons.lang3.StringUtils.EMPTY; -import static org.jrimum.utilix.Objects.isNotNull; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.InputStream; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.log4j.Logger; -import org.jrimum.bopepo.Boleto; -import org.jrimum.bopepo.pdf.Files; -import org.jrimum.utilix.Collections; -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Objects; -import org.jrimum.utilix.Strings; - -/** - *

            - * Agrupa as formas de "visão" de um boleto. - *

            - * - *

            - * Exemplo de formas de visualização: - *

              - *
            • PDF
            • - *
            • Stream
            • - *
            • Array de Bytes
            • - *
            • Outros
            • - *
            - *

            - * - * @author Gilmar P.S.L. - * @author Misael Barreto - * @author Rômulo Augusto - * @author Samuel Valério - * - * @since 0.2 - * - * @version 0.2 - */ -public class BoletoViewer { - - /** - * - */ - private static Logger log = Logger.getLogger(BoletoViewer.class); - - /** - *

            - * Engine responsável pela visualização em formato PDF. - *

            - */ - private PdfViewer pdfViewer; - - /** - *

            - * Instancia o visualizador com o template padrão. - *

            - * - * @param boleto Boleto preenchido - * - * @throws IllegalArgumentException Caso o {@code boleto} seja nulo - */ - public BoletoViewer(Boleto boleto) { - checkBoleto(boleto); - this.pdfViewer = new PdfViewer(boleto); - } - - /** - *

            - * Instancia o visualizador com um template determinado. - *

            - * - * @param boleto Boleto preenchido - * @param templatePath Template PDF o qual o boleto será gerado - * - * @throws IllegalArgumentException Caso o {@code boleto} ou - * {@code template} seja nulo - */ - public BoletoViewer(Boleto boleto, String templatePath) { - - checkBoleto(boleto); - checkTemplatePath(templatePath); - - this.pdfViewer = new PdfViewer(boleto); - - setTemplate(templatePath); - } - - /** - *

            - * Instancia o visualizador com um template determinado. - *

            - * - * @param boleto Boleto preenchido - * @param templateFile Template PDF o qual o boleto será gerado - * - * @throws IllegalArgumentException Caso o {@code boleto} ou - * {@code template} seja nulo - */ - public BoletoViewer(Boleto boleto, File templateFile) { - - checkBoleto(boleto); - checkTemplateFile(templateFile); - - this.pdfViewer = new PdfViewer(boleto); - - setTemplate(templateFile); - } - - /** - *

            - * Instancia o visualizador com um template determinado. - *

            - * - * @param boleto Boleto preenchido - * @param templateUrl Template PDF o qual o boleto será gerado - * - * @throws IllegalArgumentException Caso o {@code boleto} ou - * {@code template} seja nulo - */ - public BoletoViewer(Boleto boleto, URL templateUrl) { - - checkBoleto(boleto); - checkTemplateFile(templateUrl); - - this.pdfViewer = new PdfViewer(boleto); - - setTemplate(templateUrl); - } - - /** - *

            - * Instancia o visualizador com um template determinado. - *

            - * - * @param boleto Boleto preenchido - * @param templateInput Template PDF o qual o boleto será gerado - * - * @throws IllegalArgumentException Caso o {@code boleto} ou - * {@code template} seja nulo - */ - public BoletoViewer(Boleto boleto, InputStream templateInput) { - - checkBoleto(boleto); - checkTemplateFile(templateInput); - - this.pdfViewer = new PdfViewer(boleto); - - setTemplate(templateInput); - } - - /** - *

            - * Instancia o visualizador com um template determinado. - *

            - * - * @param boleto Boleto preenchido - * @param template Template PDF o qual o boleto será gerado - * - * @throws IllegalArgumentException Caso o {@code boleto} ou - * {@code template} seja nulo - */ - public BoletoViewer(Boleto boleto, byte[] template) { - - checkBoleto(boleto); - checkTemplateFile(template); - - this.pdfViewer = new PdfViewer(boleto); - - setTemplate(template); - } - - /** - * Para uso interno do componente - */ - protected BoletoViewer() { - - this.pdfViewer = new PdfViewer(); - } - - /** - * Para uso interno do componente - */ - protected BoletoViewer(PdfViewer pdfViewer) { - - this.pdfViewer = pdfViewer; - } - - /** - *

            - * Instancia o visualizador com o template padrão. Caso o boleto seja nulo, - * nenhuma instância do viewer é criada. - *

            - * - * @param boleto Boleto preenchido - * - * @throws IllegalArgumentException Caso o {@code boleto} seja nulo - */ - public static BoletoViewer create(Boleto boleto) { - checkBoleto(boleto); - return new BoletoViewer(boleto); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * - * @return Arquivo PDF em array de bytes gerado com os boletos da lista - * - * @since 0.2 - */ - public static byte[] groupInOnePDF(List boletos) { - checkBoletosList(boletos); - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer()); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param destPath Caminho para o arquivo que armazenará os boletos - * - * @return Arquivo PDF gerado com os boletos da lista - * - * @since 0.2 - */ - public static File groupInOnePDF(List boletos, String destPath) { - checkBoletosList(boletos); - checkDestPath(destPath); - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer(), - new File(destPath)); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param destFile Arquivo que armazenará os boletos - * - * @return Arquivo PDF gerado com os boletos da lista - * - * @since 0.2 - */ - public static File groupInOnePDF(List boletos, File destFile) { - checkBoletosList(boletos); - checkDestFile(destFile); - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer(), destFile); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param templatePath Caminho para o arquivo com o template para geração - * @return Arquivo PDF em array de bytes gerado com os boletos da lista - * - * @since 0.2 - */ - public static byte[] groupInOnePdfWithTemplate(List boletos, String templatePath) { - checkBoletosList(boletos); - checkTemplatePath(templatePath); - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templatePath)); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param templateUrl Arquivo com o template para geração - * @return Arquivo PDF em array de bytes gerado com os boletos da lista - * - * @since 0.2 - */ - public static byte[] groupInOnePdfWithTemplate(List boletos, URL templateUrl) { - checkBoletosList(boletos); - checkTemplateFile(templateUrl); - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templateUrl)); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param templateFile Arquivo com o template para geração - * @return Arquivo PDF em array de bytes gerado com os boletos da lista - * - * @since 0.2 - */ - public static byte[] groupInOnePdfWithTemplate(List boletos, File templateFile) { - checkBoletosList(boletos); - checkTemplateFile(templateFile); - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templateFile)); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param templateInput Arquivo com o template para geração - * @return Arquivo PDF em array de bytes gerado com os boletos da lista - * - * @since 0.2 - */ - public static byte[] groupInOnePdfWithTemplate(List boletos, InputStream templateInput) { - checkBoletosList(boletos); - checkTemplateFile(templateInput); - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templateInput)); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param template Arquivo com o template para geração - * @return Arquivo PDF em array de bytes gerado com os boletos da lista - * - * @since 0.2 - */ - public static byte[] groupInOnePdfWithTemplate(List boletos, byte[] template) { - - checkBoletosList(boletos); - checkTemplateFile(template); - - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(template)); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param destPath Caminho para o arquivo que armazenará os boletos - * @param templatePath Caminho para o arquivo com o template para geração - * @return Arquivo PDF gerado com os boletos da lista - * - * @since 0.2 - */ - public static File groupInOnePdfWithTemplate(List boletos, String destPath, - String templatePath) { - - checkBoletosList(boletos); - checkDestPath(destPath); - checkTemplatePath(templatePath); - - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templatePath), - new File(destPath)); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param destPath Caminho para o arquivo que armazenará os boletos - * @param templateFile Arquivo com o template para geração - * @return Arquivo PDF gerado com os boletos da lista - * - * @since 0.2 - */ - public static File groupInOnePdfWithTemplate(List boletos, String destPath, - File templateFile) { - - checkBoletosList(boletos); - checkDestPath(destPath); - checkTemplateFile(templateFile); - - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templateFile), - new File(destPath)); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param destFile Arquivo que armazenará os boletos - * @param templatePath Caminho para o arquivo com o template para geração - * @return Arquivo PDF gerado com os boletos da lista - * - * @since 0.2 - */ - public static File groupInOnePdfWithTemplate(List boletos, File destFile, - String templatePath) { - - checkBoletosList(boletos); - checkDestFile(destFile); - checkTemplatePath(templatePath); - - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer() - .setTemplate(templatePath), destFile); - } - - /** - *

            - * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém - * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 - * boletos, sendo 1 boleto em cada página. - *

            - * - * - * @param boletos Lista com os boletos a serem agrupados - * @param destFile Arquivo que armazenará os boletos - * @param templateFile Arquivo com o template para geração - * @return Arquivo PDF gerado com os boletos da lista - * - * @since 0.2 - */ - public static File groupInOnePdfWithTemplate(List boletos, File destFile, - File templateFile) { - - checkBoletosList(boletos); - checkDestFile(destFile); - checkTemplateFile(templateFile); - - return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer() - .setTemplate(templateFile), destFile); - } - - /** - *

            - * Agrupa os boletos das listas com seus respectivos templates em um único - * arquivo PDF. Caso exista sequência na coleção, a mesma é mantida. - *

            - * - * - * @param templatesAndBoletos Coleção de templates e boletos a serem - * agrupados - * - * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos - * - * @since 0.2 - */ - public static byte[] groupInOnePdfWithTemplates(Collection>> templatesAndBoletos) { - - checkTemplateBoletosEntries(templatesAndBoletos); - - return PdfViewerMultiProcessor.groupInOnePDF(templatesAndBoletos); - } - - /** - *

            - * Agrupa os boletos das listas com seus respectivos templates em um único - * arquivo PDF. Caso exista sequência na coleção, a mesma é mantida. - *

            - * - * - * @param templatesAndBoletos Coleção de templates e boletos a serem - * agrupados - * - * @param destFile Arquivo que armazenará os boletos - * - * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos - * - * @since 0.2 - */ - public static File groupInOnePdfWithTemplates(Collection>> templatesAndBoletos, File destFile) { - - checkTemplateBoletosEntries(templatesAndBoletos); - checkDestFile(destFile); - - try { - - return Files.bytesToFile(destFile, PdfViewerMultiProcessor.groupInOnePDF(templatesAndBoletos)); - - } catch (Exception e) { - - return Exceptions.throwIllegalStateException("Erro inesperado!", e); - } - } - - /** - *

            - * Agrupa os boletos das listas com seus respectivos templates em um único - * arquivo PDF. Caso exista sequência no Map, a mesma dependerá da chamada - * ao método {@link java.util.Map#entrySet() entrySet} do mesmo. - *

            - * - * - * @param templatesAndBoletos Mapa de templates e boletos a serem agrupados - * - * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos - * - * @since 0.2 - */ - public static byte[] groupInOnePdfWithTemplates(Map> templatesAndBoletos) { - - checkTemplateBoletosEntries(templatesAndBoletos); - - return groupInOnePdfWithTemplates(templatesAndBoletos.entrySet()); - } - - /** - *

            - * Agrupa os boletos das listas com seus respectivos templates em um único - * arquivo PDF. Caso exista sequência no Map, a mesma dependerá da chamada - * ao método {@link java.util.Map#entrySet() entrySet} do mesmo. - *

            - * - * - * @param templatesAndBoletos Mapa de templates e boletos a serem agrupados - * - * @param destFile Arquivo que armazenará os boletos - * - * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos - * - * @since 0.2 - */ - public static File groupInOnePdfWithTemplates(Map> templatesAndBoletos, File destFile) { - - checkTemplateBoletosEntries(templatesAndBoletos); - checkDestFile(destFile); - - return groupInOnePdfWithTemplates(templatesAndBoletos.entrySet(), destFile); - } - - /** - *

            - * Agrupa os boletos das listas com seus respectivos templates em um único - * arquivo PDF. Caso exista sequência no Map, a mesma dependerá da chamada - * ao método {@link java.util.Map#entrySet() entrySet} do mesmo. - *

            * @param boletos Lista com os boletos a serem gerados - * - * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos - * - * @since 0.2 - */ - public static List onePerPDF(List boletos) { - - checkBoletosList(boletos); - - return PdfViewerMultiProcessor.onePerPDF(boletos); - } - - /** - *

            - * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo - * segue a forma:
            - *
            - * diretorio + (/ ou \\) + (indice do arquivo na lista + 1) + - * ".pdf" - *

            - * - *

            - * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file);} - *
            - *
            - * Arquivos gerados: - *

              - *
            • 1.pdf
            • - *
            • 2.pdf
            • - *
            • 3.pdf
            • - *
            - *

            - * - * @param boletos Lista com os boletos a serem agrupados - * @param destPath Diretório o qual os boletos serão criados - * - * @return Lista contendo os arquivos PDF gerados a partir da lista de - * boletos - * - * @since 0.2 - */ - public static List onePerPDF(List boletos, String destPath) { - - checkBoletosList(boletos); - checkDestPath(destPath); - - return onePerPDF(boletos, new File(destPath), EMPTY, EMPTY); - } - - /** - *

            - * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo - * segue a forma:
            - *
            - * diretorio + (/ ou \\) + (indice do arquivo na lista + 1) + - * ".pdf" - *

            - * - *

            - * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file);} - *
            - *
            - * Arquivos gerados: - *

              - *
            • 1.pdf
            • - *
            • 2.pdf
            • - *
            • 3.pdf
            • - *
            - *

            - * - * @param boletos Lista com os boletos a serem agrupados - * @param destDir Diretório o qual os boletos serão criados - * - * @return Lista contendo os arquivos PDF gerados a partir da lista de - * boletos - * - * @since 0.2 - */ - public static List onePerPDF(List boletos, File destDir) { - - checkBoletosList(boletos); - checkDestDir(destDir); - - return onePerPDF(boletos, destDir, EMPTY, EMPTY); - } - - /** - *

            - * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo - * segue a forma:
            - *
            - * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + - * ".pdf" - *

            - * - *

            - * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, - * "BoletoPrefixo");}
            - *
            - * Arquivos gerados: - *

              - *
            • BoletoPrefixo1.pdf
            • - *
            • BoletoPrefixo2.pdf
            • - *
            • BoletoPrefixo3.pdf
            • - *
            - *

            - * - * @param boletos Lista com os boletos a serem agrupados - * @param destPath Diretório o qual os boletos serão criados - * @param prefixo Prefixo do nome do arquivo - * - * @return Lista contendo os arquivos PDF gerados a partir da lista de - * boletos - * - * @since 0.2 - */ - public static List onePerPDF(List boletos, String destPath, String prefixo) { - - checkBoletosList(boletos); - checkDestPath(destPath); - - return onePerPDF(boletos, new File(destPath), prefixo, EMPTY); - } - - /** - *

            - * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo - * segue a forma:
            - *
            - * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + - * ".pdf" - *

            - * - *

            - * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, - * "BoletoPrefixo");}
            - *
            - * Arquivos gerados: - *

              - *
            • BoletoPrefixo1.pdf
            • - *
            • BoletoPrefixo2.pdf
            • - *
            • BoletoPrefixo3.pdf
            • - *
            - *

            - * - * @param boletos Lista com os boletos a serem agrupados - * @param destDir Diretório o qual os boletos serão criados - * @param prefixo Prefixo do nome do arquivo - * - * @return Lista contendo os arquivos PDF gerados a partir da lista de - * boletos - * - * @since 0.2 - */ - public static List onePerPDF(List boletos, File destDir, String prefixo) { - - checkBoletosList(boletos); - checkDestDir(destDir); - - return onePerPDF(boletos, destDir, prefixo, EMPTY); - } - - /** - *

            - * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo - * segue a forma:
            - *
            - * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + - * sufixo + ".pdf" - *

            - * - *

            - * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, - * "BoletoPrefixo", "exSufixo");}
            - *
            - * Arquivos gerados: - *

              - *
            • BoletoPrefixo1exSufixo.pdf
            • - *
            • BoletoPrefixo2exSufixo.pdf
            • - *
            • BoletoPrefixo3exSufixo.pdf
            • - *
            - *

            - * - * @param boletos Lista com os boletos a serem agrupados - * @param destPath Diretório o qual os boletos serão criados - * @param prefixo Prefixo do nome do arquivo - * @param sufixo Sufixo do nome do arquivo - * @return Lista contendo os arquivos PDF gerados a partir da lista de - * boletos - * - * @since 0.2 - */ - public static List onePerPDF(List boletos, String destPath, String prefixo, String sufixo) { - - checkBoletosList(boletos); - checkDestPath(destPath); - - return onePerPDF(boletos, new File(destPath), prefixo, sufixo); - } - - /** - *

            - * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo - * segue a forma:
            - *
            - * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + - * sufixo + ".pdf" - *

            - * - *

            - * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, - * "BoletoPrefixo", "exSufixo");}
            - *
            - * Arquivos gerados: - *

              - *
            • BoletoPrefixo1exSufixo.pdf
            • - *
            • BoletoPrefixo2exSufixo.pdf
            • - *
            • BoletoPrefixo3exSufixo.pdf
            • - *
            - *

            - * - * @param boletos Lista com os boletos a serem agrupados - * @param destDir Diretório o qual os boletos serão criados - * @param prefixo Prefixo do nome do arquivo - * @param sufixo Sufixo do nome do arquivo - * @return Lista contendo os arquivos PDF gerados a partir da lista de - * boletos - * - * @since 0.2 - */ - public static List onePerPDF(List boletos, File destDir, String prefixo, String sufixo) { - - checkBoletosList(boletos); - checkDestDir(destDir); - - List files = new ArrayList(boletos.size()); - - files.addAll(PdfViewerMultiProcessor.onePerPDF(boletos, destDir, prefixo, sufixo)); - - return files; - } - - public static List onePerPDFWithTemplate(List boletos, String templatePath) { - - checkBoletosList(boletos); - checkTemplatePath(templatePath); - - return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(templatePath)); - } - - public static List onePerPDFWithTemplate(List boletos, URL templateUrl) { - - checkBoletosList(boletos); - checkTemplateFile(templateUrl); - - return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(templateUrl)); - } - - public static List onePerPDFWithTemplate(List boletos, File templateFile) { - - checkBoletosList(boletos); - checkTemplateFile(templateFile); - - return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(templateFile)); - } - - public static List onePerPDFWithTemplate(List boletos, InputStream templateInput) { - - checkBoletosList(boletos); - checkTemplateFile(templateInput); - - return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(templateInput)); - } - - public static List onePerPDFWithTemplate(List boletos, byte[] template) { - - checkBoletosList(boletos); - checkTemplateFile(template); - - return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(template)); - } - - /** - *

            - * Agrupa os boletos das listas com seus respectivos templates em um único - * arquivo PDF. Caso exista sequência na coleção, a mesma é mantida. - *

            - * - * - * @param templatesAndBoletos Coleção de templates e boletos a serem - * agrupados - * - * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos - * - * @since 0.2 - */ - public static List onePerPdfWithTemplates(Collection>> templatesAndBoletos) { - - checkTemplateBoletosEntries(templatesAndBoletos); - - return PdfViewerMultiProcessor.onePerPDF(templatesAndBoletos); - } - - /** - * Indica se o PDF do boleto gerado deve ser comprimido completamente ou - * não, o padrão é true. - * - *

            - * "Full compression" foi introduzido no modelo de documento de PDF 1.5, o - * que quer dizer que os boletos gerados por padrão pelo Bopepo estão nesse - * modelo a menos que se utilize este método informando o contrário: {@code - * #setPdfFullCompression(false)}. - *

            - *

            - * Um PDF que seja "fully compressed", só pode ser lido por um visualizador - * PDF como Acrobat Reader 6 ou superior. Entretanto, se o documento não for - * comprimido [ {@code #setPdfFullCompression(false)} ], o boleto pdf gerado - * no modelo de documento PDF 1.4 poderá ser lido por um visualizador tal - * qual Acrobat Reader 5 ou superior. - *

            - * - * @param option Escolha de compressão - * - * @return Esta instância após a operação - * - * @since 0.2 - */ - public BoletoViewer setPdfFullCompression(boolean option) { - - pdfViewer.setFullCompression(option); - - return this; - } - - /** - * Define o título do documento PDF gerado. - * - * @param titulo para ser exibido como título do documento PDF - * @return Esta instância após a operação - * - * @since 0.2 - */ - public BoletoViewer setPdfTitulo(String titulo) { - - pdfViewer.setTitle(titulo); - - return this; - } - - /** - * Define se o título do documento PDF gerado será mostrado ou não (padrão - * true). - * - * @param opcao para exibir título do documento PDF (true) - * @return Esta instância após a operação - * - * @since 0.2 - */ - public BoletoViewer setPdfExibirTitulo(boolean opcao) { - - pdfViewer.setDisplayTitle(opcao); - - return this; - } - - /** - * Define o autor do documento PDF gerado. - * - * @param autor do documento PDF - * @return Esta instância após a operação - * - * @since 0.2 - */ - public BoletoViewer setPdfAutor(String autor) { - - pdfViewer.setAuthor(autor); - - return this; - } - - /** - * Define o assunto do documento PDF gerado. - * - * @param assunto do documento PDF - * @return Esta instância após a operação - * - * @since 0.2 - */ - public BoletoViewer setPdfAssunto(String assunto) { - - pdfViewer.setSubject(assunto); - - return this; - } - - /** - * Define as palavras chave do documento PDF gerado. - * - * @param palavrasChave do documento PDF - * @return Esta instância após a operação - * - * @since 0.2 - */ - public BoletoViewer setPdfPalavrasChave(String palavrasChave) { - - pdfViewer.setKeywords(palavrasChave); - - return this; - } - - /** - * Define se o os campos do documento PDF gerado devem ser removidos ou não - * (padrão true). - * - * @param opcao para remover campos do documento PDF (true) - * @return Esta instância após a operação - * - * @since 0.2 - */ - public BoletoViewer setPdfRemoverCampos(boolean opcao) { - - pdfViewer.setRemoveFields(opcao); - - return this; - } - - /** - * Define o template que será utilizado para construir o boleto. - * - * @param template - * - * @return Esta instância após a operação - * - * @throws IllegalArgumentException Caso o {@code template} seja nulo - * - * @since 0.2 - */ - public BoletoViewer setTemplate(byte[] template) { - - checkTemplateFile(template); - - this.pdfViewer.setTemplate(template); - - return this; - } - - /** - * Define o template que será utilizado para construir o boleto. - * - * @param templateUrl - * - * @since 0.2 - * - * @return Esta instância após a operação - * - * @throws IllegalArgumentException Caso o {@code template} seja nulo - */ - public BoletoViewer setTemplate(URL templateUrl) { - - checkTemplateFile(templateUrl); - - this.pdfViewer.setTemplate(templateUrl); - - return this; - } - - /** - * Define o template que será utilizado para construir o boleto. - * - * @param templateInput - * - * @since 0.2 - * - * @return Esta instância após a operação - * - * @throws IllegalArgumentException Caso o {@code template} seja nulo - */ - public BoletoViewer setTemplate(InputStream templateInput) { - - checkTemplateFile(templateInput); - - this.pdfViewer.setTemplate(templateInput); - - return this; - } - - /** - * Define o template que será utilizado para construir o boleto. - * - * @param templatePath - * - * @since 0.2 - * - * @return Esta instância após a operação - * - * @throws IllegalArgumentException Caso o {@code template} seja nulo - */ - public BoletoViewer setTemplate(String templatePath) { - - checkTemplatePath(templatePath); - - this.pdfViewer.setTemplate(templatePath); - - return this; - } - - /** - * Define o template que será utilizado para construir o boleto. - * - * @param templateFile - * - * @since 0.2 - * - * @return Esta instância após a operação - * - * @throws IllegalArgumentException Caso o {@code template} seja nulo - */ - public BoletoViewer setTemplate(File templateFile) { - - checkTemplateFile(templateFile); - - this.pdfViewer.setTemplate(templateFile); - - return this; - } - - /** - *

            - * Atribui um boleto para uso no visualizador. {@code Null} não é permitido. - *

            - * - * @param boleto Boleto a ser visualizado - * - * @since 0.2 - * - * @return Esta instância após a operação - */ - public BoletoViewer setBoleto(Boleto boleto) { - - checkBoleto(boleto); - - updateViewerPDF(boleto); - - return this; - } - - /** - *

            - * Caso algum template tenha sido utilizado, este método define que após sua - * execução o boleto será consturído com o template padrão. - *

            - * - * @since 0.2 - * - * @return Esta instância após a operação - */ - public BoletoViewer removeTemplate() { - - final String DEFAULT = null; - - if (isNotNull(pdfViewer)) { - pdfViewer.setTemplate(DEFAULT); - } - - return this; - } - - /** - *

            - * Retorna o aquivo template utilizado pelo visualizador, que pode ser o - * template padrão ou outro. - *

            - * - * @return Arquivo template - * - * @since 0.2 - */ - public byte[] getTemplate() { - - return pdfViewer.getTemplate(); - } - - /** - *

            - * Retorna o boleto usado pelo visualizador - *

            - * - * @return o boleto - * - * @since 0.2 - */ - public Boleto getBoleto() { - - return pdfViewer.getBoleto(); - } - - /** - *

            - * Retorna o boleto em um arquivo pdf. - *

            - * - * @param destPath Caminho onde será criado o arquivo pdf - * @return Boleo em File - * - * @since 0.2 - */ - public File getPdfAsFile(String destPath) { - if (log.isDebugEnabled()) { - log.debug("documento instance : " + pdfViewer); - } - return pdfViewer.getFile(destPath); - } - - /** - *

            - * Retorna o boleto em um arquivo pdf. - *

            - * - * @param destFile Caminho onde será criado o arquivo pdf - * @return Boleto em File - * - * @since 0.2 - */ - public File getPdfAsFile(File destFile) { - if (log.isDebugEnabled()) { - log.debug("documento instance : " + pdfViewer); - } - return pdfViewer.getFile(destFile); - } - - /** - *

            - * Retorna o boleto em uma stream de bytes. - *

            - * - * @return Boleto em ByteArrayOutputStream - * - * @since 0.2 - */ - public ByteArrayOutputStream getPdfAsStream() { - if (log.isDebugEnabled()) { - log.debug("documento instance : " + pdfViewer); - } - return pdfViewer.getStream(); - - } - - /** - *

            - * Retorna o boleto em um array de bytes. - *

            - * - * @return Boleto em byte[] - * - * @since 0.2 - */ - public byte[] getPdfAsByteArray() { - if (log.isDebugEnabled()) { - log.debug("documento instance : " + pdfViewer); - } - return pdfViewer.getBytes(); - } - - /** - *

            - * Atualiza o objeto BoletoViewer mantendo as "invariantes". - *

            - * - * @param boleto - * - * @since 0.2 - */ - private void updateViewerPDF(Boleto boleto) { - - if (isNotNull(this.pdfViewer)) { - - this.pdfViewer.setBoleto(boleto); - - } else { - - this.pdfViewer = new PdfViewer(boleto); - } - } - - private static void checkDestPath(String path) { - - checkString(path, "Caminho destinado a geração do(s) arquivo(s) não contém informação!"); - } - - private static void checkTemplatePath(String path) { - - checkString(path, "Caminho do template não contém informação!"); - } - - private static void checkTemplateFile(Object template) { - - Objects.checkNotNull(template, "Arquivo de template nulo!"); - } - - private static void checkString(String str, String msg) { - - Objects.checkNotNull(str); - Strings.checkNotBlank(str, msg); - } - - private static void checkDestDir(File file) { - - Objects.checkNotNull(file, "Diretório destinado a geração do(s) boleto(s) nulo!"); - Objects.checkArgument(file.isDirectory(), "Isto não é um diretório válido!"); - } - - private static void checkDestFile(File file) { - - Objects.checkNotNull(file, "Arquivo destinado a geração do(s) boleto(s) nulo!"); - } - - private static void checkBoleto(Boleto boleto) { - - Objects.checkNotNull(boleto, "Boleto nulo!"); - } - - private static void checkBoletosList(List boletos) { - - Objects.checkNotNull(boletos, "Lista de boletos nula!"); - Collections.checkNotEmpty(boletos, "A Lista de boletos está vazia!"); - } - - private static void checkTemplateBoletosEntries(Collection>> templatesAndBoletos) { - - Collections.checkNotEmpty(templatesAndBoletos, "A Coleção de pares: (template,boletos) está vazia!"); - } - - private static void checkTemplateBoletosEntries(Map> templatesAndBoletos) { - - Collections.checkNotEmpty(templatesAndBoletos, "O Mapa (template,boletos) está vazio!"); - } - -} +/* + * 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: 08/05/2008 - 00:10:01 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 08/05/2008 - 00:10:01 + * + */ +package org.jrimum.bopepo.view; + +import static org.apache.commons.lang3.StringUtils.EMPTY; +import static org.jrimum.utilix.Objects.isNotNull; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.log4j.Logger; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.pdf.Files; +import org.jrimum.utilix.Collections; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.Strings; + +/** + *

            + * Agrupa as formas de "visão" de um boleto. + *

            + * + *

            + * Exemplo de formas de visualização: + *

              + *
            • PDF
            • + *
            • Stream
            • + *
            • Array de Bytes
            • + *
            • Outros
            • + *
            + *

            + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério + * + * @since 0.2 + * + * @version 0.2 + */ +public class BoletoViewer { + + /** + * + */ + private static Logger log = Logger.getLogger(BoletoViewer.class); + + /** + *

            + * Engine responsável pela visualização em formato PDF. + *

            + */ + private PdfViewer pdfViewer; + + /** + *

            + * Instancia o visualizador com o template padrão. + *

            + * + * @param boleto Boleto preenchido + * + * @throws IllegalArgumentException Caso o {@code boleto} seja nulo + */ + public BoletoViewer(Boleto boleto) { + checkBoleto(boleto); + this.pdfViewer = new PdfViewer(boleto); + } + + /** + *

            + * Instancia o visualizador com um template determinado. + *

            + * + * @param boleto Boleto preenchido + * @param templatePath Template PDF o qual o boleto será gerado + * + * @throws IllegalArgumentException Caso o {@code boleto} ou + * {@code template} seja nulo + */ + public BoletoViewer(Boleto boleto, String templatePath) { + + checkBoleto(boleto); + checkTemplatePath(templatePath); + + this.pdfViewer = new PdfViewer(boleto); + + setTemplate(templatePath); + } + + /** + *

            + * Instancia o visualizador com um template determinado. + *

            + * + * @param boleto Boleto preenchido + * @param templateFile Template PDF o qual o boleto será gerado + * + * @throws IllegalArgumentException Caso o {@code boleto} ou + * {@code template} seja nulo + */ + public BoletoViewer(Boleto boleto, File templateFile) { + + checkBoleto(boleto); + checkTemplateFile(templateFile); + + this.pdfViewer = new PdfViewer(boleto); + + setTemplate(templateFile); + } + + /** + *

            + * Instancia o visualizador com um template determinado. + *

            + * + * @param boleto Boleto preenchido + * @param templateUrl Template PDF o qual o boleto será gerado + * + * @throws IllegalArgumentException Caso o {@code boleto} ou + * {@code template} seja nulo + */ + public BoletoViewer(Boleto boleto, URL templateUrl) { + + checkBoleto(boleto); + checkTemplateFile(templateUrl); + + this.pdfViewer = new PdfViewer(boleto); + + setTemplate(templateUrl); + } + + /** + *

            + * Instancia o visualizador com um template determinado. + *

            + * + * @param boleto Boleto preenchido + * @param templateInput Template PDF o qual o boleto será gerado + * + * @throws IllegalArgumentException Caso o {@code boleto} ou + * {@code template} seja nulo + */ + public BoletoViewer(Boleto boleto, InputStream templateInput) { + + checkBoleto(boleto); + checkTemplateFile(templateInput); + + this.pdfViewer = new PdfViewer(boleto); + + setTemplate(templateInput); + } + + /** + *

            + * Instancia o visualizador com um template determinado. + *

            + * + * @param boleto Boleto preenchido + * @param template Template PDF o qual o boleto será gerado + * + * @throws IllegalArgumentException Caso o {@code boleto} ou + * {@code template} seja nulo + */ + public BoletoViewer(Boleto boleto, byte[] template) { + + checkBoleto(boleto); + checkTemplateFile(template); + + this.pdfViewer = new PdfViewer(boleto); + + setTemplate(template); + } + + /** + * Para uso interno do componente + */ + protected BoletoViewer() { + + this.pdfViewer = new PdfViewer(); + } + + /** + * Para uso interno do componente + */ + protected BoletoViewer(PdfViewer pdfViewer) { + + this.pdfViewer = pdfViewer; + } + + /** + *

            + * Instancia o visualizador com o template padrão. Caso o boleto seja nulo, + * nenhuma instância do viewer é criada. + *

            + * + * @param boleto Boleto preenchido + * + * @throws IllegalArgumentException Caso o {@code boleto} seja nulo + */ + public static BoletoViewer create(Boleto boleto) { + checkBoleto(boleto); + return new BoletoViewer(boleto); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * + * @return Arquivo PDF em array de bytes gerado com os boletos da lista + * + * @since 0.2 + */ + public static byte[] groupInOnePDF(List boletos) { + checkBoletosList(boletos); + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer()); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param destPath Caminho para o arquivo que armazenará os boletos + * + * @return Arquivo PDF gerado com os boletos da lista + * + * @since 0.2 + */ + public static File groupInOnePDF(List boletos, String destPath) { + checkBoletosList(boletos); + checkDestPath(destPath); + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer(), + new File(destPath)); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param destFile Arquivo que armazenará os boletos + * + * @return Arquivo PDF gerado com os boletos da lista + * + * @since 0.2 + */ + public static File groupInOnePDF(List boletos, File destFile) { + checkBoletosList(boletos); + checkDestFile(destFile); + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer(), destFile); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param templatePath Caminho para o arquivo com o template para geração + * @return Arquivo PDF em array de bytes gerado com os boletos da lista + * + * @since 0.2 + */ + public static byte[] groupInOnePdfWithTemplate(List boletos, String templatePath) { + checkBoletosList(boletos); + checkTemplatePath(templatePath); + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templatePath)); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param templateUrl Arquivo com o template para geração + * @return Arquivo PDF em array de bytes gerado com os boletos da lista + * + * @since 0.2 + */ + public static byte[] groupInOnePdfWithTemplate(List boletos, URL templateUrl) { + checkBoletosList(boletos); + checkTemplateFile(templateUrl); + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templateUrl)); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param templateFile Arquivo com o template para geração + * @return Arquivo PDF em array de bytes gerado com os boletos da lista + * + * @since 0.2 + */ + public static byte[] groupInOnePdfWithTemplate(List boletos, File templateFile) { + checkBoletosList(boletos); + checkTemplateFile(templateFile); + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templateFile)); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param templateInput Arquivo com o template para geração + * @return Arquivo PDF em array de bytes gerado com os boletos da lista + * + * @since 0.2 + */ + public static byte[] groupInOnePdfWithTemplate(List boletos, InputStream templateInput) { + checkBoletosList(boletos); + checkTemplateFile(templateInput); + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templateInput)); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param template Arquivo com o template para geração + * @return Arquivo PDF em array de bytes gerado com os boletos da lista + * + * @since 0.2 + */ + public static byte[] groupInOnePdfWithTemplate(List boletos, byte[] template) { + + checkBoletosList(boletos); + checkTemplateFile(template); + + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(template)); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param destPath Caminho para o arquivo que armazenará os boletos + * @param templatePath Caminho para o arquivo com o template para geração + * @return Arquivo PDF gerado com os boletos da lista + * + * @since 0.2 + */ + public static File groupInOnePdfWithTemplate(List boletos, String destPath, + String templatePath) { + + checkBoletosList(boletos); + checkDestPath(destPath); + checkTemplatePath(templatePath); + + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templatePath), + new File(destPath)); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param destPath Caminho para o arquivo que armazenará os boletos + * @param templateFile Arquivo com o template para geração + * @return Arquivo PDF gerado com os boletos da lista + * + * @since 0.2 + */ + public static File groupInOnePdfWithTemplate(List boletos, String destPath, + File templateFile) { + + checkBoletosList(boletos); + checkDestPath(destPath); + checkTemplateFile(templateFile); + + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer().setTemplate(templateFile), + new File(destPath)); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param destFile Arquivo que armazenará os boletos + * @param templatePath Caminho para o arquivo com o template para geração + * @return Arquivo PDF gerado com os boletos da lista + * + * @since 0.2 + */ + public static File groupInOnePdfWithTemplate(List boletos, File destFile, + String templatePath) { + + checkBoletosList(boletos); + checkDestFile(destFile); + checkTemplatePath(templatePath); + + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer() + .setTemplate(templatePath), destFile); + } + + /** + *

            + * Agrupa os boletos da lista em um único arquivo PDF. Ex: Se a lista contém + * 10 boletos, ao final será gerado um único arquivo PDF contendo os 10 + * boletos, sendo 1 boleto em cada página. + *

            + * + * + * @param boletos Lista com os boletos a serem agrupados + * @param destFile Arquivo que armazenará os boletos + * @param templateFile Arquivo com o template para geração + * @return Arquivo PDF gerado com os boletos da lista + * + * @since 0.2 + */ + public static File groupInOnePdfWithTemplate(List boletos, File destFile, + File templateFile) { + + checkBoletosList(boletos); + checkDestFile(destFile); + checkTemplateFile(templateFile); + + return PdfViewerMultiProcessor.groupInOnePDF(boletos, new BoletoViewer() + .setTemplate(templateFile), destFile); + } + + /** + *

            + * Agrupa os boletos das listas com seus respectivos templates em um único + * arquivo PDF. Caso exista sequência na coleção, a mesma é mantida. + *

            + * + * + * @param templatesAndBoletos Coleção de templates e boletos a serem + * agrupados + * + * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos + * + * @since 0.2 + */ + public static byte[] groupInOnePdfWithTemplates(Collection>> templatesAndBoletos) { + + checkTemplateBoletosEntries(templatesAndBoletos); + + return PdfViewerMultiProcessor.groupInOnePDF(templatesAndBoletos); + } + + /** + *

            + * Agrupa os boletos das listas com seus respectivos templates em um único + * arquivo PDF. Caso exista sequência na coleção, a mesma é mantida. + *

            + * + * + * @param templatesAndBoletos Coleção de templates e boletos a serem + * agrupados + * + * @param destFile Arquivo que armazenará os boletos + * + * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos + * + * @since 0.2 + */ + public static File groupInOnePdfWithTemplates(Collection>> templatesAndBoletos, File destFile) { + + checkTemplateBoletosEntries(templatesAndBoletos); + checkDestFile(destFile); + + try { + + return Files.bytesToFile(destFile, PdfViewerMultiProcessor.groupInOnePDF(templatesAndBoletos)); + + } catch (Exception e) { + + return Exceptions.throwIllegalStateException("Erro inesperado!", e); + } + } + + /** + *

            + * Agrupa os boletos das listas com seus respectivos templates em um único + * arquivo PDF. Caso exista sequência no Map, a mesma dependerá da chamada + * ao método {@link java.util.Map#entrySet() entrySet} do mesmo. + *

            + * + * + * @param templatesAndBoletos Mapa de templates e boletos a serem agrupados + * + * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos + * + * @since 0.2 + */ + public static byte[] groupInOnePdfWithTemplates(Map> templatesAndBoletos) { + + checkTemplateBoletosEntries(templatesAndBoletos); + + return groupInOnePdfWithTemplates(templatesAndBoletos.entrySet()); + } + + /** + *

            + * Agrupa os boletos das listas com seus respectivos templates em um único + * arquivo PDF. Caso exista sequência no Map, a mesma dependerá da chamada + * ao método {@link java.util.Map#entrySet() entrySet} do mesmo. + *

            + * + * + * @param templatesAndBoletos Mapa de templates e boletos a serem agrupados + * + * @param destFile Arquivo que armazenará os boletos + * + * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos + * + * @since 0.2 + */ + public static File groupInOnePdfWithTemplates(Map> templatesAndBoletos, File destFile) { + + checkTemplateBoletosEntries(templatesAndBoletos); + checkDestFile(destFile); + + return groupInOnePdfWithTemplates(templatesAndBoletos.entrySet(), destFile); + } + + /** + *

            + * Agrupa os boletos das listas com seus respectivos templates em um único + * arquivo PDF. Caso exista sequência no Map, a mesma dependerá da chamada + * ao método {@link java.util.Map#entrySet() entrySet} do mesmo. + *

            * @param boletos Lista com os boletos a serem gerados + * + * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos + * + * @since 0.2 + */ + public static List onePerPDF(List boletos) { + + checkBoletosList(boletos); + + return PdfViewerMultiProcessor.onePerPDF(boletos); + } + + /** + *

            + * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo + * segue a forma: + * + * diretorio + (/ ou \\) + (indice do arquivo na lista + 1) + + * ".pdf" + *

            + * + *

            + * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file);} + * + * + * Arquivos gerados: + *

              + *
            • 1.pdf
            • + *
            • 2.pdf
            • + *
            • 3.pdf
            • + *
            + *

            + * + * @param boletos Lista com os boletos a serem agrupados + * @param destPath Diretório o qual os boletos serão criados + * + * @return Lista contendo os arquivos PDF gerados a partir da lista de + * boletos + * + * @since 0.2 + */ + public static List onePerPDF(List boletos, String destPath) { + + checkBoletosList(boletos); + checkDestPath(destPath); + + return onePerPDF(boletos, new File(destPath), EMPTY, EMPTY); + } + + /** + *

            + * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo + * segue a forma: + * + * diretorio + (/ ou \\) + (indice do arquivo na lista + 1) + + * ".pdf" + *

            + * + *

            + * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file);} + * + * + * Arquivos gerados: + *

              + *
            • 1.pdf
            • + *
            • 2.pdf
            • + *
            • 3.pdf
            • + *
            + *

            + * + * @param boletos Lista com os boletos a serem agrupados + * @param destDir Diretório o qual os boletos serão criados + * + * @return Lista contendo os arquivos PDF gerados a partir da lista de + * boletos + * + * @since 0.2 + */ + public static List onePerPDF(List boletos, File destDir) { + + checkBoletosList(boletos); + checkDestDir(destDir); + + return onePerPDF(boletos, destDir, EMPTY, EMPTY); + } + + /** + *

            + * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo + * segue a forma: + * + * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + + * ".pdf" + *

            + * + *

            + * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, + * "BoletoPrefixo");} + * + * Arquivos gerados: + *

              + *
            • BoletoPrefixo1.pdf
            • + *
            • BoletoPrefixo2.pdf
            • + *
            • BoletoPrefixo3.pdf
            • + *
            + *

            + * + * @param boletos Lista com os boletos a serem agrupados + * @param destPath Diretório o qual os boletos serão criados + * @param prefixo Prefixo do nome do arquivo + * + * @return Lista contendo os arquivos PDF gerados a partir da lista de + * boletos + * + * @since 0.2 + */ + public static List onePerPDF(List boletos, String destPath, String prefixo) { + + checkBoletosList(boletos); + checkDestPath(destPath); + + return onePerPDF(boletos, new File(destPath), prefixo, EMPTY); + } + + /** + *

            + * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo + * segue a forma: + * + * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + + * ".pdf" + *

            + * + *

            + * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, + * "BoletoPrefixo");} + * + * Arquivos gerados: + *

              + *
            • BoletoPrefixo1.pdf
            • + *
            • BoletoPrefixo2.pdf
            • + *
            • BoletoPrefixo3.pdf
            • + *
            + *

            + * + * @param boletos Lista com os boletos a serem agrupados + * @param destDir Diretório o qual os boletos serão criados + * @param prefixo Prefixo do nome do arquivo + * + * @return Lista contendo os arquivos PDF gerados a partir da lista de + * boletos + * + * @since 0.2 + */ + public static List onePerPDF(List boletos, File destDir, String prefixo) { + + checkBoletosList(boletos); + checkDestDir(destDir); + + return onePerPDF(boletos, destDir, prefixo, EMPTY); + } + + /** + *

            + * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo + * segue a forma: + * + * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + + * sufixo + ".pdf" + *

            + * + *

            + * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, + * "BoletoPrefixo", "exSufixo");} + * + * Arquivos gerados: + *

              + *
            • BoletoPrefixo1exSufixo.pdf
            • + *
            • BoletoPrefixo2exSufixo.pdf
            • + *
            • BoletoPrefixo3exSufixo.pdf
            • + *
            + *

            + * + * @param boletos Lista com os boletos a serem agrupados + * @param destPath Diretório o qual os boletos serão criados + * @param prefixo Prefixo do nome do arquivo + * @param sufixo Sufixo do nome do arquivo + * @return Lista contendo os arquivos PDF gerados a partir da lista de + * boletos + * + * @since 0.2 + */ + public static List onePerPDF(List boletos, String destPath, String prefixo, String sufixo) { + + checkBoletosList(boletos); + checkDestPath(destPath); + + return onePerPDF(boletos, new File(destPath), prefixo, sufixo); + } + + /** + *

            + * Gera o arquivo PDF para cada boleto contido na lista. O nome do arquivo + * segue a forma: + * + * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + + * sufixo + ".pdf" + *

            + * + *

            + * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, + * "BoletoPrefixo", "exSufixo");} + * + * Arquivos gerados: + *

              + *
            • BoletoPrefixo1exSufixo.pdf
            • + *
            • BoletoPrefixo2exSufixo.pdf
            • + *
            • BoletoPrefixo3exSufixo.pdf
            • + *
            + *

            + * + * @param boletos Lista com os boletos a serem agrupados + * @param destDir Diretório o qual os boletos serão criados + * @param prefixo Prefixo do nome do arquivo + * @param sufixo Sufixo do nome do arquivo + * @return Lista contendo os arquivos PDF gerados a partir da lista de + * boletos + * + * @since 0.2 + */ + public static List onePerPDF(List boletos, File destDir, String prefixo, String sufixo) { + + checkBoletosList(boletos); + checkDestDir(destDir); + + List files = new ArrayList(boletos.size()); + + files.addAll(PdfViewerMultiProcessor.onePerPDF(boletos, destDir, prefixo, sufixo)); + + return files; + } + + public static List onePerPDFWithTemplate(List boletos, String templatePath) { + + checkBoletosList(boletos); + checkTemplatePath(templatePath); + + return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(templatePath)); + } + + public static List onePerPDFWithTemplate(List boletos, URL templateUrl) { + + checkBoletosList(boletos); + checkTemplateFile(templateUrl); + + return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(templateUrl)); + } + + public static List onePerPDFWithTemplate(List boletos, File templateFile) { + + checkBoletosList(boletos); + checkTemplateFile(templateFile); + + return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(templateFile)); + } + + public static List onePerPDFWithTemplate(List boletos, InputStream templateInput) { + + checkBoletosList(boletos); + checkTemplateFile(templateInput); + + return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(templateInput)); + } + + public static List onePerPDFWithTemplate(List boletos, byte[] template) { + + checkBoletosList(boletos); + checkTemplateFile(template); + + return PdfViewerMultiProcessor.onePerPDF(boletos, new BoletoViewer().setTemplate(template)); + } + + /** + *

            + * Agrupa os boletos das listas com seus respectivos templates em um único + * arquivo PDF. Caso exista sequência na coleção, a mesma é mantida. + *

            + * + * + * @param templatesAndBoletos Coleção de templates e boletos a serem + * agrupados + * + * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos + * + * @since 0.2 + */ + public static List onePerPdfWithTemplates(Collection>> templatesAndBoletos) { + + checkTemplateBoletosEntries(templatesAndBoletos); + + return PdfViewerMultiProcessor.onePerPDF(templatesAndBoletos); + } + + /** + * Indica se o PDF do boleto gerado deve ser comprimido completamente ou + * não, o padrão é true. + * + *

            + * "Full compression" foi introduzido no modelo de documento de PDF 1.5, o + * que quer dizer que os boletos gerados por padrão pelo Bopepo estão nesse + * modelo a menos que se utilize este método informando o contrário: {@code + * #setPdfFullCompression(false)}. + *

            + *

            + * Um PDF que seja "fully compressed", só pode ser lido por um visualizador + * PDF como Acrobat Reader 6 ou superior. Entretanto, se o documento não for + * comprimido [ {@code #setPdfFullCompression(false)} ], o boleto pdf gerado + * no modelo de documento PDF 1.4 poderá ser lido por um visualizador tal + * qual Acrobat Reader 5 ou superior. + *

            + * + * @param option Escolha de compressão + * + * @return Esta instância após a operação + * + * @since 0.2 + */ + public BoletoViewer setPdfFullCompression(boolean option) { + + pdfViewer.setFullCompression(option); + + return this; + } + + /** + * Define o título do documento PDF gerado. + * + * @param titulo para ser exibido como título do documento PDF + * @return Esta instância após a operação + * + * @since 0.2 + */ + public BoletoViewer setPdfTitulo(String titulo) { + + pdfViewer.setTitle(titulo); + + return this; + } + + /** + * Define se o título do documento PDF gerado será mostrado ou não (padrão + * true). + * + * @param opcao para exibir título do documento PDF (true) + * @return Esta instância após a operação + * + * @since 0.2 + */ + public BoletoViewer setPdfExibirTitulo(boolean opcao) { + + pdfViewer.setDisplayTitle(opcao); + + return this; + } + + /** + * Define o autor do documento PDF gerado. + * + * @param autor do documento PDF + * @return Esta instância após a operação + * + * @since 0.2 + */ + public BoletoViewer setPdfAutor(String autor) { + + pdfViewer.setAuthor(autor); + + return this; + } + + /** + * Define o assunto do documento PDF gerado. + * + * @param assunto do documento PDF + * @return Esta instância após a operação + * + * @since 0.2 + */ + public BoletoViewer setPdfAssunto(String assunto) { + + pdfViewer.setSubject(assunto); + + return this; + } + + /** + * Define as palavras chave do documento PDF gerado. + * + * @param palavrasChave do documento PDF + * @return Esta instância após a operação + * + * @since 0.2 + */ + public BoletoViewer setPdfPalavrasChave(String palavrasChave) { + + pdfViewer.setKeywords(palavrasChave); + + return this; + } + + /** + * Define se o os campos do documento PDF gerado devem ser removidos ou não + * (padrão true). + * + * @param opcao para remover campos do documento PDF (true) + * @return Esta instância após a operação + * + * @since 0.2 + */ + public BoletoViewer setPdfRemoverCampos(boolean opcao) { + + pdfViewer.setRemoveFields(opcao); + + return this; + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param template + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException Caso o {@code template} seja nulo + * + * @since 0.2 + */ + public BoletoViewer setTemplate(byte[] template) { + + checkTemplateFile(template); + + this.pdfViewer.setTemplate(template); + + return this; + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param templateUrl + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException Caso o {@code template} seja nulo + */ + public BoletoViewer setTemplate(URL templateUrl) { + + checkTemplateFile(templateUrl); + + this.pdfViewer.setTemplate(templateUrl); + + return this; + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param templateInput + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException Caso o {@code template} seja nulo + */ + public BoletoViewer setTemplate(InputStream templateInput) { + + checkTemplateFile(templateInput); + + this.pdfViewer.setTemplate(templateInput); + + return this; + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param templatePath + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException Caso o {@code template} seja nulo + */ + public BoletoViewer setTemplate(String templatePath) { + + checkTemplatePath(templatePath); + + this.pdfViewer.setTemplate(templatePath); + + return this; + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param templateFile + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException Caso o {@code template} seja nulo + */ + public BoletoViewer setTemplate(File templateFile) { + + checkTemplateFile(templateFile); + + this.pdfViewer.setTemplate(templateFile); + + return this; + } + + /** + *

            + * Atribui um boleto para uso no visualizador. {@code Null} não é permitido. + *

            + * + * @param boleto Boleto a ser visualizado + * + * @since 0.2 + * + * @return Esta instância após a operação + */ + public BoletoViewer setBoleto(Boleto boleto) { + + checkBoleto(boleto); + + updateViewerPDF(boleto); + + return this; + } + + /** + *

            + * Caso algum template tenha sido utilizado, este método define que após sua + * execução o boleto será consturído com o template padrão. + *

            + * + * @since 0.2 + * + * @return Esta instância após a operação + */ + public BoletoViewer removeTemplate() { + + final String DEFAULT = null; + + if (isNotNull(pdfViewer)) { + pdfViewer.setTemplate(DEFAULT); + } + + return this; + } + + /** + *

            + * Retorna o aquivo template utilizado pelo visualizador, que pode ser o + * template padrão ou outro. + *

            + * + * @return Arquivo template + * + * @since 0.2 + */ + public byte[] getTemplate() { + + return pdfViewer.getTemplate(); + } + + /** + *

            + * Retorna o boleto usado pelo visualizador + *

            + * + * @return o boleto + * + * @since 0.2 + */ + public Boleto getBoleto() { + + return pdfViewer.getBoleto(); + } + + /** + *

            + * Retorna o boleto em um arquivo pdf. + *

            + * + * @param destPath Caminho onde será criado o arquivo pdf + * @return Boleo em File + * + * @since 0.2 + */ + public File getPdfAsFile(String destPath) { + if (log.isDebugEnabled()) { + log.debug("documento instance : " + pdfViewer); + } + return pdfViewer.getFile(destPath); + } + + /** + *

            + * Retorna o boleto em um arquivo pdf. + *

            + * + * @param destFile Caminho onde será criado o arquivo pdf + * @return Boleto em File + * + * @since 0.2 + */ + public File getPdfAsFile(File destFile) { + if (log.isDebugEnabled()) { + log.debug("documento instance : " + pdfViewer); + } + return pdfViewer.getFile(destFile); + } + + /** + *

            + * Retorna o boleto em uma stream de bytes. + *

            + * + * @return Boleto em ByteArrayOutputStream + * + * @since 0.2 + */ + public ByteArrayOutputStream getPdfAsStream() { + if (log.isDebugEnabled()) { + log.debug("documento instance : " + pdfViewer); + } + return pdfViewer.getStream(); + + } + + /** + *

            + * Retorna o boleto em um array de bytes. + *

            + * + * @return Boleto em byte[] + * + * @since 0.2 + */ + public byte[] getPdfAsByteArray() { + if (log.isDebugEnabled()) { + log.debug("documento instance : " + pdfViewer); + } + return pdfViewer.getBytes(); + } + + /** + *

            + * Atualiza o objeto BoletoViewer mantendo as "invariantes". + *

            + * + * @param boleto + * + * @since 0.2 + */ + private void updateViewerPDF(Boleto boleto) { + + if (isNotNull(this.pdfViewer)) { + + this.pdfViewer.setBoleto(boleto); + + } else { + + this.pdfViewer = new PdfViewer(boleto); + } + } + + private static void checkDestPath(String path) { + + checkString(path, "Caminho destinado a geração do(s) arquivo(s) não contém informação!"); + } + + private static void checkTemplatePath(String path) { + + checkString(path, "Caminho do template não contém informação!"); + } + + private static void checkTemplateFile(Object template) { + + Objects.checkNotNull(template, "Arquivo de template nulo!"); + } + + private static void checkString(String str, String msg) { + + Objects.checkNotNull(str); + Strings.checkNotBlank(str, msg); + } + + private static void checkDestDir(File file) { + + Objects.checkNotNull(file, "Diretório destinado a geração do(s) boleto(s) nulo!"); + Objects.checkArgument(file.isDirectory(), "Isto não é um diretório válido!"); + } + + private static void checkDestFile(File file) { + + Objects.checkNotNull(file, "Arquivo destinado a geração do(s) boleto(s) nulo!"); + } + + private static void checkBoleto(Boleto boleto) { + + Objects.checkNotNull(boleto, "Boleto nulo!"); + } + + private static void checkBoletosList(List boletos) { + + Objects.checkNotNull(boletos, "Lista de boletos nula!"); + Collections.checkNotEmpty(boletos, "A Lista de boletos está vazia!"); + } + + private static void checkTemplateBoletosEntries(Collection>> templatesAndBoletos) { + + Collections.checkNotEmpty(templatesAndBoletos, "A Coleção de pares: (template,boletos) está vazia!"); + } + + private static void checkTemplateBoletosEntries(Map> templatesAndBoletos) { + + Collections.checkNotEmpty(templatesAndBoletos, "O Mapa (template,boletos) está vazio!"); + } + +} diff --git a/src/main/java/org/jrimum/bopepo/view/GuiaViewer.java b/src/main/java/org/jrimum/bopepo/view/GuiaViewer.java index 8a30e93d..23eecdc3 100644 --- a/src/main/java/org/jrimum/bopepo/view/GuiaViewer.java +++ b/src/main/java/org/jrimum/bopepo/view/GuiaViewer.java @@ -1,441 +1,440 @@ -/* - * 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: 08/05/2008 - 00:10:01 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Criado em: 08/05/2008 - 00:10:01 - * - */ -package org.jrimum.bopepo.view; - -import com.itextpdf.text.DocumentException; -import org.jrimum.bopepo.Guia; -import static org.apache.commons.lang3.StringUtils.isNotBlank; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; - -import static org.jrimum.utilix.Objects.isNotNull; - -/** - * - *

            - * Agrupa as formas de visualização de um boleto. - *

            - * - *

            - * EXEMPLO de formas de visualização: - *

              - *
            • PDF
            • - *
            • Stream
            • - *
            • Array de Bytes
            • - *
            - *

            - * - * @author Gilmar P.S.L. - * @author Misael - * @author Romulo - * - * @since 0.3 - * - * @version 0.3 - */ -public class GuiaViewer { - - //TODO Teste no teste unitário. - /** - * - */ - private static final long serialVersionUID = 1L; - - private static Logger log = Logger.getLogger(GuiaViewer.class); - - /** - *

            - * Engine responsável pela visualização em formato PDF. - */ - private ViewerPDF viewerPDF; - - /** - * @param guia - * @throws DocumentException - * @throws IOException - */ - public GuiaViewer(Guia guia) throws RuntimeException { - initViewerPDF(null, null, guia); - } - - /** - * @param guia - * @param templatePathName - * @throws RuntimeException - */ - public GuiaViewer(Guia guia, String templatePathName) throws RuntimeException { - initViewerPDF(templatePathName, null, guia); - } - - /** - * @param guia - * @param template - * @throws RuntimeException - */ - public GuiaViewer(Guia guia, File template) throws RuntimeException { - initViewerPDF(null, template, guia); - } - - /** - *

            - * Para uso interno do componente

            - */ - protected GuiaViewer() { - this.viewerPDF = new ViewerPDF(); - } - - /** - *

            - * Agrupo vários guias em um único pdf. - *

            - * - * @param pathName Caminho no qual será gerado o pdf - * @param guias Guias a serem agrupadas - * @return Arquivo pdf - * @throws RuntimeException - * - * @since 0.2 - */ - public static File groupInOnePDF(String pathName, List guias) throws RuntimeException { - - File group = null; - - if (validatePathName(pathName) && validateGuiasList(guias)) { - group = groupInOnePDF(pathName, guias, new GuiaViewer()); - } - - return group; - } - - public static File groupInOnePDF(String destPathName, List guias, String templatePathName) throws RuntimeException { - - File group = null; - - if (validatePathName(destPathName) && validateGuiasList(guias) && validatePathName(templatePathName)) { - group = groupInOnePDF(destPathName, guias, new GuiaViewer().setTemplate(templatePathName)); - } - - return group; - } - - public static File groupInOnePDF(String destPathName, List guias, File templateFile) throws RuntimeException { - - File group = null; - - if (validatePathName(destPathName) && validateGuiasList(guias) && validateFile(templateFile, "template")) { - group = groupInOnePDF(destPathName, guias, new GuiaViewer().setTemplate(templateFile)); - } - - return group; - } - - /** - *

            - * Gera vários arquivos pdf, cada qual com a sua guia. - *

            - * - * @param path Caminho no qual será gerados os arquivos - * @param extensao TODO - * @param guias Guias a partir dos quais serão gerados os arquivos - * @return Vários arquivos pdf - * @throws RuntimeException - * - * @since 0.2 - */ - public static List onePerPDF(String path, String extensao, List guias) throws RuntimeException { - - List files = new ArrayList(); - - if (isNotNull(path) && isNotNull(guias)) { - - if (StringUtils.isNotBlank(path)) { - - if (!guias.isEmpty()) { - - files.addAll(ViewerPDF.onePerPDF(path, extensao, guias)); - - } else { - throw new IllegalArgumentException("A Lista de guias está vazia!"); - } - - } else { - throw new IllegalArgumentException("Path(Diretório) destinado a geração dos arquivos não contém informação!"); - } - } - - return files; - } - - public File getTemplate() { - return viewerPDF.getTemplate(); - } - - /** - *

            - * Define o template que será utilizado para construir o guia. - *

            - * - * @param template - * - * @since 0.2 - */ - public GuiaViewer setTemplate(File template) { - - if (isNotNull(template)) { - this.viewerPDF.setTemplate(template); - - } else { - throw new NullPointerException("Arquivo de template inválido: valor [null]"); - } - - return this; - } - - /** - *

            - * @see GuiaViewer#setTemplate(File) - *

            - * - * @param pathName - * - * @since 0.2 - */ - public GuiaViewer setTemplate(String pathName) { - - if (isNotBlank(pathName)) { - viewerPDF.setTemplate(pathName); - - } else { - throw new IllegalArgumentException("Caminho do template inválido: valor [" + pathName + "]"); - } - - return this; - } - - /** - *

            - * Caso algum template tenha sido utilizado, este método define que após sua - * execução o guia será consturído com o template padrão. - *

            - * - * @since 0.2 - */ - public GuiaViewer removeTemplate() { - - final String PADRAO = null; - - if (isNotNull(viewerPDF)) { - viewerPDF.setTemplate(PADRAO); - } - - return this; - } - - /** - *

            - * Retorna o guia em um arquivo pdf. - *

            - * - * @param pathName Caminho onde será criado o arquivo pdf - * @return File - * @throws IllegalArgumentException - * - * @since 0.2 - */ - public File getPdfAsFile(String pathName) { - - if (log.isDebugEnabled()) { - log.debug("Documento instance: " + viewerPDF); - } - - return viewerPDF.getFile(pathName); - } - - /** - *

            - * Retorna o guia em uma stream. - *

            - * - * @return ByteArrayOutputStream - * - * @since 0.1 - */ - public ByteArrayOutputStream getPdfAsStream() { - - if (log.isDebugEnabled()) { - log.debug("documento instance : " + viewerPDF); - } - - return viewerPDF.getStream(); - - } - - /** - *

            - * Retorna o guia em um array de bytes. - *

            - * - * @return byte[] - * - * @since 0.1 - */ - public byte[] getPdfAsByteArray() { - - if (log.isDebugEnabled()) { - log.debug("documento instance : " + viewerPDF); - } - - return viewerPDF.getBytes(); - } - - /** - * @return the guia - * - * @since 0.2 - */ - public Guia getGuia() { - return viewerPDF.getGuia(); - } - - /** - * @param guia the guia to set - * - * @since 0.2 - */ - public GuiaViewer setGuia(Guia guia) { - - if (isNotNull(guia)) { - updateViewerPDF(guia); - } - - return this; - } - - private static boolean validatePathName(String pathName) { - - boolean ok = false; - - if (isNotNull(pathName)) { - - if (StringUtils.isNotBlank(pathName)) { - ok = true; - } else { - throw new IllegalArgumentException("Path(Diretório) destinado a geração do(s) arquivo(s) não contém informação!"); - } - } - - return ok; - } - - private static boolean validateFile(File file, String name) { - - boolean ok = false; - - if (isNotNull(file)) { - ok = true; - } else { - throw new NullPointerException("File(Arquivo) destinado a geração do(s) documento(s) [" + name + "] nulo!"); - } - - return ok; - } - - private static boolean validateGuiasList(List guias) { - - boolean ok = false; - - if (isNotNull(guias)) { - - if (!guias.isEmpty()) { - ok = true; - - } else { - throw new IllegalArgumentException("A Lista de guias está vazia!"); - } - } - - return ok; - } - - private static File groupInOnePDF(String pathName, List guias, GuiaViewer guiaViewer) { - - return ViewerPDF.groupInOnePDF(pathName, guias, guiaViewer); - } - - private void initViewerPDF(String templatePathName, File template, Guia guia) { - - if (isNotNull(guia)) { - this.viewerPDF = new ViewerPDF(guia); - } - - /* - * O arquivo tem prioridade - */ - if (isNotBlank(templatePathName) && isNotNull(template)) { - setTemplate(template); - - } else { - - if (isNotBlank(templatePathName)) { - setTemplate(templatePathName); - } - - if (isNotNull(template)) { - setTemplate(template); - } - } - } - - /** - *

            - * Atualiza o objeto GuiaViewer mantendo as "invariantes". - *

            - * - * @param guia - * - * @since - */ - private void updateViewerPDF(Guia guia) { - - if (isNotNull(this.viewerPDF)) { - this.viewerPDF = new ViewerPDF(guia, this.viewerPDF.getTemplate()); - - } else { - this.viewerPDF = new ViewerPDF(guia); - } - } -} +/* + * 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: 08/05/2008 - 00:10:01 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 08/05/2008 - 00:10:01 + * + */ +package org.jrimum.bopepo.view; + +import com.itextpdf.text.DocumentException; +import org.jrimum.bopepo.Guia; +import static org.apache.commons.lang3.StringUtils.isNotBlank; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + +import static org.jrimum.utilix.Objects.isNotNull; + +/** + * + *

            + * Agrupa as formas de visualização de um boleto. + *

            + * + *

            + * EXEMPLO de formas de visualização: + *

              + *
            • PDF
            • + *
            • Stream
            • + *
            • Array de Bytes
            • + *
            + *

            + * + * @author Gilmar P.S.L. + * @author Misael + * @author Romulo + * + * @since 0.3 + * + * @version 0.3 + */ +public class GuiaViewer { + + //TODO Teste no teste unitário. + /** + * + */ + private static final long serialVersionUID = 1L; + + private static Logger log = Logger.getLogger(GuiaViewer.class); + + /** + *

            + * Engine responsável pela visualização em formato PDF. + */ + private ViewerPDF viewerPDF; + + /** + * @param guia + * @throws RuntimeException + */ + public GuiaViewer(Guia guia) throws RuntimeException { + initViewerPDF(null, null, guia); + } + + /** + * @param guia + * @param templatePathName + * @throws RuntimeException + */ + public GuiaViewer(Guia guia, String templatePathName) throws RuntimeException { + initViewerPDF(templatePathName, null, guia); + } + + /** + * @param guia + * @param template + * @throws RuntimeException + */ + public GuiaViewer(Guia guia, File template) throws RuntimeException { + initViewerPDF(null, template, guia); + } + + /** + *

            + * Para uso interno do componente

            + */ + protected GuiaViewer() { + this.viewerPDF = new ViewerPDF(); + } + + /** + *

            + * Agrupo vários guias em um único pdf. + *

            + * + * @param pathName Caminho no qual será gerado o pdf + * @param guias Guias a serem agrupadas + * @return Arquivo pdf + * @throws RuntimeException + * + * @since 0.2 + */ + public static File groupInOnePDF(String pathName, List guias) throws RuntimeException { + + File group = null; + + if (validatePathName(pathName) && validateGuiasList(guias)) { + group = groupInOnePDF(pathName, guias, new GuiaViewer()); + } + + return group; + } + + public static File groupInOnePDF(String destPathName, List guias, String templatePathName) throws RuntimeException { + + File group = null; + + if (validatePathName(destPathName) && validateGuiasList(guias) && validatePathName(templatePathName)) { + group = groupInOnePDF(destPathName, guias, new GuiaViewer().setTemplate(templatePathName)); + } + + return group; + } + + public static File groupInOnePDF(String destPathName, List guias, File templateFile) throws RuntimeException { + + File group = null; + + if (validatePathName(destPathName) && validateGuiasList(guias) && validateFile(templateFile, "template")) { + group = groupInOnePDF(destPathName, guias, new GuiaViewer().setTemplate(templateFile)); + } + + return group; + } + + /** + *

            + * Gera vários arquivos pdf, cada qual com a sua guia. + *

            + * + * @param path Caminho no qual será gerados os arquivos + * @param extensao TODO + * @param guias Guias a partir dos quais serão gerados os arquivos + * @return Vários arquivos pdf + * @throws RuntimeException + * + * @since 0.2 + */ + public static List onePerPDF(String path, String extensao, List guias) throws RuntimeException { + + List files = new ArrayList(); + + if (isNotNull(path) && isNotNull(guias)) { + + if (StringUtils.isNotBlank(path)) { + + if (!guias.isEmpty()) { + + files.addAll(ViewerPDF.onePerPDF(path, extensao, guias)); + + } else { + throw new IllegalArgumentException("A Lista de guias está vazia!"); + } + + } else { + throw new IllegalArgumentException("Path(Diretório) destinado a geração dos arquivos não contém informação!"); + } + } + + return files; + } + + public File getTemplate() { + return viewerPDF.getTemplate(); + } + + /** + *

            + * Define o template que será utilizado para construir o guia. + *

            + * + * @param template + * + * @since 0.2 + */ + public GuiaViewer setTemplate(File template) { + + if (isNotNull(template)) { + this.viewerPDF.setTemplate(template); + + } else { + throw new NullPointerException("Arquivo de template inválido: valor [null]"); + } + + return this; + } + + /** + *

            + * @see GuiaViewer#setTemplate(File) + *

            + * + * @param pathName + * + * @since 0.2 + */ + public GuiaViewer setTemplate(String pathName) { + + if (isNotBlank(pathName)) { + viewerPDF.setTemplate(pathName); + + } else { + throw new IllegalArgumentException("Caminho do template inválido: valor [" + pathName + "]"); + } + + return this; + } + + /** + *

            + * Caso algum template tenha sido utilizado, este método define que após sua + * execução o guia será consturído com o template padrão. + *

            + * + * @since 0.2 + */ + public GuiaViewer removeTemplate() { + + final String PADRAO = null; + + if (isNotNull(viewerPDF)) { + viewerPDF.setTemplate(PADRAO); + } + + return this; + } + + /** + *

            + * Retorna o guia em um arquivo pdf. + *

            + * + * @param pathName Caminho onde será criado o arquivo pdf + * @return File + * @throws IllegalArgumentException + * + * @since 0.2 + */ + public File getPdfAsFile(String pathName) { + + if (log.isDebugEnabled()) { + log.debug("Documento instance: " + viewerPDF); + } + + return viewerPDF.getFile(pathName); + } + + /** + *

            + * Retorna o guia em uma stream. + *

            + * + * @return ByteArrayOutputStream + * + * @since 0.1 + */ + public ByteArrayOutputStream getPdfAsStream() { + + if (log.isDebugEnabled()) { + log.debug("documento instance : " + viewerPDF); + } + + return viewerPDF.getStream(); + + } + + /** + *

            + * Retorna o guia em um array de bytes. + *

            + * + * @return byte[] + * + * @since 0.1 + */ + public byte[] getPdfAsByteArray() { + + if (log.isDebugEnabled()) { + log.debug("documento instance : " + viewerPDF); + } + + return viewerPDF.getBytes(); + } + + /** + * @return the guia + * + * @since 0.2 + */ + public Guia getGuia() { + return viewerPDF.getGuia(); + } + + /** + * @param guia the guia to set + * + * @since 0.2 + */ + public GuiaViewer setGuia(Guia guia) { + + if (isNotNull(guia)) { + updateViewerPDF(guia); + } + + return this; + } + + private static boolean validatePathName(String pathName) { + + boolean ok = false; + + if (isNotNull(pathName)) { + + if (StringUtils.isNotBlank(pathName)) { + ok = true; + } else { + throw new IllegalArgumentException("Path(Diretório) destinado a geração do(s) arquivo(s) não contém informação!"); + } + } + + return ok; + } + + private static boolean validateFile(File file, String name) { + + boolean ok = false; + + if (isNotNull(file)) { + ok = true; + } else { + throw new NullPointerException("File(Arquivo) destinado a geração do(s) documento(s) [" + name + "] nulo!"); + } + + return ok; + } + + private static boolean validateGuiasList(List guias) { + + boolean ok = false; + + if (isNotNull(guias)) { + + if (!guias.isEmpty()) { + ok = true; + + } else { + throw new IllegalArgumentException("A Lista de guias está vazia!"); + } + } + + return ok; + } + + private static File groupInOnePDF(String pathName, List guias, GuiaViewer guiaViewer) { + + return ViewerPDF.groupInOnePDF(pathName, guias, guiaViewer); + } + + private void initViewerPDF(String templatePathName, File template, Guia guia) { + + if (isNotNull(guia)) { + this.viewerPDF = new ViewerPDF(guia); + } + + /* + * O arquivo tem prioridade + */ + if (isNotBlank(templatePathName) && isNotNull(template)) { + setTemplate(template); + + } else { + + if (isNotBlank(templatePathName)) { + setTemplate(templatePathName); + } + + if (isNotNull(template)) { + setTemplate(template); + } + } + } + + /** + *

            + * Atualiza o objeto GuiaViewer mantendo as "invariantes". + *

            + * + * @param guia + * + * @since + */ + private void updateViewerPDF(Guia guia) { + + if (isNotNull(this.viewerPDF)) { + this.viewerPDF = new ViewerPDF(guia, this.viewerPDF.getTemplate()); + + } else { + this.viewerPDF = new ViewerPDF(guia); + } + } +} diff --git a/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java b/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java index e6e6f8a4..9b18b9d3 100644 --- a/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java +++ b/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java @@ -1,264 +1,264 @@ -/* - * Copyright 2011 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: 19/03/2011 - ‎21:56:10 - * - * ================================================================================ - * - * Direitos autorais 2011 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 19/03/2011 - ‎21:56:10 - * - */ - -package org.jrimum.bopepo.view; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map.Entry; - -import org.jrimum.bopepo.Boleto; -import org.jrimum.bopepo.pdf.Files; -import org.jrimum.bopepo.pdf.PDFs; -import org.jrimum.utilix.Exceptions; - -/** - *

            - * Classe utilizada para preencher o PDF de boletos em lote. - *

            - * - * @author Gilmar P.S.L. - * - * @since 0.2 - * - * @version 0.2 - */ -class PdfViewerMultiProcessor { - - /** - * Agrupa os boletos da lista em um único arquivo PDF. - * - * - * @param boletos - * Lista com os boletos a serem agrupados - * @param boletoViewer - * Visualizador contendo o template para geração - * - * @return Arquivo PDF em array de bytes gerado com os boletos da lista - * - * @since 0.2 - */ - protected static byte[] groupInOnePDF(List boletos, BoletoViewer boletoViewer) { - - byte[] file = null; - - List boletosEmBytes = new ArrayList(boletos.size()); - - for (Boleto bop : boletos) { - boletosEmBytes.add(boletoViewer.setBoleto(bop).getPdfAsByteArray()); - } - - try { - - file = PDFs.mergeFiles(boletosEmBytes); - - boletosEmBytes.clear(); - - return file; - - } catch (Exception e) { - - return Exceptions.throwIllegalStateException("Erro durante geração do PDF! Causado por " + e.getLocalizedMessage(), e); - } - } - - /** - * Agrupa os boletos da lista em um único arquivo PDF. - * - * - * @param boletos - * Lista com os boletos a serem agrupados - * @param boletoViewer - * Visualizador contendo o template para geração - * @param fileDest - * Arquivo o qual armazenará os boletos - * @return Arquivo PDF gerado com os boletos da lista - * - * @since 0.2 - */ - protected static File groupInOnePDF(List boletos, BoletoViewer boletoViewer, File fileDest) { - - try { - - return Files.bytesToFile(fileDest, groupInOnePDF(boletos, boletoViewer)); - - } catch (Exception e) { - - return Exceptions.throwIllegalStateException("Erro durante geração do PDF! Causado por " + e.getLocalizedMessage(), e); - } - } - - /** - * Agrupa os boletos das listas com seus respectivos templates em um único - * arquivo PDF. Caso exista sequência na coleção, a mesma é mantida. - * - * - * @param templatesAndBoletos - * Coleção de templates e boletos a serem agrupados - * - * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos - * - * @since 0.2 - */ - protected static byte[] groupInOnePDF(Collection>> templatesAndBoletos) { - - byte[] file = null; - - List toMerge = new ArrayList(templatesAndBoletos.size()); - - BoletoViewer viewer = new BoletoViewer(); - - for(Entry> entry : templatesAndBoletos){ - - toMerge.add(groupInOnePDF(entry.getValue(), viewer.setTemplate(entry.getKey()))); - } - - file = PDFs.mergeFiles(toMerge); - - toMerge.clear(); - - return file; - } - - /** - * Gera um arquivo PDF para cada boleto contido na lista. O nome do arquivo - * segue a forma:
            - *
            - * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + sufixo + ".pdf" - * - *

            - * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, - * "BoletoPrefixo", "exSufixo");}
            - *
            - * Arquivos gerados: - *

              - *
            • BoletoPrefixo1exSufixo.pdf
            • - *
            • BoletoPrefixo2exSufixo.pdf
            • - *
            • BoletoPrefixo3exSufixo.pdf
            • - *
            - *

            - * - * @param boletos - * Lista com os boletos a serem agrupados - * @param destDir - * Diretório o qual os boletos serão criados - * @param prefixo - * Prefixo do nome do arquivo - * @param sufixo - * Sufixo do nome do arquivo - * @return Lista contendo os arquivos PDF gerados a partir da lista de - * boletos - * - * @since 0.2 - */ - protected static List onePerPDF(List boletos, File destDir, String prefixo, String sufixo) { - - final List arquivos = new ArrayList(boletos.size()); - final BoletoViewer bv = new BoletoViewer(); - int cont = 1; - - for (Boleto bop : boletos) { - arquivos.add(bv.setBoleto(bop).getPdfAsFile(destDir.getAbsolutePath() + File.separator + prefixo + cont++ + sufixo + ".pdf")); - } - - return arquivos; - } - - /** - * Gera um arquivo PDF para cada boleto contido na lista utilizando o - * template padrão do Bopepo. - * - * @param boletos - * Lista com os boletos a serem agrupados - * - * @return Lista contendo os arquivos PDF gerados a partir da lista de - * boletos - * - * @since 0.2 - */ - protected static List onePerPDF(List boletos) { - - return onePerPDF(boletos, new BoletoViewer()); - } - - /** - * Gera um arquivo PDF para cada boleto contido na lista utilizando o Viewer - * informado. - * - * @param boletos - * Lista com os boletos a serem agrupados - * @param boletoViewer - * Viewer contendo as informações necessárias, incluindo template - * - * @return Lista contendo os arquivos PDF gerados a partir da lista de - * boletos - * - * @since 0.2 - */ - protected static List onePerPDF(List boletos, BoletoViewer boletoViewer) { - - final List arquivos = new ArrayList(boletos.size()); - - for (Boleto bop : boletos) { - arquivos.add(boletoViewer.setBoleto(bop).getPdfAsByteArray()); - } - - return arquivos; - } - - /** - * Gera um arquivo PDF para cada template e boleto relacionado em cada - * Entry. Caso exista sequência na coleção, a mesma é mantida. - * - * - * @param templatesAndBoletos - * - Coleção de templates e boletos para geração de arquivo PDF - * - * @return Lista contendo os arquivos PDF gerados com cada template e seus - * boletos - * - * @since 0.2 - */ - protected static List onePerPDF(Collection>> templatesAndBoletos) { - - List boletos = new ArrayList(templatesAndBoletos.size()); - - BoletoViewer viewer = new BoletoViewer(); - - for(Entry> entry : templatesAndBoletos){ - - boletos.addAll(onePerPDF(entry.getValue(), viewer.setTemplate(entry.getKey()))); - } - - return boletos; - } - -} +/* + * Copyright 2011 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: 19/03/2011 - ‎21:56:10 + * + * ================================================================================ + * + * Direitos autorais 2011 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 19/03/2011 - ‎21:56:10 + * + */ + +package org.jrimum.bopepo.view; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map.Entry; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.pdf.Files; +import org.jrimum.bopepo.pdf.PDFs; +import org.jrimum.utilix.Exceptions; + +/** + *

            + * Classe utilizada para preencher o PDF de boletos em lote. + *

            + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +class PdfViewerMultiProcessor { + + /** + * Agrupa os boletos da lista em um único arquivo PDF. + * + * + * @param boletos + * Lista com os boletos a serem agrupados + * @param boletoViewer + * Visualizador contendo o template para geração + * + * @return Arquivo PDF em array de bytes gerado com os boletos da lista + * + * @since 0.2 + */ + protected static byte[] groupInOnePDF(List boletos, BoletoViewer boletoViewer) { + + byte[] file = null; + + List boletosEmBytes = new ArrayList(boletos.size()); + + for (Boleto bop : boletos) { + boletosEmBytes.add(boletoViewer.setBoleto(bop).getPdfAsByteArray()); + } + + try { + + file = PDFs.mergeFiles(boletosEmBytes); + + boletosEmBytes.clear(); + + return file; + + } catch (Exception e) { + + return Exceptions.throwIllegalStateException("Erro durante geração do PDF! Causado por " + e.getLocalizedMessage(), e); + } + } + + /** + * Agrupa os boletos da lista em um único arquivo PDF. + * + * + * @param boletos + * Lista com os boletos a serem agrupados + * @param boletoViewer + * Visualizador contendo o template para geração + * @param fileDest + * Arquivo o qual armazenará os boletos + * @return Arquivo PDF gerado com os boletos da lista + * + * @since 0.2 + */ + protected static File groupInOnePDF(List boletos, BoletoViewer boletoViewer, File fileDest) { + + try { + + return Files.bytesToFile(fileDest, groupInOnePDF(boletos, boletoViewer)); + + } catch (Exception e) { + + return Exceptions.throwIllegalStateException("Erro durante geração do PDF! Causado por " + e.getLocalizedMessage(), e); + } + } + + /** + * Agrupa os boletos das listas com seus respectivos templates em um único + * arquivo PDF. Caso exista sequência na coleção, a mesma é mantida. + * + * + * @param templatesAndBoletos + * Coleção de templates e boletos a serem agrupados + * + * @return Arquivo PDF em array de bytes gerado com os boletos fornecidos + * + * @since 0.2 + */ + protected static byte[] groupInOnePDF(Collection>> templatesAndBoletos) { + + byte[] file = null; + + List toMerge = new ArrayList(templatesAndBoletos.size()); + + BoletoViewer viewer = new BoletoViewer(); + + for(Entry> entry : templatesAndBoletos){ + + toMerge.add(groupInOnePDF(entry.getValue(), viewer.setTemplate(entry.getKey()))); + } + + file = PDFs.mergeFiles(toMerge); + + toMerge.clear(); + + return file; + } + + /** + * Gera um arquivo PDF para cada boleto contido na lista. O nome do arquivo + * segue a forma: + * + * diretorio + (/ ou \\) prefixo + (indice do arquivo na lista + 1) + sufixo + ".pdf" + * + *

            + * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file, + * "BoletoPrefixo", "exSufixo");} + * + * Arquivos gerados: + *

              + *
            • BoletoPrefixo1exSufixo.pdf
            • + *
            • BoletoPrefixo2exSufixo.pdf
            • + *
            • BoletoPrefixo3exSufixo.pdf
            • + *
            + *

            + * + * @param boletos + * Lista com os boletos a serem agrupados + * @param destDir + * Diretório o qual os boletos serão criados + * @param prefixo + * Prefixo do nome do arquivo + * @param sufixo + * Sufixo do nome do arquivo + * @return Lista contendo os arquivos PDF gerados a partir da lista de + * boletos + * + * @since 0.2 + */ + protected static List onePerPDF(List boletos, File destDir, String prefixo, String sufixo) { + + final List arquivos = new ArrayList(boletos.size()); + final BoletoViewer bv = new BoletoViewer(); + int cont = 1; + + for (Boleto bop : boletos) { + arquivos.add(bv.setBoleto(bop).getPdfAsFile(destDir.getAbsolutePath() + File.separator + prefixo + cont++ + sufixo + ".pdf")); + } + + return arquivos; + } + + /** + * Gera um arquivo PDF para cada boleto contido na lista utilizando o + * template padrão do Bopepo. + * + * @param boletos + * Lista com os boletos a serem agrupados + * + * @return Lista contendo os arquivos PDF gerados a partir da lista de + * boletos + * + * @since 0.2 + */ + protected static List onePerPDF(List boletos) { + + return onePerPDF(boletos, new BoletoViewer()); + } + + /** + * Gera um arquivo PDF para cada boleto contido na lista utilizando o Viewer + * informado. + * + * @param boletos + * Lista com os boletos a serem agrupados + * @param boletoViewer + * Viewer contendo as informações necessárias, incluindo template + * + * @return Lista contendo os arquivos PDF gerados a partir da lista de + * boletos + * + * @since 0.2 + */ + protected static List onePerPDF(List boletos, BoletoViewer boletoViewer) { + + final List arquivos = new ArrayList(boletos.size()); + + for (Boleto bop : boletos) { + arquivos.add(boletoViewer.setBoleto(bop).getPdfAsByteArray()); + } + + return arquivos; + } + + /** + * Gera um arquivo PDF para cada template e boleto relacionado em cada + * Entry. Caso exista sequência na coleção, a mesma é mantida. + * + * + * @param templatesAndBoletos + * - Coleção de templates e boletos para geração de arquivo PDF + * + * @return Lista contendo os arquivos PDF gerados com cada template e seus + * boletos + * + * @since 0.2 + */ + protected static List onePerPDF(Collection>> templatesAndBoletos) { + + List boletos = new ArrayList(templatesAndBoletos.size()); + + BoletoViewer viewer = new BoletoViewer(); + + for(Entry> entry : templatesAndBoletos){ + + boletos.addAll(onePerPDF(entry.getValue(), viewer.setTemplate(entry.getKey()))); + } + + return boletos; + } + +} diff --git a/src/main/java/org/jrimum/domkee/banco/Agencia.java b/src/main/java/org/jrimum/domkee/banco/Agencia.java index c4c947aa..3d8d5f02 100644 --- a/src/main/java/org/jrimum/domkee/banco/Agencia.java +++ b/src/main/java/org/jrimum/domkee/banco/Agencia.java @@ -1,118 +1,118 @@ -/* - * 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:57:33 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:57:33 - * - */ -package org.jrimum.domkee.banco; - -import static org.apache.commons.lang3.StringUtils.EMPTY; - -import org.apache.commons.lang3.StringUtils; -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Objects; - -/** - *

            - * Esta classe segue o padrão especificado pela FEBRABAN: - *
            - * Invariantes: - *

              - *
            • Código: deve ser um inteiro natural (incluindo zero) entre 1 e 5 - * dígitos
            • - *
            • Dígito Verificador: alpha-numérico sendo um inteiro natural (incluindo - * zero) ou caracter não vazio (' ') com um dígito.
            • - *
            - *

            - * - * @author Gilmar P.S.L. - * @author Rômulo Augusto - * @author Misael Barreto - * @author Samuel Valério - * - * @since 0.2 - * - * @version 0.2 - */ -public class Agencia implements org.jrimum.domkee.banco.IAgencia { - - private final Integer codigo; - - private final String digitoVerificador; - - public Agencia(Integer codigo) { - - this.codigo = codigo; - verifyCodigo(); - this.digitoVerificador = EMPTY; - } - - public Agencia(Integer codigo, String digito) { - - this.codigo = codigo; - verifyCodigo(); - this.digitoVerificador = digito; - verifyDv(); - } - - public void verifyCodigo() { - - if (codigo < 0) { - Exceptions.throwIllegalArgumentException("O código da agência deve ser um inteiro natural (incluindo zero)"); - } - - if (String.valueOf(codigo).length() > 5) { - Exceptions.throwIllegalArgumentException("O código da agência deve possuir de 1 a 5 dígitos"); - } - } - - public void verifyDv() { - - if (StringUtils.isBlank(digitoVerificador)) { - Exceptions.throwIllegalArgumentException("O dígito verificador da agência não pode ser null ou apenas espaços em branco"); - } - - if (digitoVerificador.length() > 1) { - Exceptions.throwIllegalArgumentException("O dígito verificador da agência deve possuir apenas um dígito"); - } - - if (!StringUtils.isAlphanumeric(digitoVerificador)) { - Exceptions.throwIllegalArgumentException("O dígito verificador da agência deve ser letra ou dígito"); - } - } - - public Integer getCodigo() { - return codigo; - } - - public String getDigitoVerificador() { - return digitoVerificador; - } - - @Override - public String toString() { - return Objects.toString(this); - } -} +/* + * 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:57:33 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:57:33 + * + */ +package org.jrimum.domkee.banco; + +import static org.apache.commons.lang3.StringUtils.EMPTY; + +import org.apache.commons.lang3.StringUtils; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; + +/** + *

            + * Esta classe segue o padrão especificado pela FEBRABAN: + *
            + * Invariantes: + *

              + *
            • Código: deve ser um inteiro natural (incluindo zero) entre 1 e 5 + * dígitos
            • + *
            • Dígito Verificador: alpha-numérico sendo um inteiro natural (incluindo + * zero) ou caracter não vazio (' ') com um dígito.
            • + *
            + *

            + * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * @author Misael Barreto + * @author Samuel Valério + * + * @since 0.2 + * + * @version 0.2 + */ +public class Agencia implements org.jrimum.domkee.banco.IAgencia { + + private final Integer codigo; + + private final String digitoVerificador; + + public Agencia(Integer codigo) { + + this.codigo = codigo; + verifyCodigo(); + this.digitoVerificador = EMPTY; + } + + public Agencia(Integer codigo, String digito) { + + this.codigo = codigo; + verifyCodigo(); + this.digitoVerificador = digito; + verifyDv(); + } + + public void verifyCodigo() { + + if (codigo < 0) { + Exceptions.throwIllegalArgumentException("O código da agência deve ser um inteiro natural (incluindo zero)"); + } + + if (String.valueOf(codigo).length() > 5) { + Exceptions.throwIllegalArgumentException("O código da agência deve possuir de 1 a 5 dígitos"); + } + } + + public void verifyDv() { + + if (StringUtils.isBlank(digitoVerificador)) { + Exceptions.throwIllegalArgumentException("O dígito verificador da agência não pode ser null ou apenas espaços em branco"); + } + + if (digitoVerificador.length() > 1) { + Exceptions.throwIllegalArgumentException("O dígito verificador da agência deve possuir apenas um dígito"); + } + + if (!StringUtils.isAlphanumeric(digitoVerificador)) { + Exceptions.throwIllegalArgumentException("O dígito verificador da agência deve ser letra ou dígito"); + } + } + + public Integer getCodigo() { + return codigo; + } + + public String getDigitoVerificador() { + return digitoVerificador; + } + + @Override + public String toString() { + return Objects.toString(this); + } +} diff --git a/src/main/java/org/jrimum/domkee/banco/Banco.java b/src/main/java/org/jrimum/domkee/banco/Banco.java index a461912d..d7aace83 100644 --- a/src/main/java/org/jrimum/domkee/banco/Banco.java +++ b/src/main/java/org/jrimum/domkee/banco/Banco.java @@ -1,444 +1,442 @@ -/* - * 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:57:43 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:57:43 - * - */ - -package org.jrimum.domkee.banco; - -import static org.jrimum.utilix.Objects.isNotNull; - -import java.awt.Image; -import java.util.Collection; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.log4j.Logger; -import org.jrimum.domkee.pessoa.NumeroDeTelefone; -import org.jrimum.domkee.pessoa.Endereco; -import org.jrimum.domkee.pessoa.CNPJ; -import org.jrimum.domkee.pessoa.CPRF; -import org.jrimum.domkee.pessoa.Pessoa; -import org.jrimum.domkee.pessoa.PessoaJuridica; - - - -/** - * - *

            - * Um Banco (instituição financeira) supervisionada pelo BACEN. - *

            - * - * @author Gilmar P.S.L. - * - * @since 0.2 - * - * @version 0.2 - */ - -public class Banco implements org.jrimum.domkee.banco.IBanco { - - private static Logger log = Logger.getLogger(Banco.class); - - private CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN; - - private String segmento; - - private Image imgLogo; - - private PessoaJuridica pessoaJuridica; - - /** - * - */ - public Banco() { - super(); - } - - - /** - * @param codigoDeCompensacaoBACEN - * @param instituicao - */ - public Banco(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN, String instituicao) { - super(); - - this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; - - pessoaJuridica = new PessoaJuridica(); - pessoaJuridica.setNome(instituicao); - pessoaJuridica.setNomeFantasia(instituicao); - } - - /** - * @param codigoDeCompensacaoBACEN - * @param instituicao - * @param cnpj - */ - public Banco(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN, String instituicao, CNPJ cnpj) { - super(); - - this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; - - pessoaJuridica = new PessoaJuridica(); - - pessoaJuridica.setCPRF(cnpj); - pessoaJuridica.setNome(instituicao); - pessoaJuridica.setNomeFantasia(instituicao); - } - - /** - * @param codigoDeCompensacaoBACEN - * @param instituicao - * @param cnpj - * @param segmento - */ - public Banco(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN, String instituicao, CNPJ cnpj, String segmento) { - - super(); - - this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; - this.segmento = segmento; - - pessoaJuridica = new PessoaJuridica(); - pessoaJuridica.setCPRF(cnpj); - pessoaJuridica.setNome(instituicao); - pessoaJuridica.setNomeFantasia(instituicao); - } - - /** - * @param codigoDeCompensacaoBACEN - * @param instituicao - * @param cnpj - * @param segmento - * @param imgLogo - */ - public Banco(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN, String instituicao, CNPJ cnpj, String segmento, Image imgLogo) { - - super(); - - this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; - this.segmento = segmento; - this.imgLogo = imgLogo; - - pessoaJuridica = new PessoaJuridica(); - pessoaJuridica.setCPRF(cnpj); - } - - /** - *

            - * Verifica se o código passado está ok em relação as regras: - *

              - *
            1. Não nulo
            2. - *
            3. Numérico
            4. - *
            5. Com 3 digitos
            6. - *
            - *

            - * - * @param codigo - Código de compensação BACEN do banco - * - * @return se ok - * - * @throws IllegalArgumentException - * - * @since 0.2 - * - */ - public static boolean isCodigoDeCompensacaoOK(String codigo) { - - boolean ok = false; - - if (isNotNull(codigo)) { - - if (StringUtils.isNumeric(codigo)) { - - if (codigo.length() == 3) { - - ok = true; - - } else { - log.warn("O código é de apenas 3 digitos!"); - } - - } else { - log.warn("O código de compensação deve ser numérico!"); - } - } - - return ok; - } - - - /** - * @return the codigoDeCompensacaoBACEN - */ - public CodigoDeCompensacaoBACEN getCodigoDeCompensacaoBACEN() { - return codigoDeCompensacaoBACEN; - } - - - /** - * @param codigoDeCompensacaoBACEN the codigoDeCompensacaoBACEN to set - */ - public void setCodigoDeCompensacaoBACEN( - CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN) { - this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; - } - - - public CNPJ getCNPJ() { - return (CNPJ)pessoaJuridica.getCPRF(); - } - - public void setCNPJ(CNPJ cnpj) { - pessoaJuridica.setCPRF(cnpj); - } - - public String getSegmento() { - return segmento; - } - - public void setSegmento(String segmento) { - this.segmento = segmento; - } - - public Image getImgLogo() { - return imgLogo; - } - - public void setImgLogo(Image imgLogo) { - this.imgLogo = imgLogo; - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#addEndereco(org.jrimum.domkee.comum.pessoa.endereco.Endereco) - */ - - public void addEndereco(Endereco endereco) { - - pessoaJuridica.addEndereco(endereco); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#addTelefone(org.jrimum.domkee.comum.pessoa.contato.NumeroDeTelefone) - */ - - public void addTelefone(NumeroDeTelefone telefone) { - - pessoaJuridica.addTelefone(telefone); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#getCPRF() - */ - - public CPRF getCPRF() { - - return pessoaJuridica.getCPRF(); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#getEnderecos() - */ - public Collection getEnderecos() { - - return pessoaJuridica.getEnderecos(); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#getNome() - */ - - public String getNome() { - - return pessoaJuridica.getNome(); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#getTelefones() - */ - - public Collection getTelefones() { - - return pessoaJuridica.getTelefones(); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#isFisica() - */ - - public boolean isFisica() { - - return pessoaJuridica.isFisica(); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#isJuridica() - */ - - public boolean isJuridica() { - - return pessoaJuridica.isJuridica(); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#setCPRF(org.jrimum.domkee.comum.pessoa.id.cprf.CPRF) - */ - - public void setCPRF(CPRF cprf) { - - pessoaJuridica.setCPRF(cprf); - } - - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#setEnderecos(java.util.Collection) - */ - public void setEnderecos(Collection enderecos) { - - pessoaJuridica.setEnderecos(enderecos); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#setNome(java.lang.String) - */ - - public void setNome(String nome) { - - pessoaJuridica.setNome(nome); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#setTelefones(java.util.Collection) - */ - - public void setTelefones(Collection telefones) { - - pessoaJuridica.setTelefones(telefones); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.PessoaJuridica#getInscricaoEstadual() - */ - - public Long getInscricaoEstadual() { - - return pessoaJuridica.getInscricaoEstadual(); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.PessoaJuridica#getInscricaoMunicipal() - */ - - public Long getInscricaoMunicipal() { - - return pessoaJuridica.getInscricaoMunicipal(); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.PessoaJuridica#getNomeFantasia() - */ - - public String getNomeFantasia() { - - return pessoaJuridica.getNome(); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.PessoaJuridica#setInscricaoEstadual(java.lang.Long) - */ - - public void setInscricaoEstadual(Long inscricaoEstadual) { - - pessoaJuridica.setInscricaoEstadual(inscricaoEstadual); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.PessoaJuridica#setInscricaoMunicipal(java.lang.Long) - */ - - public void setInscricaoMunicipal(Long inscricaoMunicipal) { - - pessoaJuridica.setInscricaoMunicipal(inscricaoMunicipal); - } - - /** - * @see org.jrimum.domkee.comum.pessoa.PessoaJuridica#setNomeFantasia(java.lang.String) - */ - - public void setNomeFantasia(String nomeFantasia) { - - pessoaJuridica.setNomeFantasia(nomeFantasia); - } - - /** - * @see Pessoa#addContaBancaria(ContaBancaria) - */ - public void addContaBancaria(ContaBancaria contaBancaria) { - pessoaJuridica.addContaBancaria(contaBancaria); - - } - - - /** - * @see Pessoa#getContasBancarias() - */ - - public Collection getContasBancarias() { - - return pessoaJuridica.getContasBancarias(); - } - - /** - * @see Pessoa#hasContaBancaria() - */ - public boolean hasContaBancaria() { - - return pessoaJuridica.hasContaBancaria(); - } - - - /** - * @see org.jrimum.domkee.comum.pessoa.Pessoa#setContasBancarias(java.util.Collection) - */ - - public void setContasBancarias(Collection contasBancarias) { - - pessoaJuridica.setContasBancarias(contasBancarias); - } - - @Override - public String toString() { - - ToStringBuilder tb = new ToStringBuilder(this); - tb.append(codigoDeCompensacaoBACEN); - tb.append(segmento); - tb.append(pessoaJuridica); - - return tb.toString(); - } - -} +/* + * 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:57:43 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:57:43 + * + */ + +package org.jrimum.domkee.banco; + +import static org.jrimum.utilix.Objects.isNotNull; + +import java.awt.Image; +import java.util.Collection; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.log4j.Logger; +import org.jrimum.domkee.pessoa.NumeroDeTelefone; +import org.jrimum.domkee.pessoa.Endereco; +import org.jrimum.domkee.pessoa.CNPJ; +import org.jrimum.domkee.pessoa.CPRF; +import org.jrimum.domkee.pessoa.Pessoa; +import org.jrimum.domkee.pessoa.PessoaJuridica; + + + +/** + * + *

            + * Um Banco (instituição financeira) supervisionada pelo BACEN. + *

            + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ + +public class Banco implements org.jrimum.domkee.banco.IBanco { + + private static Logger log = Logger.getLogger(Banco.class); + + private CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN; + + private String segmento; + + private Image imgLogo; + + private PessoaJuridica pessoaJuridica; + + /** + * + */ + public Banco() { + super(); + } + + + /** + * @param codigoDeCompensacaoBACEN + * @param instituicao + */ + public Banco(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN, String instituicao) { + super(); + + this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; + + pessoaJuridica = new PessoaJuridica(); + pessoaJuridica.setNome(instituicao); + pessoaJuridica.setNomeFantasia(instituicao); + } + + /** + * @param codigoDeCompensacaoBACEN + * @param instituicao + * @param cnpj + */ + public Banco(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN, String instituicao, CNPJ cnpj) { + super(); + + this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; + + pessoaJuridica = new PessoaJuridica(); + + pessoaJuridica.setCPRF(cnpj); + pessoaJuridica.setNome(instituicao); + pessoaJuridica.setNomeFantasia(instituicao); + } + + /** + * @param codigoDeCompensacaoBACEN + * @param instituicao + * @param cnpj + * @param segmento + */ + public Banco(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN, String instituicao, CNPJ cnpj, String segmento) { + + super(); + + this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; + this.segmento = segmento; + + pessoaJuridica = new PessoaJuridica(); + pessoaJuridica.setCPRF(cnpj); + pessoaJuridica.setNome(instituicao); + pessoaJuridica.setNomeFantasia(instituicao); + } + + /** + * @param codigoDeCompensacaoBACEN + * @param instituicao + * @param cnpj + * @param segmento + * @param imgLogo + */ + public Banco(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN, String instituicao, CNPJ cnpj, String segmento, Image imgLogo) { + + super(); + + this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; + this.segmento = segmento; + this.imgLogo = imgLogo; + + pessoaJuridica = new PessoaJuridica(); + pessoaJuridica.setCPRF(cnpj); + } + + /** + * Verifica se o código passado está ok em relação as regras: + *
              + *
            1. Não nulo
            2. + *
            3. Numérico
            4. + *
            5. Com 3 digitos
            6. + *
            + * + * @param codigo - Código de compensação BACEN do banco + * + * @return se ok + * + * @throws IllegalArgumentException + * + * @since 0.2 + * + */ + public static boolean isCodigoDeCompensacaoOK(String codigo) { + + boolean ok = false; + + if (isNotNull(codigo)) { + + if (StringUtils.isNumeric(codigo)) { + + if (codigo.length() == 3) { + + ok = true; + + } else { + log.warn("O código é de apenas 3 digitos!"); + } + + } else { + log.warn("O código de compensação deve ser numérico!"); + } + } + + return ok; + } + + + /** + * @return the codigoDeCompensacaoBACEN + */ + public CodigoDeCompensacaoBACEN getCodigoDeCompensacaoBACEN() { + return codigoDeCompensacaoBACEN; + } + + + /** + * @param codigoDeCompensacaoBACEN the codigoDeCompensacaoBACEN to set + */ + public void setCodigoDeCompensacaoBACEN( + CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN) { + this.codigoDeCompensacaoBACEN = codigoDeCompensacaoBACEN; + } + + + public CNPJ getCNPJ() { + return (CNPJ)pessoaJuridica.getCPRF(); + } + + public void setCNPJ(CNPJ cnpj) { + pessoaJuridica.setCPRF(cnpj); + } + + public String getSegmento() { + return segmento; + } + + public void setSegmento(String segmento) { + this.segmento = segmento; + } + + public Image getImgLogo() { + return imgLogo; + } + + public void setImgLogo(Image imgLogo) { + this.imgLogo = imgLogo; + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#addEndereco(org.jrimum.domkee.comum.pessoa.endereco.Endereco) + */ + + public void addEndereco(Endereco endereco) { + + pessoaJuridica.addEndereco(endereco); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#addTelefone(org.jrimum.domkee.comum.pessoa.contato.NumeroDeTelefone) + */ + + public void addTelefone(NumeroDeTelefone telefone) { + + pessoaJuridica.addTelefone(telefone); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#getCPRF() + */ + + public CPRF getCPRF() { + + return pessoaJuridica.getCPRF(); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#getEnderecos() + */ + public Collection getEnderecos() { + + return pessoaJuridica.getEnderecos(); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#getNome() + */ + + public String getNome() { + + return pessoaJuridica.getNome(); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#getTelefones() + */ + + public Collection getTelefones() { + + return pessoaJuridica.getTelefones(); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#isFisica() + */ + + public boolean isFisica() { + + return pessoaJuridica.isFisica(); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#isJuridica() + */ + + public boolean isJuridica() { + + return pessoaJuridica.isJuridica(); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#setCPRF(org.jrimum.domkee.comum.pessoa.id.cprf.CPRF) + */ + + public void setCPRF(CPRF cprf) { + + pessoaJuridica.setCPRF(cprf); + } + + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#setEnderecos(java.util.Collection) + */ + public void setEnderecos(Collection enderecos) { + + pessoaJuridica.setEnderecos(enderecos); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#setNome(java.lang.String) + */ + + public void setNome(String nome) { + + pessoaJuridica.setNome(nome); + } + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#setTelefones(java.util.Collection) + */ + + public void setTelefones(Collection telefones) { + + pessoaJuridica.setTelefones(telefones); + } + + /** + * @see org.jrimum.domkee.pessoa.PessoaJuridica#getInscricaoEstadual() + */ + + public Long getInscricaoEstadual() { + + return pessoaJuridica.getInscricaoEstadual(); + } + + /** + * @see org.jrimum.domkee.pessoa.PessoaJuridica#getInscricaoMunicipal() + */ + + public Long getInscricaoMunicipal() { + + return pessoaJuridica.getInscricaoMunicipal(); + } + + /** + * @see org.jrimum.domkee.pessoa.PessoaJuridica#getNomeFantasia() + */ + + public String getNomeFantasia() { + + return pessoaJuridica.getNome(); + } + + /** + * @see org.jrimum.domkee.pessoa.PessoaJuridica#setInscricaoEstadual(java.lang.Long) + */ + + public void setInscricaoEstadual(Long inscricaoEstadual) { + + pessoaJuridica.setInscricaoEstadual(inscricaoEstadual); + } + + /** + * @see org.jrimum.domkee.pessoa.PessoaJuridica#setInscricaoMunicipal(java.lang.Long) + */ + + public void setInscricaoMunicipal(Long inscricaoMunicipal) { + + pessoaJuridica.setInscricaoMunicipal(inscricaoMunicipal); + } + + /** + * @see org.jrimum.domkee.pessoa.PessoaJuridica#setNomeFantasia(java.lang.String) + */ + + public void setNomeFantasia(String nomeFantasia) { + + pessoaJuridica.setNomeFantasia(nomeFantasia); + } + + /** + * @see Pessoa#addContaBancaria(ContaBancaria) + */ + public void addContaBancaria(ContaBancaria contaBancaria) { + pessoaJuridica.addContaBancaria(contaBancaria); + + } + + + /** + * @see Pessoa#getContasBancarias() + */ + + public Collection getContasBancarias() { + + return pessoaJuridica.getContasBancarias(); + } + + /** + * @see Pessoa#hasContaBancaria() + */ + public boolean hasContaBancaria() { + + return pessoaJuridica.hasContaBancaria(); + } + + + /** + * @see org.jrimum.domkee.pessoa.Pessoa#setContasBancarias(java.util.Collection) + */ + + public void setContasBancarias(Collection contasBancarias) { + + pessoaJuridica.setContasBancarias(contasBancarias); + } + + @Override + public String toString() { + + ToStringBuilder tb = new ToStringBuilder(this); + tb.append(codigoDeCompensacaoBACEN); + tb.append(segmento); + tb.append(pessoaJuridica); + + return tb.toString(); + } + +} diff --git a/src/main/java/org/jrimum/domkee/banco/Contribuinte.java b/src/main/java/org/jrimum/domkee/banco/Contribuinte.java index 72a8b021..d273db64 100644 --- a/src/main/java/org/jrimum/domkee/banco/Contribuinte.java +++ b/src/main/java/org/jrimum/domkee/banco/Contribuinte.java @@ -1,75 +1,73 @@ -/** - * - */ -package org.jrimum.domkee.banco; - -import org.jrimum.domkee.pessoa.CPF; - -/** - * @author misael - * - */ -public class Contribuinte extends IEntidadeDeCobranca { - - /** - * - */ - private static final long serialVersionUID = 3267851061149256619L; - - - /** - * - */ - public Contribuinte() { - super(); - // TODO Auto-generated constructor stub - } - - /** - * @param nome - * @param cpf - */ - public Contribuinte(String nome, CPF cpf) { - super(nome, cpf); - // TODO Auto-generated constructor stub - } - - /** - * @param nome - * @param cpf - */ - public Contribuinte(String nome, String cpf) { - super(); - - setNome(nome); - - CPF cPF = new CPF(cpf); - setCPF(cPF); - } - - /** - * @param nome - */ - public Contribuinte(String nome) { - super(nome); - // TODO Auto-generated constructor stub - } - - - /** - * @return CPF - * @see #getCPF() - */ - public CPF getCPF() { - return (CPF)pessoa.getCPRF(); - } - - /** - * @param abstractCPRF - * @see # setCPF(CPF cpf) - */ - public void setCPF(CPF cpf) { - pessoa.setCPRF(cpf); - } - -} +/** + * + */ +package org.jrimum.domkee.banco; + +import org.jrimum.domkee.pessoa.CPF; + +/** + * @author misael + * + */ +public class Contribuinte extends IEntidadeDeCobranca { + + /** + * + */ + private static final long serialVersionUID = 3267851061149256619L; + + + /** + * + */ + public Contribuinte() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @param nome + * @param cpf + */ + public Contribuinte(String nome, CPF cpf) { + super(nome, cpf); + // TODO Auto-generated constructor stub + } + + /** + * @param nome + * @param cpf + */ + public Contribuinte(String nome, String cpf) { + super(); + + setNome(nome); + + CPF cPF = new CPF(cpf); + setCPF(cPF); + } + + /** + * @param nome + */ + public Contribuinte(String nome) { + super(nome); + // TODO Auto-generated constructor stub + } + + + /** + * @return CPF + * @see #getCPF() + */ + public CPF getCPF() { + return (CPF)pessoa.getCPRF(); + } + + /** + */ + public void setCPF(CPF cpf) { + pessoa.setCPRF(cpf); + } + +} diff --git a/src/main/java/org/jrimum/domkee/banco/IBanco.java b/src/main/java/org/jrimum/domkee/banco/IBanco.java index be1f3c90..d9a07eaf 100644 --- a/src/main/java/org/jrimum/domkee/banco/IBanco.java +++ b/src/main/java/org/jrimum/domkee/banco/IBanco.java @@ -1,122 +1,122 @@ -/* - * 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:59:18 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:59:18 - * - */ -package org.jrimum.domkee.banco; - -import java.awt.Image; -import org.jrimum.domkee.pessoa.IPessoaJuridica; - - -/** - * - *

            - * Interface que define o contrato para a criação de um novo banco (instituição - * financeira) supervisionada pelo BACEN. - *

            - * - * @author Gilmar P.S.L. - * @author Misael Barreto - * @author Rômulo Augusto - * @author Samuel Valério - * - * @since 0.2 - * - * @version 0.2 - */ -public interface IBanco extends IPessoaJuridica { - - /** - * @see #setCodigoDeCompensacaoBACEN(CodigoDeCompensacaoBACEN) - * - * @return CodigoDeCompensacaoBACEN - * - * @since 0.2 - */ - CodigoDeCompensacaoBACEN getCodigoDeCompensacaoBACEN(); - - /** - * @see #setSegmento(String) - * - * @return Segmento - * - * @since 0.2 - */ - String getSegmento(); - - /** - * @see #setImgLogo(Image) - * - * @return Imagem - * - * @since 0.2 - */ - Image getImgLogo(); - - /** - *

            - * Código de compensação BACEN - *

            > - * - * @param codigoDeCompensacaoBACEN - * - * @since 0.2 - */ - void setCodigoDeCompensacaoBACEN(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN); - - /** - *

            - * Segmento registrado no BACEN. - *

            - * - *

            - * Exemplos: - *

              - *
            • Banco Comercial Estrangeiro - Filial no país
            • - *
            • Banco Múltiplo
            • - *
            • Banco Comercial
            • - *
            • Banco Múltiplo Cooperativo
            • - *
            - *

            > - * - * @param segmento - * - * @since 0.2 - */ - void setSegmento(String segmento); - - /** - *

            - * Imagem da logo-marca do banco. - *

            > - * - * @param imgLogo - * - * @since 0.2 - */ - void setImgLogo(Image imgLogo); -} +/* + * 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:59:18 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:59:18 + * + */ +package org.jrimum.domkee.banco; + +import java.awt.Image; +import org.jrimum.domkee.pessoa.IPessoaJuridica; + + +/** + * + *

            + * Interface que define o contrato para a criação de um novo banco (instituição + * financeira) supervisionada pelo BACEN. + *

            + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério + * + * @since 0.2 + * + * @version 0.2 + */ +public interface IBanco extends IPessoaJuridica { + + /** + * @see #setCodigoDeCompensacaoBACEN(CodigoDeCompensacaoBACEN) + * + * @return CodigoDeCompensacaoBACEN + * + * @since 0.2 + */ + CodigoDeCompensacaoBACEN getCodigoDeCompensacaoBACEN(); + + /** + * @see #setSegmento(String) + * + * @return Segmento + * + * @since 0.2 + */ + String getSegmento(); + + /** + * @see #setImgLogo(Image) + * + * @return Imagem + * + * @since 0.2 + */ + Image getImgLogo(); + + /** + *

            + * Código de compensação BACEN + *

            + * + * @param codigoDeCompensacaoBACEN + * + * @since 0.2 + */ + void setCodigoDeCompensacaoBACEN(CodigoDeCompensacaoBACEN codigoDeCompensacaoBACEN); + + /** + *

            + * Segmento registrado no BACEN. + *

            + * + *

            + * Exemplos: + *

              + *
            • Banco Comercial Estrangeiro - Filial no país
            • + *
            • Banco Múltiplo
            • + *
            • Banco Comercial
            • + *
            • Banco Múltiplo Cooperativo
            • + *
            + *

            + * + * @param segmento + * + * @since 0.2 + */ + void setSegmento(String segmento); + + /** + *

            + * Imagem da logo-marca do banco. + *

            + * + * @param imgLogo + * + * @since 0.2 + */ + void setImgLogo(Image imgLogo); +} diff --git a/src/main/java/org/jrimum/domkee/banco/IEntidadeDeCobranca.java b/src/main/java/org/jrimum/domkee/banco/IEntidadeDeCobranca.java index 4e934e39..e8e2a724 100644 --- a/src/main/java/org/jrimum/domkee/banco/IEntidadeDeCobranca.java +++ b/src/main/java/org/jrimum/domkee/banco/IEntidadeDeCobranca.java @@ -1,55 +1,55 @@ -/** - * - */ -package org.jrimum.domkee.banco; - -import java.io.Serializable; -import org.jrimum.domkee.pessoa.AbstractCPRF; -import org.jrimum.domkee.pessoa.Pessoa; - -/** - * @author misael - * - */ -public abstract class IEntidadeDeCobranca implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 8794286412913271840L; - - /** - * Utilizado como composição - */ - protected Pessoa pessoa; - - protected IEntidadeDeCobranca() { - pessoa = new Pessoa(); - } - - protected IEntidadeDeCobranca(String nome) { - pessoa = new Pessoa(nome); - } - - protected IEntidadeDeCobranca(String nome, AbstractCPRF cadastroDePessoa) { - pessoa = new Pessoa(nome, cadastroDePessoa); - } - - /** - * @return @see - * br.com.nordestefomento.jrimum.domkee.financeiro.banco.Pessoa#getNome() - */ - public String getNome() { - return pessoa.getNome(); - } - - /** - * @param nome - * @see - * br.com.nordestefomento.jrimum.domkee.financeiro.banco.Pessoa#setNome(java.lang.String) - */ - public void setNome(String nome) { - pessoa.setNome(nome); - } - -} +/** + * + */ +package org.jrimum.domkee.banco; + +import java.io.Serializable; +import org.jrimum.domkee.pessoa.AbstractCPRF; +import org.jrimum.domkee.pessoa.Pessoa; + +/** + * @author misael + * + */ +public abstract class IEntidadeDeCobranca implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 8794286412913271840L; + + /** + * Utilizado como composição + */ + protected Pessoa pessoa; + + protected IEntidadeDeCobranca() { + pessoa = new Pessoa(); + } + + protected IEntidadeDeCobranca(String nome) { + pessoa = new Pessoa(nome); + } + + protected IEntidadeDeCobranca(String nome, AbstractCPRF cadastroDePessoa) { + pessoa = new Pessoa(nome, cadastroDePessoa); + } + + /** + * @return @see + * br.com.nordestefomento.jrimum.domkee.financeiro.banco.Pessoa#getNome() + */ + public String getNome() { + return pessoa.getNome(); + } + + /** + * @param nome + * @see + * org.jrimum.domkee.pessoa.Pessoa#setNome(java.lang.String) + */ + public void setNome(String nome) { + pessoa.setNome(nome); + } + +} diff --git a/src/main/java/org/jrimum/domkee/banco/OrgaoRecebedor.java b/src/main/java/org/jrimum/domkee/banco/OrgaoRecebedor.java index 2cbd4f60..77cf0e6e 100644 --- a/src/main/java/org/jrimum/domkee/banco/OrgaoRecebedor.java +++ b/src/main/java/org/jrimum/domkee/banco/OrgaoRecebedor.java @@ -1,130 +1,129 @@ -/** - * - */ -package org.jrimum.domkee.banco; - -import java.awt.Image; -import org.jrimum.domkee.pessoa.CNPJ; - -/** - *

            - * É a representação da entidade Órgão/Empresa que irá receber o pagamento - * efetuado pelo Contribuinte. - *

            - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * - * @since 0.3 - * - * @version 0.3 - */ -public class OrgaoRecebedor extends IEntidadeDeCobranca { - - /** - * - */ - private static final long serialVersionUID = 8761667661640466629L; - - private TipoSeguimento tipoSeguimento; - private CodigoDeIdentificacaoFebraban codigoDeIdentificacaoFebraban; - private Image imgLogo; - - /** - * @param nome - * @param tipoSeguimento - */ - public OrgaoRecebedor(String nome, TipoSeguimento tipoSeguimento) { - super(nome); - setTipoSeguimento(tipoSeguimento); - } - - /** - * @param nome - * @param tipoSeguimento - * @param codigoDeIdentificacaoFebraban - * @param imgLogo - */ - public OrgaoRecebedor(String nome, TipoSeguimento tipoSeguimento, CNPJ cnpj, CodigoDeIdentificacaoFebraban codigoDeIdentificacaoFebraban, Image imgLogo) { - super(nome, cnpj); - setTipoSeguimento(tipoSeguimento); - setCodigoDeIdentificacaoFebraban(codigoDeIdentificacaoFebraban); - setImgLogo(imgLogo); - } - - /** - * @param nome - * @param tipoSeguimento - * @param codigoDeIdentificacaoFebraban - * @param imgLogo - */ - public OrgaoRecebedor(String nome, TipoSeguimento tipoSeguimento, String cnpj, CodigoDeIdentificacaoFebraban codigoDeIdentificacaoFebraban, Image imgLogo) { - super(nome, new CNPJ(cnpj)); - setTipoSeguimento(tipoSeguimento); - setCodigoDeIdentificacaoFebraban(codigoDeIdentificacaoFebraban); - setImgLogo(imgLogo); - } - - /** - * @return the tipoSeguimento - */ - public TipoSeguimento getTipoSeguimento() { - return tipoSeguimento; - } - - /** - * @param tipoSeguimento the tipoSeguimento to set - */ - public void setTipoSeguimento(TipoSeguimento tipoSeguimento) { - this.tipoSeguimento = tipoSeguimento; - } - - /** - * @return CNPJ - * @see #getCNPJ() - */ - public CNPJ getCNPJ() { - return (CNPJ) pessoa.getCPRF(); - } - - /** - * @param abstractCNPJ - * @see # setCNPJ(CNPJ cnpj) - */ - public void setCNPJ(CNPJ cnpj) { - pessoa.setCPRF(cnpj); - } - - /** - * @param abstractCNPJ - * @see # setCNPJ(CNPJ cnpj) - */ - public void setCNPJ(String cnpj) { - setCNPJ(new CNPJ(cnpj)); - } - - /** - * @return the imgLogo - */ - public Image getImgLogo() { - return imgLogo; - } - - /** - * @param imgLogo the imgLogo to set - */ - public void setImgLogo(Image imgLogo) { - this.imgLogo = imgLogo; - } - - public CodigoDeIdentificacaoFebraban getCodigoDeIdentificacaoFebraban() { - return codigoDeIdentificacaoFebraban; - } - - public void setCodigoDeIdentificacaoFebraban( - CodigoDeIdentificacaoFebraban codigoDeIdentificacaoFebraban) { - this.codigoDeIdentificacaoFebraban = codigoDeIdentificacaoFebraban; - } - -} +/** + * + */ +package org.jrimum.domkee.banco; + +import java.awt.Image; +import org.jrimum.domkee.pessoa.CNPJ; + +/** + *

            + * É a representação da entidade Órgão/Empresa que irá receber o pagamento + * efetuado pelo Contribuinte. + *

            + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.3 + * + * @version 0.3 + */ +public class OrgaoRecebedor extends IEntidadeDeCobranca { + + /** + * + */ + private static final long serialVersionUID = 8761667661640466629L; + + private TipoSeguimento tipoSeguimento; + private CodigoDeIdentificacaoFebraban codigoDeIdentificacaoFebraban; + private Image imgLogo; + + /** + * @param nome + * @param tipoSeguimento + */ + public OrgaoRecebedor(String nome, TipoSeguimento tipoSeguimento) { + super(nome); + setTipoSeguimento(tipoSeguimento); + } + + /** + * @param nome + * @param tipoSeguimento + * @param codigoDeIdentificacaoFebraban + * @param imgLogo + */ + public OrgaoRecebedor(String nome, TipoSeguimento tipoSeguimento, CNPJ cnpj, CodigoDeIdentificacaoFebraban codigoDeIdentificacaoFebraban, Image imgLogo) { + super(nome, cnpj); + setTipoSeguimento(tipoSeguimento); + setCodigoDeIdentificacaoFebraban(codigoDeIdentificacaoFebraban); + setImgLogo(imgLogo); + } + + /** + * @param nome + * @param tipoSeguimento + * @param codigoDeIdentificacaoFebraban + * @param imgLogo + */ + public OrgaoRecebedor(String nome, TipoSeguimento tipoSeguimento, String cnpj, CodigoDeIdentificacaoFebraban codigoDeIdentificacaoFebraban, Image imgLogo) { + super(nome, new CNPJ(cnpj)); + setTipoSeguimento(tipoSeguimento); + setCodigoDeIdentificacaoFebraban(codigoDeIdentificacaoFebraban); + setImgLogo(imgLogo); + } + + /** + * @return the tipoSeguimento + */ + public TipoSeguimento getTipoSeguimento() { + return tipoSeguimento; + } + + /** + * @param tipoSeguimento the tipoSeguimento to set + */ + public void setTipoSeguimento(TipoSeguimento tipoSeguimento) { + this.tipoSeguimento = tipoSeguimento; + } + + /** + * @return CNPJ + * @see #getCNPJ() + */ + public CNPJ getCNPJ() { + return (CNPJ) pessoa.getCPRF(); + } + + /** + * @param abstractCNPJ + */ + public void setCNPJ(CNPJ cnpj) { + pessoa.setCPRF(cnpj); + } + + /** + * @param abstractCNPJ + * @see # setCNPJ(CNPJ cnpj) + */ + public void setCNPJ(String cnpj) { + setCNPJ(new CNPJ(cnpj)); + } + + /** + * @return the imgLogo + */ + public Image getImgLogo() { + return imgLogo; + } + + /** + * @param imgLogo the imgLogo to set + */ + public void setImgLogo(Image imgLogo) { + this.imgLogo = imgLogo; + } + + public CodigoDeIdentificacaoFebraban getCodigoDeIdentificacaoFebraban() { + return codigoDeIdentificacaoFebraban; + } + + public void setCodigoDeIdentificacaoFebraban( + CodigoDeIdentificacaoFebraban codigoDeIdentificacaoFebraban) { + this.codigoDeIdentificacaoFebraban = codigoDeIdentificacaoFebraban; + } + +} diff --git a/src/main/java/org/jrimum/domkee/banco/TipoDeCobranca.java b/src/main/java/org/jrimum/domkee/banco/TipoDeCobranca.java index 82038d31..7bcf4a85 100644 --- a/src/main/java/org/jrimum/domkee/banco/TipoDeCobranca.java +++ b/src/main/java/org/jrimum/domkee/banco/TipoDeCobranca.java @@ -1,66 +1,66 @@ - -/* - * 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: 19/04/2008 - 21:12:40 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Criado em: 19/04/2008 - 21:12:40 - * - */ - -package org.jrimum.domkee.banco; - - - -/** - * - *

            - * Representação dos tipos básicos de cobrança:
            - *

              - *
            • Registrada (ou com registro)
            • - *
            • Não Registrada (ou sem registro)
            • - *
            - *

            - * - * - * @author Gilmar P.S.L. - * @author Misael Barreto - * @author Rômulo Augusto - * @author Samuel Valério Valerio - * - * @since 0.2 - * - * @version 0.2 - */ - -public enum TipoDeCobranca{ - /** - *

            Tipo onde os títulos emitidos são sempre registrados no banco antes de seu vencimento ou pagamento.

            - */ - COM_REGISTRO, - /** - *

            Tipo onde os títulos emitidos só são registrados pelo banco quando são pagos.

            - */ - SEM_REGISTRO; -} + +/* + * 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: 19/04/2008 - 21:12:40 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 19/04/2008 - 21:12:40 + * + */ + +package org.jrimum.domkee.banco; + + + +/** + * + *

            + * Representação dos tipos básicos de cobrança: + *

              + *
            • Registrada (ou com registro)
            • + *
            • Não Registrada (ou sem registro)
            • + *
            + *

            + * + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério Valerio + * + * @since 0.2 + * + * @version 0.2 + */ + +public enum TipoDeCobranca{ + /** + *

            Tipo onde os títulos emitidos são sempre registrados no banco antes de seu vencimento ou pagamento.

            + */ + COM_REGISTRO, + /** + *

            Tipo onde os títulos emitidos só são registrados pelo banco quando são pagos.

            + */ + SEM_REGISTRO; +} diff --git a/src/main/java/org/jrimum/domkee/banco/Titulo.java b/src/main/java/org/jrimum/domkee/banco/Titulo.java index 6aba11e2..917c30cc 100644 --- a/src/main/java/org/jrimum/domkee/banco/Titulo.java +++ b/src/main/java/org/jrimum/domkee/banco/Titulo.java @@ -42,7 +42,7 @@ /** * Representa um título em cobrança, tais como: * - *
            + * * *
              *
            • Cheque
            • diff --git a/src/main/java/org/jrimum/overview.html b/src/main/java/org/jrimum/overview.html index 8576fae7..5924c057 100644 --- a/src/main/java/org/jrimum/overview.html +++ b/src/main/java/org/jrimum/overview.html @@ -1,21 +1,21 @@ - - -

              - JRimum é um projeto fruto da iniciativa conjunta entre Grupo JRimum e a Nordeste Fomento Mercantil - objetivando a criação de componentes reutilizáveis Java com foco no domínio de negócios do Brasil. -

              - -
              -
              - -
              -
              -

              - Bopepo é o primeiro componente disponibilizado pelo projeto com a finalidade de gerar boletos bancários. -

              -

              - A biblioteca é focada em negócios,mas também contém classes utilitárias de propósito geral. -

              -
              - - + + +

              + JRimum é um projeto fruto da iniciativa conjunta entre Grupo JRimum e a Nordeste Fomento Mercantil + objetivando a criação de componentes reutilizáveis Java com foco no domínio de negócios do Brasil. +

              + +
              +
              + + +
              +

              + Bopepo é o primeiro componente disponibilizado pelo projeto com a finalidade de gerar boletos bancários. +

              +

              + A biblioteca é focada em negócios,mas também contém classes utilitárias de propósito geral. +

              +
              + + diff --git a/src/main/java/org/jrimum/texgit/Filler.java b/src/main/java/org/jrimum/texgit/Filler.java index 5f508cf3..69fcc413 100644 --- a/src/main/java/org/jrimum/texgit/Filler.java +++ b/src/main/java/org/jrimum/texgit/Filler.java @@ -1,432 +1,432 @@ -/* - * 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:00 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:17:00 - * - */ -package org.jrimum.texgit; - -import static java.lang.String.format; -import static org.apache.commons.lang3.StringUtils.EMPTY; -import static org.jrimum.utilix.Objects.isNotNull; -import static org.jrimum.texgit.Side.*; -import static org.jrimum.utilix.Strings.*; -import org.apache.commons.lang3.StringUtils; -import org.jrimum.texgit.TextStream; -import org.jrimum.utilix.Objects; - -/** - *

              - * Preenchedor de caracteres genérico. É utilizado para preencher objetos - * String, tanto da esquerda para a direita como da direita para - * esquerda, com o objeto genérico até o tamanho especificado. Caso o tamanho - * especificado seja menor - * ou igual a 0 (ZERO), este valor será desconsiderado e nada - * será preenchido. - *

              - *

              - * É utilizado o método toString() do objeto preenchedor. - *

              - *

              - * Exemplo:
              - *

              - * Filler filler = new Filler(new Integer(10), LEFT);
              - * String outPut = filler.fill("TESTE", 8);
              - *
              - * outPut -> "101TESTE"
              - * 
              - *

              - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento - * Mercantil - * - * @since JRimum 0.1 - * - * @version 0.2.1-inc - * - */ -@SuppressWarnings("serial") -public class Filler implements org.jrimum.texgit.IFiller { - - /** - * - */ - private static final long serialVersionUID = -3996934478582358340L; - - /** - * Filler padrão para preenchimento com zeros a esquerda. - */ - public static final Filler ZERO_LEFT = new Filler(0, LEFT); - - /** - * Filler padrão para preenchimento com zeros a direita. - */ - public static final Filler ZERO_RIGHT = new Filler(0, RIGHT); - - /** - * Filler padrão para preenchimento com espaços em branco a esquerda. - */ - public static final Filler WHITE_SPACE_LEFT = new Filler(WHITE_SPACE, LEFT); - - /** - * Filler padrão para preenchimento com espaços em branco a direita. - */ - public static final Filler WHITE_SPACE_RIGHT = new Filler(WHITE_SPACE, RIGHT); - - /** - * - */ - private G padding; - - private Side sideToFill; - - public Filler() { - super(); - } - - /** - * @param fillWith - */ - public Filler(G fillWith) { - - setPadding(fillWith); - setSideToFill(Side.LEFT); - } - - /** - * @param fillWith - * @param sideToFill - */ - public Filler(G fillWith, Side sideToFill) { - - setPadding(fillWith); - setSideToFill(sideToFill); - } - - public G getFillWith() { - return getPadding(); - } - - /** - * @param fillWith valor que preenche o real valor do campo - */ - public void setFillWith(G fillWith) { - this.setPadding(fillWith); - } - - /** - * @see org.jrimum.texgit.type#setPadding(G) - */ - public void setPadding(G fillWith) { - - if (isNotNull(fillWith)) { - this.padding = fillWith; - } else { - throw new IllegalArgumentException(format("Preenchimento inválido [%s]!", fillWith)); - } - } - - public G getPadding() { - return padding; - } - - /** - * @return enum SideToFill - */ - public Side getSideToFill() { - return sideToFill; - } - - /** - * @param sideToFill enum com a informaçao de qual lado a ser preenchido - */ - public void setSideToFill(Side sideToFill) { - - if (isNotNull(sideToFill)) { - this.sideToFill = sideToFill; - } else { - throw new IllegalArgumentException(format("Lado para preenchimento [%s]!", sideToFill)); - } - } - - /** - *

              - * Preenche o campo com o caracter especificado e no lado especificado. - *

              - *

              - * Exemplo: - *
              - * Se sideToFill == LEFT, o caracter especificado será - * adicionado à String no lado esquerdo até que o campo fique com o tamanho - * que foi definido. - *

              - * - * @param toFill String a ser preenchida - * @param length tamanho máximo que a String deve ter depois de preenchida - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - */ - public String fill(String toFill, int length) { - - String str = null; - - switch (sideToFill) { - - case LEFT: - str = fillLeft(toFill, length); - break; - - case RIGHT: - str = fillRight(toFill, length); - break; - } - - return str; - } - - /** - * - *

              - * Executa o método fill(String, int) passando o parâmetro - * toFill como String.valueOf(toFill). - *

              - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - * - * @see Filler#fill(String, int) - */ - public String fill(long tofill, int length) { - return fill(String.valueOf(tofill), length); - } - - /** - * - *

              - * Executa o método fill(String, int) passando o parâmetro - * toFill como String.valueOf(toFill). - *

              - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - * - * @see Filler#fill(String, int) - */ - public String fill(int tofill, int length) { - return fill(String.valueOf(tofill), length); - } - - /** - * - *

              - * Executa o método fill(String, int) passando o parâmetro - * toFill como String.valueOf(toFill). - *

              - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - * - * @see Filler#fill(String, int) - */ - public String fill(short tofill, int length) { - return fill(String.valueOf(tofill), length); - } - - /** - * - *

              - * Executa o método fill(String, int) passando o parâmetro - * toFill como String.valueOf(toFill). - *

              - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - * - * @see Filler#fill(String, int) - */ - public String fill(byte tofill, int length) { - return fill(String.valueOf(tofill), length); - } - - /** - * - *

              - * Executa o método fill(String, int) passando o parâmetro - * toFill como String.valueOf(toFill). - *

              - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - * - * @see Filler#fill(String, int) - */ - public String fill(char tofill, int length) { - return fill(String.valueOf(tofill), length); - } - - /** - * - *

              - * Executa o método fill(String, int) passando o parâmetro - * toFill como String.valueOf(toFill). - *

              - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - * - * @see Filler#fill(String, int) - */ - public String fill(double tofill, int length) { - return fill(String.valueOf(tofill), length); - } - - /** - * - *

              - * Executa o método fill(String, int) passando o parâmetro - * toFill como String.valueOf(toFill). - *

              - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - * - * @see Filler#fill(String, int) - */ - public String fill(float tofill, int length) { - return fill(String.valueOf(tofill), length); - } - - /** - * - *

              - * Executa o método fill(String, int) passando o parâmetro - * toFill como toFill.toString(). - *
              - *

              - *

              - * Caso toFill seja null, o método - * fill(String, int) receberá uma String nula como parâmetro. - *

              - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - * - * @see Filler#fill(String, int) - */ - public String fill(Object tofill, int length) { - - String toFillTemp = null; - - if (isNotNull(tofill)) { - toFillTemp = tofill.toString(); - } - - return fill(toFillTemp, length); - } - - /** - * - *

              - * Executa o método fill(String, int) passando o parâmetro - * toFill como toFill.write(). - *
              - *

              - *

              - * Caso toFill seja null, o método - * fill(String, int) receberá uma String nula como parâmetro. - *

              - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - * - * @see Filler#fill(String, int) - */ - public String fill(TextStream tofill, int length) { - - String toFillTemp = null; - - if (isNotNull(tofill)) { - toFillTemp = tofill.write(); - } - - return fill(toFillTemp, length); - } - - /** - * Preenche a String a direita com valor do atributo "fillWith" - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - */ - private String fillRight(String toFill, int length) { - - return StringUtils.rightPad(toFill, length, padding.toString()); - } - - /** - * Preenche a String a direita com valor do atributo "fillWith" - * - * @param toFill Valor a ser preenchido - * @param length tamanho máximo que o valor deve ter depois de preenchido - * @return Nova String preenchida de acordo com o preenchedor do objeto até - * o tamanho especificado - */ - private String fillLeft(String toFill, int length) { - - return StringUtils.leftPad(toFill, length, padding.toString()); - } - - @Override - public String toString() { - return format( - "Filler [padding=\"%s\", sideToFill=%s]", - Objects.whenNull(this.padding, EMPTY), - Objects.whenNull(this.sideToFill, EMPTY)); - } - -} +/* + * 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:00 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:17:00 + * + */ +package org.jrimum.texgit; + +import static java.lang.String.format; +import static org.apache.commons.lang3.StringUtils.EMPTY; +import static org.jrimum.utilix.Objects.isNotNull; +import static org.jrimum.texgit.Side.*; +import static org.jrimum.utilix.Strings.*; +import org.apache.commons.lang3.StringUtils; +import org.jrimum.texgit.TextStream; +import org.jrimum.utilix.Objects; + +/** + *

              + * Preenchedor de caracteres genérico. É utilizado para preencher objetos + * String, tanto da esquerda para a direita como da direita para + * esquerda, com o objeto genérico até o tamanho especificado. Caso o tamanho + * especificado seja menor + * ou igual a 0 (ZERO), este valor será desconsiderado e nada + * será preenchido. + *

              + *

              + * É utilizado o método toString() do objeto preenchedor. + *

              + *

              + * Exemplo:
              + *

              + * Filler filler = new Filler(new Integer(10), LEFT);
              + * String outPut = filler.fill("TESTE", 8);
              + *
              + * outPut -> "101TESTE"
              + * 
              + *

              + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since JRimum 0.1 + * + * @version 0.2.1-inc + * + */ +@SuppressWarnings("serial") +public class Filler implements org.jrimum.texgit.IFiller { + + /** + * + */ + private static final long serialVersionUID = -3996934478582358340L; + + /** + * Filler padrão para preenchimento com zeros a esquerda. + */ + public static final Filler ZERO_LEFT = new Filler(0, LEFT); + + /** + * Filler padrão para preenchimento com zeros a direita. + */ + public static final Filler ZERO_RIGHT = new Filler(0, RIGHT); + + /** + * Filler padrão para preenchimento com espaços em branco a esquerda. + */ + public static final Filler WHITE_SPACE_LEFT = new Filler(WHITE_SPACE, LEFT); + + /** + * Filler padrão para preenchimento com espaços em branco a direita. + */ + public static final Filler WHITE_SPACE_RIGHT = new Filler(WHITE_SPACE, RIGHT); + + /** + * + */ + private G padding; + + private Side sideToFill; + + public Filler() { + super(); + } + + /** + * @param fillWith + */ + public Filler(G fillWith) { + + setPadding(fillWith); + setSideToFill(Side.LEFT); + } + + /** + * @param fillWith + * @param sideToFill + */ + public Filler(G fillWith, Side sideToFill) { + + setPadding(fillWith); + setSideToFill(sideToFill); + } + + public G getFillWith() { + return getPadding(); + } + + /** + * @param fillWith valor que preenche o real valor do campo + */ + public void setFillWith(G fillWith) { + this.setPadding(fillWith); + } + + /** + * @see org.jrimum.texgit.type#setPadding(G) + */ + public void setPadding(G fillWith) { + + if (isNotNull(fillWith)) { + this.padding = fillWith; + } else { + throw new IllegalArgumentException(format("Preenchimento inválido [%s]!", fillWith)); + } + } + + public G getPadding() { + return padding; + } + + /** + * @return enum SideToFill + */ + public Side getSideToFill() { + return sideToFill; + } + + /** + * @param sideToFill enum com a informaçao de qual lado a ser preenchido + */ + public void setSideToFill(Side sideToFill) { + + if (isNotNull(sideToFill)) { + this.sideToFill = sideToFill; + } else { + throw new IllegalArgumentException(format("Lado para preenchimento [%s]!", sideToFill)); + } + } + + /** + *

              + * Preenche o campo com o caracter especificado e no lado especificado. + *

              + *

              + * Exemplo: + *
              + * Se sideToFill == LEFT, o caracter especificado será + * adicionado à String no lado esquerdo até que o campo fique com o tamanho + * que foi definido. + *

              + * + * @param toFill String a ser preenchida + * @param length tamanho máximo que a String deve ter depois de preenchida + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + */ + public String fill(String toFill, int length) { + + String str = null; + + switch (sideToFill) { + + case LEFT: + str = fillLeft(toFill, length); + break; + + case RIGHT: + str = fillRight(toFill, length); + break; + } + + return str; + } + + /** + * + *

              + * Executa o método fill(String, int) passando o parâmetro + * toFill como String.valueOf(toFill). + *

              + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + * + * @see Filler#fill(String, int) + */ + public String fill(long tofill, int length) { + return fill(String.valueOf(tofill), length); + } + + /** + * + *

              + * Executa o método fill(String, int) passando o parâmetro + * toFill como String.valueOf(toFill). + *

              + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + * + * @see Filler#fill(String, int) + */ + public String fill(int tofill, int length) { + return fill(String.valueOf(tofill), length); + } + + /** + * + *

              + * Executa o método fill(String, int) passando o parâmetro + * toFill como String.valueOf(toFill). + *

              + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + * + * @see Filler#fill(String, int) + */ + public String fill(short tofill, int length) { + return fill(String.valueOf(tofill), length); + } + + /** + * + *

              + * Executa o método fill(String, int) passando o parâmetro + * toFill como String.valueOf(toFill). + *

              + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + * + * @see Filler#fill(String, int) + */ + public String fill(byte tofill, int length) { + return fill(String.valueOf(tofill), length); + } + + /** + * + *

              + * Executa o método fill(String, int) passando o parâmetro + * toFill como String.valueOf(toFill). + *

              + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + * + * @see Filler#fill(String, int) + */ + public String fill(char tofill, int length) { + return fill(String.valueOf(tofill), length); + } + + /** + * + *

              + * Executa o método fill(String, int) passando o parâmetro + * toFill como String.valueOf(toFill). + *

              + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + * + * @see Filler#fill(String, int) + */ + public String fill(double tofill, int length) { + return fill(String.valueOf(tofill), length); + } + + /** + * + *

              + * Executa o método fill(String, int) passando o parâmetro + * toFill como String.valueOf(toFill). + *

              + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + * + * @see Filler#fill(String, int) + */ + public String fill(float tofill, int length) { + return fill(String.valueOf(tofill), length); + } + + /** + * + *

              + * Executa o método fill(String, int) passando o parâmetro + * toFill como toFill.toString(). + *
              + *

              + *

              + * Caso toFill seja null, o método + * fill(String, int) receberá uma String nula como parâmetro. + *

              + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + * + * @see Filler#fill(String, int) + */ + public String fill(Object tofill, int length) { + + String toFillTemp = null; + + if (isNotNull(tofill)) { + toFillTemp = tofill.toString(); + } + + return fill(toFillTemp, length); + } + + /** + * + *

              + * Executa o método fill(String, int) passando o parâmetro + * toFill como toFill.write(). + *
              + *

              + *

              + * Caso toFill seja null, o método + * fill(String, int) receberá uma String nula como parâmetro. + *

              + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + * + * @see Filler#fill(String, int) + */ + public String fill(TextStream tofill, int length) { + + String toFillTemp = null; + + if (isNotNull(tofill)) { + toFillTemp = tofill.write(); + } + + return fill(toFillTemp, length); + } + + /** + * Preenche a String a direita com valor do atributo "fillWith" + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + */ + private String fillRight(String toFill, int length) { + + return StringUtils.rightPad(toFill, length, padding.toString()); + } + + /** + * Preenche a String a direita com valor do atributo "fillWith" + * + * @param toFill Valor a ser preenchido + * @param length tamanho máximo que o valor deve ter depois de preenchido + * @return Nova String preenchida de acordo com o preenchedor do objeto até + * o tamanho especificado + */ + private String fillLeft(String toFill, int length) { + + return StringUtils.leftPad(toFill, length, padding.toString()); + } + + @Override + public String toString() { + return format( + "Filler [padding=\"%s\", sideToFill=%s]", + Objects.whenNull(this.padding, EMPTY), + Objects.whenNull(this.sideToFill, EMPTY)); + } + +} diff --git a/src/main/java/org/jrimum/texgit/IFiller.java b/src/main/java/org/jrimum/texgit/IFiller.java index 44106907..8b03118b 100644 --- a/src/main/java/org/jrimum/texgit/IFiller.java +++ b/src/main/java/org/jrimum/texgit/IFiller.java @@ -11,7 +11,7 @@ public interface IFiller extends Serializable{ * *

              * Exemplo: - *
              + *
              * Se sideToFill == SideToFill.LEFT, o caracter especificado será adicionado à String * no lado esquerdo até que o campo fique com o tamanho que foi definido. *

              diff --git a/src/main/java/org/jrimum/texgit/IFixed.java b/src/main/java/org/jrimum/texgit/IFixed.java index bcd18dd1..4bed8cf0 100644 --- a/src/main/java/org/jrimum/texgit/IFixed.java +++ b/src/main/java/org/jrimum/texgit/IFixed.java @@ -1,52 +1,52 @@ -/* - * 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: 26/07/2008 - 12:44:41 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 26/07/2008 - 12:44:41 - * - */ -package org.jrimum.texgit; - -/** - * @author Gilmar P.S.L. - * - */ -public interface IFixed { - - /** - * Informa a validade para a fixação de uma ou mais medidas. Exemplo:
              - * - *
              -	 * {
              -	 * 	isLenghtAsDefine();
              -	 * 	isSizeAsDefine();
              -	 * }
              -	 * 
              - * - * @return Indicativo se está de acordo com o definido - * - * @throws IllegalStateException - */ - public abstract boolean isFixedAsDefined() throws IllegalStateException; -} +/* + * 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: 26/07/2008 - 12:44:41 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 26/07/2008 - 12:44:41 + * + */ +package org.jrimum.texgit; + +/** + * @author Gilmar P.S.L. + * + */ +public interface IFixed { + + /** + * Informa a validade para a fixação de uma ou mais medidas. Exemplo: + * + *
              +	 * {
              +	 * 	isLenghtAsDefine();
              +	 * 	isSizeAsDefine();
              +	 * }
              +	 * 
              + * + * @return Indicativo se está de acordo com o definido + * + * @throws IllegalStateException + */ + public abstract boolean isFixedAsDefined() throws IllegalStateException; +} diff --git a/src/main/java/org/jrimum/utilix/BancoUtil.java b/src/main/java/org/jrimum/utilix/BancoUtil.java index 0377b518..b8a06c1c 100644 --- a/src/main/java/org/jrimum/utilix/BancoUtil.java +++ b/src/main/java/org/jrimum/utilix/BancoUtil.java @@ -1,150 +1,150 @@ -/* - * 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 Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:17:40 - * - */ - -package org.jrimum.utilix; - -import static org.jrimum.utilix.ObjectUtil.isNull; - -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; - -import org.apache.commons.lang3.time.DateUtils; - -import org.jrimum.JRimumException; - -/** - *

              - * Esta classe tem a responsabilidade de prover serviços utilitários - * do universo bancário, como por exemplo calcular o fator de vencimento. - *

              - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento Mercantil - * - * @since 0.2 - * - * @version 0.2 - */ -public class BancoUtil { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - *

              - * Data base para o cálculo do fator de vencimento fixada em 07.10.1997 - * (03.07.2000 retrocedidos 1000 dias do início do processo) segundo a FEBRABAN. - *

              - */ - private static final Date DATA_BASE_DO_FATOR_DE_VENCIMENTO = new GregorianCalendar(1997, Calendar.OCTOBER, 7).getTime(); - - private static final Date DATA_LIMITE_DO_FATOR_DE_VENCIMENTO = new GregorianCalendar(2025, Calendar.FEBRUARY, 21).getTime(); - - /** - * - *

              - * Calcula o fator de vencimento, com base na subtração entre a - * DATA DE VENCIMENTO do título e a DATA BASE , fixada em - * 07.10.1997 (03.07.2000 retrocedidos 1000 dias do início do processo). - * Trata-se de um referencial numérico de 4 dígitos, situado nas - * quatro primeiras posições do campo “valor”, que representa a - * quantidade de dias decorridos da data base à data de vencimento - * do título. - *

              - *

              - * Os bloquetos de cobrança emitidos a partir de 1º de setembro - * de 2000 (primeiro dia útil = 03/07/2000 - SEGUNDA) OBRIGATORIAMENTE - * devem conter essas características, para que quando - * forem capturados pela rede bancária, os sistemas possam realizar - * operação inversa, ou seja, adicionar à data base o fator de - * vencimento capturado, obtendo, dessa forma, a data do - * vencimento do bloqueto.
              - * - * Exemplos: 03/07/2000(Fator = 1000), 05/07/2000(Fator = 1002), - * 01/05/2002 (Fator = 1667), 05/07/2000(Fator = 1002) - * e 21/02/2025(Fator = 9999). - *

              - * - *

              - * Observações: - *

                - *
              • - * A data base para o cálculo do fator de vencimento é - * 07/10/1997 (Fator de vencimento = 0).Caso a data de - * vencimento seja anterior a data base, uma exceção do tipo - * IllegalArgumentException será lançada. - *
              • - *
              • - * A data limite para o cálculo do fator de vencimento é - * 21/02/2025 (Fator de vencimento = 9999) Caso a data de - * vencimento seja posterior a data limite, uma exceção do tipo - * IllegalArgumentException será lançada. - *
              • - *
              - *

              - * - * @param dataVencimento - data de vencimento. - * @return fator de vencimento. - * - * @throws JRimumException Caso alguma condição de entrada não seja respeitada. - */ - public static int calculceFatorDeVencimento(Date dataVencimento) throws JRimumException { - - Date dataVencTruncada = null; - int fator; - - - if (isNull(dataVencimento)) { - throw new JRimumException(new IllegalArgumentException("Impossível realizar o cálculo 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 JRimumException(new IllegalArgumentException("Para o cálculo do fator de" + - " vencimento se faz necessário 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; - } -} +/* + * 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 Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:17:40 + * + */ + +package org.jrimum.utilix; + +import static org.jrimum.utilix.ObjectUtil.isNull; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.apache.commons.lang3.time.DateUtils; + +import org.jrimum.JRimumException; + +/** + *

              + * Esta classe tem a responsabilidade de prover serviços utilitários + * do universo bancário, como por exemplo calcular o fator de vencimento. + *

              + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class BancoUtil { + + /** + * + */ + private static final long serialVersionUID = 1L; + + /** + *

              + * Data base para o cálculo do fator de vencimento fixada em 07.10.1997 + * (03.07.2000 retrocedidos 1000 dias do início do processo) segundo a FEBRABAN. + *

              + */ + private static final Date DATA_BASE_DO_FATOR_DE_VENCIMENTO = new GregorianCalendar(1997, Calendar.OCTOBER, 7).getTime(); + + private static final Date DATA_LIMITE_DO_FATOR_DE_VENCIMENTO = new GregorianCalendar(2025, Calendar.FEBRUARY, 21).getTime(); + + /** + * + *

              + * Calcula o fator de vencimento, com base na subtração entre a + * DATA DE VENCIMENTO do título e a DATA BASE , fixada em + * 07.10.1997 (03.07.2000 retrocedidos 1000 dias do início do processo). + * Trata-se de um referencial numérico de 4 dígitos, situado nas + * quatro primeiras posições do campo “valor”, que representa a + * quantidade de dias decorridos da data base à data de vencimento + * do título. + *

              + *

              + * Os bloquetos de cobrança emitidos a partir de 1º de setembro + * de 2000 (primeiro dia útil = 03/07/2000 - SEGUNDA) OBRIGATORIAMENTE + * devem conter essas características, para que quando + * forem capturados pela rede bancária, os sistemas possam realizar + * operação inversa, ou seja, adicionar à data base o fator de + * vencimento capturado, obtendo, dessa forma, a data do + * vencimento do bloqueto.
              + * + * Exemplos: 03/07/2000(Fator = 1000), 05/07/2000(Fator = 1002), + * 01/05/2002 (Fator = 1667), 05/07/2000(Fator = 1002) + * e 21/02/2025(Fator = 9999). + *

              + * + *

              + * Observações: + *

                + *
              • + * A data base para o cálculo do fator de vencimento é + * 07/10/1997 (Fator de vencimento = 0).Caso a data de + * vencimento seja anterior a data base, uma exceção do tipo + * IllegalArgumentException será lançada. + *
              • + *
              • + * A data limite para o cálculo do fator de vencimento é + * 21/02/2025 (Fator de vencimento = 9999) Caso a data de + * vencimento seja posterior a data limite, uma exceção do tipo + * IllegalArgumentException será lançada. + *
              • + *
              + *

              + * + * @param dataVencimento - data de vencimento. + * @return fator de vencimento. + * + * @throws JRimumException Caso alguma condição de entrada não seja respeitada. + */ + public static int calculceFatorDeVencimento(Date dataVencimento) throws JRimumException { + + Date dataVencTruncada = null; + int fator; + + + if (isNull(dataVencimento)) { + throw new JRimumException(new IllegalArgumentException("Impossível realizar o cálculo 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 JRimumException(new IllegalArgumentException("Para o cálculo do fator de" + + " vencimento se faz necessário 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; + } +} diff --git a/src/main/java/org/jrimum/utilix/DateFormat.java b/src/main/java/org/jrimum/utilix/DateFormat.java index f763c737..f1dc1276 100644 --- a/src/main/java/org/jrimum/utilix/DateFormat.java +++ b/src/main/java/org/jrimum/utilix/DateFormat.java @@ -1,247 +1,247 @@ -/* - * Copyright 2010 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: 01/08/2010 - 17:31:00 - * - * ================================================================================ - * - * Direitos autorais 2010 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 01/08/2010 - 17:31:00 - * - */ - -package org.jrimum.utilix; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; - -import org.jrimum.utilix.Exceptions; - -/** - *

              - * Formatadores de data thread-safe. Para uma mesma categoria, os formatadores - * atualmente são diferenciados pelos seus separadores ("formato_separador") - * exemplos: - *

                - *
              • DDMMYY default:ddMMyy
              • - *
              • DDMMYY_B barr:dd/MM/yy
              • - *
              • DDMMYY_H hyphen:dd-MM-yy
              • - *
              • DDMMYY_U underline:dd_MM_yy
              • - *
              • HHMMSS_C colon:"hh:mm:ss"
              • - *
              • etc.
              • - *
              - *

              - * - * @author Gilmar P.S.L. - * - * @since 0.2 - * - * @version 0.2 - */ -public enum DateFormat implements Format{ - - /** - *

              - * Formatador de datas no padrão "ddMMyy". - *

              - */ - DDMMYY("ddMMyy"), - - /** - *

              - * Formatador de datas no padrão "dd/MM/yy". - *

              - */ - DDMMYY_B("dd/MM/yy"), - - /** - *

              - * Formatador de datas no padrão "dd-MM-yy". - *

              - */ - DDMMYY_H("dd-MM-yy"), - - /** - *

              - * Formatador de datas no padrão "dd_MM_yy". - *

              - */ - DDMMYY_U("dd_MM_yy"), - - /** - *

              - * Formatador de datas no padrão "ddMMyyyy". - *

              - */ - DDMMYYYY("ddMMyyyy"), - - /** - *

              - * Formatador de datas no padrão "dd/MM/yyyy". - *

              - */ - DDMMYYYY_B("dd/MM/yyyy"), - - /** - *

              - * Formatador de datas no padrão "dd-MM-yyyy". - *

              - */ - DDMMYYYY_H("dd-MM-yyyy"), - - /** - *

              - * Formatador de datas no padrão "dd_MM_yyyy". - *

              - */ - DDMMYYYY_U("dd_MM_yyyy"), - - /** - *

              - * Formatador de datas no padrão "yyMMdd". - *

              - */ - YYMMDD("yyMMdd"), - - /** - *

              - * Formatador de datas no padrão "yy/MM/dd". - *

              - */ - YYMMDD_B("yy/MM/dd"), - - /** - *

              - * Formatador de datas no padrão "yy/MM/dd". - *

              - */ - YYMMDD_H("yy-MM-dd"), - - /** - *

              - * Formatador de datas no padrão "yy_MM_dd". - *

              - */ - YYMMDD_U("yy_MM_dd"), - - /** - *

              - * Formatador de datas no padrão "yyyyMMdd". - *

              - */ - YYYYMMDD("yyyyMMdd"), - - /** - *

              - * Formatador de datas no padrão "yyyy/MM/dd". - *

              - */ - YYYYMMDD_B("yyyy/MM/dd"), - - /** - *

              - * Formatador de datas no padrão "yyyy-MM-dd". - *

              - */ - YYYYMMDD_H("yyyy-MM-dd"), - - /** - *

              - * Formatador de datas no padrão "yyyy_MM_dd". - *

              - */ - YYYYMMDD_U("yyyy_MM_dd"), - - /** - *

              - * Formatador de datas no padrão "hhmmss". - *

              - */ - HHMMSS("hhmmss"), - - /** - *

              - * Formatador de datas no padrão "HHmmss". - *

              - */ - HHMMSS_24("HHmmss"), - - /** - *

              - * Formatador de datas no padrão "hh:mm:ss". - *

              - */ - HHMMSS_C("hh:mm:ss"), - - /** - *

              - * Formatador de datas no padrão "HH:mm:ss". - *

              - */ - HHMMSS_24C("HH:mm:ss"), - ; - - private final ThreadLocalFormat DATE_FORMAT; - - private DateFormat(String format) { - - DATE_FORMAT = new ThreadLocalFormat(format){ - - @Override - protected SimpleDateFormat initialValue() { - - return new SimpleDateFormat(format); - } - - }; - } - - /** - * @see org.jrimum.utilix.text.Format#format(java.lang.Object) - */ - public String format(Date obj) { - - return DATE_FORMAT.get().format(obj); - } - - /** - * @see org.jrimum.utilix.text.Format#parse(java.lang.String) - */ - public Date parse(String text) { - - try { - - return DATE_FORMAT.get().parse(text); - - } catch (ParseException e) { - - return Exceptions.throwIllegalArgumentException("DateFormat Exception!", e); - } - } - - /** - * @see org.jrimum.utilix.text.Format#copy() - */ - public SimpleDateFormat copy(){ - - return (SimpleDateFormat) DATE_FORMAT.get().clone(); - } -} +/* + * Copyright 2010 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: 01/08/2010 - 17:31:00 + * + * ================================================================================ + * + * Direitos autorais 2010 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 01/08/2010 - 17:31:00 + * + */ + +package org.jrimum.utilix; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.jrimum.utilix.Exceptions; + +/** + *

              + * Formatadores de data thread-safe. Para uma mesma categoria, os formatadores + * atualmente são diferenciados pelos seus separadores ("formato_separador") + * exemplos: + *

                + *
              • DDMMYY default:ddMMyy
              • + *
              • DDMMYY_B barr:dd/MM/yy
              • + *
              • DDMMYY_H hyphen:dd-MM-yy
              • + *
              • DDMMYY_U underline:dd_MM_yy
              • + *
              • HHMMSS_C colon:"hh:mm:ss"
              • + *
              • etc.
              • + *
              + *

              + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public enum DateFormat implements Format{ + + /** + *

              + * Formatador de datas no padrão "ddMMyy". + *

              + */ + DDMMYY("ddMMyy"), + + /** + *

              + * Formatador de datas no padrão "dd/MM/yy". + *

              + */ + DDMMYY_B("dd/MM/yy"), + + /** + *

              + * Formatador de datas no padrão "dd-MM-yy". + *

              + */ + DDMMYY_H("dd-MM-yy"), + + /** + *

              + * Formatador de datas no padrão "dd_MM_yy". + *

              + */ + DDMMYY_U("dd_MM_yy"), + + /** + *

              + * Formatador de datas no padrão "ddMMyyyy". + *

              + */ + DDMMYYYY("ddMMyyyy"), + + /** + *

              + * Formatador de datas no padrão "dd/MM/yyyy". + *

              + */ + DDMMYYYY_B("dd/MM/yyyy"), + + /** + *

              + * Formatador de datas no padrão "dd-MM-yyyy". + *

              + */ + DDMMYYYY_H("dd-MM-yyyy"), + + /** + *

              + * Formatador de datas no padrão "dd_MM_yyyy". + *

              + */ + DDMMYYYY_U("dd_MM_yyyy"), + + /** + *

              + * Formatador de datas no padrão "yyMMdd". + *

              + */ + YYMMDD("yyMMdd"), + + /** + *

              + * Formatador de datas no padrão "yy/MM/dd". + *

              + */ + YYMMDD_B("yy/MM/dd"), + + /** + *

              + * Formatador de datas no padrão "yy/MM/dd". + *

              + */ + YYMMDD_H("yy-MM-dd"), + + /** + *

              + * Formatador de datas no padrão "yy_MM_dd". + *

              + */ + YYMMDD_U("yy_MM_dd"), + + /** + *

              + * Formatador de datas no padrão "yyyyMMdd". + *

              + */ + YYYYMMDD("yyyyMMdd"), + + /** + *

              + * Formatador de datas no padrão "yyyy/MM/dd". + *

              + */ + YYYYMMDD_B("yyyy/MM/dd"), + + /** + *

              + * Formatador de datas no padrão "yyyy-MM-dd". + *

              + */ + YYYYMMDD_H("yyyy-MM-dd"), + + /** + *

              + * Formatador de datas no padrão "yyyy_MM_dd". + *

              + */ + YYYYMMDD_U("yyyy_MM_dd"), + + /** + *

              + * Formatador de datas no padrão "hhmmss". + *

              + */ + HHMMSS("hhmmss"), + + /** + *

              + * Formatador de datas no padrão "HHmmss". + *

              + */ + HHMMSS_24("HHmmss"), + + /** + *

              + * Formatador de datas no padrão "hh:mm:ss". + *

              + */ + HHMMSS_C("hh:mm:ss"), + + /** + *

              + * Formatador de datas no padrão "HH:mm:ss". + *

              + */ + HHMMSS_24C("HH:mm:ss"), + ; + + private final ThreadLocalFormat DATE_FORMAT; + + private DateFormat(String format) { + + DATE_FORMAT = new ThreadLocalFormat(format){ + + @Override + protected SimpleDateFormat initialValue() { + + return new SimpleDateFormat(format); + } + + }; + } + + /** + * @see org.jrimum.utilix.text.Format#format(java.lang.Object) + */ + public String format(Date obj) { + + return DATE_FORMAT.get().format(obj); + } + + /** + * @see org.jrimum.utilix.text.Format#parse(java.lang.String) + */ + public Date parse(String text) { + + try { + + return DATE_FORMAT.get().parse(text); + + } catch (ParseException e) { + + return Exceptions.throwIllegalArgumentException("DateFormat Exception!", e); + } + } + + /** + * @see org.jrimum.utilix.text.Format#copy() + */ + public SimpleDateFormat copy(){ + + return (SimpleDateFormat) DATE_FORMAT.get().clone(); + } +} diff --git a/src/main/java/org/jrimum/utilix/DateUtil.java b/src/main/java/org/jrimum/utilix/DateUtil.java index 79e76eee..7dd5cae2 100644 --- a/src/main/java/org/jrimum/utilix/DateUtil.java +++ b/src/main/java/org/jrimum/utilix/DateUtil.java @@ -1,228 +1,228 @@ -/* - * 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 Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:17:40 - * - */ - -package org.jrimum.utilix; - -import static org.jrimum.utilix.ObjectUtil.isNotNull; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - -import org.apache.commons.lang3.time.DateUtils; - - -/** - * - * Esta classe tem a responsabilidade de prover serviços utilitários - * relacionados a manipulação de Objetos Date, Calendar, GregorianCalendar. - * - * - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento Mercantil - * - * @since 0.2 - * - * @version 0.2 - */ -public class DateUtil { - - /** - * - */ - private static final long serialVersionUID = 4339951860440604914L; - - /** - * Formatador de datas no padrão dd/MM/yyyy. - */ - public static final DateFormat FORMAT_DD_MM_YYYY = new SimpleDateFormat("dd/MM/yyyy"); - - /** - * Formatador de datas no padrão ddMMyy. - */ - public static final DateFormat FORMAT_DDMMYY = new SimpleDateFormat("ddMMyy"); - - /** - * Formatador de datas no padrão yyMMdd. - */ - public static final DateFormat FORMAT_YYMMDD = new SimpleDateFormat("yyMMdd"); - - /** - * Representa uma data inexistente. Usada em casos que não se pode usar - * null. - *
              - * É obtida da seguinte forma: new GregorianCalendar(1, 0, 1).getTime() - */ - public static final Date DATE_NULL; - - static { - - Calendar calendar = Calendar.getInstance(); - calendar.set(1, 0, 1); - calendar.setLenient(false); - DATE_NULL = DateUtils.truncate(calendar.getTime(), Calendar.YEAR); - } - - /** - *

              - * Converte um objeto String em um objeto java.util.Date - * no formato de data padrão brasileiro: dd/MM/yyyy. - *

              - *

              - * Utiliza a sobrecarca parse(String dateAsString, DateFormat dateFormat) para - * realizar a conversão. - *

              - * - * @param dateAsString - um valor de data em forma de String. - * @return Objeto java.util.Date convertido a partir do objeto String - * - * @throws IllegalArgumentException caso o objeto String não seja um valor válido - * de data suportado pelo formato. - */ - public static Date parse(String dateAsString) { - - return parse(dateAsString, FORMAT_DD_MM_YYYY); - } - - /** - *

              - * Converte um objeto String em um objeto java.util.Date - * a partir do formato de data especificado. - *

              - *

              - * Utiliza a sobrecarca parse(String dateAsString, DateFormat dateFormat) para - * realizar a conversão. - *

              - * - * @param dateAsString - um valor de data em forma de String. - * @param dateFormat - formato de data - * @return Objeto java.util.Date convertido a partir do objeto String - * - * @throws IllegalArgumentException caso o objeto String não seja um valor válido - * de data suportado pelo formato. - */ - public static Date parse(String dateAsString, String dateFormat) { - - if (dateFormat == null) { - throw new NullPointerException("O formato da data não pode ter valor [null]."); - } - - return parse(dateAsString, new SimpleDateFormat(dateFormat)); - } - - /** - * Converte um objeto String em um objeto java.util.Date - * através do objeto java.text.DateFormat especificado. - * - * @param dateAsString - um valor de data em forma de String. - * @param dateFormat - formatador para objetos java.util.Date. - * @return Objeto java.util.Date convertido a partir do objeto String - * - * @throws IllegalArgumentException caso o objeto String não seja um valor válido - * de data suportado pelo formatador. - */ - public static Date parse(String dateAsString, DateFormat dateFormat) { - - Date date = null; - - if (dateAsString == null) { - throw new NullPointerException("A String a ser convertida não pode ter valor [null]."); - } - - if (dateFormat == null) { - throw new NullPointerException("O formatador não pode ter valor [null]."); - } - - try { - - date = dateFormat.parse(dateAsString); - - } catch (ParseException e) { - - String msg = "A String [" + dateAsString + "] deve ser uma data válida no formato"; - if (dateFormat instanceof SimpleDateFormat) { - SimpleDateFormat sdf = (SimpleDateFormat) dateFormat; - msg += " [" + sdf.toPattern() + "]."; - - } else { - msg += " especificado."; - } - - IllegalArgumentException iae = new IllegalArgumentException(msg); - iae.initCause(e); - throw iae; - } - - return date; - } - - /** - *

              - * Calcula a diferença de dias entre duas datas. O resultado é modular, - * ou seja, maior ou igual a zero, logo a data final não precisa ser - * necessariamente maior que a data inicial. - *

              - * - * @param dataInicial - data inicial do intervalo. - * @param dataFinal - data final do intervalo. - * @return número(módulo) de dias entre as datas. - * - * @throws IllegalArgumentException Caso pelo menos uma das duas datas seja null. - */ - public static long calculeDiferencaEmDias(final Date dataInicial, final Date dataFinal) { - - long fator = 0; - Date dataInicialTruncada, dataFinalTruncada; - - - if (isNotNull(dataInicial) && isNotNull(dataFinal)) { - - dataInicialTruncada = DateUtils.truncate(dataInicial, Calendar.DATE); - dataFinalTruncada = DateUtils.truncate(dataFinal, Calendar.DATE); - - fator = ((dataFinalTruncada.getTime() - dataInicialTruncada.getTime()) / DateUtils.MILLIS_PER_DAY); - - if (fator < 0) { - fator *= -1; - } - } - else { - throw new IllegalArgumentException("A data inicial [" + dataInicial + "] e a data final [" + dataFinal + "] " + - "não podem ter valor 'null'."); - } - - return fator; - } - -} +/* + * 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 Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:17:40 + * + */ + +package org.jrimum.utilix; + +import static org.jrimum.utilix.ObjectUtil.isNotNull; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import org.apache.commons.lang3.time.DateUtils; + + +/** + * + * Esta classe tem a responsabilidade de prover serviços utilitários + * relacionados a manipulação de Objetos Date, Calendar, GregorianCalendar. + * + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class DateUtil { + + /** + * + */ + private static final long serialVersionUID = 4339951860440604914L; + + /** + * Formatador de datas no padrão dd/MM/yyyy. + */ + public static final DateFormat FORMAT_DD_MM_YYYY = new SimpleDateFormat("dd/MM/yyyy"); + + /** + * Formatador de datas no padrão ddMMyy. + */ + public static final DateFormat FORMAT_DDMMYY = new SimpleDateFormat("ddMMyy"); + + /** + * Formatador de datas no padrão yyMMdd. + */ + public static final DateFormat FORMAT_YYMMDD = new SimpleDateFormat("yyMMdd"); + + /** + * Representa uma data inexistente. Usada em casos que não se pode usar + * null. + *
              + * É obtida da seguinte forma: new GregorianCalendar(1, 0, 1).getTime() + */ + public static final Date DATE_NULL; + + static { + + Calendar calendar = Calendar.getInstance(); + calendar.set(1, 0, 1); + calendar.setLenient(false); + DATE_NULL = DateUtils.truncate(calendar.getTime(), Calendar.YEAR); + } + + /** + *

              + * Converte um objeto String em um objeto java.util.Date + * no formato de data padrão brasileiro: dd/MM/yyyy. + *

              + *

              + * Utiliza a sobrecarca parse(String dateAsString, DateFormat dateFormat) para + * realizar a conversão. + *

              + * + * @param dateAsString - um valor de data em forma de String. + * @return Objeto java.util.Date convertido a partir do objeto String + * + * @throws IllegalArgumentException caso o objeto String não seja um valor válido + * de data suportado pelo formato. + */ + public static Date parse(String dateAsString) { + + return parse(dateAsString, FORMAT_DD_MM_YYYY); + } + + /** + *

              + * Converte um objeto String em um objeto java.util.Date + * a partir do formato de data especificado. + *

              + *

              + * Utiliza a sobrecarca parse(String dateAsString, DateFormat dateFormat) para + * realizar a conversão. + *

              + * + * @param dateAsString - um valor de data em forma de String. + * @param dateFormat - formato de data + * @return Objeto java.util.Date convertido a partir do objeto String + * + * @throws IllegalArgumentException caso o objeto String não seja um valor válido + * de data suportado pelo formato. + */ + public static Date parse(String dateAsString, String dateFormat) { + + if (dateFormat == null) { + throw new NullPointerException("O formato da data não pode ter valor [null]."); + } + + return parse(dateAsString, new SimpleDateFormat(dateFormat)); + } + + /** + * Converte um objeto String em um objeto java.util.Date + * através do objeto java.text.DateFormat especificado. + * + * @param dateAsString - um valor de data em forma de String. + * @param dateFormat - formatador para objetos java.util.Date. + * @return Objeto java.util.Date convertido a partir do objeto String + * + * @throws IllegalArgumentException caso o objeto String não seja um valor válido + * de data suportado pelo formatador. + */ + public static Date parse(String dateAsString, DateFormat dateFormat) { + + Date date = null; + + if (dateAsString == null) { + throw new NullPointerException("A String a ser convertida não pode ter valor [null]."); + } + + if (dateFormat == null) { + throw new NullPointerException("O formatador não pode ter valor [null]."); + } + + try { + + date = dateFormat.parse(dateAsString); + + } catch (ParseException e) { + + String msg = "A String [" + dateAsString + "] deve ser uma data válida no formato"; + if (dateFormat instanceof SimpleDateFormat) { + SimpleDateFormat sdf = (SimpleDateFormat) dateFormat; + msg += " [" + sdf.toPattern() + "]."; + + } else { + msg += " especificado."; + } + + IllegalArgumentException iae = new IllegalArgumentException(msg); + iae.initCause(e); + throw iae; + } + + return date; + } + + /** + *

              + * Calcula a diferença de dias entre duas datas. O resultado é modular, + * ou seja, maior ou igual a zero, logo a data final não precisa ser + * necessariamente maior que a data inicial. + *

              + * + * @param dataInicial - data inicial do intervalo. + * @param dataFinal - data final do intervalo. + * @return número(módulo) de dias entre as datas. + * + * @throws IllegalArgumentException Caso pelo menos uma das duas datas seja null. + */ + public static long calculeDiferencaEmDias(final Date dataInicial, final Date dataFinal) { + + long fator = 0; + Date dataInicialTruncada, dataFinalTruncada; + + + if (isNotNull(dataInicial) && isNotNull(dataFinal)) { + + dataInicialTruncada = DateUtils.truncate(dataInicial, Calendar.DATE); + dataFinalTruncada = DateUtils.truncate(dataFinal, Calendar.DATE); + + fator = ((dataFinalTruncada.getTime() - dataInicialTruncada.getTime()) / DateUtils.MILLIS_PER_DAY); + + if (fator < 0) { + fator *= -1; + } + } + else { + throw new IllegalArgumentException("A data inicial [" + dataInicial + "] e a data final [" + dataFinal + "] " + + "não podem ter valor 'null'."); + } + + return fator; + } + +} diff --git a/src/main/java/org/jrimum/utilix/Dates.java b/src/main/java/org/jrimum/utilix/Dates.java index cba2784b..fc2cbb9c 100644 --- a/src/main/java/org/jrimum/utilix/Dates.java +++ b/src/main/java/org/jrimum/utilix/Dates.java @@ -1,281 +1,281 @@ -/* - * 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 Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:17:40 - * - */ -package org.jrimum.utilix; - -import static org.jrimum.utilix.Objects.isNotNull; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - -import org.apache.commons.lang3.time.DateUtils; - -/** - *

              - * Serviços utilitários relacionados a manipulação de Objetos - * Date, Calendar, GregorianCalendar. - *

              - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento - * Mercantil - * - * @since 0.2 - * - * @version 0.2 - */ -public final class Dates { - - /** - *

              - * Representa uma data inexistente, pode ser usada em casos que não se pode - * usar null [ é obtida da seguinte forma: - * Calendar.set(1, 0, 1) ] - *

              - */ - private static final Date DATE_NULL; - - static { - - Calendar calendar = Calendar.getInstance(); - calendar.set(1, 0, 1); - calendar.setLenient(false); - DATE_NULL = DateUtils.truncate(calendar.getTime(), Calendar.YEAR); - } - - /** - * Utility class pattern: classe não instanciável - * - * @throws IllegalStateException Caso haja alguma tentativa de utilização - * deste construtor. - */ - public static final DateFormat FORMAT_YYMMDD = new SimpleDateFormat( - "yyMMdd"); - - /** - *

              - * Formatador de datas no padrão yyyyMMdd. - *

              - */ - public static final DateFormat FORMAT_YYYYMMDD = new SimpleDateFormat( - "yyyyMMdd"); - - private Dates() { - - Exceptions.throwIllegalStateException("Instanciação não permitida!"); - } - - /** - *

              - * Retorna uma data inexistente, pode ser usada em casos que não se pode - * usar null [ é obtida da seguinte forma: - * Calendar.set(1, 0, 1) ] - *

              - * - * @return data invalida - 01/01/0001 - */ - public static Date invalidDate() { - - return (Date) DATE_NULL.clone(); - } - - /** - *

              - * Compara uma dada data qualquer com a data invalida 01/01/0001. - *

              - * - * @param date - Data qualquer - * - * @return igualdade - Se igual a data inválida - */ - public static boolean equalsInvalidDate(Date date) { - - if (date == null) { - - return false; - - } else { - - return (DATE_NULL.compareTo(date) == 0); - } - } - - /** - *

              - * Calcula a diferença de dias entre duas datas. O resultado é modular, ou - * seja, maior ou igual a zero, logo a data final não precisa ser - * necessariamente maior que a data inicial. - *

              - * - * @param dataInicial - data inicial do intervalo. - * @param dataFinal - data final do intervalo. - * @return número(módulo) de dias entre as datas. - * - * @throws IllegalArgumentException Caso pelo menos uma das duas datas seja - * null. - * @since 0.2 - */ - public static long calculeDiferencaEmDias(final Date dataInicial, final Date dataFinal) { - - long fator = 0; - - Date dataInicialTruncada, dataFinalTruncada; - - if (isNotNull(dataInicial) && isNotNull(dataFinal)) { - - dataInicialTruncada = DateUtils.truncate(dataInicial, Calendar.DATE); - dataFinalTruncada = DateUtils.truncate(dataFinal, Calendar.DATE); - - fator = ((dataFinalTruncada.getTime() - dataInicialTruncada.getTime()) / DateUtils.MILLIS_PER_DAY); - - if (fator < 0) { - fator *= -1; - } - - } else { - - Exceptions.throwIllegalArgumentException("A data inicial [" + dataInicial - + "] e a data final [" + dataFinal + "] " - + "não podem ter valor 'null'."); - } - - return fator; - } - - /** - *

              - * Converte um objeto String em um objeto - * java.util.Date a partir do formato de data especificado. - *

              - *

              - * Utiliza a sobrecarca - * parse(String dateAsString, String dateFormat) para realizar - * a conversão. - *

              - * - * @param dateAsString - um valor de data em forma de String. - * @param dateFormat - formato de data em forma de String. - * @return Objeto java.util.Date convertido a partir do objeto - * String - * - * @throws IllegalArgumentException caso o objeto String não - * seja um valor válido de data suportado pelo formato. - * @since 0.2 - */ - public static Date parse(String dateAsString, String dateFormat) { - - if (dateFormat == null) { - throw new NullPointerException("O formato da data não pode ter valor [null]."); - } - - return parse(dateAsString, new SimpleDateFormat(dateFormat)); - } - - /** - *

              - * Converte um objeto String em um objeto - * java.util.Date através do objeto - * java.text.DateFormat especificado. - *

              - * - * @param dateAsString - um valor de data em forma de String. - * @param dateFormat - formatador para objetos java.util.Date. - * @return Objeto java.util.Date convertido a partir do objeto - * String - * - * @throws IllegalArgumentException caso o objeto String não - * seja um valor válido de data suportado pelo formatador. - * @since 0.2 - */ - public static Date parse(String dateAsString, DateFormat dateFormat) { - - Date date = null; - - if (dateAsString == null) { - throw new NullPointerException("A String a ser convertida não pode ter valor [null]."); - } - - if (dateFormat == null) { - throw new NullPointerException("O formatador não pode ter valor [null]."); - } - - try { - - date = dateFormat.parse(dateAsString); - - } catch (ParseException e) { - - String msg = "A String [" + dateAsString - + "] deve ser uma data válida no formato"; - if (dateFormat instanceof SimpleDateFormat) { - SimpleDateFormat sdf = (SimpleDateFormat) dateFormat; - msg += " [" + sdf.toPattern() + "]."; - - } else { - msg += " especificado."; - } - - IllegalArgumentException iae = new IllegalArgumentException(msg); - iae.initCause(e); - throw iae; - } - - return date; - } - - /** - *

              - * Retorna um objeto java.util.Date somente com a informação do - * dia, mes e ano. A informação sobre hora, minuto, segundo e millesegundos - * é zerada. Isto é altamente recomendado em rotinas nas quais datas são - * comparadas. - *

              - * - * @param date - um data em forma de java.util.Date. - * - * @return Objeto java.util.Date truncado a partir do objeto - * java.util.Date informado como parâmetro. - * - * @throws NullPointerException Caso o objeto java.util.Date - * esteja nulo - * @since 0.3 - */ - public static Date truncarData(Date date) { - if (date == null) { - throw new NullPointerException("O data não pode ser nula. Impossível realizar o truncamento da data."); - } - - return DateUtils.truncate(date, Calendar.DATE); - } - -} +/* + * 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 Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:17:40 + * + */ +package org.jrimum.utilix; + +import static org.jrimum.utilix.Objects.isNotNull; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import org.apache.commons.lang3.time.DateUtils; + +/** + *

              + * Serviços utilitários relacionados a manipulação de Objetos + * Date, Calendar, GregorianCalendar. + *

              + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public final class Dates { + + /** + *

              + * Representa uma data inexistente, pode ser usada em casos que não se pode + * usar null [ é obtida da seguinte forma: + * Calendar.set(1, 0, 1) ] + *

              + */ + private static final Date DATE_NULL; + + static { + + Calendar calendar = Calendar.getInstance(); + calendar.set(1, 0, 1); + calendar.setLenient(false); + DATE_NULL = DateUtils.truncate(calendar.getTime(), Calendar.YEAR); + } + + /** + * Utility class pattern: classe não instanciável + * + * @throws IllegalStateException Caso haja alguma tentativa de utilização + * deste construtor. + */ + public static final DateFormat FORMAT_YYMMDD = new SimpleDateFormat( + "yyMMdd"); + + /** + *

              + * Formatador de datas no padrão yyyyMMdd. + *

              + */ + public static final DateFormat FORMAT_YYYYMMDD = new SimpleDateFormat( + "yyyyMMdd"); + + private Dates() { + + Exceptions.throwIllegalStateException("Instanciação não permitida!"); + } + + /** + *

              + * Retorna uma data inexistente, pode ser usada em casos que não se pode + * usar null [ é obtida da seguinte forma: + * Calendar.set(1, 0, 1) ] + *

              + * + * @return data invalida - 01/01/0001 + */ + public static Date invalidDate() { + + return (Date) DATE_NULL.clone(); + } + + /** + *

              + * Compara uma dada data qualquer com a data invalida 01/01/0001. + *

              + * + * @param date - Data qualquer + * + * @return igualdade - Se igual a data inválida + */ + public static boolean equalsInvalidDate(Date date) { + + if (date == null) { + + return false; + + } else { + + return (DATE_NULL.compareTo(date) == 0); + } + } + + /** + *

              + * Calcula a diferença de dias entre duas datas. O resultado é modular, ou + * seja, maior ou igual a zero, logo a data final não precisa ser + * necessariamente maior que a data inicial. + *

              + * + * @param dataInicial - data inicial do intervalo. + * @param dataFinal - data final do intervalo. + * @return número(módulo) de dias entre as datas. + * + * @throws IllegalArgumentException Caso pelo menos uma das duas datas seja + * null. + * @since 0.2 + */ + public static long calculeDiferencaEmDias(final Date dataInicial, final Date dataFinal) { + + long fator = 0; + + Date dataInicialTruncada, dataFinalTruncada; + + if (isNotNull(dataInicial) && isNotNull(dataFinal)) { + + dataInicialTruncada = DateUtils.truncate(dataInicial, Calendar.DATE); + dataFinalTruncada = DateUtils.truncate(dataFinal, Calendar.DATE); + + fator = ((dataFinalTruncada.getTime() - dataInicialTruncada.getTime()) / DateUtils.MILLIS_PER_DAY); + + if (fator < 0) { + fator *= -1; + } + + } else { + + Exceptions.throwIllegalArgumentException("A data inicial [" + dataInicial + + "] e a data final [" + dataFinal + "] " + + "não podem ter valor 'null'."); + } + + return fator; + } + + /** + *

              + * Converte um objeto String em um objeto + * java.util.Date a partir do formato de data especificado. + *

              + *

              + * Utiliza a sobrecarca + * parse(String dateAsString, String dateFormat) para realizar + * a conversão. + *

              + * + * @param dateAsString - um valor de data em forma de String. + * @param dateFormat - formato de data em forma de String. + * @return Objeto java.util.Date convertido a partir do objeto + * String + * + * @throws IllegalArgumentException caso o objeto String não + * seja um valor válido de data suportado pelo formato. + * @since 0.2 + */ + public static Date parse(String dateAsString, String dateFormat) { + + if (dateFormat == null) { + throw new NullPointerException("O formato da data não pode ter valor [null]."); + } + + return parse(dateAsString, new SimpleDateFormat(dateFormat)); + } + + /** + *

              + * Converte um objeto String em um objeto + * java.util.Date através do objeto + * java.text.DateFormat especificado. + *

              + * + * @param dateAsString - um valor de data em forma de String. + * @param dateFormat - formatador para objetos java.util.Date. + * @return Objeto java.util.Date convertido a partir do objeto + * String + * + * @throws IllegalArgumentException caso o objeto String não + * seja um valor válido de data suportado pelo formatador. + * @since 0.2 + */ + public static Date parse(String dateAsString, DateFormat dateFormat) { + + Date date = null; + + if (dateAsString == null) { + throw new NullPointerException("A String a ser convertida não pode ter valor [null]."); + } + + if (dateFormat == null) { + throw new NullPointerException("O formatador não pode ter valor [null]."); + } + + try { + + date = dateFormat.parse(dateAsString); + + } catch (ParseException e) { + + String msg = "A String [" + dateAsString + + "] deve ser uma data válida no formato"; + if (dateFormat instanceof SimpleDateFormat) { + SimpleDateFormat sdf = (SimpleDateFormat) dateFormat; + msg += " [" + sdf.toPattern() + "]."; + + } else { + msg += " especificado."; + } + + IllegalArgumentException iae = new IllegalArgumentException(msg); + iae.initCause(e); + throw iae; + } + + return date; + } + + /** + *

              + * Retorna um objeto java.util.Date somente com a informação do + * dia, mes e ano. A informação sobre hora, minuto, segundo e millesegundos + * é zerada. Isto é altamente recomendado em rotinas nas quais datas são + * comparadas. + *

              + * + * @param date - um data em forma de java.util.Date. + * + * @return Objeto java.util.Date truncado a partir do objeto + * java.util.Date informado como parâmetro. + * + * @throws NullPointerException Caso o objeto java.util.Date + * esteja nulo + * @since 0.3 + */ + public static Date truncarData(Date date) { + if (date == null) { + throw new NullPointerException("O data não pode ser nula. Impossível realizar o truncamento da data."); + } + + return DateUtils.truncate(date, Calendar.DATE); + } + +} diff --git a/src/main/java/org/jrimum/utilix/DecimalFormat.java b/src/main/java/org/jrimum/utilix/DecimalFormat.java index e29f1450..4d982b75 100644 --- a/src/main/java/org/jrimum/utilix/DecimalFormat.java +++ b/src/main/java/org/jrimum/utilix/DecimalFormat.java @@ -1,129 +1,129 @@ -/* - * Copyright 2010 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: 01/08/2010 - 21:30:00 - * - * ================================================================================ - * - * Direitos autorais 2010 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 01/08/2010 - 21:30:00 - * - */ - -package org.jrimum.utilix; - -import java.text.ParseException; - -import org.jrimum.utilix.Exceptions; - -/** - *

              - * Formatadores thread-safe relacionados a moeda e números decimais. - *

              - * - * @author Gilmar P.S.L. - * - * @since 0.2 - * - * @version 0.2 - */ -public enum DecimalFormat implements Format{ - - /** - *

              - * Formatador de decimais pt-BR para Float,Double,BigDecimal no padrão - * "#,##0.0". Exemplo: "1.500,9". - *

              - */ - NUMBER_D_BR("#,##0.0", DecimalFormatSymbols.BRASIL.copy()), - - /** - *

              - * Formatador de decimais pt-BR para Float,Double,BigDecimal no padrão - * "#,##0.00". Exemplo: "1.500,99". - *

              - */ - NUMBER_DD_BR("#,##0.00", DecimalFormatSymbols.BRASIL.copy()), - - /** - *

              - * Formatador de decimais Float,Double,BigDecimal no padrão de - * moeda (Real pt-BR): "R$ #,##0.0". Usado para formatar valores - * monetários em real com o prefixo R$, exemplo: R$ 10,0. - *

              - */ - MONEY_D_BR("\u00A4 #,##0.0", DecimalFormatSymbols.BRASIL.copy()), - - /** - *

              - * Formatador de decimais Float,Double,BigDecimal no padrão de - * moeda (Real pt-BR): "R$ #,##0.00". Usado para formatar valores - * monetários em real com o prefixo R$, exemplo: R$ 10,00. - *

              - */ - MONEY_DD_BR("\u00A4 #,##0.00", DecimalFormatSymbols.BRASIL.copy()), - - ; - - private final ThreadLocalLocalizedFormat DECIMAL_FORMAT; - - private DecimalFormat(String format, java.text.DecimalFormatSymbols formatSymbols) { - - DECIMAL_FORMAT = new ThreadLocalLocalizedFormat(format, formatSymbols){ - - @Override - protected java.text.DecimalFormat initialValue() { - - return new java.text.DecimalFormat(format, formatSymbols); - } - }; - } - - /** - * @see org.jrimum.utilix.text.Format#format(java.lang.Object) - */ - public String format(Number obj) { - - return DECIMAL_FORMAT.get().format(obj); - } - - /** - * @see org.jrimum.utilix.text.Format#parse(java.lang.String) - */ - public Number parse(String text) { - - try { - - return DECIMAL_FORMAT.get().parse(text); - - } catch (ParseException e) { - - return Exceptions.throwIllegalArgumentException("DecimalFormat Exception!", e); - } - } - - /** - * @see org.jrimum.utilix.text.Format#copy() - */ - public java.text.DecimalFormat copy(){ - - return (java.text.DecimalFormat) DECIMAL_FORMAT.get().clone(); - } -} +/* + * Copyright 2010 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: 01/08/2010 - 21:30:00 + * + * ================================================================================ + * + * Direitos autorais 2010 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 01/08/2010 - 21:30:00 + * + */ + +package org.jrimum.utilix; + +import java.text.ParseException; + +import org.jrimum.utilix.Exceptions; + +/** + *

              + * Formatadores thread-safe relacionados a moeda e números decimais. + *

              + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public enum DecimalFormat implements Format{ + + /** + *

              + * Formatador de decimais pt-BR para Float,Double,BigDecimal no padrão + * "#,##0.0". Exemplo: "1.500,9". + *

              + */ + NUMBER_D_BR("#,##0.0", DecimalFormatSymbols.BRASIL.copy()), + + /** + *

              + * Formatador de decimais pt-BR para Float,Double,BigDecimal no padrão + * "#,##0.00". Exemplo: "1.500,99". + *

              + */ + NUMBER_DD_BR("#,##0.00", DecimalFormatSymbols.BRASIL.copy()), + + /** + *

              + * Formatador de decimais Float,Double,BigDecimal no padrão de + * moeda (Real pt-BR): "R$ #,##0.0". Usado para formatar valores + * monetários em real com o prefixo R$, exemplo: R$ 10,0. + *

              + */ + MONEY_D_BR("\u00A4 #,##0.0", DecimalFormatSymbols.BRASIL.copy()), + + /** + *

              + * Formatador de decimais Float,Double,BigDecimal no padrão de + * moeda (Real pt-BR): "R$ #,##0.00". Usado para formatar valores + * monetários em real com o prefixo R$, exemplo: R$ 10,00. + *

              + */ + MONEY_DD_BR("\u00A4 #,##0.00", DecimalFormatSymbols.BRASIL.copy()), + + ; + + private final ThreadLocalLocalizedFormat DECIMAL_FORMAT; + + private DecimalFormat(String format, java.text.DecimalFormatSymbols formatSymbols) { + + DECIMAL_FORMAT = new ThreadLocalLocalizedFormat(format, formatSymbols){ + + @Override + protected java.text.DecimalFormat initialValue() { + + return new java.text.DecimalFormat(format, formatSymbols); + } + }; + } + + /** + * @see org.jrimum.utilix.text.Format#format(java.lang.Object) + */ + public String format(Number obj) { + + return DECIMAL_FORMAT.get().format(obj); + } + + /** + * @see org.jrimum.utilix.text.Format#parse(java.lang.String) + */ + public Number parse(String text) { + + try { + + return DECIMAL_FORMAT.get().parse(text); + + } catch (ParseException e) { + + return Exceptions.throwIllegalArgumentException("DecimalFormat Exception!", e); + } + } + + /** + * @see org.jrimum.utilix.text.Format#copy() + */ + public java.text.DecimalFormat copy(){ + + return (java.text.DecimalFormat) DECIMAL_FORMAT.get().clone(); + } +} diff --git a/src/main/java/org/jrimum/utilix/StringUtil.java b/src/main/java/org/jrimum/utilix/StringUtil.java index b830ce08..888ba229 100644 --- a/src/main/java/org/jrimum/utilix/StringUtil.java +++ b/src/main/java/org/jrimum/utilix/StringUtil.java @@ -116,8 +116,8 @@ public static String eliminateSymbols(final String str) { * não. *

              *

              - * removeStartWithZeros("00000") => 0
              - * removeStartWithZeros("00023") => 23
              + * removeStartWithZeros("00000") => 0 + * removeStartWithZeros("00023") => 23 * removeStartWithZeros("02003") => 2003 *

              * @param str @@ -163,7 +163,7 @@ public static String removeStartWithZeros(final String str) { *

            * * e o Cedilha (ç). - *
            + * * Os acentos são removidos tanto para letras minúsculas como para letras * maiúsculas. * diff --git a/src/main/java/org/jrimum/utilix/Strings.java b/src/main/java/org/jrimum/utilix/Strings.java index 4835ed0b..13651dde 100644 --- a/src/main/java/org/jrimum/utilix/Strings.java +++ b/src/main/java/org/jrimum/utilix/Strings.java @@ -129,8 +129,8 @@ public static String eliminateSymbols(final String str) { * Remove os zeros iniciais de uma String, seja ela numérica ou * não. *

            - * removeStartWithZeros("00000") => 0
            - * removeStartWithZeros("00023") => 23
            + * removeStartWithZeros("00000") => 0 + * removeStartWithZeros("00023") => 23 * removeStartWithZeros("02003") => 2003 *

            * diff --git a/src/main/java/org/jrimum/vallia/AbstractCPRFValidator.java b/src/main/java/org/jrimum/vallia/AbstractCPRFValidator.java index a99f07c6..e628af30 100644 --- a/src/main/java/org/jrimum/vallia/AbstractCPRFValidator.java +++ b/src/main/java/org/jrimum/vallia/AbstractCPRFValidator.java @@ -1,362 +1,362 @@ -/* - * 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:19:24 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:19:24 - * - */ -package org.jrimum.vallia; - -import java.io.Serializable; -import java.util.regex.Pattern; - -import org.apache.commons.lang3.StringUtils; -import org.jrimum.ConfiguracaoJRimum; -import org.jrimum.utilix.ObjectUtil; -import static org.jrimum.utilix.Objects.isNotNull; - -/** - *

            - * Representa a família de validadores para o cadastro de pessoa na receita - * federal (CPRF). - *

            - * - * - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento - * Mercantil - * - * @since 0.2 - * - * @version 0.2 - * - */ -public abstract class AbstractCPRFValidator { - - private static final long serialVersionUID = -3107505512223559948L; - - /** - *

            - * Cadastro de pessoa para validação. - *

            - */ - protected StringBuilder codigoDoCadastro; - - /** - *

            - * Validador de dígito verificador do cadastro de Pessoa. - *

            - */ - protected AbstractDigitoVerificador digitoVerificador; - - /** - *

            - * Expressão regular para validação de CPF: "###.###.###-##" ou - * "###########". - *

            - */ - private static final String REGEX_CPF = "(\\d{3}\\.\\d{3}\\.\\d{3}\\-\\d{2})|(\\d{11})"; - - /** - *

            - * Expressão regular para validação de CNPJ: "##.###.###/####-##" ou - * "##############". - *

            - */ - private static final String REGEX_CNPJ = "(\\d{2}\\.\\d{3}\\.\\d{3}\\/\\d{4}\\-\\d{2})|(\\d{14})"; - - /** - *

            - * Expressão regular para validação de um cadastro: "###" ou - * "##############". - *

            - */ - private static final String REGEX_CADASTRO = "\\d{3,14}"; - - /** - *

            - * Representa o tipo de cadastro e fornece o autenticador correto de a cordo - * com este tipo. - *

            - * - * - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento - * Mercantil - * - * @since 0.2 - * - * @version 0.2 - */ - public enum TipoDeCPRF implements Serializable { - - CPF, CNPJ; - - public AbstractCPRFValidator getAutenticador() { - - AbstractCPRFValidator validador = null; - - switch (this) { - - case CPF: - - validador = new CPFValidator(); - validador.digitoVerificador = new CPFDV(); - - break; - - case CNPJ: - - validador = new CNPJValidator(); - validador.digitoVerificador = new CNPJDV(); - - break; - } - - return validador; - } - - /** - * @see br.com.nordestefomento.jrimum.utilix.ObjectUtil#toString() - * @see java.lang.Enum#toString() - */ - public String toString() { - return ObjectUtil.toString(this); - } - } - - /** - * @see - * br.com.nordestefomento.jrimum.vallia.AbstractCPRFValidator.TipoDeCPRF - */ - @SuppressWarnings("unused") - private TipoDeCPRF tipoDeCadastro; - - /** - *

            - * Valida o dígito verificador do cadastro de pessoa passado durante a - * instanciação do validador. - *

            - * - * @return verdadeiro se o dígito verificador for válido. - */ - public abstract boolean isValido(); - - /** - *

            - * Revome a formatação existente em códigoDoCadastro. - *

            - */ - protected abstract void removeFormatacao(); - - /** - *

            - * Recupera uma instância de um validador para o cadastro de pessoa a partir - * de um identificador. - *

            - *

            - * Primeiro é feita uma pré-validação que consiste em: - *

              - *
            • Verificar se o parâmetro não é nulo.
            • - *
            • Verificar se o parâmetro não é vazio.
            • - *
            • Verificar se o parâmetro está em algum formatador válido para - * cadastro de pessoa.
            • - *
            - *

            - * - * @param codigoDoCadastro - identificador do cadastro de pessoa. - * @return uma instância de AbstractCPRFValidator. - * @exception IllegalArgumentException - caso o parâmetro não esteja em um - * formatador válido de cadastro de pessoa. - * @since 0.2 - */ - public static AbstractCPRFValidator create(String codigoDoCadastro) - throws IllegalArgumentException { - AbstractCPRFValidator validatorCPRF = null; - validatorCPRF = create(selectTipoDeCadastro(codigoDoCadastro)); - validatorCPRF.codigoDoCadastro = new StringBuilder(codigoDoCadastro); - validatorCPRF.removeFormatacao(); - return validatorCPRF; - } - - /** - *

            - * Cria um validador a partir do tipo de CPRF. - *

            - * - * @param tipoDeCadastro - * @return um validador - * - * @since 0.2 - */ - public static AbstractCPRFValidator create(TipoDeCPRF tipoDeCadastro) { - AbstractCPRFValidator validatorCPRF = null; - if (isNotNull(tipoDeCadastro)) { - validatorCPRF = tipoDeCadastro.getAutenticador(); - validatorCPRF.tipoDeCadastro = tipoDeCadastro; - } else { - throw new IllegalArgumentException("Tipo de Cadastro [ " - + tipoDeCadastro + " ] nulo !"); - } - - return validatorCPRF; - } - - /** - *

            - * Faz a pré-validação e se correto identifica o tipo de cadastro. - *

            - * - * @param codigoDoCadastro - * @return - * @throws IllegalArgumentException - * - * @since 0.2 - */ - private static TipoDeCPRF selectTipoDeCadastro(String codigoDoCadastro) - throws IllegalArgumentException { - - TipoDeCPRF tipo = null; - - switch_Tipo: - { - - if (StringUtils.isNotBlank(codigoDoCadastro)) { - - /* - * FILTRO - */ - if (Pattern.matches(REGEX_CPF, codigoDoCadastro)) { - - tipo = TipoDeCPRF.CPF; - - break switch_Tipo; - } - - if (Pattern.matches(REGEX_CNPJ, codigoDoCadastro)) { - - tipo = TipoDeCPRF.CNPJ; - - break switch_Tipo; - } - - } - - if (ConfiguracaoJRimum.falharEmCPRFInvalido) { - throw new IllegalArgumentException("O código de cadastro [ " - + codigoDoCadastro - + " ] não está em um formatador válido !"); - } - } - - return tipo; - } - - /** - *

            - * Define se os parâmetros válidos em relação a nulidade e formato de CPRF. - *

            - * - * @param codigoDoCadastro - * @param tipoDeCadastro - * @return indicação de aprovação - * @throws IllegalArgumentException - * - * @since 0.2 - */ - public static boolean isParametrosValidos(String codigoDoCadastro, - TipoDeCPRF tipoDeCadastro) throws IllegalArgumentException { - - boolean isValido = false; - - if (isNotNull(codigoDoCadastro) && isNotNull(tipoDeCadastro)) { - - if (Pattern.matches(REGEX_CADASTRO, codigoDoCadastro)) { - - isValido = true; - - } else { - - throw new IllegalArgumentException( - "O cadastro está em um tamanho incorreto ou não exsite: [ " - + codigoDoCadastro + " ]"); - } - } else { - - throw new IllegalArgumentException( - "O tipo de cadastro está incorreto: [ " + tipoDeCadastro - + " ] ou o cadastro não exsite: [ " - + codigoDoCadastro + " ]"); - } - - return isValido; - } - - /** - *

            - * Recupera o cadastro de pessoa a ser validado.
            - * Obs.: A String retornada não possui formatação, ou seja, possui apenas os - * dígitos. - *

            - * - * @return cadastro de pessoa a ser validado. - * - * @since 0.2 - */ - public String getCodigoDoCadastro() { - - return codigoDoCadastro.toString(); - } - - /** - *

            - * Indica se o validador é de pessoa física. - *

            - * - * @return verdadeiro se for de pessoa física. - * @since 0.2 - */ - public boolean isFisica() { - - return this instanceof CPFValidator; - } - - /** - *

            Indica se o validador é de pessoa jurídica.

            - * - * @return verdadeiro se for de pessoa jurídica. - * @since 0.2 - */ - public boolean isJuridica() { - - return this instanceof CNPJValidator; - } - -} +/* + * 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:19:24 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:19:24 + * + */ +package org.jrimum.vallia; + +import java.io.Serializable; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; +import org.jrimum.ConfiguracaoJRimum; +import org.jrimum.utilix.ObjectUtil; +import static org.jrimum.utilix.Objects.isNotNull; + +/** + *

            + * Representa a família de validadores para o cadastro de pessoa na receita + * federal (CPRF). + *

            + * + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + * + */ +public abstract class AbstractCPRFValidator { + + private static final long serialVersionUID = -3107505512223559948L; + + /** + *

            + * Cadastro de pessoa para validação. + *

            + */ + protected StringBuilder codigoDoCadastro; + + /** + *

            + * Validador de dígito verificador do cadastro de Pessoa. + *

            + */ + protected AbstractDigitoVerificador digitoVerificador; + + /** + *

            + * Expressão regular para validação de CPF: "###.###.###-##" ou + * "###########". + *

            + */ + private static final String REGEX_CPF = "(\\d{3}\\.\\d{3}\\.\\d{3}\\-\\d{2})|(\\d{11})"; + + /** + *

            + * Expressão regular para validação de CNPJ: "##.###.###/####-##" ou + * "##############". + *

            + */ + private static final String REGEX_CNPJ = "(\\d{2}\\.\\d{3}\\.\\d{3}\\/\\d{4}\\-\\d{2})|(\\d{14})"; + + /** + *

            + * Expressão regular para validação de um cadastro: "###" ou + * "##############". + *

            + */ + private static final String REGEX_CADASTRO = "\\d{3,14}"; + + /** + *

            + * Representa o tipo de cadastro e fornece o autenticador correto de a cordo + * com este tipo. + *

            + * + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ + public enum TipoDeCPRF implements Serializable { + + CPF, CNPJ; + + public AbstractCPRFValidator getAutenticador() { + + AbstractCPRFValidator validador = null; + + switch (this) { + + case CPF: + + validador = new CPFValidator(); + validador.digitoVerificador = new CPFDV(); + + break; + + case CNPJ: + + validador = new CNPJValidator(); + validador.digitoVerificador = new CNPJDV(); + + break; + } + + return validador; + } + + /** + * @see br.com.nordestefomento.jrimum.utilix.ObjectUtil#toString() + * @see java.lang.Enum#toString() + */ + public String toString() { + return ObjectUtil.toString(this); + } + } + + /** + * @see + * br.com.nordestefomento.jrimum.vallia.AbstractCPRFValidator.TipoDeCPRF + */ + @SuppressWarnings("unused") + private TipoDeCPRF tipoDeCadastro; + + /** + *

            + * Valida o dígito verificador do cadastro de pessoa passado durante a + * instanciação do validador. + *

            + * + * @return verdadeiro se o dígito verificador for válido. + */ + public abstract boolean isValido(); + + /** + *

            + * Revome a formatação existente em códigoDoCadastro. + *

            + */ + protected abstract void removeFormatacao(); + + /** + *

            + * Recupera uma instância de um validador para o cadastro de pessoa a partir + * de um identificador. + *

            + *

            + * Primeiro é feita uma pré-validação que consiste em: + *

              + *
            • Verificar se o parâmetro não é nulo.
            • + *
            • Verificar se o parâmetro não é vazio.
            • + *
            • Verificar se o parâmetro está em algum formatador válido para + * cadastro de pessoa.
            • + *
            + *

            + * + * @param codigoDoCadastro - identificador do cadastro de pessoa. + * @return uma instância de AbstractCPRFValidator. + * @exception IllegalArgumentException - caso o parâmetro não esteja em um + * formatador válido de cadastro de pessoa. + * @since 0.2 + */ + public static AbstractCPRFValidator create(String codigoDoCadastro) + throws IllegalArgumentException { + AbstractCPRFValidator validatorCPRF = null; + validatorCPRF = create(selectTipoDeCadastro(codigoDoCadastro)); + validatorCPRF.codigoDoCadastro = new StringBuilder(codigoDoCadastro); + validatorCPRF.removeFormatacao(); + return validatorCPRF; + } + + /** + *

            + * Cria um validador a partir do tipo de CPRF. + *

            + * + * @param tipoDeCadastro + * @return um validador + * + * @since 0.2 + */ + public static AbstractCPRFValidator create(TipoDeCPRF tipoDeCadastro) { + AbstractCPRFValidator validatorCPRF = null; + if (isNotNull(tipoDeCadastro)) { + validatorCPRF = tipoDeCadastro.getAutenticador(); + validatorCPRF.tipoDeCadastro = tipoDeCadastro; + } else { + throw new IllegalArgumentException("Tipo de Cadastro [ " + + tipoDeCadastro + " ] nulo !"); + } + + return validatorCPRF; + } + + /** + *

            + * Faz a pré-validação e se correto identifica o tipo de cadastro. + *

            + * + * @param codigoDoCadastro + * @return + * @throws IllegalArgumentException + * + * @since 0.2 + */ + private static TipoDeCPRF selectTipoDeCadastro(String codigoDoCadastro) + throws IllegalArgumentException { + + TipoDeCPRF tipo = null; + + switch_Tipo: + { + + if (StringUtils.isNotBlank(codigoDoCadastro)) { + + /* + * FILTRO + */ + if (Pattern.matches(REGEX_CPF, codigoDoCadastro)) { + + tipo = TipoDeCPRF.CPF; + + break switch_Tipo; + } + + if (Pattern.matches(REGEX_CNPJ, codigoDoCadastro)) { + + tipo = TipoDeCPRF.CNPJ; + + break switch_Tipo; + } + + } + + if (ConfiguracaoJRimum.falharEmCPRFInvalido) { + throw new IllegalArgumentException("O código de cadastro [ " + + codigoDoCadastro + + " ] não está em um formatador válido !"); + } + } + + return tipo; + } + + /** + *

            + * Define se os parâmetros válidos em relação a nulidade e formato de CPRF. + *

            + * + * @param codigoDoCadastro + * @param tipoDeCadastro + * @return indicação de aprovação + * @throws IllegalArgumentException + * + * @since 0.2 + */ + public static boolean isParametrosValidos(String codigoDoCadastro, + TipoDeCPRF tipoDeCadastro) throws IllegalArgumentException { + + boolean isValido = false; + + if (isNotNull(codigoDoCadastro) && isNotNull(tipoDeCadastro)) { + + if (Pattern.matches(REGEX_CADASTRO, codigoDoCadastro)) { + + isValido = true; + + } else { + + throw new IllegalArgumentException( + "O cadastro está em um tamanho incorreto ou não exsite: [ " + + codigoDoCadastro + " ]"); + } + } else { + + throw new IllegalArgumentException( + "O tipo de cadastro está incorreto: [ " + tipoDeCadastro + + " ] ou o cadastro não exsite: [ " + + codigoDoCadastro + " ]"); + } + + return isValido; + } + + /** + *

            + * Recupera o cadastro de pessoa a ser validado. + * Obs.: A String retornada não possui formatação, ou seja, possui apenas os + * dígitos. + *

            + * + * @return cadastro de pessoa a ser validado. + * + * @since 0.2 + */ + public String getCodigoDoCadastro() { + + return codigoDoCadastro.toString(); + } + + /** + *

            + * Indica se o validador é de pessoa física. + *

            + * + * @return verdadeiro se for de pessoa física. + * @since 0.2 + */ + public boolean isFisica() { + + return this instanceof CPFValidator; + } + + /** + *

            Indica se o validador é de pessoa jurídica.

            + * + * @return verdadeiro se for de pessoa jurídica. + * @since 0.2 + */ + public boolean isJuridica() { + + return this instanceof CNPJValidator; + } + +} diff --git a/src/main/java/org/jrimum/vallia/BoletoCodigoDeBarrasDV.java b/src/main/java/org/jrimum/vallia/BoletoCodigoDeBarrasDV.java index 4bb43ac9..27106b6b 100644 --- a/src/main/java/org/jrimum/vallia/BoletoCodigoDeBarrasDV.java +++ b/src/main/java/org/jrimum/vallia/BoletoCodigoDeBarrasDV.java @@ -1,120 +1,120 @@ -/* - * 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:22:11 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:22:11 - * - */ - -package org.jrimum.vallia; - -import org.apache.commons.lang3.StringUtils; - -/** - *

            - * Lógica de cálculo do dígito verificador do código de barras de um boleto.
            - * A lógica funciona da seguinte forma: - *

            - *

            - * Utilizando-se o módulo 11, considerando-se os 43 dígitos que compõem o código - * de barras, já excluída a 5ª posição (posição do dígito verificador), segue-se - * o procedimento abaixo: - *

            - *

            - * Calcula-se o dígito verificador através da expressão DV = 11 - R - * , onde R é o resultado do cálculo do módulo.
            - * Observação: O dígito verificador será 1 para os restos (resultado do módulo): - * 0 , 10 ou 1 (zero, dez, um). - *

            - *

            - * Obs.: A rotina de módulo utilizada é o módulo 11. - *

            - * - * @see Modulo - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento - * Mercantil - * - * @version 0.2 - * - * @since 0.2 - */ -public class BoletoCodigoDeBarrasDV extends AbstractDigitoVerificador { - - private static final long serialVersionUID = 7977220668336110040L; - - private static final int TAMANHO_SEM_DV = 43; - - private static final Modulo modulo11 = new Modulo(TipoDeModulo.MODULO11); - - /** - *

            - * Construtor vaizo, o mesmo que super(). - *

            - * - * @since 0.2 - */ - public BoletoCodigoDeBarrasDV() { - - super(); - } - - /** - * @see br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(String) - * @since 0.2 - */ - @Override - public int calcule(String numero) throws IllegalArgumentException { - - int dv = 0; - int resto = 0; - - if (StringUtils.isNotBlank(numero) && StringUtils.isNumeric(numero) - && (numero.length() == TAMANHO_SEM_DV)) { - - // Realizando o cálculo do dígito verificador utilizando módulo 11. - // Obtendo o resto da divisão por 11. - resto = modulo11.calcule(numero); - - // Seguindo as especificações da FEBRABAN, caso o resto seja - // (0), (1) ou (10), será atribuído (1) ao digito verificador. - if ((resto == 0) || (resto == 1) || (resto == 10)) - dv = 1; - // Caso contrário, dv = 11 - resto. - else - dv = modulo11.valor() - resto; - - } else { - throw new IllegalArgumentException("O código de barras " + "[ " - + numero + " ] deve conter apenas números e " - + TAMANHO_SEM_DV + " caracteres."); - } - - return dv; - } - -} +/* + * 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:22:11 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:22:11 + * + */ + +package org.jrimum.vallia; + +import org.apache.commons.lang3.StringUtils; + +/** + *

            + * Lógica de cálculo do dígito verificador do código de barras de um boleto. + * A lógica funciona da seguinte forma: + *

            + *

            + * Utilizando-se o módulo 11, considerando-se os 43 dígitos que compõem o código + * de barras, já excluída a 5ª posição (posição do dígito verificador), segue-se + * o procedimento abaixo: + *

            + *

            + * Calcula-se o dígito verificador através da expressão DV = 11 - R + * , onde R é o resultado do cálculo do módulo. + * Observação: O dígito verificador será 1 para os restos (resultado do módulo): + * 0 , 10 ou 1 (zero, dez, um). + *

            + *

            + * Obs.: A rotina de módulo utilizada é o módulo 11. + *

            + * + * @see Modulo + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @version 0.2 + * + * @since 0.2 + */ +public class BoletoCodigoDeBarrasDV extends AbstractDigitoVerificador { + + private static final long serialVersionUID = 7977220668336110040L; + + private static final int TAMANHO_SEM_DV = 43; + + private static final Modulo modulo11 = new Modulo(TipoDeModulo.MODULO11); + + /** + *

            + * Construtor vaizo, o mesmo que super(). + *

            + * + * @since 0.2 + */ + public BoletoCodigoDeBarrasDV() { + + super(); + } + + /** + * @see br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(String) + * @since 0.2 + */ + @Override + public int calcule(String numero) throws IllegalArgumentException { + + int dv = 0; + int resto = 0; + + if (StringUtils.isNotBlank(numero) && StringUtils.isNumeric(numero) + && (numero.length() == TAMANHO_SEM_DV)) { + + // Realizando o cálculo do dígito verificador utilizando módulo 11. + // Obtendo o resto da divisão por 11. + resto = modulo11.calcule(numero); + + // Seguindo as especificações da FEBRABAN, caso o resto seja + // (0), (1) ou (10), será atribuído (1) ao digito verificador. + if ((resto == 0) || (resto == 1) || (resto == 10)) + dv = 1; + // Caso contrário, dv = 11 - resto. + else + dv = modulo11.valor() - resto; + + } else { + throw new IllegalArgumentException("O código de barras " + "[ " + + numero + " ] deve conter apenas números e " + + TAMANHO_SEM_DV + " caracteres."); + } + + return dv; + } + +} diff --git a/src/main/java/org/jrimum/vallia/BoletoLinhaDigitavelDV.java b/src/main/java/org/jrimum/vallia/BoletoLinhaDigitavelDV.java index 75ec5bea..f2cf9aaf 100644 --- a/src/main/java/org/jrimum/vallia/BoletoLinhaDigitavelDV.java +++ b/src/main/java/org/jrimum/vallia/BoletoLinhaDigitavelDV.java @@ -1,150 +1,150 @@ -/* - * 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:22:21 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:22:21 - * - */ -package org.jrimum.vallia; - -import java.util.regex.Pattern; - -import org.apache.commons.lang3.StringUtils; -import org.jrimum.texgit.Filler; - -/** - *

            - * Segundo o padrão FEBRABAN a linha digitável possui cinco campos, dos quais - * apenas os três primeiros necessitam de validação com dígito verificador. - *

            - *

            - * Para fins de validação é preciso saber o seguinte: - *

              - *
            • O primerio campo tem tamanho 9 (nove) mais o dígito verificador.
            • - *
            • O segundo campo tem tamanho 10 (dez) mais o dígito verificador.
            • - *
            • O terceiro campo tem tamanho 10 (dez) mais o dígito verificador.
            • - *
            - *

            - *

            - * Obs1.: Todos os campos listados podem vir com um ponto (.) de separação - * exatamente após o dígito da 5ª posição.
            - * Exemplo de linha digitável:
            - * 99997.77213 30530.150082 18975.000003 1 10010000035000 - *

            - *

            - * O cálculo do dígito verificador é descrito através da expressão - * DV = 11 - R, onde R é o resultado do cálculo do módulo.
            - * Obs1.: O dígito verificador será 0 (zero) se o resto (resultado do módulo) - * for 0 (zero).
            - * Obs2.: A rotina de módulo utilizada é a módulo 10. - *

            - * - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento - * Mercantil - * - * @since 0.2 - * - * @version 0.2 - */ -public class BoletoLinhaDigitavelDV extends AbstractDigitoVerificador { - - private static final long serialVersionUID = -9177413216786384292L; - - /** - *

            - * Módulo 10 utilizado no cálculo. - *

            - */ - private static final Modulo modulo10 = new Modulo(TipoDeModulo.MODULO10); - - /** - *

            - * Expressão regular para validação do campo da linha digitável, aceita os - * seguintes formatos: - *

            - *
            • #########
            • - *
            • #####.####
            • - *
            • ##########
            • #####.#####
            - * - */ - private static final String REGEX_CAMPO = "(\\d{9})|(\\d{10})|(\\d{5})\\.(\\d{4})|(\\d{5})\\.(\\d{5})"; - - /** - *

            - * Construtor vaizo, o mesmo que super(). - *

            - * - * @since 0.2 - */ - public BoletoLinhaDigitavelDV() { - super(); - } - - /** - * @see - * br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) - * @since 0.2 - */ - @Override - public int calcule(long numero) { - - return calcule(Filler.ZERO_LEFT.fill(String.valueOf(numero), 10)); - } - - /** - * @see - * br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) - * @since 0.2 - */ - @Override - public int calcule(String numero) throws IllegalArgumentException { - - int dv = 0; - int resto = 0; - - if (StringUtils.isNotBlank(numero) - && Pattern.matches(REGEX_CAMPO, numero)) { - - numero = StringUtils.replaceChars(numero, ".", ""); - - resto = modulo10.calcule(numero); - - if (resto != 0) { - dv = modulo10.valor() - resto; - } - } else { - throw new IllegalArgumentException( - "O campo [ " - + numero - + " ] da linha digitável deve conter apenas números com 9 ou 10 dígitos !"); - } - - return dv; - } - -} +/* + * 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:22:21 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:22:21 + * + */ +package org.jrimum.vallia; + +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; +import org.jrimum.texgit.Filler; + +/** + *

            + * Segundo o padrão FEBRABAN a linha digitável possui cinco campos, dos quais + * apenas os três primeiros necessitam de validação com dígito verificador. + *

            + *

            + * Para fins de validação é preciso saber o seguinte: + *

              + *
            • O primerio campo tem tamanho 9 (nove) mais o dígito verificador.
            • + *
            • O segundo campo tem tamanho 10 (dez) mais o dígito verificador.
            • + *
            • O terceiro campo tem tamanho 10 (dez) mais o dígito verificador.
            • + *
            + *

            + *

            + * Obs1.: Todos os campos listados podem vir com um ponto (.) de separação + * exatamente após o dígito da 5ª posição. + * Exemplo de linha digitável: + * 99997.77213 30530.150082 18975.000003 1 10010000035000 + *

            + *

            + * O cálculo do dígito verificador é descrito através da expressão + * DV = 11 - R, onde R é o resultado do cálculo do módulo. + * Obs1.: O dígito verificador será 0 (zero) se o resto (resultado do módulo) + * for 0 (zero). + * Obs2.: A rotina de módulo utilizada é a módulo 10. + *

            + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class BoletoLinhaDigitavelDV extends AbstractDigitoVerificador { + + private static final long serialVersionUID = -9177413216786384292L; + + /** + *

            + * Módulo 10 utilizado no cálculo. + *

            + */ + private static final Modulo modulo10 = new Modulo(TipoDeModulo.MODULO10); + + /** + *

            + * Expressão regular para validação do campo da linha digitável, aceita os + * seguintes formatos: + *

            + *
            • #########
            • + *
            • #####.####
            • + *
            • ##########
            • #####.#####
            + * + */ + private static final String REGEX_CAMPO = "(\\d{9})|(\\d{10})|(\\d{5})\\.(\\d{4})|(\\d{5})\\.(\\d{5})"; + + /** + *

            + * Construtor vaizo, o mesmo que super(). + *

            + * + * @since 0.2 + */ + public BoletoLinhaDigitavelDV() { + super(); + } + + /** + * @see + * br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) + * @since 0.2 + */ + @Override + public int calcule(long numero) { + + return calcule(Filler.ZERO_LEFT.fill(String.valueOf(numero), 10)); + } + + /** + * @see + * br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) + * @since 0.2 + */ + @Override + public int calcule(String numero) throws IllegalArgumentException { + + int dv = 0; + int resto = 0; + + if (StringUtils.isNotBlank(numero) + && Pattern.matches(REGEX_CAMPO, numero)) { + + numero = StringUtils.replaceChars(numero, ".", ""); + + resto = modulo10.calcule(numero); + + if (resto != 0) { + dv = modulo10.valor() - resto; + } + } else { + throw new IllegalArgumentException( + "O campo [ " + + numero + + " ] da linha digitável deve conter apenas números com 9 ou 10 dígitos !"); + } + + return dv; + } + +} diff --git a/src/main/java/org/jrimum/vallia/CNPJDV.java b/src/main/java/org/jrimum/vallia/CNPJDV.java index 6c800f0b..42cc65cb 100644 --- a/src/main/java/org/jrimum/vallia/CNPJDV.java +++ b/src/main/java/org/jrimum/vallia/CNPJDV.java @@ -1,199 +1,199 @@ -/* - * 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:22:39 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:22:39 - * - */ -package org.jrimum.vallia; - -import java.util.regex.Pattern; - -import org.apache.commons.lang3.StringUtils; -import org.jrimum.texgit.Filler; - -/** - *

            - * O cálculo do dígito verificador do CNPJ é realizado em duas etapas e é - * auxiliado pela rotina de módulo 11. - *

            - *

            - * Abaixo é demonstrado como esse cálculo é feito: - *

            - *

            Exemplo para um número hipotético 11.222.333/0001-XX:

            - *

            - * Primeiramente obtém-se um número R, calculado através da rotina de módulo 11, - * a partir dos doze primeiros números do CNPJ, nesse caso 112223330001.
            - * Para obter o primeiro dígito verificador deve-se seguir a seguinte lógica: - *
            - *
            - * Se o número R for menor que 2, o dígito terá valor 0 (zero); senão, será a - * subtração do valor do módulo (11) menos o valor do número R, ou seja, - * DV = 11 - R. - *

            - *

            - * Para obter o segundo dígito verificador é da mesma forma do primeiro, porém - * deve ser calculado a partir dos treze primeiros números do CNPJ, ou seja, - * 112223330001 + primeiro dígito. - *

            - *

            - * Obs.: O limite mínimo e máximo do módulo 11 são 2 e 9, respectivamente. - *

            - * - * @see Modulo - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento - * Mercantil - * - * @since 0.2 - * - * @version 0.2 - */ -public class CNPJDV extends AbstractDigitoVerificador { - - /** - * - */ - private static final long serialVersionUID = -4702398145481452503L; - - /** - *

            - * Liminte mínimo do para cálculo no módulo 11. - *

            - */ - private static final int LIMITE_MINIMO = 2; - - /** - *

            - * Liminte máximo do para cálculo no módulo 11. - *

            - */ - private static final int LIMITE_MAXIMO = 9; - - /** - *

            - * Expressão regular para validação dos doze primeiros números do CNPJ sem - * formatação: "############". - *

            - */ - private static final String REGEX_CNPJ_DV = "\\d{12}"; - - /** - *

            - * Expressão regular para validação dos doze primeiros números do CNPJ - * formatado: "##.###.###/####". - *

            - */ - private static final String REGEX_CNPJ_DV_FORMATTED = "\\d{2}\\.\\d{3}\\.\\d{3}\\/\\d{4}"; - - /** - * @see - * br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(long) - * @since 0.2 - */ - @Override - public int calcule(long numero) { - - return calcule(Filler.ZERO_LEFT.fill(String.valueOf(numero), 12)); - } - - /** - * @see - * br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) - * @since 0.2 - */ - @Override - public int calcule(String numero) throws IllegalArgumentException { - - int dv1 = 0; - int dv2 = 0; - - boolean isFormatoValido = false; - - validacao: - { - - if (StringUtils.isNotBlank(numero)) { - - isFormatoValido = (Pattern.matches(REGEX_CNPJ_DV, numero) || Pattern - .matches(REGEX_CNPJ_DV_FORMATTED, numero)); - - if (isFormatoValido) { - - numero = StringUtils.replaceChars(numero, ".", ""); - numero = StringUtils.replaceChars(numero, "/", ""); - - dv1 = calculeDigito(numero); - dv2 = calculeDigito(numero + dv1); - - break validacao; - } - } - - throw new IllegalArgumentException( - "O CNPJ [ " - + numero - + " ] deve conter apenas números, sendo eles no formato ##.###.###/#### ou ############ !"); - - } - - return Integer.parseInt(dv1 + "" + dv2); - - } - - /** - *

            - * Método auxiliar para o cálculo do dígito verificador. - *

            - *

            - * Calcula os dígitos separadamente. - *

            - * - * @param numero - número a partir do qual será extraído o dígito - * verificador. - * @return Um número que faz parte de um dígito verificador. - * @throws IllegalArgumentException caso o número não esteja no formatador - * desejável. - * - * @since 0.2 - */ - private int calculeDigito(String numero) throws IllegalArgumentException { - - int dv = 0; - int resto = 0; - - resto = Modulo.calculeMod11(numero, LIMITE_MINIMO, LIMITE_MAXIMO); - - if (resto >= 2) { - - dv = TipoDeModulo.MODULO11.valor() - resto; - } - - return dv; - } - -} +/* + * 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:22:39 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:22:39 + * + */ +package org.jrimum.vallia; + +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; +import org.jrimum.texgit.Filler; + +/** + *

            + * O cálculo do dígito verificador do CNPJ é realizado em duas etapas e é + * auxiliado pela rotina de módulo 11. + *

            + *

            + * Abaixo é demonstrado como esse cálculo é feito: + *

            + *

            Exemplo para um número hipotético 11.222.333/0001-XX:

            + *

            + * Primeiramente obtém-se um número R, calculado através da rotina de módulo 11, + * a partir dos doze primeiros números do CNPJ, nesse caso 112223330001. + * Para obter o primeiro dígito verificador deve-se seguir a seguinte lógica: + * + * + * Se o número R for menor que 2, o dígito terá valor 0 (zero); senão, será a + * subtração do valor do módulo (11) menos o valor do número R, ou seja, + * DV = 11 - R. + *

            + *

            + * Para obter o segundo dígito verificador é da mesma forma do primeiro, porém + * deve ser calculado a partir dos treze primeiros números do CNPJ, ou seja, + * 112223330001 + primeiro dígito. + *

            + *

            + * Obs.: O limite mínimo e máximo do módulo 11 são 2 e 9, respectivamente. + *

            + * + * @see Modulo + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class CNPJDV extends AbstractDigitoVerificador { + + /** + * + */ + private static final long serialVersionUID = -4702398145481452503L; + + /** + *

            + * Liminte mínimo do para cálculo no módulo 11. + *

            + */ + private static final int LIMITE_MINIMO = 2; + + /** + *

            + * Liminte máximo do para cálculo no módulo 11. + *

            + */ + private static final int LIMITE_MAXIMO = 9; + + /** + *

            + * Expressão regular para validação dos doze primeiros números do CNPJ sem + * formatação: "############". + *

            + */ + private static final String REGEX_CNPJ_DV = "\\d{12}"; + + /** + *

            + * Expressão regular para validação dos doze primeiros números do CNPJ + * formatado: "##.###.###/####". + *

            + */ + private static final String REGEX_CNPJ_DV_FORMATTED = "\\d{2}\\.\\d{3}\\.\\d{3}\\/\\d{4}"; + + /** + * @see + * br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(long) + * @since 0.2 + */ + @Override + public int calcule(long numero) { + + return calcule(Filler.ZERO_LEFT.fill(String.valueOf(numero), 12)); + } + + /** + * @see + * br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) + * @since 0.2 + */ + @Override + public int calcule(String numero) throws IllegalArgumentException { + + int dv1 = 0; + int dv2 = 0; + + boolean isFormatoValido = false; + + validacao: + { + + if (StringUtils.isNotBlank(numero)) { + + isFormatoValido = (Pattern.matches(REGEX_CNPJ_DV, numero) || Pattern + .matches(REGEX_CNPJ_DV_FORMATTED, numero)); + + if (isFormatoValido) { + + numero = StringUtils.replaceChars(numero, ".", ""); + numero = StringUtils.replaceChars(numero, "/", ""); + + dv1 = calculeDigito(numero); + dv2 = calculeDigito(numero + dv1); + + break validacao; + } + } + + throw new IllegalArgumentException( + "O CNPJ [ " + + numero + + " ] deve conter apenas números, sendo eles no formato ##.###.###/#### ou ############ !"); + + } + + return Integer.parseInt(dv1 + "" + dv2); + + } + + /** + *

            + * Método auxiliar para o cálculo do dígito verificador. + *

            + *

            + * Calcula os dígitos separadamente. + *

            + * + * @param numero - número a partir do qual será extraído o dígito + * verificador. + * @return Um número que faz parte de um dígito verificador. + * @throws IllegalArgumentException caso o número não esteja no formatador + * desejável. + * + * @since 0.2 + */ + private int calculeDigito(String numero) throws IllegalArgumentException { + + int dv = 0; + int resto = 0; + + resto = Modulo.calculeMod11(numero, LIMITE_MINIMO, LIMITE_MAXIMO); + + if (resto >= 2) { + + dv = TipoDeModulo.MODULO11.valor() - resto; + } + + return dv; + } + +} diff --git a/src/main/java/org/jrimum/vallia/CPFDV.java b/src/main/java/org/jrimum/vallia/CPFDV.java index b61c741b..7bfbeb5a 100644 --- a/src/main/java/org/jrimum/vallia/CPFDV.java +++ b/src/main/java/org/jrimum/vallia/CPFDV.java @@ -1,192 +1,192 @@ -/* - * 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:51:09 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:51:09 - * - */ - -package org.jrimum.vallia; - -import java.util.regex.Pattern; - -import org.apache.commons.lang3.StringUtils; -import org.jrimum.texgit.Filler; - - -/** - *

            - * O cálculo do dígito verificador do CPF é realizado em duas etapas e é - * auxiliado pela rotina de módulo 11. - *

            - *

            - * Abaixo é demonstrado como esse cálculo é feito: - *

            - *

            Exemplo para um número hipotético 222.333.666-XX:

            - *

            - * Primeiramente obtém-se um número R, calculado através da rotina de módulo 11, - * a partir dos nove primeiros números do CPF, nesse caso 222333666.
            - * Para obter o primeiro dígito verificador deve-se seguir a seguinte lógica:
            - *
            - * Se o número R for menor que 2, o dígito terá valor 0 (zero); senão, será a - * subtração do valor do módulo (11) menos o valor do número R, ou seja, - * DV = 11 - R. - *

            - *

            - * Para obter o segundo dígito verificador é da mesma forma do primeiro, porém - * deve ser calculado a partir dos dez primeiros números do CPF, ou seja, - * 222333666 + primeiro dígito. - *

            - *

            - * Obs.: Os limites mínimos e máximos do módulo 11 para o cálculo do primeiro e - * do segundo dígito verificador são 2 - 10 e 2 e 11, respectivamente. - *

            - * - * @see Modulo - * - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento - * Mercantil - * - * @since 0.2 - * - * @version 0.2 - */ -public class CPFDV extends AbstractDigitoVerificador { - - /** - * - */ - private static final long serialVersionUID = 2059692008894172695L; - - /** - *

            - * Liminte mínimo do para cálculo no módulo 11. - *

            - */ - private static final int LIMITE_MINIMO = 2; - - /** - *

            - * Expressão regular para validação dos nove primeiros números do CPF sem - * formatação: "#########". - *

            - */ - private static final String REGEX_CPF_DV = "\\d{9}"; - - /** - *

            - * Expressão regular para validação dos nove primeiros números do CPF - * formatado: "###.###.###". - *

            - */ - private static final String REGEX_CPF_DV_FORMATTED = "\\d{3}\\.\\d{3}\\.\\d{3}"; - - /** - * @see br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(long) - * @since 0.2 - */ - @Override - public int calcule(long numero) { - - return calcule(Filler.ZERO_LEFT.fill(String.valueOf(numero), 9)); - } - - /** - * @see br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) - * @since 0.2 - */ - @Override - public int calcule(String numero) throws IllegalArgumentException { - - int dv1 = 0; - int dv2 = 0; - boolean isFormatoValido = false; - - validacao: { - - if (StringUtils.isNotBlank(numero)) { - - isFormatoValido = (Pattern.matches(REGEX_CPF_DV, numero) || Pattern - .matches(REGEX_CPF_DV_FORMATTED, numero)); - - if (isFormatoValido) { - - numero = StringUtils.replaceChars(numero, ".", ""); - - dv1 = calcule(numero, 10); - dv2 = calcule(numero + dv1, 11); - - break validacao; - } - } - - throw new IllegalArgumentException( - "O CPF [ " - + numero - + " ] deve conter apenas números, sendo eles no formato ###.###.### ou ######### !"); - - } - - return Integer.parseInt(dv1 + "" + dv2); - - } - - /** - *

            - * Método auxiliar para o cálculo do dígito verificador. - *

            - *

            - * Calcula os dígitos separadamente. - *

            - * - * @param numero - * - número a partir do qual será extraído o dígito verificador. - * @param limiteMaximoDoModulo - * - limite máximo do módulo utilizado, no caso, módulo 11. - * @return um número que faz parte de um dígito verificador. - * @throws IllegalArgumentException - * caso o número não esteja no formatador desejável. - * @since 0.2 - */ - private int calcule(String numero, int limiteMaximoDoModulo) - throws IllegalArgumentException { - - int dv = 0; - int resto = 0; - - resto = Modulo - .calculeMod11(numero, LIMITE_MINIMO, limiteMaximoDoModulo); - - if (resto >= 2) { - - dv = TipoDeModulo.MODULO11.valor() - resto; - } - - return dv; - } -} +/* + * 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:51:09 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:51:09 + * + */ + +package org.jrimum.vallia; + +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; +import org.jrimum.texgit.Filler; + + +/** + *

            + * O cálculo do dígito verificador do CPF é realizado em duas etapas e é + * auxiliado pela rotina de módulo 11. + *

            + *

            + * Abaixo é demonstrado como esse cálculo é feito: + *

            + *

            Exemplo para um número hipotético 222.333.666-XX:

            + *

            + * Primeiramente obtém-se um número R, calculado através da rotina de módulo 11, + * a partir dos nove primeiros números do CPF, nesse caso 222333666. + * Para obter o primeiro dígito verificador deve-se seguir a seguinte lógica: + * + * Se o número R for menor que 2, o dígito terá valor 0 (zero); senão, será a + * subtração do valor do módulo (11) menos o valor do número R, ou seja, + * DV = 11 - R. + *

            + *

            + * Para obter o segundo dígito verificador é da mesma forma do primeiro, porém + * deve ser calculado a partir dos dez primeiros números do CPF, ou seja, + * 222333666 + primeiro dígito. + *

            + *

            + * Obs.: Os limites mínimos e máximos do módulo 11 para o cálculo do primeiro e + * do segundo dígito verificador são 2 - 10 e 2 e 11, respectivamente. + *

            + * + * @see Modulo + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class CPFDV extends AbstractDigitoVerificador { + + /** + * + */ + private static final long serialVersionUID = 2059692008894172695L; + + /** + *

            + * Liminte mínimo do para cálculo no módulo 11. + *

            + */ + private static final int LIMITE_MINIMO = 2; + + /** + *

            + * Expressão regular para validação dos nove primeiros números do CPF sem + * formatação: "#########". + *

            + */ + private static final String REGEX_CPF_DV = "\\d{9}"; + + /** + *

            + * Expressão regular para validação dos nove primeiros números do CPF + * formatado: "###.###.###". + *

            + */ + private static final String REGEX_CPF_DV_FORMATTED = "\\d{3}\\.\\d{3}\\.\\d{3}"; + + /** + * @see br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(long) + * @since 0.2 + */ + @Override + public int calcule(long numero) { + + return calcule(Filler.ZERO_LEFT.fill(String.valueOf(numero), 9)); + } + + /** + * @see br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) + * @since 0.2 + */ + @Override + public int calcule(String numero) throws IllegalArgumentException { + + int dv1 = 0; + int dv2 = 0; + boolean isFormatoValido = false; + + validacao: { + + if (StringUtils.isNotBlank(numero)) { + + isFormatoValido = (Pattern.matches(REGEX_CPF_DV, numero) || Pattern + .matches(REGEX_CPF_DV_FORMATTED, numero)); + + if (isFormatoValido) { + + numero = StringUtils.replaceChars(numero, ".", ""); + + dv1 = calcule(numero, 10); + dv2 = calcule(numero + dv1, 11); + + break validacao; + } + } + + throw new IllegalArgumentException( + "O CPF [ " + + numero + + " ] deve conter apenas números, sendo eles no formato ###.###.### ou ######### !"); + + } + + return Integer.parseInt(dv1 + "" + dv2); + + } + + /** + *

            + * Método auxiliar para o cálculo do dígito verificador. + *

            + *

            + * Calcula os dígitos separadamente. + *

            + * + * @param numero + * - número a partir do qual será extraído o dígito verificador. + * @param limiteMaximoDoModulo + * - limite máximo do módulo utilizado, no caso, módulo 11. + * @return um número que faz parte de um dígito verificador. + * @throws IllegalArgumentException + * caso o número não esteja no formatador desejável. + * @since 0.2 + */ + private int calcule(String numero, int limiteMaximoDoModulo) + throws IllegalArgumentException { + + int dv = 0; + int resto = 0; + + resto = Modulo + .calculeMod11(numero, LIMITE_MINIMO, limiteMaximoDoModulo); + + if (resto >= 2) { + + dv = TipoDeModulo.MODULO11.valor() - resto; + } + + return dv; + } +} diff --git a/src/main/java/org/jrimum/vallia/GuiaCodigoDeBarrasDV.java b/src/main/java/org/jrimum/vallia/GuiaCodigoDeBarrasDV.java index 8d9e0ffc..76865468 100644 --- a/src/main/java/org/jrimum/vallia/GuiaCodigoDeBarrasDV.java +++ b/src/main/java/org/jrimum/vallia/GuiaCodigoDeBarrasDV.java @@ -1,100 +1,100 @@ -/* - * 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:22:11 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:22:11 - * - */ - -package org.jrimum.vallia; - -import org.apache.commons.lang3.StringUtils; - - -public class GuiaCodigoDeBarrasDV extends AbstractDigitoVerificador { - - private static final long serialVersionUID = -560089440368821000L; - - private static final int TAMANHO_SEM_DV = 43; - - private Modulo modulo; - - /** - *

            - * Construtor vaizo, o mesmo que super(). - *

            - * - * @since 0.2 - */ - public GuiaCodigoDeBarrasDV(Modulo modulo) { - super(); - this.modulo = modulo; - } - - /** - * @see - * @since 0.3 - */ - @Override - public int calcule(String numero) throws IllegalArgumentException { - - int dv = 0; - int resto = 0; - - if (StringUtils.isNotBlank(numero) && StringUtils.isNumeric(numero) - && (numero.length() == TAMANHO_SEM_DV)) { - - // Realizando o cálculo do dígito verificador. - resto = modulo.calcule(numero); - - if (modulo.getMod() == TipoDeModulo.MODULO11) { - // Seguindo as especificações da FEBRABAN, caso o resto seja - // (0), (1) ou (10), será atribuído (1) ao digito verificador. - if ((resto == 0) || (resto == 1) || (resto == 10)) - dv = 1; - // Caso contrário, dv = 11 - resto. - else - dv = modulo.valor() - resto; - } - - else if (modulo.getMod() == TipoDeModulo.MODULO10) { - // Seguindo as especificações da FEBRABAN, caso o resto seja - // (0) ou (10), será atribuido o valor zero. - if ( (resto == 0) || (resto == 10) ) - dv = 0; - // Caso contrário, dv = 10 - resto. - else - dv = modulo.valor() - resto; - } - - } else { - throw new IllegalArgumentException("O código de barras " + "[ " - + numero + " ] deve conter apenas números e " - + TAMANHO_SEM_DV + " caracteres."); - } - - return dv; - } - -} +/* + * 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:22:11 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:22:11 + * + */ + +package org.jrimum.vallia; + +import org.apache.commons.lang3.StringUtils; + + +public class GuiaCodigoDeBarrasDV extends AbstractDigitoVerificador { + + private static final long serialVersionUID = -560089440368821000L; + + private static final int TAMANHO_SEM_DV = 43; + + private Modulo modulo; + + /** + *

            + * Construtor vaizo, o mesmo que super(). + *

            + * + * @since 0.2 + */ + public GuiaCodigoDeBarrasDV(Modulo modulo) { + super(); + this.modulo = modulo; + } + + /** + * @see + * @since 0.3 + */ + @Override + public int calcule(String numero) throws IllegalArgumentException { + + int dv = 0; + int resto = 0; + + if (StringUtils.isNotBlank(numero) && StringUtils.isNumeric(numero) + && (numero.length() == TAMANHO_SEM_DV)) { + + // Realizando o cálculo do dígito verificador. + resto = modulo.calcule(numero); + + if (modulo.getMod() == TipoDeModulo.MODULO11) { + // Seguindo as especificações da FEBRABAN, caso o resto seja + // (0), (1) ou (10), será atribuído (1) ao digito verificador. + if ((resto == 0) || (resto == 1) || (resto == 10)) + dv = 1; + // Caso contrário, dv = 11 - resto. + else + dv = modulo.valor() - resto; + } + + else if (modulo.getMod() == TipoDeModulo.MODULO10) { + // Seguindo as especificações da FEBRABAN, caso o resto seja + // (0) ou (10), será atribuido o valor zero. + if ( (resto == 0) || (resto == 10) ) + dv = 0; + // Caso contrário, dv = 10 - resto. + else + dv = modulo.valor() - resto; + } + + } else { + throw new IllegalArgumentException("O código de barras " + "[ " + + numero + " ] deve conter apenas números e " + + TAMANHO_SEM_DV + " caracteres."); + } + + return dv; + } + +} diff --git a/src/main/java/org/jrimum/vallia/GuiaLinhaDigitavelDV.java b/src/main/java/org/jrimum/vallia/GuiaLinhaDigitavelDV.java index f0f5906e..c9230242 100644 --- a/src/main/java/org/jrimum/vallia/GuiaLinhaDigitavelDV.java +++ b/src/main/java/org/jrimum/vallia/GuiaLinhaDigitavelDV.java @@ -1,107 +1,107 @@ -/* - * 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:22:21 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:22:21 - * - */ - -package org.jrimum.vallia; - -import java.io.Serializable; - -import org.apache.commons.lang3.StringUtils; - - -public class GuiaLinhaDigitavelDV extends AbstractDigitoVerificador implements Serializable { - - private static final long serialVersionUID = -1093744246886652909L; - - /** - *

            - * Módulo utilizado no cálculo. - *

            - */ - private Modulo modulo; - - /** - *

            - * Construtor vaizo, o mesmo que super(). - *

            - * - * @since 0.3 - */ - public GuiaLinhaDigitavelDV(Modulo modulo) { - super(); - this.modulo = modulo; - } - - /** - * @see br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) - * @since 0.3 - */ - @Override - public int calcule(String numeroStr) throws IllegalArgumentException { - - int dv = 0; - int resto = 0; - - if ( - StringUtils.isNotBlank(numeroStr) - && StringUtils.isNumeric(numeroStr) - && (numeroStr.length() == 11) - ) { - - resto = modulo.calcule(numeroStr); - - - if (modulo.getMod() == TipoDeModulo.MODULO11) { - // Seguindo as especificações da FEBRABAN, caso o resto seja - // (0), (1) ou (10), será atribuído (1) ao digito verificador. - if ((resto == 0) || (resto == 1) || (resto == 10)) - dv = 1; - // Caso contrário, dv = 11 - resto. - else - dv = modulo.valor() - resto; - } - - else if (modulo.getMod() == TipoDeModulo.MODULO10) { - // Seguindo as especificações da FEBRABAN, caso o resto seja - // (0) ou (10), será atribuido o valor zero. - if ( (resto == 0) || (resto == 10) ) - dv = 0; - // Caso contrário, dv = 10 - resto. - else - dv = modulo.valor() - resto; - } - } else - throw new IllegalArgumentException( - "O campo [ " + numeroStr + " ] da linha digitável deve " + - "conter apenas números, com exatamento 11 dígitos, para que " + - "o cálculo do dígito verificador possa ser executado !"); - - return dv; - } - -} +/* + * 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:22:21 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:22:21 + * + */ + +package org.jrimum.vallia; + +import java.io.Serializable; + +import org.apache.commons.lang3.StringUtils; + + +public class GuiaLinhaDigitavelDV extends AbstractDigitoVerificador implements Serializable { + + private static final long serialVersionUID = -1093744246886652909L; + + /** + *

            + * Módulo utilizado no cálculo. + *

            + */ + private Modulo modulo; + + /** + *

            + * Construtor vaizo, o mesmo que super(). + *

            + * + * @since 0.3 + */ + public GuiaLinhaDigitavelDV(Modulo modulo) { + super(); + this.modulo = modulo; + } + + /** + * @see br.com.nordestefomento.jrimum.vallia.digitoverificador.AbstractDigitoVerificador#calcule(java.lang.String) + * @since 0.3 + */ + @Override + public int calcule(String numeroStr) throws IllegalArgumentException { + + int dv = 0; + int resto = 0; + + if ( + StringUtils.isNotBlank(numeroStr) + && StringUtils.isNumeric(numeroStr) + && (numeroStr.length() == 11) + ) { + + resto = modulo.calcule(numeroStr); + + + if (modulo.getMod() == TipoDeModulo.MODULO11) { + // Seguindo as especificações da FEBRABAN, caso o resto seja + // (0), (1) ou (10), será atribuído (1) ao digito verificador. + if ((resto == 0) || (resto == 1) || (resto == 10)) + dv = 1; + // Caso contrário, dv = 11 - resto. + else + dv = modulo.valor() - resto; + } + + else if (modulo.getMod() == TipoDeModulo.MODULO10) { + // Seguindo as especificações da FEBRABAN, caso o resto seja + // (0) ou (10), será atribuido o valor zero. + if ( (resto == 0) || (resto == 10) ) + dv = 0; + // Caso contrário, dv = 10 - resto. + else + dv = modulo.valor() - resto; + } + } else + throw new IllegalArgumentException( + "O campo [ " + numeroStr + " ] da linha digitável deve " + + "conter apenas números, com exatamento 11 dígitos, para que " + + "o cálculo do dígito verificador possa ser executado !"); + + return dv; + } + +} diff --git a/src/main/java/org/jrimum/vallia/Modulo.java b/src/main/java/org/jrimum/vallia/Modulo.java index 118d08ae..c25cc0f5 100644 --- a/src/main/java/org/jrimum/vallia/Modulo.java +++ b/src/main/java/org/jrimum/vallia/Modulo.java @@ -1,522 +1,522 @@ -/* - * 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: 20/04/2008 - 18:11:05 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Criado em: 20/04/2008 - 18:11:05 - * - */ -package org.jrimum.vallia; - -import static org.jrimum.vallia.TipoDeModulo.MODULO10; -import static org.jrimum.vallia.TipoDeModulo.MODULO11; - -import org.apache.commons.lang3.StringUtils; - -import org.jrimum.utilix.ObjectUtil; -import static org.jrimum.utilix.ObjectUtil.isNotNull; - -/** - *

            - * Representa o módulo no contexto de autenticação, ou seja, uma rotina que - * auxilia no cálculo do dígito verificador. - *

            - *

            - * As rotinas tradicionais são Módulo 10 e Módulo 11. - *

            - * - * @author Gilmar P.S.L. - * - * @version 0.2 - * - * @since 0.2 - */ -public class Modulo { - - /** - * - */ - private static final long serialVersionUID = -3612368544258125201L; - - /** - *

            - * Mensagem da exceção lançada no método calcular. - *

            - */ - private static final String O_ARGUMENTO_DEVE_CONTER_APENAS_NUMEROS = "O argumento deve conter apenas números !"; - - public static final int MOD10 = TipoDeModulo.MODULO10.valor(); - - public static final int MOD11 = TipoDeModulo.MODULO11.valor(); - - private TipoDeModulo mod; - - /** - *

            - * Valor inteiro do "peso" mínimo mutiplicador utilizado no cálculo do - * módulo. - *

            - */ - private int limiteMaximo; - - /** - *

            - * Valor inteiro do "peso" máximo mutiplicador utilizado no cálculo do - * módulo. - *

            - */ - private int limiteMinimo; - - /** - *

            - * Inicializa um módulo com valores default. - *

            - * - * @param mod tipo do módulo - * @see #initDefault - * @see #calcule(String) - * @since 0.2 - */ - public Modulo(TipoDeModulo mod) { - super(); - - if (isNotNull(mod, "modulo")) { - - this.mod = mod; - initDefault(); - } - } - - /** - *

            - * Inicializa um módulo com o tipo definido com valores default. - *

            - * - * @param limiteMaximo peso máximo - * @param limiteMinimo peso mínimo - * @param mod tipo do módulo - * @see #calcule(String) - * @since 0.2 - */ - public Modulo(TipoDeModulo mod, int limiteMaximo, int limiteMinimo) { - super(); - - if (isNotNull(mod, "modulo")) { - - this.limiteMaximo = limiteMaximo; - this.limiteMinimo = limiteMinimo; - this.mod = mod; - } - } - - /** - *

            - * Retorna o valor da instância do módulo de acordo com a enum - * da instância. - *

            - * - *

            - * Se por um acaso a instância enum for nula uma - * NullPointerException será lançada. Caso a enum - * contenha um módulo não implementado por essa classe o retorno será - * -1 - *

            - * - * @return valor da instância do módulo. - * - * @since 0.2 - */ - public int valor() { - - switch (mod) { - - case MODULO10: - - return MODULO10.valor(); - - case MODULO11: - - return MODULO11.valor(); - - default: - return -1; - } - - } - - /** - *

            - * Executa o cáculo do módulo 11 com os limites definidos. - *

            - * - *

            - * Transforma o numero em string e executa o método - * calculeMod11 - *

            - * - * @param numero - * @param limiteMin - * @param limiteMax - * @return resultado do cálculo - * - * @since 0.2 - * @see #calculeMod11(String, int, int) - */ - public static int calculeMod11(long numero, int limiteMin, int limiteMax) { - - return calculeMod11(String.valueOf(numero), limiteMin, limiteMax); - } - - /** - *

            - * Realiza o cálculo da soma na forma do módulo 11. - *

            - *

            - * O módulo 11 funciona da seguinte maneira: - *

            - *

            - * Cada dígito do número, começando da direita para a esquerda (menos - * significativo para o mais significativo), é multiplicado pelo números - * limite mínimo, limite mínimo + 1, limite mínimo + 2 e assim - * sucessivamente até o limite máxmio definido, então inicia-se novamente a - * contagem. - *

            - *

            - * Exemplo para o número 654321: - * - *

            -     * +---+---+---+---+---+---+
            -     * | 6 | 5 | 4 | 3 | 2 | 1 |
            -     * +---+---+---+---+---+---+
            -     *   |   |   |   |   |   |
            -     *  x7  x6  x5  x4  x3  x2
            -     *   |   |   |   |   |   |
            -     *  =42 =30 =20 =12 =6  =2
            -     *   +---+---+---+---+---+->
            -     * 
            - * - * @param numero - * @param limiteMin - * @param limiteMax - * @return valor do módulo - * @throws IllegalArgumentException - * - * @since 0.2 - */ - public static int calculeMod11(String numero, int limiteMin, int limiteMax) - throws IllegalArgumentException { - - return (calculeSomaSequencialMod11(numero, limiteMin, limiteMax) % 11); - } - - public static int calculeSomaSequencialMod11(String numero, int limiteMin, - int limiteMax) throws IllegalArgumentException { - - int peso = 0; - int soma = 0; - - if (StringUtils.isNotBlank(numero) && StringUtils.isNumeric(numero)) { - - StringBuilder sb = new StringBuilder(numero); - sb.reverse(); - - peso = limiteMin; - - for (char c : sb.toString().toCharArray()) { - soma += peso * Character.getNumericValue(c); - peso++; - - if (peso > limiteMax) { - peso = limiteMin; - } - } - - } else { - throw new IllegalArgumentException( - O_ARGUMENTO_DEVE_CONTER_APENAS_NUMEROS); - } - - return soma; - } - - /** - *

            - * Executa o cáculo do módulo 10 com os limites definidos. - *

            - * - *

            - * Transforma o numero em string e executa o método - * calculeMod10 - *

            - * - * @param numero - * @param limiteMin - * @param limiteMax - * @return resultado do cálculo - * - * @since 0.2 - * @see #calculeMod10(String, int, int) - */ - public static int calculeMod10(long numero, int limiteMin, int limiteMax) { - - return calculeMod10(String.valueOf(numero), limiteMin, limiteMax); - } - - /** - *

            - * Executa o cáculo do módulo 10 com os limites definidos. - *

            - * - *

            - * Executa o método calculeSomaSequencialMod10 e aplica o - * resultado em % 10 - *

            - * - * @param numero - * @param limiteMin - * @param limiteMax - * @return resultado de calculeSomaSequencialMod10 % 10 - * - * @since 0.2 - * @see #calculeSomaSequencialMod10(String, int, int) - */ - public static int calculeMod10(String numero, int limiteMin, int limiteMax) - throws IllegalArgumentException { - - return (calculeSomaSequencialMod10(numero, limiteMin, limiteMax) % 10); - } - - /** - *

            - * Realiza o cálculo da soma na forma do módulo 10. - *

            - *

            - * O módulo 10 funciona da seguinte maneira: - *

            - *

            - * Cada dígito do número, começando da direita para a esquerda (menos - * significativo para o mais significativo), é multiplicado pelo números - * limite mínimo, limite mínimo + 1, limite mínimo + 2 e assim - * sucessivamente até o limite máxmio definido, então inicia-se novamente a - * contagem. - *

            - *

            - * Exemplo para o número 123456: - * - *

            -     * +---+---+---+---+---+---+
            -     * | 1 | 2 | 3 | 4 | 5 | 6 |
            -     * +---+---+---+---+---+---+
            -     *   |   |   |   |   |   |
            -     *  x1  x2  x1  x2  x1  x2
            -     *   |   |   |   |   |   |
            -     *  =1  =4  =3  =8  =5  =[ 3 <= ( 1 + 2 <==12 ) ] = 24
            -     *   +---+---+---+---+---+-> = (24 / 10) = 3, resto 3; Então o módulo é igual a 3.
            -     * 
            - * - *

            - * - *

            - * Geralmente os limites para o módulo 10 são mínimo 1 e máximo 2 apenas. - *

            - * - * @param numero - * @param limiteMin - * @param limiteMax - * @return soma sequencial usada no cálculo do módulo - * @throws IllegalArgumentException - * - * @since 0.2 - */ - public static int calculeSomaSequencialMod10(String numero, int limiteMin, - int limiteMax) throws IllegalArgumentException { - - int produto = 0; - int peso = 0; - int soma = 0; - - if (StringUtils.isNotBlank(numero) && StringUtils.isNumeric(numero)) { - - StringBuilder sb = new StringBuilder(numero); - sb.reverse(); - - peso = limiteMax; - - for (char c : sb.toString().toCharArray()) { - - produto = peso * Character.getNumericValue(c); - - if (produto > 9) { - - soma += produto / 10; - soma += produto % 10; - } else { - soma += produto; - } - - peso = (peso == limiteMax) ? limiteMin : limiteMax; - } - - } else { - throw new IllegalArgumentException( - O_ARGUMENTO_DEVE_CONTER_APENAS_NUMEROS); - } - - return soma; - } - - /** - *

            - * Executa o cáculo do módulo da instância. - *

            - * - * @param numero - * @return - * @throws IllegalArgumentException - * - * @since 0.2 - */ - public int calcule(String numero) throws IllegalArgumentException { - - int modulo = 0; - - switch (mod) { - - case MODULO10: - - modulo = calculeMod10(numero, getLimiteMinimo(), getLimiteMaximo()); - - break; - - case MODULO11: - - modulo = calculeMod11(numero, getLimiteMinimo(), getLimiteMaximo()); - - break; - } - - return modulo; - } - - /** - *

            - * Executa o cáculo do módulo da instância. - *

            - * - * @param numero - * @return - * - * @since 0.2 - */ - public int calcule(long numero) { - - return calcule(String.valueOf(numero)); - } - - /** - *

            - * Inicializa as variáveis limiteMaximo e - * limiteMinimo com os valores padrões de acordo com a - * instância do módulo da classe. - *

            - * - *

            - * Valores padrões:
            - *
            - * MODULO10: (limiteMinimo = 1 e limiteMaximo = 2)
            - * - * MODULO11: (limiteMinimo = 2 e limiteMaximo = 9)
            - *

            - * - * @since 0.2 - */ - private void initDefault() { - - switch (mod) { - - case MODULO10: - - setLimiteMinimo(1); - setLimiteMaximo(2); - - break; - - case MODULO11: - - setLimiteMinimo(2); - setLimiteMaximo(9); - - break; - } - } - - /** - * @return the limiteMaximo - */ - public int getLimiteMaximo() { - return limiteMaximo; - } - - /** - * @param limiteMaximo the limiteMaximo to set - */ - public void setLimiteMaximo(int limiteMaximo) { - this.limiteMaximo = limiteMaximo; - } - - /** - * @return the limiteMinimo - */ - public int getLimiteMinimo() { - return limiteMinimo; - } - - /** - * @param limiteMinimo the limiteMinimo to set - */ - public void setLimiteMinimo(int limiteMinimo) { - this.limiteMinimo = limiteMinimo; - } - - /** - * @return the mod - */ - public TipoDeModulo getMod() { - return mod; - } - - /** - * @param mod the mod to set - */ - public void setMod(TipoDeModulo mod) { - this.mod = mod; - } - - @Override - public String toString() { - return ObjectUtil.toString(this); - } -} +/* + * 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: 20/04/2008 - 18:11:05 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 20/04/2008 - 18:11:05 + * + */ +package org.jrimum.vallia; + +import static org.jrimum.vallia.TipoDeModulo.MODULO10; +import static org.jrimum.vallia.TipoDeModulo.MODULO11; + +import org.apache.commons.lang3.StringUtils; + +import org.jrimum.utilix.ObjectUtil; +import static org.jrimum.utilix.ObjectUtil.isNotNull; + +/** + *

            + * Representa o módulo no contexto de autenticação, ou seja, uma rotina que + * auxilia no cálculo do dígito verificador. + *

            + *

            + * As rotinas tradicionais são Módulo 10 e Módulo 11. + *

            + * + * @author Gilmar P.S.L. + * + * @version 0.2 + * + * @since 0.2 + */ +public class Modulo { + + /** + * + */ + private static final long serialVersionUID = -3612368544258125201L; + + /** + *

            + * Mensagem da exceção lançada no método calcular. + *

            + */ + private static final String O_ARGUMENTO_DEVE_CONTER_APENAS_NUMEROS = "O argumento deve conter apenas números !"; + + public static final int MOD10 = TipoDeModulo.MODULO10.valor(); + + public static final int MOD11 = TipoDeModulo.MODULO11.valor(); + + private TipoDeModulo mod; + + /** + *

            + * Valor inteiro do "peso" mínimo mutiplicador utilizado no cálculo do + * módulo. + *

            + */ + private int limiteMaximo; + + /** + *

            + * Valor inteiro do "peso" máximo mutiplicador utilizado no cálculo do + * módulo. + *

            + */ + private int limiteMinimo; + + /** + *

            + * Inicializa um módulo com valores default. + *

            + * + * @param mod tipo do módulo + * @see #initDefault + * @see #calcule(String) + * @since 0.2 + */ + public Modulo(TipoDeModulo mod) { + super(); + + if (isNotNull(mod, "modulo")) { + + this.mod = mod; + initDefault(); + } + } + + /** + *

            + * Inicializa um módulo com o tipo definido com valores default. + *

            + * + * @param limiteMaximo peso máximo + * @param limiteMinimo peso mínimo + * @param mod tipo do módulo + * @see #calcule(String) + * @since 0.2 + */ + public Modulo(TipoDeModulo mod, int limiteMaximo, int limiteMinimo) { + super(); + + if (isNotNull(mod, "modulo")) { + + this.limiteMaximo = limiteMaximo; + this.limiteMinimo = limiteMinimo; + this.mod = mod; + } + } + + /** + *

            + * Retorna o valor da instância do módulo de acordo com a enum + * da instância. + *

            + * + *

            + * Se por um acaso a instância enum for nula uma + * NullPointerException será lançada. Caso a enum + * contenha um módulo não implementado por essa classe o retorno será + * -1 + *

            + * + * @return valor da instância do módulo. + * + * @since 0.2 + */ + public int valor() { + + switch (mod) { + + case MODULO10: + + return MODULO10.valor(); + + case MODULO11: + + return MODULO11.valor(); + + default: + return -1; + } + + } + + /** + *

            + * Executa o cáculo do módulo 11 com os limites definidos. + *

            + * + *

            + * Transforma o numero em string e executa o método + * calculeMod11 + *

            + * + * @param numero + * @param limiteMin + * @param limiteMax + * @return resultado do cálculo + * + * @since 0.2 + * @see #calculeMod11(String, int, int) + */ + public static int calculeMod11(long numero, int limiteMin, int limiteMax) { + + return calculeMod11(String.valueOf(numero), limiteMin, limiteMax); + } + + /** + *

            + * Realiza o cálculo da soma na forma do módulo 11. + *

            + *

            + * O módulo 11 funciona da seguinte maneira: + *

            + *

            + * Cada dígito do número, começando da direita para a esquerda (menos + * significativo para o mais significativo), é multiplicado pelo números + * limite mínimo, limite mínimo + 1, limite mínimo + 2 e assim + * sucessivamente até o limite máxmio definido, então inicia-se novamente a + * contagem. + *

            + *

            + * Exemplo para o número 654321: + * + *

            +     * +---+---+---+---+---+---+
            +     * | 6 | 5 | 4 | 3 | 2 | 1 |
            +     * +---+---+---+---+---+---+
            +     *   |   |   |   |   |   |
            +     *  x7  x6  x5  x4  x3  x2
            +     *   |   |   |   |   |   |
            +     *  =42 =30 =20 =12 =6  =2
            +     *   +---+---+---+---+---+->
            +     * 
            + * + * @param numero + * @param limiteMin + * @param limiteMax + * @return valor do módulo + * @throws IllegalArgumentException + * + * @since 0.2 + */ + public static int calculeMod11(String numero, int limiteMin, int limiteMax) + throws IllegalArgumentException { + + return (calculeSomaSequencialMod11(numero, limiteMin, limiteMax) % 11); + } + + public static int calculeSomaSequencialMod11(String numero, int limiteMin, + int limiteMax) throws IllegalArgumentException { + + int peso = 0; + int soma = 0; + + if (StringUtils.isNotBlank(numero) && StringUtils.isNumeric(numero)) { + + StringBuilder sb = new StringBuilder(numero); + sb.reverse(); + + peso = limiteMin; + + for (char c : sb.toString().toCharArray()) { + soma += peso * Character.getNumericValue(c); + peso++; + + if (peso > limiteMax) { + peso = limiteMin; + } + } + + } else { + throw new IllegalArgumentException( + O_ARGUMENTO_DEVE_CONTER_APENAS_NUMEROS); + } + + return soma; + } + + /** + *

            + * Executa o cáculo do módulo 10 com os limites definidos. + *

            + * + *

            + * Transforma o numero em string e executa o método + * calculeMod10 + *

            + * + * @param numero + * @param limiteMin + * @param limiteMax + * @return resultado do cálculo + * + * @since 0.2 + * @see #calculeMod10(String, int, int) + */ + public static int calculeMod10(long numero, int limiteMin, int limiteMax) { + + return calculeMod10(String.valueOf(numero), limiteMin, limiteMax); + } + + /** + *

            + * Executa o cáculo do módulo 10 com os limites definidos. + *

            + * + *

            + * Executa o método calculeSomaSequencialMod10 e aplica o + * resultado em % 10 + *

            + * + * @param numero + * @param limiteMin + * @param limiteMax + * @return resultado de calculeSomaSequencialMod10 % 10 + * + * @since 0.2 + * @see #calculeSomaSequencialMod10(String, int, int) + */ + public static int calculeMod10(String numero, int limiteMin, int limiteMax) + throws IllegalArgumentException { + + return (calculeSomaSequencialMod10(numero, limiteMin, limiteMax) % 10); + } + + /** + *

            + * Realiza o cálculo da soma na forma do módulo 10. + *

            + *

            + * O módulo 10 funciona da seguinte maneira: + *

            + *

            + * Cada dígito do número, começando da direita para a esquerda (menos + * significativo para o mais significativo), é multiplicado pelo números + * limite mínimo, limite mínimo + 1, limite mínimo + 2 e assim + * sucessivamente até o limite máxmio definido, então inicia-se novamente a + * contagem. + *

            + *

            + * Exemplo para o número 123456: + * + *

            +     * +---+---+---+---+---+---+
            +     * | 1 | 2 | 3 | 4 | 5 | 6 |
            +     * +---+---+---+---+---+---+
            +     *   |   |   |   |   |   |
            +     *  x1  x2  x1  x2  x1  x2
            +     *   |   |   |   |   |   |
            +     *  =1  =4  =3  =8  =5  =[ 3 <= ( 1 + 2 <==12 ) ] = 24
            +     *   +---+---+---+---+---+-> = (24 / 10) = 3, resto 3; Então o módulo é igual a 3.
            +     * 
            + * + *

            + * + *

            + * Geralmente os limites para o módulo 10 são mínimo 1 e máximo 2 apenas. + *

            + * + * @param numero + * @param limiteMin + * @param limiteMax + * @return soma sequencial usada no cálculo do módulo + * @throws IllegalArgumentException + * + * @since 0.2 + */ + public static int calculeSomaSequencialMod10(String numero, int limiteMin, + int limiteMax) throws IllegalArgumentException { + + int produto = 0; + int peso = 0; + int soma = 0; + + if (StringUtils.isNotBlank(numero) && StringUtils.isNumeric(numero)) { + + StringBuilder sb = new StringBuilder(numero); + sb.reverse(); + + peso = limiteMax; + + for (char c : sb.toString().toCharArray()) { + + produto = peso * Character.getNumericValue(c); + + if (produto > 9) { + + soma += produto / 10; + soma += produto % 10; + } else { + soma += produto; + } + + peso = (peso == limiteMax) ? limiteMin : limiteMax; + } + + } else { + throw new IllegalArgumentException( + O_ARGUMENTO_DEVE_CONTER_APENAS_NUMEROS); + } + + return soma; + } + + /** + *

            + * Executa o cáculo do módulo da instância. + *

            + * + * @param numero + * @return + * @throws IllegalArgumentException + * + * @since 0.2 + */ + public int calcule(String numero) throws IllegalArgumentException { + + int modulo = 0; + + switch (mod) { + + case MODULO10: + + modulo = calculeMod10(numero, getLimiteMinimo(), getLimiteMaximo()); + + break; + + case MODULO11: + + modulo = calculeMod11(numero, getLimiteMinimo(), getLimiteMaximo()); + + break; + } + + return modulo; + } + + /** + *

            + * Executa o cáculo do módulo da instância. + *

            + * + * @param numero + * @return + * + * @since 0.2 + */ + public int calcule(long numero) { + + return calcule(String.valueOf(numero)); + } + + /** + *

            + * Inicializa as variáveis limiteMaximo e + * limiteMinimo com os valores padrões de acordo com a + * instância do módulo da classe. + *

            + * + *

            + * Valores padrões: + * + * MODULO10: (limiteMinimo = 1 e limiteMaximo = 2) + * + * MODULO11: (limiteMinimo = 2 e limiteMaximo = 9) + *

            + * + * @since 0.2 + */ + private void initDefault() { + + switch (mod) { + + case MODULO10: + + setLimiteMinimo(1); + setLimiteMaximo(2); + + break; + + case MODULO11: + + setLimiteMinimo(2); + setLimiteMaximo(9); + + break; + } + } + + /** + * @return the limiteMaximo + */ + public int getLimiteMaximo() { + return limiteMaximo; + } + + /** + * @param limiteMaximo the limiteMaximo to set + */ + public void setLimiteMaximo(int limiteMaximo) { + this.limiteMaximo = limiteMaximo; + } + + /** + * @return the limiteMinimo + */ + public int getLimiteMinimo() { + return limiteMinimo; + } + + /** + * @param limiteMinimo the limiteMinimo to set + */ + public void setLimiteMinimo(int limiteMinimo) { + this.limiteMinimo = limiteMinimo; + } + + /** + * @return the mod + */ + public TipoDeModulo getMod() { + return mod; + } + + /** + * @param mod the mod to set + */ + public void setMod(TipoDeModulo mod) { + this.mod = mod; + } + + @Override + public String toString() { + return ObjectUtil.toString(this); + } +} diff --git a/src/test/java/org/jrimum/bopepo/TestCodigoDeBarras.java b/src/test/java/org/jrimum/bopepo/TestCodigoDeBarras.java index 43c25958..4696a05a 100644 --- a/src/test/java/org/jrimum/bopepo/TestCodigoDeBarras.java +++ b/src/test/java/org/jrimum/bopepo/TestCodigoDeBarras.java @@ -1,140 +1,140 @@ -/* - * 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:12:06 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/03/2008 - 18:12:06 - * - */ - - -package org.jrimum.bopepo; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.math.BigDecimal; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; - -import org.jrimum.bopepo.campolivre.CampoLivre; -import org.jrimum.bopepo.campolivre.CampoLivreFactory; -import org.jrimum.domkee.banco.Agencia; -import org.jrimum.domkee.banco.Carteira; -import org.jrimum.domkee.banco.Cedente; -import org.jrimum.domkee.banco.ContaBancaria; -import org.jrimum.domkee.banco.NumeroDaConta; -import org.jrimum.domkee.banco.Sacado; -import org.jrimum.domkee.banco.TipoDeMoeda; -import org.jrimum.domkee.banco.Titulo; -import org.junit.Before; -import org.junit.Test; - -/** - * - * Teste Unitário para:
            - * {@link org.jrimum.bopepo.CodigoDeBarras#getFatorDeVencimento()} - * - * - * - * @author Gilmar P.S.L. - * @author Misael Barreto - * @author Rômulo Augusto - * - * @since 0.2 - * - * @version 0.2 - */ -public class TestCodigoDeBarras{ - - private CampoLivre clBradesco; - - private Titulo titulo; - - private CodigoDeBarras codigoDeBarras; - - private Date VENCIMENTO = new GregorianCalendar(2000, Calendar.JULY, 3).getTime(); - - @Before - public void setUp() throws Exception { - - Sacado sacado = new Sacado("Sacado"); - Cedente cedente = new Cedente("Cedente"); - - ContaBancaria contaBancaria = new ContaBancaria(); - contaBancaria.setBanco(BancosSuportados.BANCO_BRADESCO.create()); - - Agencia agencia = new Agencia(1234, "1"); - contaBancaria.setAgencia(agencia); - - contaBancaria.setCarteira(new Carteira(5)); - - NumeroDaConta numeroDaConta = new NumeroDaConta(); - numeroDaConta.setCodigoDaConta(6789); - contaBancaria.setNumeroDaConta(numeroDaConta); - - titulo = new Titulo(contaBancaria, sacado, cedente); - titulo.setNossoNumero("12345678901"); - titulo.setTipoDeMoeda(TipoDeMoeda.REAL); - titulo.setValor(BigDecimal.valueOf(100.23)); - titulo.setDataDoVencimento(VENCIMENTO); - - clBradesco = CampoLivreFactory.create(titulo); - - codigoDeBarras = new CodigoDeBarras(titulo, clBradesco); - - } - - /** - * Test method for - * {@link org.jrimum.bopepo.CodigoDeBarras#getDigitoVerificadorGeral()}. - */ - @Test - public void testGetDigitoVerificadorGeral() { - assertTrue(2 == codigoDeBarras.getDigitoVerificadorGeral().getValue()); - } - - /** - * Test method for - * {@link org.jrimum.bopepo.CodigoDeBarras#toString()}. - */ - @Test - public void testWrite() { - - assertEquals("23792100000000100231234051234567890100067890", codigoDeBarras.write()); - - } - - /** - * Test method for - * {@link org.jrimum.bopepo.CodigoDeBarras#getFatorDeVencimento()}. - */ - @Test - public void testGetFatorDeVencimento() { - - assertTrue(1000 == codigoDeBarras.getFatorDeVencimento().getValue()); - - } - -} +/* + * 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:12:06 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:12:06 + * + */ + + +package org.jrimum.bopepo; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.jrimum.bopepo.campolivre.CampoLivre; +import org.jrimum.bopepo.campolivre.CampoLivreFactory; +import org.jrimum.domkee.banco.Agencia; +import org.jrimum.domkee.banco.Carteira; +import org.jrimum.domkee.banco.Cedente; +import org.jrimum.domkee.banco.ContaBancaria; +import org.jrimum.domkee.banco.NumeroDaConta; +import org.jrimum.domkee.banco.Sacado; +import org.jrimum.domkee.banco.TipoDeMoeda; +import org.jrimum.domkee.banco.Titulo; +import org.junit.Before; +import org.junit.Test; + +/** + * + * Teste Unitário para: + * {@link org.jrimum.bopepo.CodigoDeBarras#getFatorDeVencimento()} + * + * + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCodigoDeBarras{ + + private CampoLivre clBradesco; + + private Titulo titulo; + + private CodigoDeBarras codigoDeBarras; + + private Date VENCIMENTO = new GregorianCalendar(2000, Calendar.JULY, 3).getTime(); + + @Before + public void setUp() throws Exception { + + Sacado sacado = new Sacado("Sacado"); + Cedente cedente = new Cedente("Cedente"); + + ContaBancaria contaBancaria = new ContaBancaria(); + contaBancaria.setBanco(BancosSuportados.BANCO_BRADESCO.create()); + + Agencia agencia = new Agencia(1234, "1"); + contaBancaria.setAgencia(agencia); + + contaBancaria.setCarteira(new Carteira(5)); + + NumeroDaConta numeroDaConta = new NumeroDaConta(); + numeroDaConta.setCodigoDaConta(6789); + contaBancaria.setNumeroDaConta(numeroDaConta); + + titulo = new Titulo(contaBancaria, sacado, cedente); + titulo.setNossoNumero("12345678901"); + titulo.setTipoDeMoeda(TipoDeMoeda.REAL); + titulo.setValor(BigDecimal.valueOf(100.23)); + titulo.setDataDoVencimento(VENCIMENTO); + + clBradesco = CampoLivreFactory.create(titulo); + + codigoDeBarras = new CodigoDeBarras(titulo, clBradesco); + + } + + /** + * Test method for + * {@link org.jrimum.bopepo.CodigoDeBarras#getDigitoVerificadorGeral()}. + */ + @Test + public void testGetDigitoVerificadorGeral() { + assertTrue(2 == codigoDeBarras.getDigitoVerificadorGeral().getValue()); + } + + /** + * Test method for + * {@link org.jrimum.bopepo.CodigoDeBarras#toString()}. + */ + @Test + public void testWrite() { + + assertEquals("23792100000000100231234051234567890100067890", codigoDeBarras.write()); + + } + + /** + * Test method for + * {@link org.jrimum.bopepo.CodigoDeBarras#getFatorDeVencimento()}. + */ + @Test + public void testGetFatorDeVencimento() { + + assertTrue(1000 == codigoDeBarras.getFatorDeVencimento().getValue()); + + } + +} diff --git a/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaNaoRegistrada.java b/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaNaoRegistrada.java index 8f15d382..e5627f4c 100644 --- a/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaNaoRegistrada.java +++ b/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaNaoRegistrada.java @@ -1,140 +1,140 @@ -package org.jrimum.bopepo.campolivre; - -import org.jrimum.bopepo.BancosSuportados; -import org.jrimum.domkee.banco.Agencia; -import org.jrimum.domkee.banco.Carteira; -import org.jrimum.domkee.banco.NumeroDaConta; -import org.jrimum.domkee.banco.TipoDeCobranca; -import org.junit.Before; -import org.junit.Test; - -/** - *

            - * Teste unitário do campo livre do banco unibanco para cobrança não registrada - *

            - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento Mercantil - * - * @since 0.2 - * - * @version 0.2 - * - */ -public class TestCLUnibancoCobrancaNaoRegistrada extends AbstractCampoLivreBaseTest { - - /** - *

            - * Situação: precisamos emitir um título para um sacado com essas - * características: - *

            - *

            - * Banco: UNIBANCO – identificação 409
            - * Moeda: Real – R$ - identificação 9
            - * Vencimento: 31 de dezembro de 2001
            - * Valor: R$1000,00
            - * Código para transação CVT: 5 (cobrança sem registro – 7744-5)
            - * Número de referência do cliente(NossoNúmero) : 112233445566777
            - * Número de referência do cliente (Código Conta): 1234561
            - *

            - *

            - * NÚMERO DE ORIGEM DO CÓDIGO DE BARRAS: - *

            - *

            - * - *

            -	 * 409  9  2  1546  0000100000  5  1234561  00  112233445566777
            -	 * 
            - * - *

            - *

            - * LINHA DIGITÁVEL: - *

            - *

            - * - *

            -	 * 40995.12347  56100.112236  34455.667773  2  15460000100000
            -	 * 
            - * - *

            - * - * @throws Exception - * - * @since 0.2 - */ - - @Before - public void setUp(){ - - titulo.getContaBancaria().setBanco(BancosSuportados.UNIBANCO.create()); - titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(123456, "1")); - titulo.getContaBancaria().setCarteira(new Carteira(123, TipoDeCobranca.SEM_REGISTRO)); - titulo.getContaBancaria().setAgencia(new Agencia(01234, "1")); - titulo.setNumeroDoDocumento("1234567"); - titulo.setNossoNumero("11223344556677"); - titulo.setDigitoDoNossoNumero("7"); - - createCampoLivreToTest(); - - setCampoLivreEsperadoComoString("5123456100112233445566777"); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComContaNula() { - - titulo.getContaBancaria().setNumeroDaConta(null); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComContaNegativa() { - - titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(-23)); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComDigitoDaContaNula() { - - titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(23, null)); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComDigitoDaContaNegativa() { - - titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(2, "-3")); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComDigitoDaContaNaoNumerico() { - - titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(-23, "X")); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComNossoNumeroNula() { - - titulo.setNossoNumero(null); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComNossoNumeroNegativo() { - - titulo.setNossoNumero("-012345679012345"); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComNossoNumeroNaoNumerico() { - - titulo.setNossoNumero("123456790123y45"); - createCampoLivreToTest(); - } - -} +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.banco.Agencia; +import org.jrimum.domkee.banco.Carteira; +import org.jrimum.domkee.banco.NumeroDaConta; +import org.jrimum.domkee.banco.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + *

            + * Teste unitário do campo livre do banco unibanco para cobrança não registrada + *

            + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + * + */ +public class TestCLUnibancoCobrancaNaoRegistrada extends AbstractCampoLivreBaseTest { + + /** + *

            + * Situação: precisamos emitir um título para um sacado com essas + * características: + *

            + *

            + * Banco: UNIBANCO – identificação 409 + * Moeda: Real – R$ - identificação 9 + * Vencimento: 31 de dezembro de 2001 + * Valor: R$1000,00 + * Código para transação CVT: 5 (cobrança sem registro – 7744-5) + * Número de referência do cliente(NossoNúmero) : 112233445566777 + * Número de referência do cliente (Código Conta): 1234561 + *

            + *

            + * NÚMERO DE ORIGEM DO CÓDIGO DE BARRAS: + *

            + *

            + * + *

            +	 * 409  9  2  1546  0000100000  5  1234561  00  112233445566777
            +	 * 
            + * + *

            + *

            + * LINHA DIGITÁVEL: + *

            + *

            + * + *

            +	 * 40995.12347  56100.112236  34455.667773  2  15460000100000
            +	 * 
            + * + *

            + * + * @throws Exception + * + * @since 0.2 + */ + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.UNIBANCO.create()); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(123456, "1")); + titulo.getContaBancaria().setCarteira(new Carteira(123, TipoDeCobranca.SEM_REGISTRO)); + titulo.getContaBancaria().setAgencia(new Agencia(01234, "1")); + titulo.setNumeroDoDocumento("1234567"); + titulo.setNossoNumero("11223344556677"); + titulo.setDigitoDoNossoNumero("7"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("5123456100112233445566777"); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComContaNula() { + + titulo.getContaBancaria().setNumeroDaConta(null); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComContaNegativa() { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(-23)); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComDigitoDaContaNula() { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(23, null)); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComDigitoDaContaNegativa() { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(2, "-3")); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComDigitoDaContaNaoNumerico() { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(-23, "X")); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComNossoNumeroNula() { + + titulo.setNossoNumero(null); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComNossoNumeroNegativo() { + + titulo.setNossoNumero("-012345679012345"); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComNossoNumeroNaoNumerico() { + + titulo.setNossoNumero("123456790123y45"); + createCampoLivreToTest(); + } + +} diff --git a/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaRegistrada.java b/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaRegistrada.java index 6bc74c1a..8d15766f 100644 --- a/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaRegistrada.java +++ b/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaRegistrada.java @@ -1,146 +1,146 @@ -/* - * 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: 25/04/2008 - 01:53:23 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Criado em: 25/04/2008 - 01:53:23 - * - */ - -package org.jrimum.bopepo.campolivre; - -import java.util.Calendar; - -import org.jrimum.bopepo.BancosSuportados; -import org.jrimum.domkee.banco.Agencia; -import org.jrimum.domkee.banco.Carteira; -import org.jrimum.domkee.banco.TipoDeCobranca; -import org.junit.Before; -import org.junit.Test; - -/** - *

            - * Teste unitário do campo livre do banco unibanco para cobrança não registrada - *

            - * - * @author Gilmar P.S.L - * @author Misael Barreto - * @author Rômulo Augusto - * @author Nordeste Fomento Mercantil - * - * @since 0.2 - * - * @version 0.2 - * - */ -public class TestCLUnibancoCobrancaRegistrada extends AbstractCampoLivreBaseTest { - - /** - *

            - * Cobrança com registro
            - *
            - * Situação: precisamos emitir um título para um sacado com essas - * características: - *

            - *

            - * Banco: UNIBANCO – identificação 409
            - * Agência: 0001-9
            - * Moeda: Real – R$ - identificação 9
            - * Vencimento: 31 de dezembro de 2001
            - * Valor: R$1000,00
            - * Código para transação CVT: 04 (cobrança com registro – 5539-5)
            - * “Nosso Número”: 11223344554
            - *

            - * - *

            - * NÚMERO DE ORIGEM DO CÓDIGO DE BARRAS:
            - *
            - * - *

            -	 * 409 9  1  1546  0000100000  04  011231  0001  9  11223344554  0
            -	 * 
            - * - *
            - * LINHA DIGITÁVEL:
            - * - *
            -	 * 40990.40117  20100.019110  22334.455403  1  15460000100000
            -	 * 
            - * - *

            - * - * - * @throws Exception - * - * @since - */ - @Before - public void setUp(){ - - Calendar cal = Calendar.getInstance(); - - cal.set(2001,Calendar.DECEMBER,31); - - - titulo.getContaBancaria().setBanco(BancosSuportados.UNIBANCO.create()); - titulo.getContaBancaria().setAgencia(new Agencia(1, "9")); - titulo.getContaBancaria().setCarteira(new Carteira(123,TipoDeCobranca.COM_REGISTRO)); - titulo.setNumeroDoDocumento("1234567"); - titulo.setNossoNumero("11223344554"); - titulo.setDataDoVencimento(cal.getTime()); - - createCampoLivreToTest(); - - setCampoLivreEsperadoComoString("0401123100019112233445540"); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComAgenciaNula() { - - titulo.getContaBancaria().setAgencia(null); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComNossoNumeroNulo() { - - titulo.setNossoNumero(null); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComNossoNumeroNegativo() { - - titulo.setNossoNumero("-012345679012345"); - createCampoLivreToTest(); - } - - @Test(expected = CampoLivreException.class) - public final void testGetInstanceComNossoNumeroNaoNumerico() { - - titulo.setNossoNumero("123456790123y45"); - createCampoLivreToTest(); - } - -} +/* + * 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: 25/04/2008 - 01:53:23 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 25/04/2008 - 01:53:23 + * + */ + +package org.jrimum.bopepo.campolivre; + +import java.util.Calendar; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.banco.Agencia; +import org.jrimum.domkee.banco.Carteira; +import org.jrimum.domkee.banco.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + *

            + * Teste unitário do campo livre do banco unibanco para cobrança não registrada + *

            + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + * + */ +public class TestCLUnibancoCobrancaRegistrada extends AbstractCampoLivreBaseTest { + + /** + *

            + * Cobrança com registro + * + * Situação: precisamos emitir um título para um sacado com essas + * características: + *

            + *

            + * Banco: UNIBANCO – identificação 409 + * Agência: 0001-9 + * Moeda: Real – R$ - identificação 9 + * Vencimento: 31 de dezembro de 2001 + * Valor: R$1000,00 + * Código para transação CVT: 04 (cobrança com registro – 5539-5) + * “Nosso Número”: 11223344554 + *

            + * + *

            + * NÚMERO DE ORIGEM DO CÓDIGO DE BARRAS: + * + * + *

            +	 * 409 9  1  1546  0000100000  04  011231  0001  9  11223344554  0
            +	 * 
            + * + * + * LINHA DIGITÁVEL: + * + *
            +	 * 40990.40117  20100.019110  22334.455403  1  15460000100000
            +	 * 
            + * + *

            + * + * + * @throws Exception + * + * @since + */ + @Before + public void setUp(){ + + Calendar cal = Calendar.getInstance(); + + cal.set(2001,Calendar.DECEMBER,31); + + + titulo.getContaBancaria().setBanco(BancosSuportados.UNIBANCO.create()); + titulo.getContaBancaria().setAgencia(new Agencia(1, "9")); + titulo.getContaBancaria().setCarteira(new Carteira(123,TipoDeCobranca.COM_REGISTRO)); + titulo.setNumeroDoDocumento("1234567"); + titulo.setNossoNumero("11223344554"); + titulo.setDataDoVencimento(cal.getTime()); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0401123100019112233445540"); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComAgenciaNula() { + + titulo.getContaBancaria().setAgencia(null); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComNossoNumeroNulo() { + + titulo.setNossoNumero(null); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComNossoNumeroNegativo() { + + titulo.setNossoNumero("-012345679012345"); + createCampoLivreToTest(); + } + + @Test(expected = CampoLivreException.class) + public final void testGetInstanceComNossoNumeroNaoNumerico() { + + titulo.setNossoNumero("123456790123y45"); + createCampoLivreToTest(); + } + +}