From d6e3bc82caf903264c0deff0acdd78f295b555ea Mon Sep 17 00:00:00 2001 From: fabiorj Date: Sat, 4 Dec 2021 12:15:25 -0300 Subject: [PATCH] commit inicial --- jrimum-bopepo/.gitignore | 6 + jrimum-bopepo/CHANGELOG.md | 75 + jrimum-bopepo/LICENSE | 191 +++ jrimum-bopepo/README.md | 8 + jrimum-bopepo/pom.xml | 263 +++ .../bopepo/exemplo/BoletoCarne3PorPagina.java | 158 ++ .../exemplo/BoletoComSacadorAvalista.java | 92 ++ .../bopepo/exemplo/CampoLivreJRimumBank.java | 117 ++ .../org/jrimum/bopepo/exemplo/Exemplos.java | 365 +++++ .../org/jrimum/bopepo/exemplo/JRimumBank.java | 52 + .../bopepo/exemplo/MeuPrimeiroBoleto.java | 270 +++ .../MeuPrimeiroBoletoBancoNaoSuportado.java | 197 +++ .../MeuPrimeiroBoletoPersonalizado.java | 72 + .../exemplo/VariosBoletosEmUmArquivo.java | 109 ++ .../VariosBoletosEmVariosArquivos.java | 92 ++ .../exemplo/banco/banrisul/NossoNumero.java | 225 +++ .../bb/BoletoBBNossoNumero10Exemplo.java | 67 + .../bb/BoletoBBNossoNumero11Exemplo.java | 67 + ...BoletoBBNossoNumero17Convenio6Exemplo.java | 84 + ...BoletoBBNossoNumero17Convenio7Exemplo.java | 61 + .../bopepo/exemplo/banco/bb/package-info.java | 36 + .../BoletoBancoDoNordesteDoBrasilExemplo.java | 105 ++ .../banco/bradesco/BoletoBradescoExemplo.java | 96 ++ .../exemplo/banco/bradesco/NossoNumero.java | 145 ++ .../brb/BoletoBancoDeBrasiliaExemplo.java | 98 ++ .../banco/cecred/BoletoCecredExemplo.java | 103 ++ .../cef/NossoNumeroCobrancaRapidaSICOB.java | 148 ++ .../bopepo/exemplo/banco/package-info.java | 35 + .../banco/sicredi/BoletoSicrediExemplo.java | 88 + ...toBancoobCobrancaNaoRegistradaExemplo.java | 83 + .../jrimum/bopepo/exemplo/package-info.java | 35 + .../src/examples/resources/img/999.png | Bin 0 -> 6618 bytes .../src/examples/resources/img/JRiboy.png | Bin 0 -> 55415 bytes .../src/examples/resources/img/JRilogo.png | Bin 0 -> 73032 bytes .../templates/BoletoCarne3PorPagina.odt | Bin 0 -> 16277 bytes .../templates/BoletoCarne3PorPagina.pdf | Bin 0 -> 60155 bytes .../BoletoTemplatePersonalizacaoSimples.odt | Bin 0 -> 146635 bytes .../BoletoTemplatePersonalizacaoSimples.pdf | Bin 0 -> 221740 bytes .../main/assembly/jrimum-bopepo-examples.xml | 27 + .../jrimum-bopepo-with-dependencies-src.xml | 60 + .../jrimum-bopepo-with-dependencies.xml | 22 + .../org/jrimum/bopepo/BancosSuportados.java | 473 ++++++ .../main/java/org/jrimum/bopepo/Boleto.java | 572 +++++++ .../org/jrimum/bopepo/BoletoException.java | 89 + .../java/org/jrimum/bopepo/BoletoUtil.java | 893 ++++++++++ .../org/jrimum/bopepo/CodigoDeBarras.java | 359 ++++ .../bopepo/CodigoDeBarrasException.java | 90 + .../org/jrimum/bopepo/FatorDeVencimento.java | 216 +++ .../org/jrimum/bopepo/LinhaDigitavel.java | 538 ++++++ .../bopepo/LinhaDigitavelException.java | 91 ++ .../org/jrimum/bopepo/MeuPrimeiroBoleto.java | 278 ++++ .../campolivre/AbstractCLBancoCitibank.java | 84 + .../campolivre/AbstractCLBancoDeBrasilia.java | 61 + .../campolivre/AbstractCLBancoDoBrasil.java | 94 ++ .../AbstractCLBancoDoNordesteDoBrasil.java | 53 + .../AbstractCLBancoIntermedium.java | 73 + .../campolivre/AbstractCLBancoReal.java | 73 + .../campolivre/AbstractCLBancoRural.java | 76 + .../campolivre/AbstractCLBancoSafra.java | 151 ++ .../bopepo/campolivre/AbstractCLBancoob.java | 77 + .../bopepo/campolivre/AbstractCLBanestes.java | 72 + .../bopepo/campolivre/AbstractCLBanrisul.java | 245 +++ .../bopepo/campolivre/AbstractCLBradesco.java | 76 + .../AbstractCLCaixaEconomicaFederal.java | 93 ++ .../bopepo/campolivre/AbstractCLCecred.java | 62 + .../bopepo/campolivre/AbstractCLHSBC.java | 83 + .../bopepo/campolivre/AbstractCLItau.java | 138 ++ .../AbstractCLMercantilDoBrasil.java | 70 + .../campolivre/AbstractCLSantander.java | 40 + .../bopepo/campolivre/AbstractCLSicredi.java | 73 + .../bopepo/campolivre/AbstractCLUnibanco.java | 70 + .../bopepo/campolivre/AbstractCampoLivre.java | 787 +++++++++ .../campolivre/CLBancoCitiBankNN11.java | 74 + .../bopepo/campolivre/CLBancoDeBrasilia.java | 359 ++++ .../campolivre/CLBancoDoBrasilNN10.java | 141 ++ .../campolivre/CLBancoDoBrasilNN11.java | 140 ++ .../CLBancoDoBrasilNN17Convenio6.java | 137 ++ .../CLBancoDoBrasilNN17Convenio7.java | 91 ++ .../campolivre/CLBancoDoNordesteDoBrasil.java | 218 +++ .../bopepo/campolivre/CLBancoIntermedium.java | 141 ++ .../jrimum/bopepo/campolivre/CLBancoReal.java | 194 +++ .../CLBancoRuralCobrancaNaoRegistrada.java | 120 ++ ...oRuralCobrancaNaoRegistradaSeguradora.java | 127 ++ .../CLBancoRuralCobrancaRegistrada.java | 131 ++ .../CLBancoSafraCobrancaNaoRegistrada.java | 164 ++ .../CLBancoSafraCobrancaRegistrada.java | 181 ++ .../bopepo/campolivre/CLBancoSantander.java | 184 +++ .../CLBancoobCobrancaNaoRegistrada.java | 238 +++ .../jrimum/bopepo/campolivre/CLBanestes.java | 222 +++ .../CLBanrisulCobrancaNaoRegistrada.java | 158 ++ .../CLBanrisulCobrancaRegistrada.java | 161 ++ .../jrimum/bopepo/campolivre/CLBradesco.java | 195 +++ ...ixaEconomicaFederalSICOBNossoNumero10.java | 217 +++ ...ixaEconomicaFederalSICOBNossoNumero14.java | 222 +++ .../CLCaixaEconomicaFederalSIGCB.java | 242 +++ .../CLCaixaEconomicaFederalSINCO.java | 126 ++ .../jrimum/bopepo/campolivre/CLCecred.java | 97 ++ .../CLHSBCCobrancaNaoRegistrada.java | 226 +++ .../campolivre/CLHSBCCobrancaRegistrada.java | 144 ++ .../CLItauComCarteirasEspeciais.java | 185 +++ .../bopepo/campolivre/CLItauPadrao.java | 297 ++++ .../campolivre/CLMercantilDoBrasil.java | 167 ++ .../jrimum/bopepo/campolivre/CLSicredi.java | 276 ++++ .../CLUnibancoCobrancaNaoRegistrada.java | 161 ++ .../CLUnibancoCobrancaRegistrada.java | 192 +++ .../jrimum/bopepo/campolivre/CampoLivre.java | 57 + .../campolivre/CampoLivreException.java | 85 + .../bopepo/campolivre/CampoLivreFactory.java | 134 ++ .../NotSupportedBancoException.java | 92 ++ .../NotSupportedCampoLivreException.java | 87 + .../bopepo/campolivre/package-info.java | 35 + .../java/org/jrimum/bopepo/package-info.java | 36 + .../parametro/ParametroBancoDeBrasilia.java | 49 + .../bopepo/parametro/ParametroBancoRural.java | 50 + .../parametro/ParametroBancoSantander.java | 54 + .../parametro/ParametroBancoSicredi.java | 52 + .../bopepo/parametro/ParametroBancoob.java | 50 + .../bopepo/parametro/ParametroCECRED.java | 47 + .../ParametroCaixaEconomicaFederal.java | 49 + .../bopepo/parametro/ParametroHSBC.java | 49 + .../jrimum/bopepo/parametro/package-info.java | 37 + .../org/jrimum/bopepo/pdf/CodigoDeBarras.java | 110 ++ .../java/org/jrimum/bopepo/pdf/Files.java | 435 +++++ .../main/java/org/jrimum/bopepo/pdf/PDFs.java | 188 +++ .../jrimum/bopepo/pdf/PdfDateConverter.java | 163 ++ .../org/jrimum/bopepo/pdf/PdfDocInfo.java | 410 +++++ .../java/org/jrimum/bopepo/pdf/PdfDocMix.java | 1202 ++++++++++++++ .../org/jrimum/bopepo/pdf/PdfDocReader.java | 301 ++++ .../org/jrimum/bopepo/pdf/PdfRectangle.java | 121 ++ .../org/jrimum/bopepo/pdf/package-info.java | 35 + .../org/jrimum/bopepo/view/BoletoCampo.java | 107 ++ .../org/jrimum/bopepo/view/BoletoViewer.java | 1453 +++++++++++++++++ .../org/jrimum/bopepo/view/PdfViewer.java | 478 ++++++ .../bopepo/view/PdfViewerMultiProcessor.java | 264 +++ .../jrimum/bopepo/view/ResourceBundle.java | 185 +++ .../bopepo/view/info/BoletoInfoView.java | 50 + .../view/info/BoletoInfoViewBuilder.java | 308 ++++ .../campo/AbstractBoletoInfoCampoView.java | 343 ++++ .../BoletoInfoCampoAgenciaCodigoCedente.java | 95 ++ .../campo/BoletoInfoCampoCodigoBanco.java | 54 + .../info/campo/BoletoInfoCampoEndereco.java | 123 ++ .../info/campo/BoletoInfoCampoLogoBanco.java | 65 + .../campo/BoletoInfoCampoNossoNumero.java | 66 + .../info/campo/BoletoInfoCampoPessoa.java | 87 + .../view/info/campo/BoletoInfoCampoView.java | 102 ++ .../campo/BoletoInfoCampoViewFactory.java | 82 + .../info/campo/BoletoInfoViewBradesco.java | 87 + .../view/info/campo/BoletoInfoViewCecred.java | 78 + .../info/campo/BoletoInfoViewDefault.java | 45 + .../info/campo/BoletoInfoViewSicredi.java | 133 ++ .../caixa/BoletoInfoViewCaixaFactory.java | 30 + .../caixa/BoletoInfoViewCaixaSICOB10.java | 43 + .../caixa/BoletoInfoViewCaixaSICOB14.java | 56 + .../campo/caixa/BoletoInfoViewCaixaSIGCB.java | 39 + .../campo/caixa/BoletoInfoViewCaixaSINCO.java | 30 + .../hsbc/AbstractBoletoInfoViewHSBC.java | 48 + .../hsbc/BoletoInfoViewHSBCNaoRegistrada.java | 44 + .../hsbc/BoletoInfoViewHSBCRegistrada.java | 45 + .../bopepo/view/info/campo/package-info.java | 37 + .../jrimum/bopepo/view/info/package-info.java | 36 + .../org/jrimum/bopepo/view/package-info.java | 35 + jrimum-bopepo/src/main/resources/img/001.png | Bin 0 -> 2440 bytes jrimum-bopepo/src/main/resources/img/004.png | Bin 0 -> 7384 bytes jrimum-bopepo/src/main/resources/img/021.png | Bin 0 -> 3427 bytes jrimum-bopepo/src/main/resources/img/033.png | Bin 0 -> 9234 bytes jrimum-bopepo/src/main/resources/img/041.png | Bin 0 -> 3598 bytes jrimum-bopepo/src/main/resources/img/070.png | Bin 0 -> 16051 bytes jrimum-bopepo/src/main/resources/img/077.png | Bin 0 -> 5274 bytes jrimum-bopepo/src/main/resources/img/085.png | Bin 0 -> 10929 bytes jrimum-bopepo/src/main/resources/img/104.png | Bin 0 -> 7062 bytes jrimum-bopepo/src/main/resources/img/151.png | Bin 0 -> 3460 bytes jrimum-bopepo/src/main/resources/img/237.png | Bin 0 -> 1875 bytes jrimum-bopepo/src/main/resources/img/341.png | Bin 0 -> 2699 bytes jrimum-bopepo/src/main/resources/img/356.png | Bin 0 -> 3007 bytes jrimum-bopepo/src/main/resources/img/389.png | Bin 0 -> 2075 bytes jrimum-bopepo/src/main/resources/img/399.png | Bin 0 -> 4185 bytes jrimum-bopepo/src/main/resources/img/409.png | Bin 0 -> 5929 bytes jrimum-bopepo/src/main/resources/img/422.png | Bin 0 -> 7367 bytes jrimum-bopepo/src/main/resources/img/453.png | Bin 0 -> 3208 bytes jrimum-bopepo/src/main/resources/img/745.png | Bin 0 -> 5063 bytes jrimum-bopepo/src/main/resources/img/748.png | Bin 0 -> 2819 bytes jrimum-bopepo/src/main/resources/img/756.png | Bin 0 -> 12814 bytes .../main/resources/img/Boleto_Completo.png | Bin 0 -> 227566 bytes .../pdf/BoletoTemplateComSacadorAvalista.odt | Bin 0 -> 14316 bytes .../pdf/BoletoTemplateComSacadorAvalista.pdf | Bin 0 -> 68125 bytes .../pdf/BoletoTemplateSemSacadorAvalista.odt | Bin 0 -> 14019 bytes .../pdf/BoletoTemplateSemSacadorAvalista.pdf | Bin 0 -> 65811 bytes .../jrimum/bopepo/TestBancosSuportados.java | 79 + .../java/org/jrimum/bopepo/TestBoleto.java | 254 +++ .../org/jrimum/bopepo/TestBoletoUtil.java | 404 +++++ .../org/jrimum/bopepo/TestCodigoDeBarras.java | 140 ++ .../jrimum/bopepo/TestFatorDeVencimento.java | 107 ++ .../org/jrimum/bopepo/TestLinhaDigitavel.java | 110 ++ .../AbstractCLBancoSafraBaseTest.java | 42 + .../AbstractCampoLivreBaseTest.java | 439 +++++ .../campolivre/TestCLBancoDeBrasilia.java | 181 ++ .../campolivre/TestCLBancoDoBrasilNN10.java | 67 + .../campolivre/TestCLBancoDoBrasilNN11.java | 68 + .../TestCLBancoDoBrasilNN17Convenio6.java | 66 + .../TestCLBancoDoBrasilNN17Convenio7.java | 35 + .../campolivre/TestCLBancoIntermedium.java | 34 + .../bopepo/campolivre/TestCLBancoReal.java | 69 + ...TestCLBancoRuralCobrancaNaoRegistrada.java | 44 + ...oRuralCobrancaNaoRegistradaSeguradora.java | 51 + .../TestCLBancoRuralCobrancaRegistrada.java | 38 + ...TestCLBancoSafraCobrancaNaoRegistrada.java | 146 ++ .../TestCLBancoSafraCobrancaRegistrada.java | 182 +++ .../campolivre/TestCLBancoSantander.java | 63 + .../TestCLBancoobCobrancaNaoRegistrada.java | 98 ++ .../bopepo/campolivre/TestCLBanestes.java | 129 ++ .../TestCLBanrisulCobrancaNaoRegistrada.java | 121 ++ .../TestCLBanrisulCobrancaRegistrada.java | 121 ++ .../bopepo/campolivre/TestCLBradesco.java | 161 ++ ...ixaEconomicaFederalSICOBNossoNumero14.java | 170 ++ .../TestCLCaixaEconomicaFederalSIGCB.java | 64 + .../TestCLCaixaEconomicaFederalSINCO.java | 63 + .../bopepo/campolivre/TestCLCecred.java | 136 ++ .../TestCLHSBCCobrancaNaoRegistrada.java | 42 + .../TestCLHSBCCobrancaRegistrada.java | 42 + .../TestCLItauComCarteirasEspeciais.java | 71 + .../bopepo/campolivre/TestCLItauPadrao.java | 84 + .../campolivre/TestCLMercantilDoBrasil.java | 81 + .../bopepo/campolivre/TestCLSicredi.java | 237 +++ .../TestCLUnibancoCobrancaNaoRegistrada.java | 140 ++ .../TestCLUnibancoCobrancaRegistrada.java | 146 ++ .../campolivre/TestCampoLivreFactory.java | 110 ++ .../jrimum/bopepo/excludes/BoletoBuilder.java | 87 + .../bopepo/excludes/CedenteBuilder.java | 57 + .../bopepo/excludes/ContaBancariaBuilder.java | 66 + .../bopepo/excludes/EnderecoBuilder.java | 102 ++ .../org/jrimum/bopepo/excludes/Images.java | 81 + .../java/org/jrimum/bopepo/excludes/PDFs.java | 88 + .../jrimum/bopepo/excludes/SacadoBuilder.java | 59 + .../excludes/SacadorAvalistaBuilder.java | 73 + .../jrimum/bopepo/excludes/TituloBuilder.java | 94 ++ .../functional/TestBoletoPdfFeatures.java | 86 + ...stValoresDosCamposDoBoletoBradescoPDF.java | 178 ++ .../java/org/jrimum/bopepo/pdf/Resources.java | 77 + .../java/org/jrimum/bopepo/pdf/TestFiles.java | 106 ++ .../bopepo/pdf/TestPdfDateConverter.java | 91 ++ .../org/jrimum/bopepo/pdf/TestPdfDocInfo.java | 235 +++ .../org/jrimum/bopepo/pdf/TestPdfDocMix.java | 420 +++++ .../jrimum/bopepo/pdf/TestPdfDocReader.java | 165 ++ .../jrimum/bopepo/view/TestBoletoViewer.java | 122 ++ .../bopepo/view/TestResourceBundle.java | 107 ++ .../view/info/TestBoletoInfoViewBuilder.java | 97 ++ ...stBoletoInfoCampoAgenciaCodigoCedente.java | 96 ++ .../campo/TestBoletoInfoCampoCodigoBanco.java | 54 + .../campo/TestBoletoInfoCampoEndereco.java | 265 +++ .../campo/TestBoletoInfoCampoLogoBanco.java | 75 + .../campo/TestBoletoInfoCampoNossoNumero.java | 96 ++ .../info/campo/TestBoletoInfoCampoPessoa.java | 91 ++ .../campo/TestBoletoInfoCampoViewFactory.java | 59 + .../campo/TestBoletoInfoViewBradesco.java | 53 + .../info/campo/TestBoletoInfoViewCecred.java | 42 + .../caixa/TestBoletoInfoViewCaixaFactory.java | 62 + .../caixa/TestBoletoInfoViewCaixaSICOB10.java | 53 + .../caixa/TestBoletoInfoViewCaixaSICOB14.java | 61 + .../caixa/TestBoletoInfoViewCaixaSIGCB.java | 70 + .../caixa/TestBoletoInfoViewCaixaSINCO.java | 44 + .../hsbc/TestAbstractBoletoInfoViewHSBC.java | 41 + .../TestBoletoInfoViewHSBCNaoRegistrada.java | 67 + .../TestBoletoInfoViewHSBCRegistrada.java | 66 + .../src/test/resources/ArquivoComCampos.odt | Bin 0 -> 11981 bytes .../src/test/resources/ArquivoComCampos.pdf | Bin 0 -> 25280 bytes .../src/test/resources/ArquivoSemCampos.odt | Bin 0 -> 10623 bytes .../src/test/resources/ArquivoSemCampos.pdf | Bin 0 -> 26237 bytes ...sDosCamposParaBoletoBradescoPDF.properties | 98 ++ .../src/test/resources/log4j.properties | 50 + 269 files changed, 32775 insertions(+) create mode 100644 jrimum-bopepo/.gitignore create mode 100644 jrimum-bopepo/CHANGELOG.md create mode 100644 jrimum-bopepo/LICENSE create mode 100644 jrimum-bopepo/README.md create mode 100644 jrimum-bopepo/pom.xml create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/BoletoCarne3PorPagina.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/BoletoComSacadorAvalista.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/CampoLivreJRimumBank.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/Exemplos.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/JRimumBank.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoleto.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoletoBancoNaoSuportado.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoletoPersonalizado.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/VariosBoletosEmUmArquivo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/VariosBoletosEmVariosArquivos.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/banrisul/NossoNumero.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero10Exemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero11Exemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero17Convenio6Exemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero17Convenio7Exemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/package-info.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bnb/BoletoBancoDoNordesteDoBrasilExemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bradesco/BoletoBradescoExemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bradesco/NossoNumero.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/brb/BoletoBancoDeBrasiliaExemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/cecred/BoletoCecredExemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/cef/NossoNumeroCobrancaRapidaSICOB.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/package-info.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/sicredi/BoletoSicrediExemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/bancoob/BoletoBancoobCobrancaNaoRegistradaExemplo.java create mode 100644 jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/package-info.java create mode 100644 jrimum-bopepo/src/examples/resources/img/999.png create mode 100644 jrimum-bopepo/src/examples/resources/img/JRiboy.png create mode 100644 jrimum-bopepo/src/examples/resources/img/JRilogo.png create mode 100644 jrimum-bopepo/src/examples/resources/templates/BoletoCarne3PorPagina.odt create mode 100644 jrimum-bopepo/src/examples/resources/templates/BoletoCarne3PorPagina.pdf create mode 100644 jrimum-bopepo/src/examples/resources/templates/BoletoTemplatePersonalizacaoSimples.odt create mode 100644 jrimum-bopepo/src/examples/resources/templates/BoletoTemplatePersonalizacaoSimples.pdf create mode 100644 jrimum-bopepo/src/main/assembly/jrimum-bopepo-examples.xml create mode 100644 jrimum-bopepo/src/main/assembly/jrimum-bopepo-with-dependencies-src.xml create mode 100644 jrimum-bopepo/src/main/assembly/jrimum-bopepo-with-dependencies.xml create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/BancosSuportados.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/Boleto.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/BoletoException.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/BoletoUtil.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/CodigoDeBarras.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/CodigoDeBarrasException.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/FatorDeVencimento.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/LinhaDigitavel.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/LinhaDigitavelException.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/MeuPrimeiroBoleto.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoCitibank.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDeBrasilia.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDoBrasil.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDoNordesteDoBrasil.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoIntermedium.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoReal.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoRural.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoSafra.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoob.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBanestes.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBanrisul.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBradesco.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLCaixaEconomicaFederal.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLCecred.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLHSBC.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLItau.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLMercantilDoBrasil.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLSantander.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLSicredi.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLUnibanco.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCampoLivre.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoCitiBankNN11.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDeBrasilia.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN10.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN11.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN17Convenio6.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN17Convenio7.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoIntermedium.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoReal.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaNaoRegistradaSeguradora.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSafraCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSafraCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSantander.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoobCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanestes.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanrisulCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanrisulCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBradesco.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSIGCB.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSINCO.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCecred.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLHSBCCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLHSBCCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLItauComCarteirasEspeciais.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLMercantilDoBrasil.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLSicredi.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivre.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivreException.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivreFactory.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/NotSupportedBancoException.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/NotSupportedCampoLivreException.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/package-info.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/package-info.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoDeBrasilia.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoRural.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoSantander.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoSicredi.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoob.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroCECRED.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroCaixaEconomicaFederal.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroHSBC.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/package-info.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/CodigoDeBarras.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/Files.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PDFs.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocMix.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocReader.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfRectangle.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/package-info.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/BoletoCampo.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/BoletoViewer.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/PdfViewer.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/ResourceBundle.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/BoletoInfoView.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/BoletoInfoViewBuilder.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/AbstractBoletoInfoCampoView.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoAgenciaCodigoCedente.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoCodigoBanco.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoEndereco.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoLogoBanco.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoNossoNumero.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoPessoa.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoView.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoViewFactory.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewBradesco.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewCecred.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewDefault.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewSicredi.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaFactory.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSICOB10.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSICOB14.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSIGCB.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSINCO.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/AbstractBoletoInfoViewHSBC.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/BoletoInfoViewHSBCNaoRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/BoletoInfoViewHSBCRegistrada.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/package-info.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/package-info.java create mode 100644 jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/package-info.java create mode 100644 jrimum-bopepo/src/main/resources/img/001.png create mode 100644 jrimum-bopepo/src/main/resources/img/004.png create mode 100644 jrimum-bopepo/src/main/resources/img/021.png create mode 100644 jrimum-bopepo/src/main/resources/img/033.png create mode 100644 jrimum-bopepo/src/main/resources/img/041.png create mode 100644 jrimum-bopepo/src/main/resources/img/070.png create mode 100644 jrimum-bopepo/src/main/resources/img/077.png create mode 100644 jrimum-bopepo/src/main/resources/img/085.png create mode 100644 jrimum-bopepo/src/main/resources/img/104.png create mode 100644 jrimum-bopepo/src/main/resources/img/151.png create mode 100644 jrimum-bopepo/src/main/resources/img/237.png create mode 100644 jrimum-bopepo/src/main/resources/img/341.png create mode 100644 jrimum-bopepo/src/main/resources/img/356.png create mode 100644 jrimum-bopepo/src/main/resources/img/389.png create mode 100644 jrimum-bopepo/src/main/resources/img/399.png create mode 100644 jrimum-bopepo/src/main/resources/img/409.png create mode 100644 jrimum-bopepo/src/main/resources/img/422.png create mode 100644 jrimum-bopepo/src/main/resources/img/453.png create mode 100644 jrimum-bopepo/src/main/resources/img/745.png create mode 100644 jrimum-bopepo/src/main/resources/img/748.png create mode 100644 jrimum-bopepo/src/main/resources/img/756.png create mode 100644 jrimum-bopepo/src/main/resources/img/Boleto_Completo.png create mode 100644 jrimum-bopepo/src/main/resources/pdf/BoletoTemplateComSacadorAvalista.odt create mode 100644 jrimum-bopepo/src/main/resources/pdf/BoletoTemplateComSacadorAvalista.pdf create mode 100644 jrimum-bopepo/src/main/resources/pdf/BoletoTemplateSemSacadorAvalista.odt create mode 100644 jrimum-bopepo/src/main/resources/pdf/BoletoTemplateSemSacadorAvalista.pdf create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBancosSuportados.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBoleto.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBoletoUtil.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestCodigoDeBarras.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestFatorDeVencimento.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestLinhaDigitavel.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/AbstractCLBancoSafraBaseTest.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/AbstractCampoLivreBaseTest.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDeBrasilia.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN10.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN11.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN17Convenio6.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN17Convenio7.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoIntermedium.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoReal.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaNaoRegistradaSeguradora.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSafraCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSafraCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSantander.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoobCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanestes.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanrisulCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanrisulCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBradesco.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSICOBNossoNumero14.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSIGCB.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSINCO.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCecred.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLHSBCCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLHSBCCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLItauComCarteirasEspeciais.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLItauPadrao.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLMercantilDoBrasil.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLSicredi.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaNaoRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCampoLivreFactory.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/BoletoBuilder.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/CedenteBuilder.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/ContaBancariaBuilder.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/EnderecoBuilder.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/Images.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/PDFs.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/SacadoBuilder.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/SacadorAvalistaBuilder.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/TituloBuilder.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/functional/TestBoletoPdfFeatures.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/functional/TestValoresDosCamposDoBoletoBradescoPDF.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/Resources.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestFiles.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDateConverter.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocInfo.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocMix.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocReader.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/TestBoletoViewer.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/TestResourceBundle.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/TestBoletoInfoViewBuilder.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoAgenciaCodigoCedente.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoCodigoBanco.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoEndereco.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoLogoBanco.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoNossoNumero.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoPessoa.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoViewFactory.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoViewBradesco.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoViewCecred.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaFactory.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSICOB10.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSICOB14.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSIGCB.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSINCO.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestAbstractBoletoInfoViewHSBC.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestBoletoInfoViewHSBCNaoRegistrada.java create mode 100644 jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestBoletoInfoViewHSBCRegistrada.java create mode 100644 jrimum-bopepo/src/test/resources/ArquivoComCampos.odt create mode 100644 jrimum-bopepo/src/test/resources/ArquivoComCampos.pdf create mode 100644 jrimum-bopepo/src/test/resources/ArquivoSemCampos.odt create mode 100644 jrimum-bopepo/src/test/resources/ArquivoSemCampos.pdf create mode 100644 jrimum-bopepo/src/test/resources/ValoresEsperadosDosCamposParaBoletoBradescoPDF.properties create mode 100644 jrimum-bopepo/src/test/resources/log4j.properties diff --git a/jrimum-bopepo/.gitignore b/jrimum-bopepo/.gitignore new file mode 100644 index 0000000..700e479 --- /dev/null +++ b/jrimum-bopepo/.gitignore @@ -0,0 +1,6 @@ +/bin +/target +.classpath +.DS_Store +.project +.settings \ No newline at end of file diff --git a/jrimum-bopepo/CHANGELOG.md b/jrimum-bopepo/CHANGELOG.md new file mode 100644 index 0000000..5220641 --- /dev/null +++ b/jrimum-bopepo/CHANGELOG.md @@ -0,0 +1,75 @@ +Bopepo Changelog +==================================================== + +0.2.3 (2014/02/01) main release GitHub +---------------------------------------------------------------------- + +**Improvement** + + * #1: Mudar passagem de parâmetros bancários de string para enum + * #2: Colocar complemento do endereço do sacado como campo padrão no boleto + * #4: Novo Banco: BRB + * #5: Novo enum com todos os campos padrões do boleto + * #6: Atualizar templates dos boletos em função da nova nomenclatura BACEN + * #7: Substituir funções de texto do utilix por similar em texgit + * #8: Inserir meta-dados realcionados ao PDF + * #9: Campos formatados em função do padrão de cada Banco + * #11: Novo Banco: CECRED + + +0.2.3-SNAPSHOT (2011-02-09) TracSVN +---------------------------------------------------------------------- + +**Fix** + + * #25: Implementação BANCO SANTANDER S.A. - Correção do uso de dígitos verificadores. + * #13: Banco Real - Mudança do número do documento pelo nosso número + +**Improvement** + + * #54: Implementação Campo Livre SICOB - CEF + * #58: Bancoob + * Novas formas de processamento em lote + * Novas formas para definição de template + * Opção de definição de compressão do PDF + * Classe para geração isolada de código de barras + * Classe para geração de pdfs estilo relatório + + +0.3-Litio-GeracaoGuia-VersaoAvaliacao-2011-04-14 (2011/04/14) TracSVN +---------------------------------------------------------------------- + + * Ajustes construtores de OrgaoRecebedor e Arrecadacao, que sofreram ajustes básicos nos parâmetros. + * Novo exemplo MinhaPrimeiraGuiaASerPagaEmVariosBancos. + + +0.2.3-SNAPSHOT (2011-02-09) TracSVN +---------------------------------------------------------------------- + +**Improvement** + + * Novo Banco: Banco do Nordeste + * Novo Boleto: Banco do Brasil convênio 7 dígitos nosso número 17 dígitos. + + +0.3-Litio-GeracaoGuia-VersaoAvaliacao-2010-09-17 (2010/09/17) TracSVN +---------------------------------------------------------------------- + +0.3-Litio-GeracaoGuia-VersaoAvaliacao-2010-09-09 (2010/09/09) TracSVN +---------------------------------------------------------------------- + +0.3-Litio-GeracaoGuia-VersaoAvaliacao-2010-06-10 (2010/06/10) TracSVN +---------------------------------------------------------------------- + +0.2.2 (2009/10/18) main release TracSVN +---------------------------------------------------------------------- + +0.2.1-INC2X (2008/11/13) incubation TracSVN +---------------------------------------------------------------------- + +0.2.1-INC2 (2008/07/15) incubation TracSVN +---------------------------------------------------------------------- + +0.2.1-INC (2008/06/15) incubation TracSVN +---------------------------------------------------------------------- + \ No newline at end of file diff --git a/jrimum-bopepo/LICENSE b/jrimum-bopepo/LICENSE new file mode 100644 index 0000000..37ec93a --- /dev/null +++ b/jrimum-bopepo/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/jrimum-bopepo/README.md b/jrimum-bopepo/README.md new file mode 100644 index 0000000..c15fa6d --- /dev/null +++ b/jrimum-bopepo/README.md @@ -0,0 +1,8 @@ +Bopepo +====== + +[![Build Status](https://ci-jrimum.rhcloud.com/buildStatus/icon?job=Bopepo)](https://ci-jrimum.rhcloud.com) + +Biblioteca Java para geração de boletos bancários. + + * http://jrimum.org/bopepo diff --git a/jrimum-bopepo/pom.xml b/jrimum-bopepo/pom.xml new file mode 100644 index 0000000..dc4282a --- /dev/null +++ b/jrimum-bopepo/pom.xml @@ -0,0 +1,263 @@ + + + 4.0.0 + br.com.rjconsultores + jrimum-bopepo + jar + Projeto Bopepo + 1.0.0 + Projeto open source de componentes de software para o domínio de negócios do Brasil. + http://www.jrimum.org/bopepo + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + Projeto JRimum + http://www.jrimum.org + + + + http://github.com/jrimum/bopepo/issues + GitHub + + + + http://github.com/jrimum/bopepo + + + + + Gilmar P. S. L. + gilmatryx@gmail.com + + + Misael Barreto + misaelbarreto@gmail.com + + + Rômulo Augusto + romulomail@gmail.com + + + + + UTF-8 + UTF-8 + + + + + disable-java8-doclint + + [1.8,) + + + -Xdoclint:none + + + + + + + + + src/main/resources + + **/*.odt + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.5 + 1.5 + + + + org.codehaus.mojo + animal-sniffer-maven-plugin + 1.6 + + + org.codehaus.mojo.signature + java18 + 1.0 + + + + + animal-sniffer + compile + + check + + + + + + maven-assembly-plugin + 2.4 + + + src/main/assembly/jrimum-bopepo-with-dependencies.xml + src/main/assembly/jrimum-bopepo-with-dependencies-src.xml + src/main/assembly/jrimum-bopepo-examples.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.16 + + false + + org/jrimum/bopepo/**/* + + + org/jrimum/bopepo/excludes/**/* + org/jrimum/bopepo/**/*$* + + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + package + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + + attach-javadoc + package + + jar + + + + + UTF-8 + UTF-8 + true + private + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.1 + + + + + + + + br.com.rjconsultores + jrimum-domkee + 1.0.0 + + + br.com.rjconsultores + jrimum-texgit + 1.0.0 + + + com.lowagie + itext + 2.0.8 + + + bouncycastle + bcmail-jdk14 + + + bouncycastle + bcprov-jdk14 + + + bouncycastle + bctsp-jdk14 + + + + + + com.itextpdf + itextpdf + 5.4.5 + test + + + com.google.guava + guava-jdk5 + 14.0.1 + test + + + org.hamcrest + hamcrest-all + 1.3 + test + + + org.mockito + mockito-all + 1.9.5 + test + + + commons-io + commons-io + 2.4 + test + + + junit + junit + 4.11 + test + + + + + + rj-releases + http://52.5.53.15:8081/nexus/content/repositories/releases/ + + + \ No newline at end of file diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/BoletoCarne3PorPagina.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/BoletoCarne3PorPagina.java new file mode 100644 index 0000000..f9976d3 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/BoletoCarne3PorPagina.java @@ -0,0 +1,158 @@ +package org.jrimum.bopepo.exemplo; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.pdf.Files; +import org.jrimum.bopepo.view.BoletoViewer; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.utilix.ClassLoaders; +import org.jrimum.utilix.Exceptions; + +import com.lowagie.text.Document; +import com.lowagie.text.DocumentException; +import com.lowagie.text.pdf.PdfContentByte; +import com.lowagie.text.pdf.PdfImportedPage; +import com.lowagie.text.pdf.PdfReader; +import com.lowagie.text.pdf.PdfWriter; + +/** + * Exemplo de boleto no estilo carnê com três boletos em uma página. + * + * @author Rômulo Augusto + */ +public class BoletoCarne3PorPagina { + + public static void main(String[] args) throws DocumentException, IOException { + + Boleto boletoBBNossoNumero10 = crieBoletoBBNossoNumero10(); + Boleto boletoBradesco = crieBoletoBradesco(); + + List boletos = new ArrayList(); + boletos.add(boletoBBNossoNumero10); + boletos.add(boletoBradesco); + boletos.add(boletoBBNossoNumero10); + boletos.add(boletoBradesco); + boletos.add(boletoBBNossoNumero10); + boletos.add(boletoBBNossoNumero10); + boletos.add(boletoBradesco); + boletos.add(boletoBBNossoNumero10); + + //Informando o template personalizado: + File templatePersonalizado = new File(ClassLoaders.getResource("/templates/BoletoCarne3PorPagina.pdf").getFile()); + + File boletosPorPagina = groupInPages(boletos, "Carne3PorPagina.pdf", templatePersonalizado); + + Exemplos.mostreBoletoNaTela(boletosPorPagina); + } + + private static File groupInPages(List boletos, String filePath, File templatePersonalizado) { + + File arq = null; + BoletoViewer boletoViewer = new BoletoViewer(boletos.get(0)); + boletoViewer.setTemplate(templatePersonalizado); + + List boletosEmBytes = new ArrayList(boletos.size()); + + for (Boleto bop : boletos) { + boletosEmBytes.add(boletoViewer.setBoleto(bop).getPdfAsByteArray()); + } + + try { + + arq = Files.bytesToFile(filePath, mergeFilesInPages(boletosEmBytes)); + + } catch (Exception e) { + Exceptions.throwIllegalStateException("Erro durante geração do PDF! Causado por " + e.getLocalizedMessage(), e); + } + + return arq; + } + + private static Boleto crieBoletoBBNossoNumero10() { + + Titulo titulo = Exemplos.crieTitulo(); + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + contaBancaria.setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + contaBancaria.setNumeroDaConta(new NumeroDaConta(1234567)); + contaBancaria.setCarteira(new Carteira(12)); + + titulo.setNossoNumero("1234567890"); + + Boleto boletoBBNossoNumero10 = Exemplos.crieBoleto(titulo); + + return boletoBBNossoNumero10; + } + + private static Boleto crieBoletoBradesco() { + + Titulo titulo = Exemplos.crieTitulo(); + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + contaBancaria.setBanco(BancosSuportados.BANCO_BRADESCO.create()); + contaBancaria.setAgencia(new Agencia(1234)); + contaBancaria.setCarteira(new Carteira(12)); + titulo.setNossoNumero("01234567891"); + contaBancaria.setNumeroDaConta(new NumeroDaConta(1234567)); + + Boleto boletoBradesco = Exemplos.crieBoleto(titulo); + + return boletoBradesco; + } + + public static byte[] mergeFilesInPages(List pdfFilesAsByteArray) throws DocumentException, IOException { + + Document document = new Document(); + ByteArrayOutputStream byteOS = new ByteArrayOutputStream(); + + PdfWriter writer = PdfWriter.getInstance(document, byteOS); + + document.open(); + + PdfContentByte cb = writer.getDirectContent(); + float positionAnterior = 0; + + for (byte[] in : pdfFilesAsByteArray) { + + PdfReader reader = new PdfReader(in); + + for (int i = 1; i <= reader.getNumberOfPages(); i++) { + + float documentHeight = cb.getPdfDocument().getPageSize().getHeight(); + + //import the page from source pdf + PdfImportedPage page = writer.getImportedPage(reader, i); + float pagePosition = positionAnterior; + + if ( (documentHeight - positionAnterior) <= page.getHeight()) { + document.newPage(); + pagePosition = 0; + positionAnterior = 0; + } + + //add the page to the destination pdf + cb.addTemplate(page, 0, pagePosition); + + positionAnterior += page.getHeight(); + } + } + + byteOS.flush(); + document.close(); + + byte[] arquivoEmBytes = byteOS.toByteArray(); + byteOS.close(); + + return arquivoEmBytes; + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/BoletoComSacadorAvalista.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/BoletoComSacadorAvalista.java new file mode 100644 index 0000000..463e7f6 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/BoletoComSacadorAvalista.java @@ -0,0 +1,92 @@ +package org.jrimum.bopepo.exemplo; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.domkee.comum.pessoa.endereco.CEP; +import org.jrimum.domkee.comum.pessoa.endereco.Endereco; +import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa; +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; +import org.jrimum.domkee.financeiro.banco.febraban.SacadorAvalista; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + * Exemplo de código para geração de um boleto simples com Sacador Avalista. + * + *

+ * Baseado no {@linkplain org.jrimum.bopepo.exemplo.MeuPrimeiroBoleto}. + *

+ * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +public class BoletoComSacadorAvalista extends MeuPrimeiroBoleto{ + + /** + * Executa o exemplo. + * + * @param args + */ + public static void main(String[] args) { + + new BoletoComSacadorAvalista().exemplo(); + } + + /** + * Cria um boleto com sacador avalista, em passos distintos, com os dados necessários para a visualização. + * + * @return boleto com dados + */ + @Override + Boleto crieUmBoleto() { + + /* + * PASSO 1: Faça o mesmo que se fez em MeuPrimeiroBoleto. + */ + ContaBancaria contaBancaria = crieUmaContaBancaria(); + Cedente cedente = crieUmCedente(); + Sacado sacado = crieUmSacado(); + + /* + * PASSO 2: Informe os dados do Sacador Avalista. + */ + SacadorAvalista sacadorAvalista = crieUmSacadorAvalista(); + + /* + * PASSO 3: Crie um novo título/cobrança e informe os dados. + */ + Titulo titulo = crieOsDadosDoNovoTitulo(new Titulo(contaBancaria,sacado,cedente,sacadorAvalista)); + + /* + * PASSO 4: Crie o boleto e informe os dados necessários do mesmo jeito. + */ + Boleto boleto = crieOsDadosDoNovoBoleto(new Boleto(titulo)); + + return boleto; + } + + /** + * Cria uma instância de sacador avalista com os principais dados para o boleto. + * + * @return sacadorAvalista com os dados necssários + */ + private final SacadorAvalista crieUmSacadorAvalista() { + + SacadorAvalista sacadorAvalista = new SacadorAvalista("JRimum Enterprise", "00.000.000/0001-91"); + + // Informando o endereço do sacador avalista. + Endereco enderecoSacAval = new Endereco(); + enderecoSacAval.setUF(UnidadeFederativa.DF); + enderecoSacAval.setLocalidade("Brasília"); + enderecoSacAval.setCep(new CEP("70150-903")); + enderecoSacAval.setBairro("Grande Centro"); + enderecoSacAval.setLogradouro("Rua Eternamente Principal"); + enderecoSacAval.setNumero("001"); + sacadorAvalista.addEndereco(enderecoSacAval); + + return sacadorAvalista; + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/CampoLivreJRimumBank.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/CampoLivreJRimumBank.java new file mode 100644 index 0000000..49a24e1 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/CampoLivreJRimumBank.java @@ -0,0 +1,117 @@ +/* + * 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: 01/11/2010 - 10:30: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: 01/11/2010 - 10:30:00 + * + */ +package org.jrimum.bopepo.exemplo; + +import static org.jrimum.texgit.type.component.Fillers.ZERO_LEFT; + +import org.jrimum.bopepo.campolivre.CampoLivre; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.FixedField; + +/** + *

+ * Campo Livre fictício para usar junto com o JRimumBank. + * Como todo campo livre, deve possuir o tamanho de 25 dígitos. + *

+ *

+ * O campo livre é, geralmente, formado através de dados do título. Assim, essa implementação + * recebe um título através de seu construtor. + *

+ * Segue abaixo o layout desse campo livre fictício: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
PosiçãoTamanhoPictureConteúdo
20-2569 (6)Código da conta (sem o dígito)
26-2949 (4)Código da agência (sem o dígito)
30-3569 (6)ZEROS
36-4499 (9)Nosso número (sem o dígito)
+ * + * @author Rômulo Augusto + * @author Misael Barreto + * + */ +public class CampoLivreJRimumBank implements CampoLivre { + + private static final long serialVersionUID = 338556606717660573L; + + private Titulo titulo; + + public CampoLivreJRimumBank(Titulo titulo) { + this.titulo = titulo; + } + + + public void read(String g) { + //Sem leitura + } + + public String write() { + + ContaBancaria conta = titulo.getContaBancaria(); + + FixedField fieldConta = new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 6, ZERO_LEFT); + FixedField fieldAgencia = new FixedField(conta.getAgencia().getCodigo(), 4, ZERO_LEFT); + FixedField fieldZeros = new FixedField(0, 6, ZERO_LEFT); + FixedField fieldNossoNumero = new FixedField(titulo.getNossoNumero(), 9); + + return fieldConta.write() + fieldAgencia.write() + fieldZeros.write() + fieldNossoNumero.write(); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/Exemplos.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/Exemplos.java new file mode 100644 index 0000000..2ff9200 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/Exemplos.java @@ -0,0 +1,365 @@ +/* + * 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: 18/05/2008 - 21:15: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: 18/05/2008 - 21:15:39 + * + */ + +package org.jrimum.bopepo.exemplo; + +import java.io.File; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.BoletoViewer; +import org.jrimum.domkee.comum.pessoa.endereco.Endereco; +import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; +import org.jrimum.domkee.financeiro.banco.febraban.SacadorAvalista; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite; +import org.jrimum.utilix.Exceptions; + +/** + * Classe utilitária para criação de objetos necessários para geração dos + * boletos de exemplo. + * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class Exemplos { + + /** + * Utility class pattern: classe não instanciável + * + * @throws AssertionError Caso haja alguma tentativa de utilização deste construtor. + */ + private Exemplos() { + Exceptions.throwIllegalStateException("Instanciação não permitida!"); + } + + /** + *

+ * Devolve uma lista com mais de um boleto. + *

+ * + * @return List + * + * @since 0.2 + */ + public static List getVariosBoletos() { + + List boletos = new ArrayList(5); + + Titulo titulo; + + final Date VENCIMENTO = new GregorianCalendar(2000, Calendar.JULY, 3).getTime(); + + final Date DATA_DO_DOCUMENTO = new GregorianCalendar(2000, Calendar.APRIL, 14).getTime(); + + Sacado sacado = crieSacado(); + + Cedente cedente = crieCedente(); + + ContaBancaria contaBancaria = new ContaBancaria(BancosSuportados.BANCO_DO_BRASIL.create()); + + contaBancaria.setAgencia(new Agencia(1234, "7")); + contaBancaria.setCarteira(new Carteira(5)); + contaBancaria.setNumeroDaConta(new NumeroDaConta(6789, "12")); + + cedente.addContaBancaria(contaBancaria); + + SacadorAvalista sacadorAvalista = crieSacadorAvalista(); + + // Fim Código em teste + titulo = new Titulo(contaBancaria,sacado, cedente, sacadorAvalista); + titulo.setNumeroDoDocumento("123456789"); + titulo.setNossoNumero("1234567890"); + titulo.setDigitoDoNossoNumero("5"); + titulo.setValor(BigDecimal.valueOf(100.23)); + titulo.setDataDoDocumento(DATA_DO_DOCUMENTO); + titulo.setDataDoVencimento(VENCIMENTO); + titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL); + titulo.setAceite(Aceite.A); + + Boleto b1,b2,b3,b4,b5; + b1 = new Boleto(titulo); + + b1.setLocalPagamento("Pagável preferencialmente na Rede X ou em qualquer Banco até o Vencimento."); + b1.setInstrucaoAoSacado("Senhor sacado, sabemos sim que o valor cobrado é injusto e esperamos seu pagamento assim mesmo."); + b1.setInstrucao1("PARA PAGAMENTO 1 "); + b1.getTitulo().getSacado().setNome("Misael Martins Motriz"); + + b2 = new Boleto(titulo); + + b2.setLocalPagamento(b1.getLocalPagamento()); + b2.setInstrucaoAoSacado(b1.getInstrucaoAoSacado()); + b2.setInstrucao1("PARA PAGAMENTO 2 "); + b2.getTitulo().getSacado().setNome("Samuca Meu Carro"); + + b3 = new Boleto(titulo); + + b3.setLocalPagamento(b1.getLocalPagamento()); + b3.setInstrucaoAoSacado(b1.getInstrucaoAoSacado()); + b3.setInstrucao1("PARA PAGAMENTO 3 "); + b3.getTitulo().getSacado().setNome("Romulo O Namorador"); + + b4 = new Boleto(titulo); + + b4.setLocalPagamento(b1.getLocalPagamento()); + b4.setInstrucaoAoSacado(b1.getInstrucaoAoSacado()); + b4.setInstrucao1("PARA PAGAMENTO 4 "); + b1.getTitulo().getSacado().setNome("Michelx E Seus Irmãos"); + + b5 = new Boleto(titulo); + + b5.setLocalPagamento(b1.getLocalPagamento()); + b5.setInstrucaoAoSacado(b1.getInstrucaoAoSacado()); + b5.setInstrucao1("PARA PAGAMENTO 5 "); + b5.getTitulo().getSacado().setNome("É o doido o que sobrescreveu."); + + boletos.add(b1); + boletos.add(b2); + boletos.add(b3); + boletos.add(b4); + boletos.add(b5); + + return boletos; + } + + /** + * Cria uma conta bancária com dados padrão. Esta contabancária não tem banco definido. + * + * @return + */ + public static ContaBancaria crieContaBancaria() { + + ContaBancaria contaBancaria = new ContaBancaria(); + + Agencia agencia = new Agencia(1234, "0"); + contaBancaria.setAgencia(agencia); + + NumeroDaConta numeroDaConta = new NumeroDaConta(123456, "0"); + contaBancaria.setNumeroDaConta(numeroDaConta); + + contaBancaria.setCarteira(new Carteira(1)); + + return contaBancaria; + } + + /** + * Cria um cedente com dados padrão. + * + * @return + */ + public static Cedente crieCedente() { + + Cedente cedente = new Cedente("PROJETO JRimum", "00.000.208/0001-00"); + + cedente.addContaBancaria(crieContaBancaria()); + + return cedente; + } + + /** + * Cria um Sacado com dados padrão. + * + * @return + */ + public static Sacado crieSacado() { + + Sacado sacado = new Sacado("JRimum Developer", "111.111.111-11"); + + Endereco endereco = new Endereco(); + endereco.setUF(UnidadeFederativa.RN); + endereco.setLocalidade("Natal"); + endereco.setCep("59064-120"); + endereco.setBairro("Centro"); + endereco.setLogradouro("Rua JRimum"); + endereco.setNumero("2332"); + + sacado.addEndereco(endereco); + + return sacado; + } + + /** + * Cria um Sacador Avalista padrão. + * + * @return + */ + public static SacadorAvalista crieSacadorAvalista() { + + SacadorAvalista sacadorAvalista = new SacadorAvalista("JavaRN", "00.000.000/0001-91"); + + Endereco endereco = new Endereco(); + endereco.setUF(UnidadeFederativa.PB); + endereco.setLocalidade("João Pessoa"); + endereco.setCep("59064-120"); + endereco.setBairro("Centro"); + endereco.setLogradouro("Rua JRimum Paraiba"); + endereco.setNumero("3223"); + + sacadorAvalista.addEndereco(endereco); + + return sacadorAvalista; + } + + /** + * Cria um título com dados padrão. + * + * @return + */ + public static Titulo crieTitulo() { + return crieTitulo(crieCedente(), crieSacado(), crieSacadorAvalista()); + } + + /** + * Cria um título com dados padrão sem sacador avalista. + * + * @return + */ + public static Titulo crieTituloSemSacadorAvalista() { + return crieTitulo(crieCedente(), crieSacado(), null); + } + + /** + * Cria um título a partir de um cedente, um sacado e um sacador avalista. + * + * @param cedente + * @param sacado + * @param sacadorAvalista + * @return + */ + public static Titulo crieTitulo(Cedente cedente, Sacado sacado, SacadorAvalista sacadorAvalista) { + + ContaBancaria contaBancariaDoCedente = cedente.getContasBancarias().iterator().next(); + Titulo titulo = null; + + if (sacadorAvalista != null) { + titulo = new Titulo(contaBancariaDoCedente, sacado, cedente, sacadorAvalista); + + } else { + titulo = new Titulo(contaBancariaDoCedente, sacado, cedente); + } + + titulo.setNumeroDoDocumento("123465"); + titulo.setNossoNumero("1"); + titulo.setDigitoDoNossoNumero("0"); + titulo.setValor(BigDecimal.TEN); + titulo.setDataDoDocumento(new Date()); + titulo.setDataDoVencimento(new Date()); + titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL); + titulo.setAceite(Aceite.A); + titulo.setDesconto(BigDecimal.ONE); + + return titulo; + } + + /** + * Cria um boleto a partir de um título. Para as informações extras, como instruções, + * é configurado um texto padrão. + * + * @param titulo + * @return + */ + public static Boleto crieBoleto(Titulo titulo) { + + Boleto boleto = new Boleto(titulo); + + boleto.setLocalPagamento("Pagável preferencialmente na Rede X ou em qualquer Banco até o Vencimento."); + + boleto.setInstrucaoAoSacado("Senhor sacado, sabemos sim que o valor cobrado não é o esperado, aproveite o DESCONTÃO!"); + + boleto.setInstrucao1("PARA PAGAMENTO 1 até Hoje não cobrar nada!"); + boleto.setInstrucao2("PARA PAGAMENTO 2 até Amanhã Não cobre!"); + boleto.setInstrucao3("PARA PAGAMENTO 3 até Depois de amanhã, OK, não cobre."); + boleto.setInstrucao4("PARA PAGAMENTO 4 até 04/xx/xxxx de 4 dias atrás COBRAR O VALOR DE: R$ 01,00"); + boleto.setInstrucao5("PARA PAGAMENTO 5 até 05/xx/xxxx COBRAR O VALOR DE: R$ 02,00"); + boleto.setInstrucao6("PARA PAGAMENTO 6 até 06/xx/xxxx COBRAR O VALOR DE: R$ 03,00"); + boleto.setInstrucao7("PARA PAGAMENTO 7 até xx/xx/xxxx COBRAR O VALOR QUE VOCÊ QUISER!"); + boleto.setInstrucao8("APÓS o Vencimento, Pagável Somente na Rede X."); + + return boleto; + } + + /** + * Gera o boleto. + * + * @param boleto + */ + public static void execute(Boleto boleto) { + execute(boleto, null); + } + + public static void executeComTemplate(Boleto boleto, File template) { + execute(boleto, template); + } + + /** + * Abre o arquivo no aplicativo padrão do sistema. + * + * @param arquivoBoleto + */ + public static void mostreBoletoNaTela(File arquivoBoleto) { + + try { + // Descomente se estiver usando java 6 ou superior + // java.awt.Desktop.getDesktop().open(arquivoBoleto); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void execute(Boleto boleto, File template) { + + BoletoViewer viewer = new BoletoViewer(boleto); + + if (template != null) { + viewer.setTemplate(template); + } + + File boletoPDF = viewer.getPdfAsFile("BOLETO_" + boleto.getClass().getSimpleName().toUpperCase() + ".PDF"); + + mostreBoletoNaTela(boletoPDF); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/JRimumBank.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/JRimumBank.java new file mode 100644 index 0000000..b4c19b2 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/JRimumBank.java @@ -0,0 +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: 01/11/2010 - 09:37: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: 01/11/2010 - 09:37:00 + * + */ +package org.jrimum.bopepo.exemplo; + +import javax.swing.ImageIcon; + +import org.jrimum.domkee.comum.pessoa.id.cprf.CNPJ; +import org.jrimum.domkee.financeiro.banco.febraban.Banco; +import org.jrimum.domkee.financeiro.banco.febraban.CodigoDeCompensacaoBACEN; +import org.jrimum.utilix.ClassLoaders; + +/** + * Banco fictício usado para exemplos genéricos. + * + * @author Rômulo Augusto + * @author Misael Barreto + * + */ +public class JRimumBank extends Banco { + + public JRimumBank() { + super(new CodigoDeCompensacaoBACEN("999"), "JRimum Bank", new CNPJ("02756617000167"), + "Banco Múltiplo", new ImageIcon(ClassLoaders.getResource("/img/999.png")).getImage()); + } +} \ No newline at end of file diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoleto.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoleto.java new file mode 100644 index 0000000..9e22580 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoleto.java @@ -0,0 +1,270 @@ +/* + * 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: 01/11/2010 - 09:37: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: 01/11/2010 - 09:37:00 + * + */ +package org.jrimum.bopepo.exemplo; + +import java.io.File; +import java.math.BigDecimal; +import java.util.Date; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.BoletoViewer; +import org.jrimum.domkee.comum.pessoa.endereco.CEP; +import org.jrimum.domkee.comum.pessoa.endereco.Endereco; +import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite; + +/** + * Exemplo de código para geração de um boleto simples. + * + *

+ * Utiliza o Banco Bradesco como exemplo, já que possui um implementação simples. + *

+ * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class MeuPrimeiroBoleto { + + /** + * Executa o exemplo. + * + * @param args + */ + public static void main(String[] args) { + + new MeuPrimeiroBoleto().exemplo(); + } + + /** + * Um simples exemplo de como gerar um boleto. + */ + final void exemplo() { + + /* + * Para gerar um boleto é preciso dos dados do boleto e de um + * visualizador de boletos. + */ + + /* + * Primeiro crie os dados do boleto. + */ + Boleto boleto = crieUmBoleto(); + + /* + * Em seguida, basta criar um visualizador para o boleto. + */ + BoletoViewer boletoViewer = new BoletoViewer(boleto); + + /* + * Depois, gere um arquivo, byte array ou stream. Nesse exemplo, um + * arquivo será salvo na mesma pasta do seu "projeto" + */ + + // Exemplos de uso: + // WINDOWS: boletoViewer.getAsPDF("C:/Temp/MeuBoleto.pdf"); + // LINUX: boletoViewer.getAsPDF("/home/temp/MeuBoleto.pdf"); + File arquivoPdf = boletoViewer.getPdfAsFile("MeuPrimeiroBoleto.pdf"); + + // Agora veja o arquivo gerado na tela. + mostreBoletoNaTela(arquivoPdf); + + } + + /** + * Cria um boleto, em passos distintos, com os dados necessários para a visualização. + * + * @return boleto com dados + */ + Boleto crieUmBoleto() { + + /* + * PASSO 1: Você precisa dos dados de uma conta bancária habilitada para + * emissão de boletos. + */ + ContaBancaria contaBancaria = crieUmaContaBancaria(); + + /* + * PASSO 2: Informe os dados do cedente. + */ + Cedente cedente = crieUmCedente(); + + /* + * PASSO 3: Informe os dados do Sacado. + */ + Sacado sacado = crieUmSacado(); + + /* + * PASSO 4: Crie um novo título/cobrança e informe os dados. + */ + Titulo titulo = crieOsDadosDoNovoTitulo(new Titulo(contaBancaria,sacado,cedente)); + + /* + * PASSO 5: Crie o boleto e informe os dados necessários. + */ + Boleto boleto = crieOsDadosDoNovoBoleto(new Boleto(titulo)); + + return boleto; + } + + /** + * Preenche os principais dados do boleto. + * + * @param boleto + * @return boleto com os dados necssários + */ + final Boleto crieOsDadosDoNovoBoleto(Boleto boleto) { + + boleto.setLocalPagamento("Pagável preferencialmente na Rede X ou em qualquer Banco até o Vencimento."); + boleto.setInstrucaoAoSacado("Senhor sacado, sabemos sim que o valor cobrado não é o esperado, aproveite o DESCONTÃO!"); + boleto.setInstrucao1("PARA PAGAMENTO 1 até Hoje não cobrar nada!"); + boleto.setInstrucao2("PARA PAGAMENTO 2 até Amanhã Não cobre!"); + boleto.setInstrucao3("PARA PAGAMENTO 3 até Depois de amanhã, OK, não cobre."); + boleto.setInstrucao4("PARA PAGAMENTO 4 até 04/xx/xxxx de 4 dias atrás COBRAR O VALOR DE: R$ 01,00"); + boleto.setInstrucao5("PARA PAGAMENTO 5 até 05/xx/xxxx COBRAR O VALOR DE: R$ 02,00"); + boleto.setInstrucao6("PARA PAGAMENTO 6 até 06/xx/xxxx COBRAR O VALOR DE: R$ 03,00"); + boleto.setInstrucao7("PARA PAGAMENTO 7 até xx/xx/xxxx COBRAR O VALOR QUE VOCÊ QUISER!"); + boleto.setInstrucao8("APÓS o Vencimento, Pagável Somente na Rede X."); + + return boleto; + } + + /** + * Preenche os principais dados do título. + * + * @param titulo + * + * @return título com os dados necssários + */ + final Titulo crieOsDadosDoNovoTitulo(Titulo titulo) { + + /* + * DADOS BÁSICOS. + */ + + titulo.setNumeroDoDocumento("123456"); + titulo.setNossoNumero("99345678912"); + titulo.setDigitoDoNossoNumero("5"); + titulo.setValor(BigDecimal.valueOf(0.23)); + + // Para informar a data de maneira simples você pode utilizar as + // classes utilitárias do JRimum. Abaixo temos alguns exemplos: + // (1) titulo.setDataDoVencimento( DateFormat.DDMMYYYY_B.parse("11/03/2011") ); + // (2) titulo.setDataDoVencimento( Dates.parse("11/03/2011", "dd/MM/yyyy") ); + titulo.setDataDoDocumento(new Date()); + titulo.setDataDoVencimento(new Date()); + + titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL); + titulo.setAceite(Aceite.A); + titulo.setDesconto(new BigDecimal(0.05)); + titulo.setDeducao(BigDecimal.ZERO); + titulo.setMora(BigDecimal.ZERO); + titulo.setAcrecimo(BigDecimal.ZERO); + titulo.setValorCobrado(BigDecimal.ZERO); + + return titulo; + } + + /** + * Cria uma instância de sacado com os principais dados para o boleto. + * + * @return sacado com os dados necssários + */ + final Sacado crieUmSacado() { + + Sacado sacado = new Sacado("Java Developer Pronto Para Férias", "222.222.222-22"); + + // Informando o endereço do sacado. + Endereco enderecoSac = new Endereco(); + enderecoSac.setUF(UnidadeFederativa.RN); + enderecoSac.setLocalidade("Natal"); + enderecoSac.setCep(new CEP("59064-120")); + enderecoSac.setBairro("Grande Centro"); + enderecoSac.setLogradouro("Rua poeta dos programas"); + enderecoSac.setNumero("1"); + sacado.addEndereco(enderecoSac); + + return sacado; + } + + /** + * Cria uma instância de cedente com os principais dados para o boleto. + * + * @return cedente com os dados necssários + */ + final Cedente crieUmCedente() { + + return new Cedente("Projeto JRimum", "00.000.208/0001-00"); + } + + /** + * Cria uma instância de conta bancária com os principais dados para o + * boleto em questão (Banco Bradesco). + * + * @return conta com os dados necssários + */ + final ContaBancaria crieUmaContaBancaria(){ + + ContaBancaria contaBancaria = new ContaBancaria(BancosSuportados.BANCO_BRADESCO.create()); + contaBancaria.setNumeroDaConta(new NumeroDaConta(123456, "0")); + contaBancaria.setCarteira(new Carteira(30)); + contaBancaria.setAgencia(new Agencia(1234, "1")); + + return contaBancaria; + } + + /** + * Exibe o arquivo na tela. + * + * @param arquivoBoleto + */ + final void mostreBoletoNaTela(File arquivoBoleto) { + + try { + // Descomente se estiver usando java 6 ou superior + // java.awt.Desktop.getDesktop().open(arquivoBoleto); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoletoBancoNaoSuportado.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoletoBancoNaoSuportado.java new file mode 100644 index 0000000..7dc4bcf --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoletoBancoNaoSuportado.java @@ -0,0 +1,197 @@ +/* + * 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: 01/11/2010 - 09:37: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: 01/11/2010 - 09:37:00 + * + */ +package org.jrimum.bopepo.exemplo; + +import java.io.File; +import java.math.BigDecimal; +import java.util.Date; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.campolivre.CampoLivre; +import org.jrimum.bopepo.view.BoletoViewer; +import org.jrimum.domkee.comum.pessoa.endereco.CEP; +import org.jrimum.domkee.comum.pessoa.endereco.Endereco; +import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa; +import org.jrimum.domkee.financeiro.banco.Banco; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; +import org.jrimum.domkee.financeiro.banco.febraban.SacadorAvalista; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite; + +/** + *

+ * Exemplo de código para geração de um boleto simples. + *

+ *

+ * Utiliza o Banco Bradesco como exemplo, já que possui um implementação simples. + *

+ * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class MeuPrimeiroBoletoBancoNaoSuportado { + + public static void main(String[] args) { + + /* + * INFORMANDO DADOS SOBRE O CEDENTE. + */ + Cedente cedente = new Cedente("PROJETO JRimum", "00.000.208/0001-00"); + + /* + * INFORMANDO DADOS SOBRE O SACADO. + */ + Sacado sacado = new Sacado("JavaDeveloper Pronto Para Férias", "222.222.222-22"); + + // Informando o endereço do sacado. + Endereco enderecoSac = new Endereco(); + enderecoSac.setUF(UnidadeFederativa.RN); + enderecoSac.setLocalidade("Natal"); + enderecoSac.setCep(new CEP("59064-120")); + enderecoSac.setBairro("Grande Centro"); + enderecoSac.setLogradouro("Rua poeta dos programas"); + enderecoSac.setNumero("1"); + sacado.addEndereco(enderecoSac); + + /* + * INFORMANDO DADOS SOBRE O SACADOR AVALISTA. + */ + SacadorAvalista sacadorAvalista = new SacadorAvalista("JRimum Enterprise", "00.000.000/0001-91"); + + // Informando o endereço do sacador avalista. + Endereco enderecoSacAval = new Endereco(); + enderecoSacAval.setUF(UnidadeFederativa.DF); + enderecoSacAval.setLocalidade("Brasília"); + enderecoSacAval.setCep(new CEP("59000-000")); + enderecoSacAval.setBairro("Grande Centro"); + enderecoSacAval.setLogradouro("Rua Eternamente Principal"); + enderecoSacAval.setNumero("001"); + sacadorAvalista.addEndereco(enderecoSacAval); + + /* + * INFORMANDO OS DADOS SOBRE O TÍTULO. + */ + // RECURSO PONTO DE EXTENSÃO: + // Informando um banco que AINDA não é suportado nativamente pelo componente. + Banco banco = new JRimumBank(); + + + + // Informando dados sobre a conta bancária do título. + ContaBancaria contaBancaria = new ContaBancaria(banco); + contaBancaria.setNumeroDaConta(new NumeroDaConta(123456, "0")); + contaBancaria.setCarteira(new Carteira(30)); + contaBancaria.setAgencia(new Agencia(1234, "1")); + + Titulo titulo = new Titulo(contaBancaria, sacado, cedente, sacadorAvalista); + titulo.setNumeroDoDocumento("123456"); + titulo.setNossoNumero("993456789"); + titulo.setDigitoDoNossoNumero("5"); + titulo.setValor(BigDecimal.valueOf(0.23)); + titulo.setDataDoDocumento(new Date()); + titulo.setDataDoVencimento(new Date()); + titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL); + titulo.setAceite(Aceite.A); + titulo.setDesconto(new BigDecimal(0.05)); + titulo.setDeducao(BigDecimal.ZERO); + titulo.setMora(BigDecimal.ZERO); + titulo.setAcrecimo(BigDecimal.ZERO); + titulo.setValorCobrado(BigDecimal.ZERO); + + + + + + /* + * INFORMANDO OS DADOS SOBRE O BOLETO. + */ + + // RECURSO PONTO DE EXTENSÃO: + // Informando o campo livre do banco que AINDA não é suportado nativamente pelo componente. + CampoLivre campoLivre = new CampoLivreJRimumBank(titulo); + + Boleto boleto = new Boleto(titulo, campoLivre); + + boleto.setLocalPagamento("Pagável preferencialmente na Rede X ou em " + + "qualquer Banco até o Vencimento."); + boleto.setInstrucaoAoSacado("Senhor sacado, sabemos sim que o valor " + + "cobrado não é o esperado, aproveite o DESCONTÃO!"); + boleto.setInstrucao1("PARA PAGAMENTO 1 até Hoje não cobrar nada!"); + boleto.setInstrucao2("PARA PAGAMENTO 2 até Amanhã Não cobre!"); + boleto.setInstrucao3("PARA PAGAMENTO 3 até Depois de amanhã, OK, não cobre."); + boleto.setInstrucao4("PARA PAGAMENTO 4 até 04/xx/xxxx de 4 dias atrás COBRAR O VALOR DE: R$ 01,00"); + boleto.setInstrucao5("PARA PAGAMENTO 5 até 05/xx/xxxx COBRAR O VALOR DE: R$ 02,00"); + boleto.setInstrucao6("PARA PAGAMENTO 6 até 06/xx/xxxx COBRAR O VALOR DE: R$ 03,00"); + boleto.setInstrucao7("PARA PAGAMENTO 7 até xx/xx/xxxx COBRAR O VALOR QUE VOCÊ QUISER!"); + boleto.setInstrucao8("APÓS o Vencimento, Pagável Somente na Rede X."); + + /* + * GERANDO O BOLETO BANCÁRIO. + */ + // Instanciando um objeto "BoletoViewer", classe responsável pela + // geração do boleto bancário. + BoletoViewer boletoViewer = new BoletoViewer(boleto); + + // Gerando o arquivo. No caso o arquivo mencionado será salvo na mesma + // pasta do projeto. Outros exemplos: + // WINDOWS: boletoViewer.getAsPDF("C:/Temp/MeuBoleto.pdf"); + // LINUX: boletoViewer.getAsPDF("/home/temp/MeuBoleto.pdf"); + File arquivoPdf = boletoViewer.getPdfAsFile("MeuPrimeiroBoleto.pdf"); + + // Mostrando o boleto gerado na tela. + mostreBoletoNaTela(arquivoPdf); + } + + /** + * Exibe o arquivo na tela. + * + * @param arquivoBoleto + */ + private static void mostreBoletoNaTela(File arquivoBoleto) { + + try { + // Descomente se estiver usando java 6 ou superior + // java.awt.Desktop.getDesktop().open(arquivoBoleto); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoletoPersonalizado.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoletoPersonalizado.java new file mode 100644 index 0000000..8e0fc5f --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/MeuPrimeiroBoletoPersonalizado.java @@ -0,0 +1,72 @@ +/* + * 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: 01/11/2010 - 09:37: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: 01/11/2010 - 09:37:00 + * + */ +package org.jrimum.bopepo.exemplo; + +import java.io.File; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.BoletoViewer; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.utilix.ClassLoaders; + +/** + *

+ * Exemplo de código para geração de um boleto simples usando um template personalizado. + *

+ *

+ * Utiliza a classe utilitária Exemplos para criar os objetos necessários para gerar o boleto. + *

+ * + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class MeuPrimeiroBoletoPersonalizado { + + public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + titulo.setNossoNumero("1234567890"); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + //Informando o template personalizado: + File templatePersonalizado = new File(ClassLoaders.getResource("/templates/BoletoTemplatePersonalizacaoSimples.pdf").getFile()); + BoletoViewer boletoViewer = new BoletoViewer(boleto, templatePersonalizado); + + File arquivoPdf = boletoViewer.getPdfAsFile("MeuBoletoPersonalizado.pdf"); + + Exemplos.mostreBoletoNaTela(arquivoPdf); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/VariosBoletosEmUmArquivo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/VariosBoletosEmUmArquivo.java new file mode 100644 index 0000000..cd4c4e8 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/VariosBoletosEmUmArquivo.java @@ -0,0 +1,109 @@ + +/* + * 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: 18/05/2008 - 21:13:29 + * + * ================================================================================ + * + * 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: 18/05/2008 - 21:13:29 + * + */ + +package org.jrimum.bopepo.exemplo; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.BoletoViewer; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

+ * Exemplo de código para geração de vários boletos em um único arquivo PDF. + *

+ * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class VariosBoletosEmUmArquivo { + + + public static void main(String[] args) { + + Boleto boletoBB = crieBoletoBB(); + Boleto boletoBradesco = crieBoletoBradesco(); + + List boletos = new ArrayList(); + boletos.add(boletoBB); + boletos.add(boletoBradesco); + + File pdf = BoletoViewer.groupInOnePDF(boletos, "PDFComVariosBoletos.pdf"); + Exemplos.mostreBoletoNaTela(pdf); + } + + /** + * Cria um boleto do banco Bradesco. + * @return + */ + private static Boleto crieBoletoBradesco() { + + Titulo tituloBradesco = Exemplos.crieTitulo(); + tituloBradesco.setNossoNumero("01234567891"); + + ContaBancaria contaBancariaBradesco = tituloBradesco.getContaBancaria(); + contaBancariaBradesco.setBanco(BancosSuportados.BANCO_BRADESCO.create()); + contaBancariaBradesco.setAgencia(new Agencia(1234)); + contaBancariaBradesco.setCarteira(new Carteira(12)); + contaBancariaBradesco.setNumeroDaConta(new NumeroDaConta(1234567)); + + return Exemplos.crieBoleto(tituloBradesco); + } + + /** + * Cria um boleto do Banco do Brasil. + * @return + */ + private static Boleto crieBoletoBB() { + + Titulo tituloBB = Exemplos.crieTitulo(); + tituloBB .setNossoNumero("1234567890"); + + ContaBancaria contaBancariaBB = tituloBB.getContaBancaria(); + contaBancariaBB.setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + + return Exemplos.crieBoleto(tituloBB); + } + +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/VariosBoletosEmVariosArquivos.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/VariosBoletosEmVariosArquivos.java new file mode 100644 index 0000000..49c183f --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/VariosBoletosEmVariosArquivos.java @@ -0,0 +1,92 @@ +/* + * 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: 18/05/2008 - 21:13:29 + * + * ================================================================================ + * + * 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: 18/05/2008 - 21:13:29 + * + */ + +package org.jrimum.bopepo.exemplo; + +import java.io.File; +import java.util.List; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.BoletoViewer; + + + +/** + * + *

+ * Exemplo de código para geração de vários boletos em um único arquivo PDF. + *

+ * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ + +public class VariosBoletosEmVariosArquivos { + + + public static void main(String[] args) { + + /* + * É bem simples, consiga os boletos + */ + + List boletos = Exemplos.getVariosBoletos(); + + /* + * Depois diga o nome do diretorio para onde os boletos serão gerados. + */ + + BoletoViewer.onePerPDF(boletos, new File("./"), "prefixo-boleto-", "-sufixo-DePagamento"); + + + /* + * Pronto, agora vamos conferir um: + */ + try{ + // Descomente se estiver usando java 6 ou superior + //java.awt.Desktop.getDesktop().open(new File("prefixo-boleto-1-sufixo-DePagamento.pdf")); + + }catch(Exception e){ + throw new RuntimeException("Arquivo não gerado!",e); + } + + /* + * É sério, é só isso mesmo! + * Se não acredita confira os vários arquivos que estão no diretório. + */ + + } + +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/banrisul/NossoNumero.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/banrisul/NossoNumero.java new file mode 100644 index 0000000..3ec8d8f --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/banrisul/NossoNumero.java @@ -0,0 +1,225 @@ +/* + * 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: 11/04/2011 - 23:20:00 + * + * ================================================================================ + * + * 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: 11/04/2011 - 23:20:00 + * + */ + +package org.jrimum.bopepo.exemplo.banco.banrisul; + +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.utilix.Objects; +import org.jrimum.vallia.digitoverificador.Modulo; + +/** + * Classe responsável pela criação do Nosso Número referente ao Banco Banrisul. + * + * @author Gilmar P.S.L. + */ +public class NossoNumero { + + private int numero; + + private int dvMod10; + private int dvMod11; + + /** + * Nosso número calculado. + */ + private StringBuilder nossoNumero = new StringBuilder(""); + + /** + * Para uso interno. + */ + private NossoNumero() {} + + public static NossoNumero valueOf(int numero){ + + Objects.checkArgument(numero > 0, "Número [ "+numero+" ] inválido!"); + + NossoNumero nn = new NossoNumero(); + nn.numero = numero; + nn.create(); + + return nn; + } + + /** + * Responsável pela lógica de cálculo do dígito verificador informada pelo + * Bradesco. + *

+ * Para maiores esclarecimentos ver o manual do Bradesco. + *

+ */ + private void create(){ + + nossoNumero.append(Fillers.ZERO_LEFT.fill(numero, 8)); + + calculeDvMod10(); + calculeDvMod11(); + } + + private void calculeDvMod11() { + + int somatorio = Modulo.calculeSomaSequencialMod11(nossoNumero.toString()+getDvMod10(),2,7); + + int restoDivisao; + + /* + * Caso o somatório obtido seja menor que 11, considerar como resto da divisão o próprio somatório. + */ + if(somatorio < 11){ + restoDivisao = somatorio; + }else{ + restoDivisao = somatorio % 11; + } + + int restoSubtracao = (11 - restoDivisao); + + /* + * Caso o resto obtido no cálculo do módulo 11 seja 0, o segundo NC será + * igual ao próprio resto. + */ + if(restoDivisao == 0){ + this.dvMod11 = 0; + }else{ + + if(restoDivisao != 1){ + + this.dvMod11 = restoSubtracao; + + }else{ + /* + * Caso o resto obtido no cálculo do módulo 11 seja igual a 1, + * considera-se o DV inválido. Soma-se, então, "1" ao DV obtido + * do módulo "10" e refaz-se o cálculo do módulo “11” . + */ + this.dvMod10++; + + /* + * Se o dígito obtido pelo módulo “10” era igual a "9", + * considera-se então (9+1=10) DV inválido. Neste caso, o DV do + * módulo "10" automaticamente será igual a "0" e procede-se + * assim novo cálculo pelo módulo "11". + */ + if(this.dvMod10 == 10){ + + dvMod10 = 0; + } + + /* + * Novo cálculo + */ + calculeDvMod11(); + } + } + } + + private void calculeDvMod10() { + + int somatorio = Modulo.calculeSomaSequencialMod10(nossoNumero.toString(),1,2); + + int restoDivisao; + + /* + * Quando o somatório for menor que 10, o resto da divisão por 10 será o + * próprio somatório. + */ + if(somatorio < 10){ + restoDivisao = somatorio; + }else{ + restoDivisao = somatorio % 10; + } + + int restoSubtracao = (10 - restoDivisao); + + if(restoDivisao == 0){ + this.dvMod10 = 0; + }else{ + this.dvMod10 = restoSubtracao; + } + } + + /** + * Retorna o digito verificador calculado. + * + * @return String Digito Verificador de dois dígitos + */ + public String getDv(){ + return dvMod10+""+dvMod11; + } + + /** + * @return the dvMod10 + */ + public int getDvMod10() { + return dvMod10; + } + + /** + * @return the dvMod11 + */ + public int getDvMod11() { + return dvMod11; + } + + /** + * String com o nosso número sem o digito verificador. + * + * @return nosso número + */ + public String writeRaw(){ + return Fillers.ZERO_LEFT.fill(numero, 8); + } + + /** + * String com o nosso número com o digito verificador. + * + * @return nosso número + */ + public String writeFull(){ + return nossoNumero.toString(); + } + + /** + * String com o nosso número formatado com o digito verificador. + * + * @return nosso número + */ + public String writeFormated(){ + return Fillers.ZERO_LEFT.fill(numero, 8)+"."+getDv(); + } + + /** + * Escreve o nosso número formatado. + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return writeFormated(); + } + +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero10Exemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero10Exemplo.java new file mode 100644 index 0000000..43ea2c5 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero10Exemplo.java @@ -0,0 +1,67 @@ +/* + * 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/09/2009 - 00:44:51 + * + * ================================================================================ + * + * 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/09/2009 - 00:44:51 + * + */ +package org.jrimum.bopepo.exemplo.banco.bb; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

+ * Exemplo do boleto para o Banco do Brasil com Nosso Número 10 + *

+ *

+ * Mostra um exemplo funcional que gera um boleto para a implementação de campo livre + * do Banco do Brasil com Nosso Número 10 + *

+ * + * @author Rômulo Augusto + * + * @version 0.2 + */ +public class BoletoBBNossoNumero10Exemplo { + + public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + //Campos específicos para o Banco do Brasil com nosso número 10. + titulo.setNossoNumero("1234567890"); + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + contaBancaria.setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero11Exemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero11Exemplo.java new file mode 100644 index 0000000..c9603c8 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero11Exemplo.java @@ -0,0 +1,67 @@ +/* + * 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/09/2009 - 00:44:51 + * + * ================================================================================ + * + * 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/09/2009 - 00:44:51 + * + */ +package org.jrimum.bopepo.exemplo.banco.bb; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

+ * Exemplo do boleto para o Banco do Brasil com Nosso Número 11 + *

+ *

+ * Mostra um exemplo funcional que gera um boleto para a implementação de campo livre + * do Banco do Brasil com Nosso Número 11 + *

+ * + * @author Rômulo Augusto + * + * @version 0.2 + */ +public class BoletoBBNossoNumero11Exemplo { + + public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + //Campos específicos para o Banco do Brasil com nosso número 11. + titulo.setNossoNumero("12345678901"); + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + contaBancaria.setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero17Convenio6Exemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero17Convenio6Exemplo.java new file mode 100644 index 0000000..f4b8b67 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero17Convenio6Exemplo.java @@ -0,0 +1,84 @@ +/* + * 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/09/2009 - 00:44:51 + * + * ================================================================================ + * + * 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/09/2009 - 00:44:51 + * + */ +package org.jrimum.bopepo.exemplo.banco.bb; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

+ * Exemplo do boleto para o Banco do Brasil com Nosso Número de 17 dígitos e Convênio de 6 posições. + *

+ *

+ * Mostra um exemplo funcional que gera um boleto para a implementação de campo livre + * do Banco do Brasil com Banco do Brasil com Nosso Número 17/Convênio 7; + *

+ * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @version 0.2 + */ +public class BoletoBBNossoNumero17Convenio6Exemplo { + + public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + /* + * Campos específicos para o Banco do Brasil com Nosso Número 17 / Convênio 6. + */ + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + + /* + * Banco do Brasil 001 + */ + contaBancaria.setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + + /* + * Conta/Convênio de 6 posições ou seja, até 999999 + */ + contaBancaria.setNumeroDaConta(new NumeroDaConta(123456)); + + /* + * Nosso Número de 17 posições + */ + titulo.setNossoNumero("12345678901234567"); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero17Convenio7Exemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero17Convenio7Exemplo.java new file mode 100644 index 0000000..416ea13 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/BoletoBBNossoNumero17Convenio7Exemplo.java @@ -0,0 +1,61 @@ +package org.jrimum.bopepo.exemplo.banco.bb; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

+ * Exemplo do boleto para o Banco do Brasil com Nosso Número de 17 dígitos e Convênio de 7 posições. + *

+ *

+ * Mostra um exemplo funcional que gera um boleto para a implementação de campo livre + * do Banco do Brasil com Nosso Número 17/Convênio 7; + *

+ * + * @author Gilmar P.S.L. + * + * @version 0.2 + */ +public class BoletoBBNossoNumero17Convenio7Exemplo { + + +public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + /* + * Campos específicos para o Banco do Brasil com Nosso Número 17 / Convênio 6. + */ + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + + /* + * Banco do Brasil 001 + */ + contaBancaria.setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + + /* + * Conta/Convênio de 7 posições ou seja, acima de 1.000.000 + */ + contaBancaria.setNumeroDaConta(new NumeroDaConta(1234567)); + + /* + * Nosso Número de 17 posições + */ + titulo.setNossoNumero("12345678901234567"); + + /* + * Carteira com no máximo 2 dígitos + */ + contaBancaria.setCarteira(new Carteira(23)); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/package-info.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/package-info.java new file mode 100644 index 0000000..2bfb6b7 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bb/package-info.java @@ -0,0 +1,36 @@ +/* + * 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: 02/11/2010 - 18:06:18 + * + * ================================================================================ + * + * 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: 02/11/2010 - 18:06:18 + * + */ + +/** + * Exemplos de geração de boletos para o Banco do Brasil. + * + * @author Gilmar P.S.L + * @author Rômulo Augusto + */ +package org.jrimum.bopepo.exemplo.banco.bb; \ No newline at end of file diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bnb/BoletoBancoDoNordesteDoBrasilExemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bnb/BoletoBancoDoNordesteDoBrasilExemplo.java new file mode 100644 index 0000000..ba66d6f --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bnb/BoletoBancoDoNordesteDoBrasilExemplo.java @@ -0,0 +1,105 @@ +/* + * 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.exemplo.banco.bnb; + + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

+ * Exemplo do boleto para o Banco do Nordeste + *

+ *

+ * Mostra um exemplo funcional que gera um boleto para a implementação de campo livre + * do Banco do Nordeste do Brasil + *

+ * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Paulo Porto + * + * @version 0.2 + */ +public class BoletoBancoDoNordesteDoBrasilExemplo { + + public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + /* + * Campos específicos para o Banco do Nordeste. + */ + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + + /* + * Banco do Nordeste 004 + */ + contaBancaria.setBanco(BancosSuportados.BANCO_DO_NORDESTE_DO_BRASIL.create()); + + /* + * Agência com no máximo 4 dígitos + */ + contaBancaria.setAgencia(new Agencia(100)); + + /* + * Carteira com no máximo 2 dígitos + */ + contaBancaria.setCarteira(new Carteira(57)); + + /* + * Nosso Número com 7 dígitos + */ + titulo.setNossoNumero("7654321"); + + /* + * Dígito do Nosso Número + */ + titulo.setDigitoDoNossoNumero("0"); + + /* + * Número da conta com no máximo 7 dígitos e necessariamente com o dígito verificador + */ + contaBancaria.setNumeroDaConta(new NumeroDaConta(13677, "9")); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bradesco/BoletoBradescoExemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bradesco/BoletoBradescoExemplo.java new file mode 100644 index 0000000..907e05c --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bradesco/BoletoBradescoExemplo.java @@ -0,0 +1,96 @@ +/* + * 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/09/2009 - 00:44:51 + * + * ================================================================================ + * + * 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/09/2009 - 00:44:51 + * + */ +package org.jrimum.bopepo.exemplo.banco.bradesco; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

+ * Exemplo do boleto para o Banco Bradesco + *

+ *

+ * Mostra um exemplo funcional que gera um boleto para a implementação de campo livre + * do Banco Bradesco + *

+ * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @version 0.2 + */ +public class BoletoBradescoExemplo { + + public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + /* + * Campos específicos para o Banco Bradesco. + */ + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + + /* + * Banco bradesco 237 + */ + contaBancaria.setBanco(BancosSuportados.BANCO_BRADESCO.create()); + + /* + * Agência com no máximo 4 dígitos + */ + contaBancaria.setAgencia(new Agencia(1234)); + + /* + * Carteira com no máximo 2 dígitos + */ + contaBancaria.setCarteira(new Carteira(12)); + + /* + * Nosso número com 11 dígitos + */ + titulo.setNossoNumero("01234567891"); + + /* + * Número da conta com no máxiom 7 dígitos + */ + contaBancaria.setNumeroDaConta(new NumeroDaConta(1234567)); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bradesco/NossoNumero.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bradesco/NossoNumero.java new file mode 100644 index 0000000..96cf411 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/bradesco/NossoNumero.java @@ -0,0 +1,145 @@ +/* + * 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: 07/04/2011 - 10:57:00 + * + * ================================================================================ + * + * 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: 07/04/2011 - 10:57:00 + * + */ + +package org.jrimum.bopepo.exemplo.banco.bradesco; + +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.utilix.Objects; +import org.jrimum.vallia.digitoverificador.Modulo; + +/** + * Classe responsável pela criação do Nosso Número referente ao Banco Bradesco. + * + * @author Gilmar P.S.L. + */ +public class NossoNumero { + + private String carteira; + + private long numero; + + private String dv; + + private StringBuilder nossoNumero = new StringBuilder(""); + + /** + * Para uso interno. + */ + private NossoNumero() {} + + public static NossoNumero valueOf(long numero, int carteira){ + + Objects.checkArgument(numero > 0, "Número [ "+numero+" ] inválido!"); + Objects.checkArgument(carteira > 0, "Carteira [ "+carteira+" ] inválida!"); + Objects.checkArgument(carteira <= 99, "Carteira [ "+carteira+" ] inválida! Carteira Bradesco deve ser um número entre 1 e 99"); + + NossoNumero nn = new NossoNumero(); + nn.numero = numero; + nn.carteira = Fillers.ZERO_LEFT.fill(carteira, 2); + nn.create(); + + return nn; + } + + /** + * Responsável pela lógica de cálculo do dígito verificador informada pelo + * Bradesco. + *

+ * Para maiores esclarecimentos ver o manual do Bradesco. + *

+ */ + private void create(){ + + nossoNumero.append(Fillers.ZERO_LEFT.fill(numero, 11)); + + String formula = this.carteira+nossoNumero.toString(); + + int restoDivisao = Modulo.calculeMod11(formula,2,7); + + int restoSubtracao = (11 - restoDivisao); + + if(restoDivisao == 0){ + dv = "0"; + }else{ + if(restoSubtracao == 10){ + dv = "P"; + }else{ + dv = ""+restoSubtracao; + } + } + nossoNumero.append(dv); + } + + /** + * Retorna o digito verificador calculado. + * + * @return String Digito Verificador + */ + public String getDv(){ + return dv; + } + + /** + * String com o nosso número sem o digito verificador. + * + * @return nosso número + */ + public String writeRaw(){ + return Fillers.ZERO_LEFT.fill(numero, 11); + } + + /** + * String com o nosso número com o digito verificador. + * + * @return nosso número + */ + public String writeFull(){ + return nossoNumero.toString(); + } + + /** + * String com o nosso número formatado com o digito verificador. + * + * @return nosso número + */ + public String writeFormated(){ + return Fillers.ZERO_LEFT.fill(numero, 11)+"-"+dv; + } + + /** + * Escreve o nosso número formatado. + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return writeFormated(); + } + +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/brb/BoletoBancoDeBrasiliaExemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/brb/BoletoBancoDeBrasiliaExemplo.java new file mode 100644 index 0000000..0d94725 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/brb/BoletoBancoDeBrasiliaExemplo.java @@ -0,0 +1,98 @@ +/* + * Copyright 2014 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/02/2014 - 17:49:03 + * + * ================================================================================ + * + * Direitos autorais 2014 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/02/2014 - 17:49:03 + * + */ + +package org.jrimum.bopepo.exemplo.banco.brb; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + * Exemplo do boleto para BRB - Banco de Brasília. + + *

+ * Mostra um exemplo funcional que gera um boleto para a implementação padrão do BRB. + *

+ * + * @author Gilmar P.S.L. + * + * @version 0.2 + */ +/** + * @author Gilmar P.S.L. + * + */ +public class BoletoBancoDeBrasiliaExemplo { + + public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + /* + * Campos específicos para o Banco de Brasília. + */ + ContaBancaria contaBancaria = titulo.getContaBancaria(); + + /* + * Banco 070 + */ + contaBancaria.setBanco(BancosSuportados.BANCO_DE_BRASILIA.create()); + + /* + * Código do agência com no máxiom 3 dígitos + */ + contaBancaria.setAgencia(new Agencia(58));//058 + + /* + * Código do conta com no máxiom 7 dígitos + */ + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(2006));//0002006 + + /* + * Carteira com no máximo 2 dígitos + */ + contaBancaria.setCarteira(new Carteira(1,TipoDeCobranca.SEM_REGISTRO)); + + /* + * Nosso número com 6 dígitos + */ + titulo.setNossoNumero("000001"); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/cecred/BoletoCecredExemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/cecred/BoletoCecredExemplo.java new file mode 100644 index 0000000..fb9b67f --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/cecred/BoletoCecredExemplo.java @@ -0,0 +1,103 @@ +/* + * Copyright 2014 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: 21/01/2014 - 16:28:50 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 21/01/2014 - 16:28:50 + * + */ + +package org.jrimum.bopepo.exemplo.banco.cecred; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.bopepo.parametro.ParametroCECRED; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + * Exemplo do boleto para CECRED. + * + *

+ * Mostra um exemplo funcional que gera um boleto para a implementação padrão do + * CECRED. + *

+ * + * @author Gilmar P.S.L. + * + * @version 0.2 + */ +public class BoletoCecredExemplo { + + public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + /* + * Campos específicos para o CECRED. + */ + ContaBancaria contaBancaria = titulo.getContaBancaria(); + + /* + * Banco 085 + */ + contaBancaria.setBanco(BancosSuportados.CECRED.create()); + + /* + * Número da conta com no máximo 8 dígitos + */ + int conta = 12345; + + contaBancaria.setNumeroDaConta(new NumeroDaConta(conta)); + + /* + * Carteira com no máximo 2 dígitos + */ + contaBancaria.setCarteira(new Carteira(12)); + + /* + * Númeero sequencial do boleto com no máximo 9 dígitos + */ + String sequencial = "123456789"; + + /* + * Nosso número com exatamente 17 dígitos + * "numero_da_conta"[8] + "sequencial"[9] + */ + titulo.setNossoNumero("000"+conta+sequencial); + + /* + * Código do convênio com no máxiom 6 dígitos + */ + titulo.setParametrosBancarios(new ParametrosBancariosMap(ParametroCECRED.CODIGO_DO_CONVENIO, 123)); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/cef/NossoNumeroCobrancaRapidaSICOB.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/cef/NossoNumeroCobrancaRapidaSICOB.java new file mode 100644 index 0000000..4e2e828 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/cef/NossoNumeroCobrancaRapidaSICOB.java @@ -0,0 +1,148 @@ +/* + * Copyright 2013 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: 21/03/2013 - 11:25:33 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 21/03/2013 - 11:25:33 + * + */ +package org.jrimum.bopepo.exemplo.banco.cef; + +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.utilix.Objects; +import org.jrimum.vallia.digitoverificador.Modulo; + +/** + * Nosso Número referente a COBRANÇA RÁPIDA – 11 POSIÇÕES da CAIXA ECONÔMICA + * FEDERAL (CEF) + * + *
    + *
  • Campo com 10 posições sempre iniciando com 9;
  • + *
  • Utiliza 1 dígito verificador calculado através do módulo 11, com peso 2 a + * 9.
  • + *
+ * + *

+ * 9NNNNNNNNN - D1 + *

+ * + * + * @author Gilmar P.S.L. + */ +public class NossoNumeroCobrancaRapidaSICOB { + + private long numero; + + private String dv; + + private StringBuilder nossoNumero = new StringBuilder(""); + + /** + * Para uso interno. + */ + private NossoNumeroCobrancaRapidaSICOB() {} + + public static NossoNumeroCobrancaRapidaSICOB valueOf(long numero){ + + Objects.checkArgument(numero > 0, "Número [ "+numero+" ] inválido!"); + + NossoNumeroCobrancaRapidaSICOB nn = new NossoNumeroCobrancaRapidaSICOB(); + nn.numero = numero; + nn.create(); + + return nn; + } + + /** + * Responsável pela lógica de cálculo do dígito verificador informada pelo + * Bradesco. + *

+ * Para maiores esclarecimentos ver o manual do Bradesco. + *

+ */ + private void create(){ + + nossoNumero.append(9); + nossoNumero.append(Fillers.ZERO_LEFT.fill(numero, 9)); + + String formula = nossoNumero.toString(); + + int restoDivisao = Modulo.calculeMod11(formula,2,9); + + int restoSubtracao = (11 - restoDivisao); + + if(restoDivisao > 9){ + dv = "0"; + }else{ + dv = ""+restoSubtracao; + } + + nossoNumero.append(dv); + } + + /** + * Retorna o digito verificador calculado. + * + * @return String Digito Verificador + */ + public String getDv(){ + return dv; + } + + /** + * String com o nosso número sem o digito verificador. + * + * @return nosso número + */ + public String writeRaw(){ + return Fillers.ZERO_LEFT.fill(numero, 10); + } + + /** + * String com o nosso número com o digito verificador. + * + * @return nosso número + */ + public String writeFull(){ + return nossoNumero.toString(); + } + + /** + * String com o nosso número formatado com o digito verificador. + * + * @return nosso número + */ + public String writeFormated(){ + return "9"+Fillers.ZERO_LEFT.fill(numero, 9)+"-"+dv; + } + + /** + * Escreve o nosso número formatado. + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return writeFormated(); + } +} \ No newline at end of file diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/package-info.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/package-info.java new file mode 100644 index 0000000..e8b1384 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/package-info.java @@ -0,0 +1,35 @@ +/* + * 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: 14/08/2010 - 20:50:14 + * + * ================================================================================ + * + * 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: 14/08/2010 - 20:50:14 + * + */ + +/** + * Criação de dados para os respectivos bancos na demonstração de geração de boletos. + * + * @author Gilmar P.S.L + */ +package org.jrimum.bopepo.exemplo.banco; \ No newline at end of file diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/sicredi/BoletoSicrediExemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/sicredi/BoletoSicrediExemplo.java new file mode 100644 index 0000000..76a4267 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/banco/sicredi/BoletoSicrediExemplo.java @@ -0,0 +1,88 @@ +/* + * 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: 12/11/2010 - 12:47:22 + * + * ================================================================================ + * + * 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: 12/11/2010 - 12:47:22 + * + */ + +package org.jrimum.bopepo.exemplo.banco.sicredi; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.bopepo.parametro.ParametroBancoSicredi; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

+ * Exemplo do boleto para o Banco Sicredi + *

+ *

+ * Mostra um exemplo funcional que gera um boleto para a implementação de campo livre + * do Banco Sicredi + *

+ * + * @author Gilmar P.S.L. + * + * @version 0.2 + */ +public class BoletoSicrediExemplo { + +public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + /* + * Campos específicos para o Banco Sicredi. + */ + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + + /* + * Banco Sicredi 748 + */ + contaBancaria.setBanco(BancosSuportados.BANCO_SICREDI.create()); + + contaBancaria.setAgencia(new Agencia(165)); + contaBancaria.setNumeroDaConta(new NumeroDaConta(623)); + contaBancaria.setCarteira(new Carteira(1, TipoDeCobranca.SEM_REGISTRO)); + + titulo.setNossoNumero("07200003"); + titulo.setDigitoDoNossoNumero("1"); + + titulo.setParametrosBancarios(new ParametrosBancariosMap(ParametroBancoSicredi.POSTO_DA_AGENCIA, 2)); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/bancoob/BoletoBancoobCobrancaNaoRegistradaExemplo.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/bancoob/BoletoBancoobCobrancaNaoRegistradaExemplo.java new file mode 100644 index 0000000..a3d9cb1 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/bancoob/BoletoBancoobCobrancaNaoRegistradaExemplo.java @@ -0,0 +1,83 @@ +/* + * 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: 17/02/2011 - 12:40:00 + * + * ================================================================================ + * + * 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: 17/02/2011 - 12:40:00 + */ + +package org.jrimum.bopepo.exemplo.bancoob; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.exemplo.Exemplos; +import org.jrimum.bopepo.parametro.ParametroBancoob; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

+ * Exemplo do boleto para o Bancoob - Cobrança não registrada. + *

+ *

+ * Mostra um exemplo funcional que gera um boleto para a implementação de campo + * livre do Bancoob para cobrança não registrada. + *

+ * + * @author Gilmar P.S.L. + * + * @version 0.2 + */ +public class BoletoBancoobCobrancaNaoRegistradaExemplo { + + public static void main(String[] args) { + + Titulo titulo = Exemplos.crieTitulo(); + + /* + * Campos específicos para o Bancoob. + */ + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + + /* + * Banco Sicredi 756 + */ + contaBancaria.setBanco(BancosSuportados.BANCOOB.create()); + + contaBancaria.setAgencia(new Agencia(4340)); + contaBancaria.setNumeroDaConta(new NumeroDaConta(1)); + contaBancaria.setCarteira(new Carteira(1)); + + titulo.setNossoNumero("11000001"); + titulo.setParametrosBancarios(new ParametrosBancariosMap(ParametroBancoob.NUMERO_DA_PARCELA,Integer.valueOf(0))); + + Boleto boleto = Exemplos.crieBoleto(titulo); + + Exemplos.execute(boleto); + } +} diff --git a/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/package-info.java b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/package-info.java new file mode 100644 index 0000000..4bbb396 --- /dev/null +++ b/jrimum-bopepo/src/examples/java/org/jrimum/bopepo/exemplo/package-info.java @@ -0,0 +1,35 @@ +/* + * 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: 14/08/2010 - 20:50:14 + * + * ================================================================================ + * + * 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: 14/08/2010 - 20:50:14 + * + */ + +/** + * Exemplos demosntrativos envolvendo a geração de boletos. + * + * @author Gilmar P.S.L + */ +package org.jrimum.bopepo.exemplo; \ No newline at end of file diff --git a/jrimum-bopepo/src/examples/resources/img/999.png b/jrimum-bopepo/src/examples/resources/img/999.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0547d27aa6a3dfe0eb8232d5baa6397e2b1a1a GIT binary patch literal 6618 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

F5{v_FzuL$+zPueH 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

6N|b3PS!tMNlzhS&_OS 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

7MRA)4OU{SJn4b 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%0DO%BkN?UYA8SKW zD*~5Vi*}cP(o3e=-@lG*(ZBPRYqz`|Mh4oG>c_)Jbu{tR{16;_O{9&19ps2Jl|4kR6Y{KY3O z-IV`$CM6!wj8_nM0tM9h#&_tp>v71)UG-ew)-1FG%;SG)GQ>lz| zND&rcbF?mizX3oUy6t+ZOI5#O*#G?VNT#M(Dp%I2?R4NVhS%LTiQco^QF%h}qAotw-%HEQgn2B*SZZ^Y| z!qq!`{+0V`w=N8%{yOilCqunbPxN+*v@z#d!lkX5K$sbTQ1J%00+B|T&yMcA>bf_< z1xJ+dmL!X*wQX?Pbg3*)8jIRl4GUx#uUZe_XjJ5o( zmZJp*ix;hGE#Ra}xT(M><1txNs*~L?m;fY4wNej9NS8T>Ce_TY@4Qg_y9A&VK`TX* zyVLA1hA$a<@#`m3ANj4r^H=`-9*LnLbSNh<%1O0mydx>clu9OPekWykLxzA*xaHD8 ze0E~?rbU&$yeQ)#;~apNjx|?DOjneA;!KtHH&!K5*+yX_23rIg2Qg&=xGH zw1Ux!5s)8z=eR%9jp@^f-wltqISH)40N2pju6oy z07qZ<J-gD%-c!B@8mwQTg{D+$?Nr zrfwym;5_4GgphzOzBv85e*fbckAGJZD|6QLQ3t8e_wD|hd{<70nT+`M_K0f{9&B~3d72$z6` zXAQ=#vymqks6`54wOm0Cp~}}{G^M{0Iq=}ib|Bp-EGi~KrU~p;ezL*{tW&kk= z&akLG-23>#x&GzG=W+%AF-2H_aR

{Idog*H7MdJ>U6>`xamI{_8&ZxhH~K9zLhG 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

rFoKw}=g5R=mT;3)9iS;u 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 W*!O1=(H;VL9xCrO6~Xe>!2bibuX7*( literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/examples/resources/templates/BoletoCarne3PorPagina.odt b/jrimum-bopepo/src/examples/resources/templates/BoletoCarne3PorPagina.odt new file mode 100644 index 0000000000000000000000000000000000000000..3f70fe112e47b7490a546ef0e94b8fd957d93c90 GIT binary patch literal 16277 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 P_~!@(28PQ2boKuL-TVy& literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/examples/resources/templates/BoletoCarne3PorPagina.pdf b/jrimum-bopepo/src/examples/resources/templates/BoletoCarne3PorPagina.pdf new file mode 100644 index 0000000000000000000000000000000000000000..80a846cd38815e53481fd4b2a57eb97385cbb0b9 GIT binary patch literal 60155 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 z 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 literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/examples/resources/templates/BoletoTemplatePersonalizacaoSimples.odt b/jrimum-bopepo/src/examples/resources/templates/BoletoTemplatePersonalizacaoSimples.odt new file mode 100644 index 0000000000000000000000000000000000000000..157895883cb862266eb58d605943d1c7777335ef GIT binary patch literal 146635 zcmaI71yCGO*C0B;0D}YucbFkK1O_L#%b)?0;O_1c+#xst0tA-;Ay}~B?iL8{1a}K= zZ}Pw0eQ)>wYP+hd<<`+Y_uM15)f7>Hga7~t0MM%x5;N%I!e#^j0RK+JD}cSVy}6sW zlew{zlbyAxv75D{1BZu$8M~vgtFZ;&62{c5`<%F?QkjpKu_6E`o`FK*;|C@*gArC!DdVskxmw0*#{! zhpD@Z%RlN~_I4b0Q@^&A%NAaP2JoPy5Qi1Ar3Cse_dcO zDS>~FFiswB7@q*A1h2FtyOV=ul$wg%3ruoM1l$V+d1-aTbpQZBk^-S2?gF$VI1v}1 ztE7S^2yys=%pwub7*6uqt^j}>LOwZCB-h}TM#M`RHyJHA4Mz(%Ph%HzfU>cvi=(}{ znYA%Q*4o9~)6vD&6(Ue)HR%NaKmZET5}IC_hgsg4`fpQC0&H=2GKJnQ>$<-ErcO2> zFA2hcVi<$bfnTh|5Ay4f}CBnXR+;8%uE7_;-;hOVTIT7p1BnH6>@-t{;vUY%7fkxC>-s$;abL>XCSD zGKZ#s>IHp{c?=1kdYV_S>TSNLZ3w7M^R3}#Es0!Dr9?#NK0BJT}kxl>gT7zH!;}1-HD>0FT^VGAdUP?u2s-@prUKzp|IdZ&=HL%c* zR7F@c`MZ49P)ytYi;ZxA4f1Owr|OdQTN@L9&Y1b(qRCX7Ma_+y5{ylt8abJ^ZMxy` zOy5sEYHUVE+_#Hg$@}G$A>1)!f} zJ@^Q-30fDJ5@^;{^={0S{ND&PZ3DRiZh0c>m)c8Gi&B=16jkG?C?;!4ad?c-PY8if{V7{v3z_r~tOUg##VH2<>~= z3#rj97t=cXGUtaWna^0xp|=|ph=xaLROs-FI^&4cKa@Bp@iv^7IgRZ3wa*hsu% zq464j8u{{fa)!7CsGd)vkFLYFCnS)JGTc=tFnnL<{f1X5hFN&kOzOPO=ki#Usz`Ck zz!>ZLQcc^sqcUgTDIk|dGW-)|I6Y~|%SATkPRXfgw+|lfv1QIJh%u?ElO1sQC%cge z$g;ZxoW5wL?3

  • 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%0DO%BkN?UYA8SKWD*~5Vi*}cP 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%0DuCD z4&LHu6dDUd8l4H5Fs|ROP+?%B)rFZ~$uG>$)T@mrvx%gH;UX(O0Js*bLBY|LJV;9e z`mp$a=t7_xwA){*icq-W;UtFNdH>^h^6=wM(+h0ND!Y|(jRd~0XR^uErY)QFp;QJ6 z1$Yy1mttUuoYY+qXIxp4ed7c`AQt`V6fl1Uu$yb=TmqFOG#xi@E%Ggtk8!k#P3wN3 z90UfXOH2i{?Vf7w?uuURuiasB9FrAw+9dfP5>B;6*;&|`j}0`47V{0ZMa9j4BP4fVLF61DeK;+8GNo&VnSf#f#1yC*Rnab(+3#)? z74U$3u3j6VY#fAm;GC?~$9|;XhyLPZaQ)|=eEIy9sb8->wsq6cb|PFBK}-CM>g+gG zz^(zQR!1o{h6QpGujj?(y+ukmkDf+9Wh7b$nOy6lKxZb_%bWiKjJ*WZn<9E{HBl4* z8YXU4f~@PDQ8P*<=ts(cuT{;uZ#7!Uj zs+7>>bpiSxbvwcdQ8-mifF=Nhf{?t7D=Lj)Ma5FZ0kzzjq(+MIF!S3D749u>@wMOm z8JgU^*HBemAUIJViX!VYF}B>0Aq3D&+{(3}w5*9lh7>&DZ4DI$HpnqaD$KT*=ErkO zO9I9UWF$jq3ldcn3de24iY7v!CI(=nWe8kaGR;lNHrK^M5z%{S0I)hhDlmsbb!1Ow z>-Ix;-@EOxgYOu*cjtb6RLOwU0B=cLuU#p0l`)O~iF47n&;y(zkiQHpO=F;9cm(2J zY#={d&TrMp6~+<8P_J8rB@Lw9=GEDSVjW&67S7NW<3WM$vH$=e07*naRNHPb%fgkL zR5Ki`&w$YELk)AernAjd$9={_^5*&zxzE7&rs&E2!|5-7;|2w60%&vvLL|gX#5qz4 z15{I!Zpbrh(Kk2<7@;dQ!UzRvR`S(qy$H`kJ6}S3QM3hr!)XFF2WWT$K*QX-Wmw;^0ibq{dX2PMH4?Y^XP*2@)MJ8|ij zC{D)%$){*aPE$$bPO46eh`{1CpgIn;=7qA%TwobO6}fWyJdKFY-mh|RXamjyF!>_z z`gee0Y3-eW5J3XAfZSAJW)tP-L5Tx&GMHXy&#C1v&69t1)(t9!sZyyX+^%ghw<|K- z`YoZ9I1Qj?3&mumH7(M^C;^CqO2dZ%UZRvZt6(g5N~osm8Z_Q`}o88$wJHs>0Rk(v_*{nbv*xj;25*90%S(KO(n-#^j`r779%eVYNU^ z_E3w#?_!~Ehr&e(!#I;lkAtp!1JU2xMft+c-&XUpwjYr6b^1-9G6~FH0$TOei$=AD z0)~O5oCUvJznn4XEq;3sln_Gr5ZtNRg{8TmvE?0VB9O|6FVmOBh+=^aSPoEi0b3Fw z2T?Os1+XcsiZ?%`D+`Rj>61{TgyU#FvBmuF|2UO+-{nPT_k;Hn8TGWnbK)EcLj~2; zq~r25?_T@Y-3LMmOs_Rpn48Pvq0!wif|#=B$b@Q^aFbLWpea$n)y7m3iHjARC3v`~ zsnqhqwOtXk4-dg$L9?}#o2u68*q#Vu3W?0A;xvI)3#eH@O@>mgddC2u!16e#7Zz2W zwD_7@`#PmB98NV=Hxy9mHh^^XhT-z3r)j8{T!amKI<3)p9&?f0p5nwo`|w6Qkd$f| z8WiE4K}duv#kGZNA^unhk^Hv=W(ziWt#u_cqAW^vuqz^`SNc7fCq8qkc=m&jeeL^a zCVu$64-RWumUp;K5w|3OKz>_wpj87}C1AJ+WOo6{9e|dVn~lsz(Wb2TA|*VAti;_u zaviniftl05nePJ&xz#x((O3`_(37||Ys1f1&JLM$oONol}l zn91b}je~a^nKl|2#1wD41vD+7YIPKoen|q_;E-59mg+7H&Wk!FuEpXv-CqVyf7$0d z41}wirV0a370-fm>5^mJ2NMc}DvG7LHAL9BLWvcu5_Lv6N1z#~jqG1F&|@WGp--V| zrlxBEL`n#;$NC~7toNLRNPdZesp(>Km&PxJynl|Kw^}xYn5e3XVXtv<_U2@P*BY@! zG>XZu3oF2rKUoVM&M{D@o37OC-Mey-8V`TZy7&6SA31Z=o6vx)L)M5bF<%UYvSfFZCC36RTlB4L3B+VAn41Ei zDvC7+Y8aLbjkNdxj&&|;3a!}~1MBmygo>I_G(`bbI+mo@65|~gLIKUhOu>TTxHmL~ zRQMp)rc7|&&iC=Q%Eqb-6M{`Do4qzW zb1PRY?%$EjN|w1REh8#p@J-2)2t@9FH3>i>B2<^D$|D#o8a3%hMU+5@prb!+)MzF> zn+zA%3>-mtEnESnF9TM6@Jr}A;84s=m6x_FI8P~Qu~lli3?dd_)=c` z;9|+&v||@Vr~Xe&qGv@Z6opXUnWt;Gb5<5YfCS}rFTZeOHdn@QhD!I1To`Q&Xtsb# zOSp2paCLGiAm(mBuvD_$`%Psw;z+D96kq@@{OS`p^qDhVpBq-~`pjIu`RIXNLkKM4 zx^Y^<=iX=lm4@h_72|aE?N`(&N_8Jv80IxaYldqeCX6vSjypgtXL*@m`P89_)TpK@ zNkj$Nd>e4;0yT-RHi}5EJ~6WtZdPy+l(f)O*sSk02kD!t!7R-z?^`Of)igB�E$x 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 F`agpD>>2<7 literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/examples/resources/templates/BoletoTemplatePersonalizacaoSimples.pdf b/jrimum-bopepo/src/examples/resources/templates/BoletoTemplatePersonalizacaoSimples.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3fa22b9f7139b01718a03c82944ee32fe8a51ace GIT binary patch literal 221740 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

    + * 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.financeiro.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; + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/Boleto.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/Boleto.java new file mode 100644 index 0000000..045e17c --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/Boleto.java @@ -0,0 +1,572 @@ +/* + * 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:04: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:04:06 + * + */ + +package org.jrimum.bopepo; + +import static org.jrimum.utilix.Objects.isNotNull; +import static org.jrimum.utilix.Objects.isNull; +import static org.jrimum.utilix.text.DateFormat.DDMMYYYY_B; + +import java.awt.Image; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.jrimum.bopepo.campolivre.CampoLivre; +import org.jrimum.bopepo.campolivre.CampoLivreFactory; +import org.jrimum.bopepo.campolivre.NotSupportedBancoException; +import org.jrimum.bopepo.campolivre.NotSupportedCampoLivreException; +import org.jrimum.bopepo.view.BoletoCampo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; + +/** + *

    + * É a representação do documento Boleto que por sua vez, representa títulos + * em cobrança. + *

    + * + *

    + * A classe encapsula os atributos integrantes e as funcionalidades inerentes + * à construção de tal documento. + *

    + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * @author Samuel Valério + * + * @since 0.2 + * + * @version 0.2 + */ +public class Boleto { + + private static Logger log = Logger.getLogger(Boleto.class); + + /** + * @see Titulo + */ + private Titulo titulo; + + /** + * @see #setDataDeProcessamento(Date) + */ + private Date dataDeProcessamento; + + /** + * @see CodigoDeBarras + */ + private CodigoDeBarras codigoDeBarras; + + /** + * @see LinhaDigitavel + */ + private LinhaDigitavel linhaDigitavel; + + /** + * @see CampoLivre + */ + private CampoLivre campoLivre; + + /** + * @see #setLocalPagamento(String) + */ + private String localPagamento; + + /** + * @see #setInstrucaoAoSacado(String) + */ + private String instrucaoAoSacado; + + private String instrucao1; + private String instrucao2; + private String instrucao3; + private String instrucao4; + private String instrucao5; + private String instrucao6; + private String instrucao7; + private String instrucao8; + + /** + * @see #setTextosExtras(Map) + */ + private Map textosExtras; + + /** + *

    + * Map com nome do campo e imagem para este campo. + *

    + */ + private Map imagensExtras; + + /** + * Apenas cria um instâcia do boleto com os dados nulos. + */ + public Boleto() { + super(); + } + + /** + * Cria um boleto pronto para ser gerado. + * + * @param titulo + * @throws NotSupportedBancoException + * @throws NotSupportedCampoLivreException + */ + public Boleto(Titulo titulo)throws IllegalArgumentException, NotSupportedBancoException, NotSupportedCampoLivreException{ + + if(log.isTraceEnabled()) + log.trace("Instanciando boleto"); + + if(log.isDebugEnabled()) + log.debug("titulo instance : "+titulo); + + if(isNotNull(titulo)){ + + this.setTitulo(titulo); + this.setCampoLivre(CampoLivreFactory.create(titulo)); + this.load(); + + if(log.isDebugEnabled()){ + log.debug("boleto instance : " + this); + } + + }else { + + if(log.isDebugEnabled()){ + log.debug("Título Nulo - Valor Não Permitido!"); + } + + Exceptions.throwIllegalArgumentException("Título nulo!"); + } + + if(log.isDebugEnabled() || log.isTraceEnabled()){ + log.trace("Boleto Instanciado : "+this); + } + + } + + /** + * @param titulo + * @param campoLivre + */ + public Boleto(Titulo titulo, CampoLivre campoLivre) { + super(); + + if(log.isTraceEnabled()) + log.trace("Instanciando boleto"); + + if(log.isDebugEnabled()) + log.debug("titulo instance : "+titulo); + + if(log.isDebugEnabled()) + log.debug("campoLivre instance : "+campoLivre); + + if(isNotNull(titulo)){ + + this.setTitulo(titulo); + this.setCampoLivre(campoLivre); + this.load(); + + if(log.isDebugEnabled()) + log.debug("boleto instance : "+this); + + }else { + IllegalArgumentException e = new IllegalArgumentException("Título nulo!"); + log.error("Valor Não Permitido!",e); + throw e; + } + + if(log.isDebugEnabled() || log.isTraceEnabled()){ + + log.trace("Boleto Instanciado : "+this); + } + + } + + private void load(){ + + codigoDeBarras = new CodigoDeBarras(titulo, campoLivre); + linhaDigitavel = new LinhaDigitavel(codigoDeBarras); + dataDeProcessamento = new Date(); + + if(log.isInfoEnabled()){ + + log.info("Data de Processamento do Boleto : "+DDMMYYYY_B.format(dataDeProcessamento)); + } + } + + /** + * @return O campoLivre da isntância. + */ + public CampoLivre getCampoLivre() { + + return campoLivre; + } + + /** + * @param campoLivre the campoLivre to set + */ + private void setCampoLivre(CampoLivre campoLivre) { + + Objects.checkNotNull(campoLivre); + + int length = campoLivre.write().length(); + + if (length == CampoLivre.STRING_LENGTH) { + this.campoLivre = campoLivre; + + } else { + + if (length > CampoLivre.STRING_LENGTH) { + Exceptions.throwIllegalArgumentException("O tamanho da String [" + length + "] é maior que o especificado [" + CampoLivre.STRING_LENGTH + "]!"); + + } else { + Exceptions.throwIllegalArgumentException("O tamanho da String [" + length + "] é menor que o especificado [" + CampoLivre.STRING_LENGTH + "]!"); + } + } + } + + /** + * @return the titulo + */ + public Titulo getTitulo() { + return titulo; + } + + /** + * @param titulo the titulo to set + */ + public void setTitulo(Titulo titulo) { + this.titulo = titulo; + } + + /** + * @see #getDataDeProcessamento() + * + * @return the dataDeProcessamento + */ + public Date getDataDeProcessamento() { + return dataDeProcessamento; + } + + /** + *

    + * Data de emissão do boleto de cobrança. + *

    + * + * @param dataDeProcessamento the dataDeProcessamento to set + */ + public void setDataDeProcessamento(Date dataDeProcessamento) { + this.dataDeProcessamento = dataDeProcessamento; + } + + /** + * @return the codigoDeBarras + */ + public CodigoDeBarras getCodigoDeBarras() { + return codigoDeBarras; + } + + /** + * @param codigoDeBarras the codigoDeBarras to set + */ + public void setCodigoDeBarras(CodigoDeBarras codigoDeBarras) { + this.codigoDeBarras = codigoDeBarras; + } + + /** + * @return the linhaDigitavel + */ + public LinhaDigitavel getLinhaDigitavel() { + return linhaDigitavel; + } + + /** + * @param linhaDigitavel the linhaDigitavel to set + */ + public void setLinhaDigitavel(LinhaDigitavel linhaDigitavel) { + this.linhaDigitavel = linhaDigitavel; + } + + /** + * @see #setLocalPagamento(String) + * + * @return String local de pagamento + */ + public String getLocalPagamento() { + return localPagamento; + } + + /** + *

    + * Possíveis locais para pagamento. + *

    + *

    + * Exemplo: Pagável preferencialmente na Rede X ou em qualquer Banco até + * o Vencimento. + *

    + * + * @param localPagamento1 the localPagamento1 to set + */ + public void setLocalPagamento(String localPagamento1) { + this.localPagamento = localPagamento1; + } + + /** + * @see #setInstrucaoAoSacado(String) + * + * @return the instrucaoAoSacado + */ + public String getInstrucaoAoSacado() { + return instrucaoAoSacado; + } + + /** + *

    + * Instrução adicional ao sacado, para visualizar o conceito de negócio de sacado consultar o + * glossário. + *

    + * + * @param insturcaoAoSacado the insturcaoAoSacado to set + */ + public void setInstrucaoAoSacado(String insturcaoAoSacado) { + this.instrucaoAoSacado = insturcaoAoSacado; + } + + /** + * @return the instrucao1 + */ + public String getInstrucao1() { + return instrucao1; + } + + /** + * @param instrucao1 the instrucao1 to set + */ + public void setInstrucao1(String instrucao1) { + this.instrucao1 = instrucao1; + } + + /** + * @return the instrucao2 + */ + public String getInstrucao2() { + return instrucao2; + } + + /** + * @param instrucao2 the instrucao2 to set + */ + public void setInstrucao2(String instrucao2) { + this.instrucao2 = instrucao2; + } + + /** + * @return the instrucao3 + */ + public String getInstrucao3() { + return instrucao3; + } + + /** + * @param instrucao3 the instrucao3 to set + */ + public void setInstrucao3(String instrucao3) { + this.instrucao3 = instrucao3; + } + + /** + * @return the instrucao4 + */ + public String getInstrucao4() { + return instrucao4; + } + + /** + * @param instrucao4 the instrucao4 to set + */ + public void setInstrucao4(String instrucao4) { + this.instrucao4 = instrucao4; + } + + /** + * @return the instrucao5 + */ + public String getInstrucao5() { + return instrucao5; + } + + /** + * @param instrucao5 the instrucao5 to set + */ + public void setInstrucao5(String instrucao5) { + this.instrucao5 = instrucao5; + } + + /** + * @return the instrucao6 + */ + public String getInstrucao6() { + return instrucao6; + } + + /** + * @param instrucao6 the instrucao6 to set + */ + public void setInstrucao6(String instrucao6) { + this.instrucao6 = instrucao6; + } + + /** + * @return the instrucao7 + */ + public String getInstrucao7() { + return instrucao7; + } + + /** + * @param instrucao7 the instrucao7 to set + */ + public void setInstrucao7(String instrucao7) { + this.instrucao7 = instrucao7; + } + + /** + * @return the instrucao8 + */ + public String getInstrucao8() { + return instrucao8; + } + + /** + * @param instrucao8 the instrucao8 to set + */ + public void setInstrucao8(String instrucao8) { + this.instrucao8 = instrucao8; + } + + /** + * Sobrescreve um campo padrão do boleto. + * + * @param campo + * Nome do campo no template + * @param conteudo + * Texto a ser adicionado ao campo no template + */ + public void sobrescrevaCampo(BoletoCampo campo, String conteudo){ + addTextosExtras(campo.name(), conteudo); + } + + + /** + * @return Todas os campos de texto usados como extra ou sobrescrita no + * template. + */ + public Map getTextosExtras() { + + return this.textosExtras; + } + + + /** + * Substitui todos os campos extra da instância caso exista. + * + * @param textosExtras + * Campos atribuídos + */ + public void setTextosExtras(Map textosExtras) { + + this.textosExtras = textosExtras; + } + + /** + * Adiciona um campo de texto no boleto caso o campo informado tenha o mesmo + * nome no template da instância. + * + * @param campo + * Nome do campo no template + * @param conteudo + * Texto a ser adicionado ao campo no template + */ + public void addTextosExtras(String campo, String conteudo) { + + if(isNull(getTextosExtras())) { + setTextosExtras(new HashMap()); + } + + getTextosExtras().put(campo, conteudo); + } + + /** + * @return Todas os campos de imagem usados como extra ou sobrescrita no + * template. + */ + public Map getImagensExtras() { + return this.imagensExtras; + } + + /** + * Substitui todos os campos extra da instância caso exista. + * + * @param imagensExtras + * Campos atribuídos + */ + public void setImagensExtras(Map imagensExtras) { + this.imagensExtras = imagensExtras; + } + + /** + * Adiciona um campo de imagem no boleto caso o campo informado tenha o + * mesmo nome no template da instância. + * + * @param campo + * Nome do campo no template + * @param conteudo + * Imagem a ser adicionada ao campo no template + */ + public void addImagensExtras(String campo, Image conteudo) { + + if(isNull(getImagensExtras())) { + setImagensExtras(new HashMap()); + } + + getImagensExtras().put(campo, conteudo); + } + + @Override + public String toString() { + return Objects.toString(this); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/BoletoException.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/BoletoException.java new file mode 100644 index 0000000..89d5912 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/BoletoException.java @@ -0,0 +1,89 @@ + +/* + * 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: 21/04/2008 - 23:35:28 + * + * ================================================================================ + * + * 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: 21/04/2008 - 23:35:28 + * + */ + +package org.jrimum.bopepo; + +/** + * + *

    + * Qualquer exceção gerada durante a geração de um Boleto gera uma BoletoExceptiton. Centraliza e localiza os problemas relativos a geração de um boleto. + *

    + * + * + * @author Gilmar P.S.L. + * + * @see org.jrimum.bopepo.BoletoException + * + * @since 0.2 + * + * @version 0.2 + */ + +public class BoletoException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = -3874521668322644183L; + + /** + * + */ + public BoletoException() { + + } + + /** + * @param message + * @param cause + */ + public BoletoException(String message, Throwable cause) { + super(message, cause); + + } + + /** + * @param message + */ + public BoletoException(String message) { + super(message); + + } + + /** + * @param cause + */ + public BoletoException(Throwable cause) { + super(cause); + + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/BoletoUtil.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/BoletoUtil.java new file mode 100644 index 0000000..51d9b12 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/BoletoUtil.java @@ -0,0 +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.lang.StringUtils.EMPTY; +import static org.apache.commons.lang.StringUtils.isBlank; +import static org.apache.commons.lang.StringUtils.isNotBlank; +import static org.apache.commons.lang.StringUtils.trim; +import static org.jrimum.utilix.Objects.checkNotNull; +import static org.jrimum.utilix.text.Strings.WHITE_SPACE; + +import org.jrimum.utilix.Exceptions; +import org.jrimum.vallia.digitoverificador.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/CodigoDeBarras.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/CodigoDeBarras.java new file mode 100644 index 0000000..d5b26ca --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/CodigoDeBarras.java @@ -0,0 +1,359 @@ +/* + * 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:04: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: 30/03/2008 - 18:04:23 + * + */ + + +package org.jrimum.bopepo; + +import java.math.BigDecimal; +import java.util.Date; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jrimum.bopepo.campolivre.CampoLivre; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.BlockOfFields; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.DecimalFormat; +import org.jrimum.vallia.digitoverificador.BoletoCodigoDeBarrasDV; + + +/** + *

    + * É um número único para cada Boleto composto dos seguintes campos: + *

    + *
    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Posição TamanhoPictureConteúdo
    01-0339(3)Identificação do banco
    04-04 1 9 Código moeda (9-Real)
    05-05 1 9 Dígito verificador do composição de barras (DV)
    06-09 4 9(4)Posições 06 a 09 – fator de vencimento
    10-19109(08)v99Posições 10 a 19 – valor nominal do título 
    20-44 25 9(25) FixedField livre – utilizado de acordo com a especificação interna do banco + * emissor
    + *
    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class CodigoDeBarras extends BlockOfFields{ + + /** + * + */ + private static final long serialVersionUID = 748913164143978133L; + + private static Logger log = Logger.getLogger(CodigoDeBarras.class); + + /** + * + */ + private static final Integer FIELDS_LENGTH = 6; + + /** + * + */ + private static final Integer STRING_LENGTH = 44; + + /** + * Código do Banco. + */ + private FixedField codigoDoBanco; + + /** + * Código da moeda usada no boleto. + */ + private FixedField codigoDaMoeda; + + /** + * Mecanismo de autenticação usado no composição de barras. + * + * @see org.jrimum.vallia.digitoverificador.BoletoCodigoDeBarrasDV + */ + private FixedField digitoVerificadorGeral; + + /** + * Representa a quantidade de dias decorridos da data base à data de + * vencimento do título. + * + * @see FatorDeVencimento#toFator(Date) + */ + private FixedField fatorDeVencimento; + + /** + * Valor do título. + */ + private FixedField valorNominalDoTitulo; + + /** + * @see org.jrimum.bopepo.campolivre.CampoLivre + */ + private FixedField campoLivre; + + /** + *

    + * Cria um Código de Barras a partir do título e campo livre passados. + *

    + * + * @param titulo + * @param campoLivre + * + * @see CampoLivre + */ + CodigoDeBarras(Titulo titulo, CampoLivre campoLivre) { + super(); + setLength(STRING_LENGTH); + setSize(FIELDS_LENGTH); + + if(log.isTraceEnabled()) + log.trace("Instanciando o CodigoDeBarras"); + + if(log.isDebugEnabled()){ + log.debug("titulo instance : "+titulo); + log.debug("campoLivre instance : "+campoLivre); + } + + codigoDoBanco = new FixedField("0", 3, Fillers.ZERO_LEFT); + codigoDaMoeda = new FixedField(0, 1, Fillers.ZERO_LEFT); + digitoVerificadorGeral = new FixedField(0, 1, Fillers.ZERO_LEFT); + fatorDeVencimento = new FixedField(0, 4, Fillers.ZERO_LEFT); + valorNominalDoTitulo = new FixedField(new BigDecimal(0), 10,DecimalFormat.NUMBER_DD_BR.copy(),Fillers.ZERO_LEFT); + this.campoLivre = new FixedField(StringUtils.EMPTY, 25); + + add(codigoDoBanco); + add(codigoDaMoeda); + add(digitoVerificadorGeral); + add(fatorDeVencimento); + add(valorNominalDoTitulo); + add(this.campoLivre); + + ContaBancaria contaBancaria = titulo.getContaBancaria(); + this.codigoDoBanco.setValue(contaBancaria.getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado()); + this.codigoDaMoeda.setValue(titulo.getTipoDeMoeda().getCodigo()); + this.calculateAndSetFatorDeVencimento(titulo.getDataDoVencimento()); + this.valorNominalDoTitulo.setValue(titulo.getValor()); + this.campoLivre.setValue(campoLivre.write()); + this.calculateAndSetDigitoVerificadorGeral(); + + if(log.isDebugEnabled() || log.isTraceEnabled()) + log.debug("codigoDeBarra instanciado : "+this); + } + + private void calculateAndSetDigitoVerificadorGeral() { + + if (log.isTraceEnabled()) + log.trace("Calculando Digito Verificador Geral"); + + // Instanciando o objeto irá calcular o dígito verificador do boleto. + BoletoCodigoDeBarrasDV calculadorDV = new BoletoCodigoDeBarrasDV(); + + // Preparando o conjunto de informações que será a base para o cálculo + // do dígito verificador, conforme normas da FEBRABAN. + StringBuilder toCalculateDV = new StringBuilder(codigoDoBanco.write()) + .append(codigoDaMoeda.write()) + .append(fatorDeVencimento.write()) + .append(valorNominalDoTitulo.write()) + .append(campoLivre.write()); + + // Realizando o cálculo dígito verificador e em seguida armazenando + // a informação no campo "digitoVerificadorGeral". + digitoVerificadorGeral.setValue( + calculadorDV.calcule(toCalculateDV.toString()) + ); + + if (log.isDebugEnabled()) + log.debug("Digito Verificador Geral calculado : " + + digitoVerificadorGeral.getValue()); + } + + /** + *

    + * Representa a quantidade de dias decorridos da data base à data de + * vencimento do título. + *

    + *

    + * É o resultado da subtração entre a data do vencimento do título e a DATA + * BASE, fixada em 07.10.1997 (03.07.2000 retrocedidos 1000 dias do in�cio + * do processo). + *

    + *

    + * Os bloquetos de cobrança emitidos a partir de primeiro de setembro de + * 2000 devem conter essas características, para que quando forem capturados + * pela rede bancária, os sistemas façam a operação inversa, ou seja, + * adicionar à data base o fator de vencimento capturado, obtendo, dessa + * forma, a data do vencimento do bloqueto. + *

    + * + * @param vencimento + */ + private void calculateAndSetFatorDeVencimento(Date vencimento) { + + fatorDeVencimento.setValue( + FatorDeVencimento.toFator(vencimento)); + } + + /** + * @return the codigoDoBanco + */ + FixedField getCodigoDoBanco() { + return codigoDoBanco; + } + + /** + * @param codigoDoBanco the codigoDoBanco to set + */ + void setCodigoDoBanco(FixedField codigoDoBanco) { + this.codigoDoBanco = codigoDoBanco; + } + + /** + * @return the codigoDaMoeda + */ + FixedField getCodigoDaMoeda() { + return codigoDaMoeda; + } + + /** + * @param codigoDaMoeda the codigoDaMoeda to set + */ + void setCodigoDaMoeda(FixedField codigoDaMoeda) { + this.codigoDaMoeda = codigoDaMoeda; + } + + /** + * @return the digitoVerificadorGeral + */ + FixedField getDigitoVerificadorGeral() { + return digitoVerificadorGeral; + } + + /** + * @param digitoVerificadorGeral the digitoVerificadorGeral to set + */ + void setDigitoVerificadorGeral(FixedField digitoVerificadorGeral) { + this.digitoVerificadorGeral = digitoVerificadorGeral; + } + + /** + * @return the fatorDeVencimento + */ + FixedField getFatorDeVencimento() { + return fatorDeVencimento; + } + + /** + * @param fatorDeVencimento the fatorDeVencimento to set + */ + void setFatorDeVencimento(FixedField fatorDeVencimento) { + this.fatorDeVencimento = fatorDeVencimento; + } + + /** + * @return the valorNominalDoTitulo + */ + FixedField getValorNominalDoTitulo() { + return valorNominalDoTitulo; + } + + /** + * @param valorNominalDoTitulo the valorNominalDoTitulo to set + */ + void setValorNominalDoTitulo(FixedField valorNominalDoTitulo) { + this.valorNominalDoTitulo = valorNominalDoTitulo; + } + + /** + * @return the campoLivre + */ + FixedField getCampoLivre() { + return campoLivre; + } + + /** + * @param campoLivre the campoLivre to set + */ + void setCampoLivre(FixedField campoLivre) { + this.campoLivre = campoLivre; + } + + @Override + public String toString() { + return Objects.toString(this); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/CodigoDeBarrasException.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/CodigoDeBarrasException.java new file mode 100644 index 0000000..7c3549e --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/CodigoDeBarrasException.java @@ -0,0 +1,90 @@ +/* + * 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: 21/04/2008 - 23:38: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: 21/04/2008 - 23:38:24 + * + */ + +package org.jrimum.bopepo; + + + +/** + * + *

    + * Qualquer exceção gerada durante a geração do Código de Barras gera uma CodigoDeBarrasException. Centraliza e localiza os problemas relativos a geração de um código de barras. + *

    + * + * + * @author Gilmar P.S.L. + * + * @see org.jrimum.bopepo.CodigoDeBarras + * + * @since 0.2 + * + * @version 0.2 + */ + +public class CodigoDeBarrasException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = -3577770829101964833L; + + /** + * + */ + public CodigoDeBarrasException() { + + } + + /** + * @param message + * @param cause + */ + public CodigoDeBarrasException(String message, Throwable cause) { + super(message, cause); + + } + + /** + * @param message + */ + public CodigoDeBarrasException(String message) { + super(message); + + } + + /** + * @param cause + */ + public CodigoDeBarrasException(Throwable cause) { + super(cause); + + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/FatorDeVencimento.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/FatorDeVencimento.java new file mode 100644 index 0000000..fc6c905 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/FatorDeVencimento.java @@ -0,0 +1,216 @@ +/* + * 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.bopepo; + +import static java.lang.String.format; +import static org.jrimum.utilix.Objects.isNull; +import static org.jrimum.utilix.text.DateFormat.DDMMYYYY_B; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.apache.commons.lang.time.DateUtils; +import org.jrimum.utilix.Dates; +import org.jrimum.utilix.Exceptions; + +/** + *

    + * Serviços utilitários do universo bancário, como por exemplo calcular o fator + * de vencimento de boletos. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class FatorDeVencimento{ + + /** + *

    + * Data base para o cálculo do fator de vencimento fixada em 07/10/1997 pela + * FEBRABAN. + *

    + */ + private static final Calendar BASE_DO_FATOR_DE_VENCIMENTO = new GregorianCalendar(1997, Calendar.OCTOBER, 7); + + /** + *

    + * Data base para o cálculo do fator de vencimento fixada em 07/10/1997 pela + * FEBRABAN. + *

    + */ + private static final Date DATA_BASE_DO_FATOR_DE_VENCIMENTO = BASE_DO_FATOR_DE_VENCIMENTO.getTime(); + + /** + *

    + * Data máxima alcançada pelo fator de vencimento com base fixada em + * 07/10/1997. + *

    + */ + private static final Date DATA_LIMITE_DO_FATOR_DE_VENCIMENTO = new GregorianCalendar(2025, Calendar.FEBRUARY, 21).getTime(); + + /** + *

    + * Calcula o fator de vencimento a partir da subtração entre a DATA DE + * VENCIMENTO de um título e a DATA BASE fixada em 07/10/1997. + *

    + * + *

    + * O fator de vencimento nada mais é que um referencial numérico de 4 + * dígitos que representa a quantidade de dias decorridos desde a data base + * (07/10/1997) até a data de vencimento do título. Ou seja, a diferença em + * dias entre duas datas. + *

    + * + *

    + * Exemplos: + *

    + *
    • 07/10/1997 (Fator = 0);
    • 03/07/2000 + * (Fator = 1000);
    • 05/07/2000 (Fator = 1002);
    • 01/05/2002 + * (Fator = 1667);
    • 21/02/2025 (Fator = 9999).
    + * + *

    + * Funcionamento: + *

    + * + *
    • Caso a data de vencimento seja anterior a data + * base (Teoricamente fator negativo), 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.
    + * + *

    + * ATENÇÃO, esse cálculo se refere a títulos em cobrança, + * ou melhor: BOLETOS. Desta forma, lembramos que a DATA BASE é uma norma da + * FEBRABAN. Essa norma diz que todos os boletos emitidos a partir de 1º de + * setembro de 2000 (primeiro dia útil = 03/07/2000 - SEGUNDA) devem seguir + * esta regra de cálculo para compor a informação de vencimento no código de + * barras. Portanto, boletos no padrão FEBRABAN quando capturados por + * sistemas da rede bancária permitem que se possa realizar a operação + * inversa, ou seja, adicionar à data base o fator de vencimento capturado. + * Obtendo então a data de vencimento deste boleto. + *

    + * @param data + * data de vencimento de um título + * @return fator de vencimento calculado + * @throws IllegalArgumentException + * + * @since 0.2 + */ + public static int toFator(Date data) throws IllegalArgumentException { + + if (isNull(data)) { + + return (Integer) Exceptions.throwIllegalArgumentException("Impossível realizar o cálculo do fator de vencimento de uma data nula!"); + + } else { + + Date dataTruncada = DateUtils.truncate(data, Calendar.DATE); + + checkIntervalo(dataTruncada); + + return (int) Dates.calculeDiferencaEmDias(DATA_BASE_DO_FATOR_DE_VENCIMENTO, dataTruncada); + } + } + + /** + *

    + * Transforma um fator de vencimento em um objeto data da forma inversa + * descrita em {@linkplain #toFator(Date)}. + *

    + * + * @param fator + * - Número entre o intervalo (incluíndo) 0 e 9999 + * @return Data do vencimento + * @throws IllegalArgumentException + * Caso o {@code fator} < 0 ou {@code fator} > 9999 + */ + public static Date toDate(int fator) throws IllegalArgumentException { + + checkIntervalo(fator); + + Calendar date = (Calendar) BASE_DO_FATOR_DE_VENCIMENTO.clone(); + + date.add(Calendar.DAY_OF_YEAR, fator); + + return DateUtils.truncate(date.getTime(), Calendar.DATE); + } + + /** + *

    + * Lança exceção caso a {@code dataVencimentoTruncada} esteja fora do + * intervalo entre a {@linkplain #DATA_BASE_DO_FATOR_DE_VENCIMENTO} e a + * {@linkplain #DATA_LIMITE_DO_FATOR_DE_VENCIMENTO}. + *

    + * + * @param dataVencimentoTruncada + * data de vencimento truncada com {@code + * DateUtils.truncate(date, Calendar.DATE)} + * @throws IllegalArgumentException + * Caso a data esteja {@code dataVencimentoTruncada} esteja fora + * do intervalo entre a + * {@linkplain #DATA_BASE_DO_FATOR_DE_VENCIMENTO} e a + * {@linkplain #DATA_LIMITE_DO_FATOR_DE_VENCIMENTO} + */ + private static void checkIntervalo(Date dataVencimentoTruncada) throws IllegalArgumentException { + + if(dataVencimentoTruncada.before(DATA_BASE_DO_FATOR_DE_VENCIMENTO) + || dataVencimentoTruncada.after(DATA_LIMITE_DO_FATOR_DE_VENCIMENTO)) { + + Exceptions.throwIllegalArgumentException( + format("Para o cálculo do fator de vencimento se faz necessário informar uma data entre %s e %s.", + DDMMYYYY_B.format(DATA_BASE_DO_FATOR_DE_VENCIMENTO), DDMMYYYY_B.format(DATA_LIMITE_DO_FATOR_DE_VENCIMENTO))); + + } + } + + /** + *

    Lança exceção caso o {@code fator} estja fora do intervalo.

    + * + * @param fatorDeVencimento - Número entre o intervalo (incluíndo) 0 e 9999 + * @throws IllegalArgumentException Caso o {@code fator} < 0 ou {@code fator} > 9999 + */ + private static void checkIntervalo(int fatorDeVencimento) throws IllegalArgumentException { + + if (fatorDeVencimento < 0 || fatorDeVencimento > 9999) { + + Exceptions.throwIllegalArgumentException( + "Impossível transformar em data um fator menor que zero! O fator de vencimento deve ser um número entre 0 e 9999."); + } + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/LinhaDigitavel.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/LinhaDigitavel.java new file mode 100644 index 0000000..15448c3 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/LinhaDigitavel.java @@ -0,0 +1,538 @@ +/* + * 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:04:37 + * + * ================================================================================ + * + * 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:04:37 + * + */ + + +package org.jrimum.bopepo; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jrimum.texgit.type.component.BlockOfFields; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.Strings; +import org.jrimum.vallia.digitoverificador.BoletoLinhaDigitavelDV; + + +/** + * + * 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:
    + *
    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Posição TamanhoConteúdo
    01-03 3 Identificação do banco
    04-041 Código de moeda (9 – Real)
    05-09 5 Cinco primeiras posições do campo livre (posições 20 a 24 do código de + * barras)
    10-10 1 Dígito verificador do primeiro campo
    11-20 10 6ª a 15ª posições do campo livre (posições 25 a 34 do código de barras) + *
    21-21 1 Dígito verificador do segundo campo
    22-31 10 16ª a 25ª posições do campo livre (posições 35 a 44 do código de barras) + *
    32-32 1 Dígito verificador do terceiro campo
    33-33 1 Dígito verificador geral (posição 5 do código de barras)
    34-37 4 Posições 34 a 37 – fator de vencimento (posições 6 a 9 do código debarras)
    37-47 10 Posições 38 a 47 – valor nominal do título(posições 10 a 19 do código de barras)
    + * + *
    + *
    + * + * Observações: + * + *
    + *
      + * + *
    • Em cada um dos três primeiros campos, após a 5a posição, deve ser + * inserido um ponto “.”, a fim de facilitar a visualização, para a digitação, + * 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 + * do bloqueto de cobrança é indicativo de que o código de barras não contém + * fator de vencimento. Nesse caso, o banco acolhedor/recebedor estará isento + * das responsabilidades pelo recebimento após o vencimento, que impede de + * identificar automaticamente se o bloqueto está ou não vencido;
      • + *
      • quando se tratar de bloquetos sem discriminação do valor no código de + * 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;
    • + *
    • Os dados da linha digitável não se apresentam na mesma ordem do código + * de barras.
    • + * + *
    + * + * + * @see org.jrimum.bopepo.CodigoDeBarras + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class LinhaDigitavel extends BlockOfFields { + + /** + * + */ + private static final long serialVersionUID = -6089634012523938802L; + + private static Logger log = Logger.getLogger(LinhaDigitavel.class); + + /** + * + */ + private static final Integer FIELDS_LENGTH = 5; + + /** + *

    + * Tamanho dos campos mais os espaços entre eles. + *

    + */ + private static final Integer STRING_LENGTH = 54; + + /** + * + */ + private FixedField innerCampo1; + + /** + * + */ + private FixedField innerCampo2; + + /** + * + */ + private FixedField innerCampo3; + + /** + *

    + * Digito verificador geral. + *

    + */ + private FixedField campo4; + + /** + * + */ + private FixedField innerCampo5; + + + /** + *

    + * Cria uma linha digitável a partir do código de barras passado. + *

    + * + * @param codigoDeBarras + * + * @see CodigoDeBarras + * + * @since 0.2 + */ + LinhaDigitavel(CodigoDeBarras codigoDeBarras) { + super(); + setLength(STRING_LENGTH); + setSize(FIELDS_LENGTH); + + if(log.isTraceEnabled()) + log.trace("Instanciando Linha Digitável"); + + if(log.isDebugEnabled()) + log.debug("codigoDeBarra instance : "+codigoDeBarras); + + innerCampo1 = new FixedField(new InnerCampo1(4,11),11); + innerCampo2 = new FixedField(new InnerCampo2(2,12),12); + innerCampo3 = new FixedField(new InnerCampo3(2,12),12); + campo4 = new FixedField(new Integer(0),1); + innerCampo5 = new FixedField(new InnerCampo5(2,14),14); + + add(innerCampo1); + add(innerCampo2); + add(innerCampo3); + add(campo4); + add(innerCampo5); + + this.innerCampo1.getValue().load(codigoDeBarras); + this.innerCampo2.getValue().load(codigoDeBarras); + this.innerCampo3.getValue().load(codigoDeBarras); + + this.campo4.setValue(codigoDeBarras.getDigitoVerificadorGeral().getValue()); + + if(log.isDebugEnabled()) + log.debug("InnerCampo 4 da Linha Digitável : "+this.campo4.getValue()); + + this.innerCampo5.getValue().load(codigoDeBarras); + + if(log.isDebugEnabled() || log.isTraceEnabled()) + log.debug("linhaDigitavel instanciada : "+this.write()); + } + + /** + * Escreve a linha digitável foramatada (com espaço entre os campos). + * + * @see org.jrimum.texgit.type.component.BlockOfFields#write() + */ + @Override + public String write(){ + + return new StringBuilder(innerCampo1.write()). + append(Strings.WHITE_SPACE). + append(innerCampo2.write()). + append(Strings.WHITE_SPACE). + append(innerCampo3.write()). + append(Strings.WHITE_SPACE). + append(campo4.write()). + append(Strings.WHITE_SPACE). + append(innerCampo5.write()).toString(); + + } + + private abstract class InnerCampo extends BlockOfFields { + + /** + * + */ + private static final long serialVersionUID = 6746400538765124943L; + /** + * + */ + protected final BoletoLinhaDigitavelDV calculadorDV = new BoletoLinhaDigitavelDV(); + + + protected InnerCampo(Integer fieldsLength, Integer stringLength) { + super(); + setLength(stringLength); + setSize(fieldsLength); + } + + } + + private abstract class InnerCampoFormatado extends InnerCampo { + + + /** + * + */ + private static final long serialVersionUID = 3650450185403697045L; + + protected InnerCampoFormatado(final Integer fieldsLength, final Integer stringLength) { + super(fieldsLength, stringLength); + } + + /** + *

    + * + * 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. + * + *

    + * + * + * @see org.jrimum.texgit.type.component.BlockOfFields#write() + */ + @Override + public String write(){ + + StringBuilder lineOfFields = new StringBuilder(StringUtils.EMPTY); + + for(FixedField field : this){ + lineOfFields.append(field.write()); + } + + lineOfFields.insert(5, "."); + + return lineOfFields.toString(); + } + + } + + /** + * Componhe o campo 1 da linha digitável com os seguintes dados:
    + *
      + *
    • Identificação do banco
    • + *
    • Código de moeda (9 – Real)
    • + *
    • Cinco primeiras posições do campo livre (posições 20 a 24 do código + * de barras)
    • + *
    • Dígito verificador do primeiro campo
    • + *
    + * + * @param titulo + * @param codigoDeBarra + * @param calculadorDV + */ + private class InnerCampo1 extends InnerCampoFormatado{ + + /** + * + */ + private static final long serialVersionUID = 2948116051922000890L; + + /** + * @param fieldsLength + * @param stringLength + */ + private InnerCampo1(Integer fieldsLength, Integer stringLength) { + super(fieldsLength, stringLength); + } + + /** + * @param codigoDeBarras + */ + private void load(CodigoDeBarras codigoDeBarras){ + + if(log.isTraceEnabled()) + log.trace("Compondo campo 1 da Linha Digitável"); + + add(new FixedField(codigoDeBarras.write().substring(0, 3),3)); + add(new FixedField(codigoDeBarras.write().substring(3, 4),1)); + add(new FixedField(codigoDeBarras.write().substring(19, 24),5)); + add(new FixedField(calculadorDV.calcule(get(0).write() + get(1).write() + get(2).write()),1)); + + if(log.isDebugEnabled()) + log.debug("Digito verificador do Field 1 da Linha Digitável : "+get(3).getValue()); + + + if(log.isDebugEnabled() || log.isTraceEnabled()) + log.debug("Field 1 da Linha Digitável composto : "+write()); + } + + } + + /** + * 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)
    • + *
    • Dígito verificador do segundo campo
    • + *
    + * + * @param codigoDeBarra + * @param calculadorDV + */ + private class InnerCampo2 extends InnerCampoFormatado{ + + /** + * + */ + private static final long serialVersionUID = -2201847536243988819L; + + /** + * @param fieldsLength + * @param stringLength + */ + private InnerCampo2(Integer fieldsLength, Integer stringLength) { + super(fieldsLength, stringLength); + } + + + /** + * @param codigoDeBarras + */ + private void load(CodigoDeBarras codigoDeBarras){ + + if(log.isTraceEnabled()) + log.trace("Compondo campo 2 da Linha Digitável"); + + add(new FixedField(codigoDeBarras.write().substring(24, 34),10)); + add(new FixedField(calculadorDV.calcule(get(0).write()),1)); + + if(log.isDebugEnabled()) + log.debug("Digito verificador do campo 2 da Linha Digitável : "+get(1).getValue()); + + if(log.isDebugEnabled() || log.isTraceEnabled()) + log.debug("InnerCampo 2 da Linha Digitável composto : "+write()); + } + + } + + /** + * 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)
    • + *
    • Dígito verificador do terceiro campo
    • + *
    + * + * @param codigoDeBarra + * @param calculadorDV + */ + private class InnerCampo3 extends InnerCampoFormatado{ + + /** + * + */ + private static final long serialVersionUID = -4248472044788156665L; + + /** + * @param fieldsLength + * @param stringLength + */ + private InnerCampo3(Integer fieldsLength, Integer stringLength) { + super(fieldsLength, stringLength); + } + + /** + * @param codigoDeBarras + */ + private void load(CodigoDeBarras codigoDeBarras){ + + if(log.isTraceEnabled()) + log.trace("Compondo campo 3 da Linha Digitável"); + + add(new FixedField(codigoDeBarras.write().substring(34, 44),10)); + add(new FixedField(calculadorDV.calcule(get(0).write()),1)); + + if(log.isDebugEnabled()) + log.debug("Digito verificador do campo 3 da Linha Digitável : "+get(1).getValue()); + + if(log.isDebugEnabled() || log.isTraceEnabled()) + log.debug("InnerCampo 3 da Linha Digitável composto : "+write()); + + } + + } + + /** + * 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)
    • + *
    • Posições 38 a 47 – valor nominal do título(posições 10 a 19 do + * código de barras)
    • + *
    + * + * @param codigoDeBarra + */ + private class InnerCampo5 extends InnerCampo{ + + /** + * + */ + private static final long serialVersionUID = -8040082112684009827L; + + /** + * @param fieldsLength + * @param stringLength + */ + private InnerCampo5(Integer fieldsLength, Integer stringLength) { + super(fieldsLength, stringLength); + } + + /** + * @param codigoDeBarras + */ + private void load(CodigoDeBarras codigoDeBarras){ + + if(log.isTraceEnabled()) + log.trace("Compondo campo 5 da Linha Digitável"); + + add(new FixedField(codigoDeBarras.write().substring(5, 9),4)); + add(new FixedField(codigoDeBarras.write().substring(9, 19),10)); + + if(log.isDebugEnabled() || log.isTraceEnabled()) + log.debug("InnerCampo 5 da Linha Digitável composto : "+write()); + + } + + } + + @Override + public String toString() { + return Objects.toString(this); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/LinhaDigitavelException.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/LinhaDigitavelException.java new file mode 100644 index 0000000..a72e4e2 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/LinhaDigitavelException.java @@ -0,0 +1,91 @@ +/* + * 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: 21/04/2008 - 23:39: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: 21/04/2008 - 23:39:43 + * + */ + +package org.jrimum.bopepo; + + + +/** + * + *

    + * Qualquer exceção gerada durante a geração da Linha Digitável gera uma LinhaDigitavelException. Centraliza e localiza os problemas relativos a geração de uma linha digitável. + *

    + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @see org.jrimum.bopepo.LinhaDigitavel + * + * @since 0.2 + * + * @version 0.2 + */ +public class LinhaDigitavelException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = 8206303471509231915L; + + /** + * + */ + public LinhaDigitavelException() { + + } + + /** + * @param message + * @param cause + */ + public LinhaDigitavelException(String message, Throwable cause) { + super(message, cause); + + } + + /** + * @param message + */ + public LinhaDigitavelException(String message) { + super(message); + + } + + /** + * @param cause + */ + public LinhaDigitavelException(Throwable cause) { + super(cause); + + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/MeuPrimeiroBoleto.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/MeuPrimeiroBoleto.java new file mode 100644 index 0000000..196db93 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/MeuPrimeiroBoleto.java @@ -0,0 +1,278 @@ +package org.jrimum.bopepo; + +/* + * 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: 01/11/2010 - 09:37: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: 01/11/2010 - 09:37:00 + * + */ + + +import java.io.File; +import java.math.BigDecimal; +import java.util.Date; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.BoletoViewer; +import org.jrimum.domkee.comum.pessoa.endereco.CEP; +import org.jrimum.domkee.comum.pessoa.endereco.Endereco; +import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite; + +/** + * Exemplo de código para geração de um boleto simples. + * + *

    + * Utiliza o Banco Bradesco como exemplo, já que possui um implementação simples. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class MeuPrimeiroBoleto { + + /** + * Executa o exemplo. + * + * @param args + */ + public static void main(String[] args) { + + new MeuPrimeiroBoleto().exemplo(); + } + + /** + * Um simples exemplo de como gerar um boleto. + */ + final void exemplo() { + + /* + * Para gerar um boleto é preciso dos dados do boleto e de um + * visualizador de boletos. + */ + + /* + * Primeiro crie os dados do boleto. + */ + Boleto boleto = crieUmBoleto(); + + /* + * Em seguida, basta criar um visualizador para o boleto. + */ + BoletoViewer boletoViewer = new BoletoViewer(boleto); + + /* + * Depois, gere um arquivo, byte array ou stream. Nesse exemplo, um + * arquivo será salvo na mesma pasta do seu "projeto" + */ + + // Exemplos de uso: + // WINDOWS: boletoViewer.getAsPDF("C:/Temp/MeuBoleto.pdf"); + // LINUX: boletoViewer.getAsPDF("/home/temp/MeuBoleto.pdf"); + File arquivoPdf = boletoViewer.getPdfAsFile("MeuPrimeiroBoleto.pdf"); + + // Agora veja o arquivo gerado na tela. + mostreBoletoNaTela(arquivoPdf); + + } + + /** + * Cria um boleto, em passos distintos, com os dados necessários para a visualização. + * + * @return boleto com dados + */ + Boleto crieUmBoleto() { + + /* + * PASSO 1: Você precisa dos dados de uma conta bancária habilitada para + * emissão de boletos. + */ + ContaBancaria contaBancaria = crieUmaContaBancaria(); + + /* + * PASSO 2: Informe os dados do cedente. + */ + Cedente cedente = crieUmCedente(); + + /* + * PASSO 3: Informe os dados do Sacado. + */ + Sacado sacado = crieUmSacado(); + + /* + * PASSO 4: Crie um novo título/cobrança e informe os dados. + */ + Titulo titulo = crieOsDadosDoNovoTitulo(new Titulo(contaBancaria,sacado,cedente)); + + /* + * PASSO 5: Crie o boleto e informe os dados necessários. + */ + Boleto boleto = crieOsDadosDoNovoBoleto(new Boleto(titulo)); + + return boleto; + } + + /** + * Preenche os principais dados do boleto. + * + * @param boleto + * @return boleto com os dados necssários + */ + final Boleto crieOsDadosDoNovoBoleto(Boleto boleto) { + +// boleto.setLocalPagamento("Pagável preferencialmente na Rede X ou em qualquer Banco até o Vencimento."); +// boleto.setInstrucaoAoSacado("Senhor sacado, sabemos sim que o valor cobrado não é o esperado, aproveite o DESCONTÃO!"); +// boleto.setInstrucao1("PARA PAGAMENTO 1 até Hoje não cobrar nada!"); +// boleto.setInstrucao2("PARA PAGAMENTO 2 até Amanhã Não cobre!"); +// boleto.setInstrucao3("PARA PAGAMENTO 3 até Depois de amanhã, OK, não cobre."); +// boleto.setInstrucao4("PARA PAGAMENTO 4 até 04/xx/xxxx de 4 dias atrás COBRAR O VALOR DE: R$ 01,00"); +// boleto.setInstrucao5("PARA PAGAMENTO 5 até 05/xx/xxxx COBRAR O VALOR DE: R$ 02,00"); +// boleto.setInstrucao6("PARA PAGAMENTO 6 até 06/xx/xxxx COBRAR O VALOR DE: R$ 03,00"); +// boleto.setInstrucao7("PARA PAGAMENTO 7 até xx/xx/xxxx COBRAR O VALOR QUE VOCÊ QUISER!"); +// boleto.setInstrucao8("APÓS o Vencimento, Pagável Somente na Rede X."); + + return boleto; + } + + /** + * Preenche os principais dados do título. + * + * @param titulo + * + * @return título com os dados necssários + */ + final Titulo crieOsDadosDoNovoTitulo(Titulo titulo) { + + /* + * DADOS BÁSICOS. + */ + + titulo.setNumeroDoDocumento("05160935000159"); + titulo.setNossoNumero("0543129"); + titulo.setDigitoDoNossoNumero("8"); + titulo.setValor(BigDecimal.valueOf(822.59)); + + // Para informar a data de maneira simples você pode utilizar as + // classes utilitárias do JRimum. Abaixo temos alguns exemplos: + // (1) titulo.setDataDoVencimento( DateFormat.DDMMYYYY_B.parse("11/03/2011") ); + // (2) titulo.setDataDoVencimento( Dates.parse("11/03/2011", "dd/MM/yyyy") ); + titulo.setDataDoDocumento(new Date()); + + Date d = new Date(); + d.setDate(07); + d.setMonth(12-1); + titulo.setDataDoVencimento(d); + + titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL); + titulo.setAceite(Aceite.N); + titulo.setDesconto(new BigDecimal(223.64)); + titulo.setDeducao(BigDecimal.ZERO); + titulo.setMora(BigDecimal.ZERO); + titulo.setAcrecimo(BigDecimal.ZERO); + titulo.setValorCobrado(BigDecimal.ZERO); + + return titulo; + } + + /** + * Cria uma instância de sacado com os principais dados para o boleto. + * + * @return sacado com os dados necssários + */ + final Sacado crieUmSacado() { + + Sacado sacado = new Sacado("BREDA TRANSPORTE E SERVIÇOS S.A", "05160935000159"); + +// // Informando o endereço do sacado. +// Endereco enderecoSac = new Endereco(); +// enderecoSac.setUF(UnidadeFederativa.RN); +// enderecoSac.setLocalidade("Natal"); +// enderecoSac.setCep(new CEP("59064-120")); +// enderecoSac.setBairro("Grande Centro"); +// enderecoSac.setLogradouro("Rua poeta dos programas"); +// enderecoSac.setNumero("1"); +// sacado.addEndereco(enderecoSac); +// + return sacado; + } + + /** + * Cria uma instância de cedente com os principais dados para o boleto. + * + * @return cedente com os dados necssários + */ + final Cedente crieUmCedente() { + + return new Cedente("BREDA TRANSPORTE E SERVIÇOS S.A.", "05160935000159"); + } + + /** + * Cria uma instância de conta bancária com os principais dados para o + * boleto em questão (Banco Bradesco). + * + * @return conta com os dados necssários + */ + final ContaBancaria crieUmaContaBancaria(){ + + ContaBancaria contaBancaria = new ContaBancaria(BancosSuportados.BANCO_SANTANDER.create()); + contaBancaria.setNumeroDaConta(new NumeroDaConta(1152386)); + contaBancaria.setAgencia(new Agencia(227, "1")); + contaBancaria.setCarteira(new Carteira(101, TipoDeCobranca.SEM_REGISTRO)); + + + return contaBancaria; + } + + /** + * Exibe o arquivo na tela. + * + * @param arquivoBoleto + */ + final void mostreBoletoNaTela(File arquivoBoleto) { + + try { + // Descomente se estiver usando java 6 ou superior + java.awt.Desktop.getDesktop().open(arquivoBoleto); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoCitibank.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoCitibank.java new file mode 100644 index 0000000..409f651 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoCitibank.java @@ -0,0 +1,84 @@ +/* + * 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: 17/02/2011 - 12:40:00 + * + * ================================================================================ + * + * 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: 17/02/2011 - 12:40:00 + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + * Interface comum para todos os campos livres do CITIBANK + * + * @author Fabiano Carrijo Justino + * @since 0.2 + * @version 0.2 + */ +abstract class AbstractCLBancoCitibank extends AbstractCampoLivre { + + /** + * {@code serialVersionUID = 6080749970883991308L} + */ + private static final long serialVersionUID = 6080749970883991308L; + + /** + *

    + * Cria um campo livre com um determinado número de campos + *

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength + * - Número de campos + */ + protected AbstractCLBancoCitibank(Integer fieldsLength) { + + super(fieldsLength); + } + + /** + * @param titulo + * @return um CampoLivre + * + */ + protected static CampoLivre create(Titulo titulo) + throws NotSupportedCampoLivreException { + checkNossoNumero(titulo); + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + checkNossoNumero(titulo); + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + switch(titulo.getNossoNumero().length()) + { + case 11: + return new CLBancoCitiBankNN11(titulo); + } + throw new NotSupportedCampoLivreException("Campo livre diponivel somente para titulos com nosso nmero composto por 10 posicoes(convenio com 7), 11 posicoes ou 17 posicoes(convenio com 6)."); + } + + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDeBrasilia.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDeBrasilia.java new file mode 100644 index 0000000..4806c15 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDeBrasilia.java @@ -0,0 +1,61 @@ +/* + * Copyright 2013 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: 24/08/2013 - 19:54:00 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 24/08/2013 - 19:54:00 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do BRB - Banco de Brasília que + * venham a existir. + *

    + * + * @author Gilmar P.S.L + * @author Douglas Ramiro + * + * @since 0.2 + * + * @version 0.2 + */ +public abstract class AbstractCLBancoDeBrasilia extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = 3200353843356508888L; + + protected AbstractCLBancoDeBrasilia(Integer fieldsLength) { + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo){ + return new CLBancoDeBrasilia().build(titulo); + } +} \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDoBrasil.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDoBrasil.java new file mode 100644 index 0000000..bcba1b7 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDoBrasil.java @@ -0,0 +1,94 @@ +/* + * 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:47 + * + * ================================================================================ + * + * 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:47 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco do Brasil que venham a existir. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLBancoDoBrasil extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -7324315662526104153L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLBancoDoBrasil(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) throws NotSupportedCampoLivreException{ + + checkNossoNumero(titulo); + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + + switch(titulo.getNossoNumero().length()){ + case NN10: + return new CLBancoDoBrasilNN10(titulo); + case NN11: + return new CLBancoDoBrasilNN11(titulo); + case NN17: + if(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta() < 1000000){ + return new CLBancoDoBrasilNN17Convenio6(titulo); + }else{ + return new CLBancoDoBrasilNN17Convenio7().build(titulo); + } + default: + throw new NotSupportedCampoLivreException( + "Campo livre diponível somente para títulos com nosso número " + + "composto por 10 posições(convênio com 7), 11 posições ou " + + "17 posições(convênio com 6)." + ); + } + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDoNordesteDoBrasil.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDoNordesteDoBrasil.java new file mode 100644 index 0000000..2e00c1a --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoDoNordesteDoBrasil.java @@ -0,0 +1,53 @@ +/** + * + */ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco do Nordeste do + * Brasil que venham a existir. + *

    + * + * @author Misael Barreto + * @author Paulo Porto + * + * @since 0.2 + * + * @version 0.2 + */ +public abstract class AbstractCLBancoDoNordesteDoBrasil extends AbstractCampoLivre { + + + /** + * + */ + private static final long serialVersionUID = -5036970456320987443L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + * + * @since 0.2 + */ + protected AbstractCLBancoDoNordesteDoBrasil(Integer fieldsLength) { + + super(fieldsLength); + } + + /** + * @param titulo + * @return um CampoLivre + * + * @see org.jrimum.bopepo.campolivre.AbstractCLBancoDoNordesteDoBrasil#create(Titulo) + */ + protected static CampoLivre create(Titulo titulo){ + return new CLBancoDoNordesteDoBrasil().build(titulo); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoIntermedium.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoIntermedium.java new file mode 100644 index 0000000..9b1d1c7 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoIntermedium.java @@ -0,0 +1,73 @@ +/* + * 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: 11/08/2010 - 10:23: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: 11/08/2010 - 10:23:00 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Intermedium que venham a + * existir. + *

    + * + * + * @author Gilmar P.S.L + * @author Lukas + * Antunes + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLBancoIntermedium extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -8103863452995430046L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLBancoIntermedium(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo){ + + return new CLBancoIntermedium(titulo); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoReal.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoReal.java new file mode 100644 index 0000000..16dabb2 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoReal.java @@ -0,0 +1,73 @@ +/* + * 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:08: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:08:00 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Real que venham a existir. + *

    + * + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * + * @see AbstractCampoLivre + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLBancoReal extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -2020155324741631945L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLBancoReal(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo){ + + return new CLBancoReal(titulo); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoRural.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoRural.java new file mode 100644 index 0000000..5cccdd2 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoRural.java @@ -0,0 +1,76 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Santander que venham a + * existir. + *

    + * + * @author Fernando Dias - + * Colaborador com o campo livre {@code CLBancoRuralCobrancaRegistrada} + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLBancoRural extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -602454445158254612L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLBancoRural(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) { + + checkCarteiraNotNull(titulo); + checkRegistroDaCarteiraNotNull(titulo); + + switch(titulo.getContaBancaria().getCarteira().getTipoCobranca()){ + case SEM_REGISTRO: + return campoSemRegistro(titulo); + case COM_REGISTRO: + return new CLBancoRuralCobrancaRegistrada(titulo); + default: + return null; + } + } + + /** + * Determina e cria um campo livre de cobrança não registrada. + * + * @param titulo + * - título com as informações para geração do campo livre + * @return campo livre ou null + */ + private static CampoLivre campoSemRegistro(Titulo titulo) { + + checkNossoNumero(titulo); + + switch(titulo.getNossoNumero().length()){ + case NN10: + return new CLBancoRuralCobrancaNaoRegistradaSeguradora(titulo); + case NN15: + return new CLBancoRuralCobrancaNaoRegistrada(titulo); + default: + throw new NotSupportedCampoLivreException( + "Combrança sem registro com campo livre diponível somente para títulos com nosso número" + + " composto por 10 posições(apólice de seguro com I.O.S.) e 15 posições(padrão)." + ); + } + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoSafra.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoSafra.java new file mode 100644 index 0000000..7d71c33 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoSafra.java @@ -0,0 +1,151 @@ +/* + * 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: 21/04/2008 - 20:27:04 + * + * ================================================================================ + * + * 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: 21/04/2008 - 20:27:04 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static java.lang.String.format; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + *

    + * Interface comum para todos os campos livres do Banco Safra que venham a + * existir. + *

    + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLBancoSafra extends AbstractCampoLivre { + + /** + * {@code serialVersionUID = -555393808447532987L} + */ + private static final long serialVersionUID = -555393808447532987L; + + /** + * Códigos do "Tipo de Cobrança" utilizados nos boletos do Banco Safra. + * + * @author Gilmar P.S.L. + */ + protected enum TipoDeCobranca { + + /** + * 1 = Bloqueto Emitido pelo Banco. + */ + BOLETO_EMITIDO_PELO_BANCO, + /** + * 2 = Eletrônica Emitido pelo Cliente. + */ + DIRETA_BOLETO_EMITIDO_PELO_CLIENTE, + /** + * 4 = Express Emitido pelo Cliente. + */ + EXPRESS_BOLETO_EMITIDO_PELO_CLIENTE; + + public int codigo() { + switch (this) { + case BOLETO_EMITIDO_PELO_BANCO: + return 1; + case DIRETA_BOLETO_EMITIDO_PELO_CLIENTE: + return 2; + case EXPRESS_BOLETO_EMITIDO_PELO_CLIENTE: + return 4; + default: + return (Integer) Exceptions.throwIllegalStateException(format( + "Tipo \"%s\" sem código atribuído!", this)); + } + } + } + + /** + * Tamanho do campo Constante = 1, chamado de "SISTEMA", definido pelo Banco + * Safra nos dois campos livres: {@link CLBancoSafraCobrancaNaoRegistrada} e + * {@link CLBancoSafraCobrancaRegistrada}. + */ + private static final Integer CONSTANT_LENGTH_SISTEMA = Integer.valueOf(1); + + /** + * Valor do campo Constante = 7, chamado de "SISTEMA", definido pelo Banco + * Safra nos dois campos livres: {@link CLBancoSafraCobrancaNaoRegistrada} e + * {@link CLBancoSafraCobrancaRegistrada}. + */ + private static final Integer CONSTANT_VALUE_SISTEMA = Integer.valueOf(7); + + /** + * Constante em forma de campo {@link AbstractCLBancoSafra#CONSTANT_VALUE_SISTEMA} e {@link AbstractCLBancoSafra#CONSTANT_LENGTH_SISTEMA}. + */ + protected static final FixedField SISTEMA_CONSTANT_FIELD = new FixedField(CONSTANT_VALUE_SISTEMA, CONSTANT_LENGTH_SISTEMA); + + /** + * Tamanho do campo = 1, chamado de "TIPO DE COBRANÇA", definido pelo Banco + * Safra nos dois campos livres: {@link CLBancoSafraCobrancaNaoRegistrada} e + * {@link CLBancoSafraCobrancaRegistrada}. + */ + protected static final Integer TIPO_COBRANCA_FIELD_LENGTH = Integer.valueOf(1); + + /** + *

    + * Cria um campo livre com um determinado número de campos + *

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength + * - Número de campos + */ + protected AbstractCLBancoSafra(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) + throws NotSupportedCampoLivreException { + + checkCarteiraNotNull(titulo); + checkRegistroDaCarteiraNotNull(titulo); + + switch (titulo.getContaBancaria().getCarteira().getTipoCobranca()) { + case COM_REGISTRO: + return new CLBancoSafraCobrancaRegistrada().build(titulo); + case SEM_REGISTRO: + return new CLBancoSafraCobrancaNaoRegistrada().build(titulo); + default: + throw new NotSupportedCampoLivreException( + "Campo livre diponível somente para títulos com carteiras com tipo de cobrança " + + "COM_REGISTRO ou SEM_REGISTRO."); + } + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoob.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoob.java new file mode 100644 index 0000000..aa15830 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBancoob.java @@ -0,0 +1,77 @@ +/* + * 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: 17/02/2011 - 12:40:00 + * + * ================================================================================ + * + * 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: 17/02/2011 - 12:40:00 + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Bancoob (BANCO COOPERATIVO DO + * BRASIL S.A.) que venham a existir. + *

    + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLBancoob extends AbstractCampoLivre { + + /** + * {@code serialVersionUID = 6080749970883991308L} + */ + private static final long serialVersionUID = 6080749970883991308L; + + /** + *

    + * Cria um campo livre com um determinado número de campos + *

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength + * - Número de campos + */ + protected AbstractCLBancoob(Integer fieldsLength) { + + super(fieldsLength); + } + + /** + * @param titulo + * @return um CampoLivre + * + * @see org.jrimum.bopepo.campolivre.AbstractCLBancoDoNordesteDoBrasil#create(Titulo) + */ + protected static CampoLivre create(Titulo titulo) { + + return new CLBancoobCobrancaNaoRegistrada().build(titulo); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBanestes.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBanestes.java new file mode 100644 index 0000000..5bb0283 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBanestes.java @@ -0,0 +1,72 @@ +/* + * 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: Dec 13, 2008 - 11:00:04 AM + * + * ================================================================================ + * + * 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: Dec 13, 2008 - 11:00:04 AM + * + */ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Banestes que venham a + * existir. + *

    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério Valerio + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLBanestes extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = 2713363808443832056L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLBanestes(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) throws NotSupportedCampoLivreException { + + return new CLBanestes(titulo); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBanrisul.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBanrisul.java new file mode 100644 index 0000000..2e99d84 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBanrisul.java @@ -0,0 +1,245 @@ +/* + * 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: 02/08/2008 - 12:06: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: 02/08/2008 - 12:06:09 + * + */ +package org.jrimum.bopepo.campolivre; + +import org.apache.commons.lang.StringUtils; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.FixedField; +import org.jrimum.vallia.digitoverificador.Modulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Banrisul que venham a + * existir. + *

    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério Valerio + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLBanrisul extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -259398499475894938L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLBanrisul(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) throws NotSupportedCampoLivreException { + + checkCarteiraNotNull(titulo); + checkRegistroDaCarteiraNotNull(titulo); + + switch (titulo.getContaBancaria().getCarteira().getTipoCobranca()) { + + case COM_REGISTRO: + return new CLBanrisulCobrancaRegistrada(titulo); + case SEM_REGISTRO: + return new CLBanrisulCobrancaNaoRegistrada(titulo); + default: + throw new NotSupportedCampoLivreException("Campo livre diponível apenas para carteiras com ou sem cobrança."); + } + } + + /** + *

    + * Calcula o duplo dígito referente às posições 20 a 42 (módulos 10 e 11). + *

    + * + * + * @param seisPrimeirosCamposConcatenados + * @return duplo dígito + * + * @since 0.2 + */ + protected String calculaDuploDigito(String seisPrimeirosCamposConcatenados) { + // calcula soma do módulo 10 a partir dos seis primeiros campos concatenados + final int somaMod10 = Modulo.calculeSomaSequencialMod10(seisPrimeirosCamposConcatenados, 1, 2); + + // calcula resto do módulo 10 a partir do resultado da soma + final byte restoMod10 = calculeRestoMod10(somaMod10); + + // calcula primeiro DV a partir do resto módulo 10 + byte primeiroDV = calculePrimeiroDV(restoMod10); + + + // calcula soma do módulo 10 a partir dos seis primeiros campos concatenados + // incluindo o primeiro dígito + int somaMod11 = Modulo.calculeSomaSequencialMod11(seisPrimeirosCamposConcatenados + primeiroDV, 2, 7); + + // calcula o resto do módulo 11 a partir do resultado da soma + byte restoMod11 = calculeRestoMod11(somaMod11); + + // se o resto do módulo 11 for 1 então o primeiro dígito é inválido + // deve ser feito o recálculo até que o resto não seja 1 + while (restoMod11 == 1) { + + // encontra um valor válido para o primeiro DV + primeiroDV = encontreValorValidoParaPrimeiroDV(primeiroDV); + + // calcula a soma do módulo 11 agora com um valor + // válido para o DV + somaMod11 = Modulo.calculeSomaSequencialMod11(seisPrimeirosCamposConcatenados + primeiroDV, 2, 7); + + // calcula o resto do módulo 11 a partir do resultado da soma + restoMod11 = calculeRestoMod11(somaMod11); + } + + // calcula o segundo DV a partir do resto módulo 11 + final byte segundoDV = calculeSegundoDV(restoMod11); + + // concatena o primeiro DV com o segundo DV para + // formar o duplo dígito + return String.valueOf(primeiroDV) + String.valueOf(segundoDV); + } + + /** + *

    + * Calcula o segundo dígito verificador. + *

    + * + * @param restoMod11 + * @return segundo dígito + * + * @since 0.2 + */ + private byte calculeSegundoDV(byte restoMod11) { + final byte segundoDV; + if (restoMod11 == 0) + segundoDV = restoMod11; + else + segundoDV = (byte) (11 - restoMod11); + return segundoDV; + } + + /** + *

    + * Calcula o primeiro dígito verificador. + *

    + * + * @param restoMod10 + * @return primeiro dígito verificador + * + * @since 0.2 + */ + private byte calculePrimeiroDV(byte restoMod10) { + final byte primeiroDV; + if (restoMod10 == 0) + primeiroDV = 0; + else + primeiroDV = (byte) (10 - restoMod10); + return primeiroDV; + } + + /** + *

    + * Calcula o resto da soma módulo 10. + *

    + * + * @param somaMod10 + * @return Resto do modúlo 10 + * + * @since 0.2 + */ + private byte calculeRestoMod10(int somaMod10) { + final byte restoMod10; + if (somaMod10 < 10) + restoMod10 = (byte) somaMod10; + else + restoMod10 = (byte) (somaMod10 % 10); + return restoMod10; + } + + /** + *

    + * Encontra um valor válido para o primeiro dígito. + *

    + * + * @param primeiroDV + * @return valor válido para o primeiro dígito + * + * @since 0.2 + */ + private byte encontreValorValidoParaPrimeiroDV(byte primeiroDV) { + final byte novoValorDoPrimeiroDV; + if (primeiroDV == 9) + novoValorDoPrimeiroDV = 0; + else + novoValorDoPrimeiroDV = (byte) (primeiroDV + 1); + return novoValorDoPrimeiroDV; + } + + /** + *

    + * Calcula o resto do módulo 11. + *

    + * + * @param somaMod11 + * @return restro do módulo 11 + * + * @since 0.2 + */ + private byte calculeRestoMod11(int somaMod11) { + final byte restoMod11; + if (somaMod11 < 11) + restoMod11 = (byte) somaMod11; + else + restoMod11 = (byte) (somaMod11 % 11); + return restoMod11; + } + + protected String concateneOsCamposExistentesAteOMomento() { + + final StringBuilder camposExistentesAteOMomentoConcatenados = new StringBuilder(StringUtils.EMPTY); + + for (FixedField field : this) { + camposExistentesAteOMomentoConcatenados.append(field.write()); + } + + return camposExistentesAteOMomentoConcatenados.toString(); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBradesco.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBradesco.java new file mode 100644 index 0000000..c1b7eeb --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLBradesco.java @@ -0,0 +1,76 @@ +/* + * 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:08:12 + * + * ================================================================================ + * + * 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:08:12 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Bradesco que venham a + * existir. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLBradesco extends AbstractCampoLivre { + + /** + * {@code serialVersionUID = -1733227746617862639L} + */ + private static final long serialVersionUID = -1733227746617862639L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + * + * @since 0.2 + */ + protected AbstractCLBradesco(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo){ + + return new CLBradesco().build(titulo); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLCaixaEconomicaFederal.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLCaixaEconomicaFederal.java new file mode 100644 index 0000000..ac70f37 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLCaixaEconomicaFederal.java @@ -0,0 +1,93 @@ +/* + * 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:08:25 + * + * ================================================================================ + * + * 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:08:25 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static java.lang.String.format; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Caixa Econômica Federal + * que venham a existir. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Rogério Kleinkauf - + * Colaborador do campo livre SIGCB + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLCaixaEconomicaFederal extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -4104858478390595830L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLCaixaEconomicaFederal(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) throws NotSupportedCampoLivreException{ + + checkNossoNumero(titulo); + + switch(titulo.getNossoNumero().length()){ + case NN10: + return new CLCaixaEconomicaFederalSICOBNossoNumero10(titulo); + case NN14: + return new CLCaixaEconomicaFederalSICOBNossoNumero14().build(titulo); + case NN15: + return new CLCaixaEconomicaFederalSIGCB(titulo); + case NN17: + return new CLCaixaEconomicaFederalSINCO(titulo); + default: + throw new NotSupportedCampoLivreException( + format("Campo Livre não suportado para o Nosso Número [%s] de tamanho [%s]." + + " Apenas títulos com Nosso Número de tamanho [%s] são suportados (SICOB, SIGCB e SINCO respectivamente)." + ,titulo.getNossoNumero(), titulo.getNossoNumero().length() + ,NN10 + "," + NN14 + ","+ NN15 + "," + NN17) + ); + } + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLCecred.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLCecred.java new file mode 100644 index 0000000..b397068 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLCecred.java @@ -0,0 +1,62 @@ +/* + * Copyright 2014 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: 21/01/2014 - 13:31:39 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 21/01/2014 - 13:31:39 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do CECRED - Cooperativa Central de Crédito Urbano que + * venham a existir. + *

    + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +public abstract class AbstractCLCecred extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -5579081722726761569L; + + protected AbstractCLCecred(Integer fieldsLength) { + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo){ + return new CLCecred().build(titulo); + } + +} \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLHSBC.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLHSBC.java new file mode 100644 index 0000000..e9aa532 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLHSBC.java @@ -0,0 +1,83 @@ +/* + * 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:08:12 + * + * ================================================================================ + * + * 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:08:12 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco HSBC que venham a + * existir. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLHSBC extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = 3179450500491723317L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLHSBC(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) { + + checkCarteiraNotNull(titulo); + checkRegistroDaCarteiraNotNull(titulo); + + switch(titulo.getContaBancaria().getCarteira().getTipoCobranca()){ + case SEM_REGISTRO: + return new CLHSBCCobrancaNaoRegistrada(titulo); + case COM_REGISTRO: + return new CLHSBCCobrancaRegistrada(titulo); + default: + return null; + } + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLItau.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLItau.java new file mode 100644 index 0000000..25b72e6 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLItau.java @@ -0,0 +1,138 @@ + +/* + * 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:08:17 + * + * ================================================================================ + * + * 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:08:17 + * + */ + +package org.jrimum.bopepo.campolivre; +import static org.jrimum.vallia.digitoverificador.Modulo.MOD10; + +import java.util.HashSet; +import java.util.Set; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.vallia.digitoverificador.Modulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Itaú que venham a + * existir. + *

    + * + * @author Gilmar P.S.L + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLItau extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -3082903872777434482L; + + /** + *

    + * Carteiras especiais sem registro na qual são utilizadas 15 posições numéricas + * para identificação do título liquidado (8 do Nosso Número e 7 do Seu Número). + *

    + */ + private static final Set CARTEIRAS_ESPECIAIS = new HashSet(8); + + static{ + + CARTEIRAS_ESPECIAIS.add(106); + CARTEIRAS_ESPECIAIS.add(107); + CARTEIRAS_ESPECIAIS.add(122); + CARTEIRAS_ESPECIAIS.add(142); + CARTEIRAS_ESPECIAIS.add(143); + CARTEIRAS_ESPECIAIS.add(195); + CARTEIRAS_ESPECIAIS.add(196); + CARTEIRAS_ESPECIAIS.add(198); + } + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLItau(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo){ + + checkCarteiraNotNull(titulo); + checkCodigoDaCarteira(titulo); + + /* + * Se a carteira for especial, a forma de construir o campo livre será diferente. + */ + if(CARTEIRAS_ESPECIAIS.contains(titulo.getContaBancaria().getCarteira().getCodigo())) { + + return new CLItauComCarteirasEspeciais(titulo); + + }else { + + return new CLItauPadrao(titulo); + } + } + + /** + *

    + * Método auxiliar para calcular o dígito verificador dos campos 31 e 41. + * O dígito é calculado com base em um campo fornecido pelos métodos que o chamam + * (calculeDigitoDaPosicao31 e calculeDigitoDaPosicao41) + *

    + *

    + * O cálculo é feito através do módulo 10. + *

    + * + * @param campo + * @return Dígito verificador do campo fornecido. + * + * @since + */ + protected Integer calculeDigitoVerificador(String campo) { + + int restoDivisao = Modulo.calculeMod10(campo, 1, 2); + int digito = MOD10 - restoDivisao; + + if(digito > 9) { + digito = 0; + } + + return new Integer(digito); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLMercantilDoBrasil.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLMercantilDoBrasil.java new file mode 100644 index 0000000..852f343 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLMercantilDoBrasil.java @@ -0,0 +1,70 @@ +/* + * 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:20:19 + * + * ================================================================================ + * + * 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:20:19 + * + */ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Mercantil do Brasil que + * venham a existir. + *

    + * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLMercantilDoBrasil extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -6705784312499730452L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLMercantilDoBrasil(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) throws NotSupportedCampoLivreException { + + return new CLMercantilDoBrasil(titulo); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLSantander.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLSantander.java new file mode 100644 index 0000000..0031963 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLSantander.java @@ -0,0 +1,40 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Santander que venham a + * existir. + *

    + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLSantander extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = 1882819688182515282L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLSantander(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) { + + return new CLBancoSantander(titulo); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLSicredi.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLSicredi.java new file mode 100644 index 0000000..9f8111c --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLSicredi.java @@ -0,0 +1,73 @@ +/* + * 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 org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + *

    + * Interface comum para todos os campos livres do Banco Sicredi que venham a + * existir. + *

    + * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +abstract class AbstractCLSicredi extends AbstractCampoLivre { + + /** + * {@code serialVersionUID = 636384334503863949L} + */ + private static final long serialVersionUID = 636384334503863949L; + + /** + *

    + * Cria um campo livre com um determinado número de campos + *

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength + * - Número de campos + */ + protected AbstractCLSicredi(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) { + + return new CLSicredi().build(titulo); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLUnibanco.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLUnibanco.java new file mode 100644 index 0000000..bfa5e29 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCLUnibanco.java @@ -0,0 +1,70 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.vallia.digitoverificador.Modulo; + +abstract class AbstractCLUnibanco extends AbstractCampoLivre { + + /** + * + */ + private static final long serialVersionUID = -6169577742706045367L; + + /** + *

    Cria um campo livre com um determinado número de campos

    + * + * @see AbstractCampoLivre + * + * @param fieldsLength - Número de campos + */ + protected AbstractCLUnibanco(Integer fieldsLength) { + + super(fieldsLength); + } + + protected static CampoLivre create(Titulo titulo) throws NotSupportedCampoLivreException { + + checkCarteiraNotNull(titulo); + checkRegistroDaCarteiraNotNull(titulo); + + switch(titulo.getContaBancaria().getCarteira().getTipoCobranca()){ + case SEM_REGISTRO: + return new CLUnibancoCobrancaNaoRegistrada(titulo); + case COM_REGISTRO: + return new CLUnibancoCobrancaRegistrada(titulo); + default: + return null; + } + } + + /** + *

    + * Calcula o dígito verificador para + * referência do cliente (cobrança sem registro) e base para + * cálculo do super dígito do nosso numero (cobrança com registro). + *

    + * + * @param numero + * @return String dígito + * + * @since 0.2 + */ + String calculeDigitoEmModulo11(String numero) { + + String dv = ""; + + int soma = Modulo.calculeSomaSequencialMod11(numero, 2, 9); + + soma *= 10; + + final int resto = soma % 11; + + if (resto == 10 || resto == 0) + dv = "0"; + else + dv = "" + resto; + + return dv; + + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCampoLivre.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCampoLivre.java new file mode 100644 index 0000000..7434008 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/AbstractCampoLivre.java @@ -0,0 +1,787 @@ +/* + * 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.financeiro.banco.febraban.Banco.isCodigoDeCompensacaoOK; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametroBancario; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.FixedField; +import org.jrimum.texgit.type.component.BlockOfFields; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.Strings; + +/** + *

    + * 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.

    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 YfsK-j8>ZTjp$~v>uS!a)=%^C@2QQ&G5dZ)H literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/assembly/jrimum-bopepo-examples.xml b/jrimum-bopepo/src/main/assembly/jrimum-bopepo-examples.xml new file mode 100644 index 0000000..07651a4 --- /dev/null +++ b/jrimum-bopepo/src/main/assembly/jrimum-bopepo-examples.xml @@ -0,0 +1,27 @@ + + examples + + zip + + + + src/examples/java + true + / + + **/*.java + + + + src/examples/resources + true + /resources + + **/** + + + + \ No newline at end of file diff --git a/jrimum-bopepo/src/main/assembly/jrimum-bopepo-with-dependencies-src.xml b/jrimum-bopepo/src/main/assembly/jrimum-bopepo-with-dependencies-src.xml new file mode 100644 index 0000000..6e8aebf --- /dev/null +++ b/jrimum-bopepo/src/main/assembly/jrimum-bopepo-with-dependencies-src.xml @@ -0,0 +1,60 @@ + + dep-sources + + jar + + false + + + /src/main/java + true + / + + **/*.java + + + + /src/main/resources + true + / + + **/** + + + + ../jrimum-texgit/src/main/java + true + / + + **/*.java + + + + ../jrimum-utilix/src/main/java + true + / + + **/*.java + + + + ../jrimum-vallia/src/main/java + true + / + + **/*.java + + + + ../jrimum-domkee/src/main/java + true + / + + **/*.java + + + + \ No newline at end of file diff --git a/jrimum-bopepo/src/main/assembly/jrimum-bopepo-with-dependencies.xml b/jrimum-bopepo/src/main/assembly/jrimum-bopepo-with-dependencies.xml new file mode 100644 index 0000000..90b7a0e --- /dev/null +++ b/jrimum-bopepo/src/main/assembly/jrimum-bopepo-with-dependencies.xml @@ -0,0 +1,22 @@ + + dep + + jar + + false + + + / + true + true + + commons-lang:commons-lang + log4j:log4j + com.lowagie:itext + + + + \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/BancosSuportados.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/BancosSuportados.java new file mode 100644 index 0000000..a11c843 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/BancosSuportados.java @@ -0,0 +1,473 @@ +/* + * 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.comum.pessoa.id.cprf.CNPJ; +import org.jrimum.domkee.financeiro.banco.febraban.Banco; +import org.jrimum.domkee.financeiro.banco.febraban.CodigoDeCompensacaoBACEN; + +/** + *

  • + * + *

    + * + * + * @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. + */ + private 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(FixedField 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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoCitiBankNN11.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoCitiBankNN11.java new file mode 100644 index 0000000..c77ac82 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoCitiBankNN11.java @@ -0,0 +1,74 @@ +/* + * 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:08:37 + * + * ================================================================================ + * + * 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:08:37 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + * Interface comum para todos os campos livres do CITIBANK + * + * @author Fabiano Carrijo Justino + * @since 0.2 + * @version 0.2 + */ + +class CLBancoCitiBankNN11 extends AbstractCLBancoDoBrasil { + private static final long serialVersionUID = -7675528811239346517L; + private static final Integer FIELDS_LENGTH = Integer.valueOf(6); + + //TODO OBTER DADOS ATRAVÉS DE OBJETOS DO BOPEPO + CLBancoCitiBankNN11(Titulo titulo) + { + super(FIELDS_LENGTH); + ContaBancaria conta = titulo.getContaBancaria(); + String nossoNumero = titulo.getNossoNumero(); +// add(new Field(conta.getProduto().getCodigo(), Integer.valueOf(1), Fillers.ZERO_LEFT)); +// add(new Field(conta.getPortifolio().getCodigo(), Integer.valueOf(3), Fillers.ZERO_LEFT)); +// add(new Field(conta.getCosmos().getCodigo(), Integer.valueOf(1), Fillers.ZERO_LEFT)); +// add(new Field(conta.getCosmosConta().getCodigo(), Integer.valueOf(8), Fillers.ZERO_LEFT)); +// add(new Field(nossoNumero, Integer.valueOf(11), Fillers.ZERO_LEFT)); +// add(new Field(conta.getProduto().getCodigo(), Integer.valueOf(1), Fillers.ZERO_LEFT)); + } + + protected void addFields(Titulo titulo) + { + +// throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + protected void checkValues(Titulo titulo) + { + throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDeBrasilia.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDeBrasilia.java new file mode 100644 index 0000000..8bacbe9 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDeBrasilia.java @@ -0,0 +1,359 @@ +/* + * Copyright 2013 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: 24/08/2013 - 19:54:00 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 24/08/2013 - 19:54:00 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static java.lang.String.format; +import static org.jrimum.bopepo.parametro.ParametroBancoDeBrasilia.CHAVE_ASBACE_DIGITO1; +import static org.jrimum.bopepo.parametro.ParametroBancoDeBrasilia.CHAVE_ASBACE_DIGITO2; + +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Objects; +import org.jrimum.vallia.digitoverificador.Modulo; + +/** + *

    + * O campo livre do BRB - Banco de Brasília deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2239(3)fixo "000" ZEROSZEROS
    23-2539(3)Agência Cedente (Sem o dígito verificador, completar com zeros a esquerda quando necessário)Código da Agência (sem dígito)
    26-327 9(7)Conta do Cedente (Sem o digito verificador, completar com zeros a esquerda quando necessário)Conta do Cedente (sem dígito)
    33-3319Carteira | Modalidade/ CategoriaCategoria - referente ao tipo de cobrança 1-sem registro impressão local, 2-com registro impressão local
    34-396 9(6)Número do Nosso Número(Sem o digito verificador)Número sequencial
    40-423 9(3)Código BACEN(Sem o digito verificador)Código do Banco- 070 - BRB
    43-4319Dígito verificador 1 da CHAVE ASBACEDV1
    44-4419Dígito verificador 2 da CHAVE ASBACEDV2
    + * + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * + * @author Gilmar P.S.L + * @author Douglas Ramiro + * + * @since 0.2 + * + * @version 0.2 + */ +/** + * @author gleitao + * + */ +public class CLBancoDeBrasilia extends AbstractCLBancoDeBrasilia{ + + /** + * + */ + private static final long serialVersionUID = -6099168685425835517L; + + /** + * Número de campos = 8. + */ + private static final Integer FIELDS_LENGTH = Integer.valueOf(8); + + /** + * Tamanho do primeiro campo "Campo Zerado [000]" = 3. + */ + private static final Integer CAMPO_ZERADO_LENGTH = Integer.valueOf(3); + + /** + * Valor do campo "Campo Zerado" = "000". + */ + private static final String CAMPO_ZERADO_VALUE = "000"; + + /** + * Tamanho do campo Agência = 3. + */ + private static final Integer AGENCIA_LENGTH = Integer.valueOf(3); + + /** + * Tamanho do campo Conta = 7. + */ + private static final Integer CONTA_LENGTH = Integer.valueOf(7); + + /** + * Tamanho do campo Nosso Número = 6. + */ + private static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(6); + + /** + * Tamanho do campo Carteira = 1. + */ + private static final Integer CARTEIRA_LENGTH = Integer.valueOf(1); + + /** + * Tamanho do campo do dígito da chave ASBACE = 1. + */ + private static final Integer DIGITO_CHAVE_ASBACE_LENGTH = Integer.valueOf(1); + + /** + * Tamanho do campo Banco = 3. + */ + private static final Integer BANCO_LENGTH = Integer.valueOf(3); + + /** + * Tipo de cobrança: 1-Sem registro impressão local (mesmo que carteira, modalidade ou categoria). + */ + private static final Integer CARTEIRA_SEM_REGISTRO = Integer.valueOf(1);; + + /** + * Tipo de cobrança: 2-Com registro impressão local (mesmo que carteira, modalidade ou categoria). + */ + private static final Integer CARTEIRA_COM_REGISTRO = Integer.valueOf(2); + + /** + * Dígito verificador calculado em função da CHAVE ASBACE e necessário para o cálculo do {@link #digitoVerificador2DaChaveASBACE}. + */ + private Integer digitoVerificador1DaChaveASBACE; + + /** + * Dígito verificador calculado em função da CHAVE ASBACE + {@link #digitoVerificador1DaChaveASBACE}. + */ + private Integer digitoVerificador2DaChaveASBACE; + + /** + *

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

    + * + * @since 0.2 + */ + protected CLBancoDeBrasilia() { + super(FIELDS_LENGTH); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#checkValues(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + * + * @since 0.2 + */ + @Override + protected void checkValues(Titulo titulo) { + + checkAgenciaNotNull(titulo); + checkCodigoDaAgencia(titulo); + checkCodigoDaAgenciaMenorOuIgualQue(titulo, 999); + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 9999999); + checkNossoNumero(titulo); + checkTamanhoDoNossoNumero(titulo, 6); + checkCarteiraNotNull(titulo); + checkCodigoDaCarteira(titulo); + checkCarteiraComOuSemRegistro(titulo); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#addFields(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + * + * @since 0.2 + */ + @Override + protected void addFields(Titulo titulo) { + + this.add(new FixedField(CAMPO_ZERADO_VALUE, CAMPO_ZERADO_LENGTH, Fillers.ZERO_LEFT)); + 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().getCarteira().getCodigo(), CARTEIRA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getNossoNumero(), NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigo(), BANCO_LENGTH, Fillers.ZERO_LEFT)); + calculeDigitosNecessariosDaChaveASBACE(); + this.add(new FixedField(this.digitoVerificador1DaChaveASBACE, DIGITO_CHAVE_ASBACE_LENGTH)); + this.add(new FixedField(this.digitoVerificador2DaChaveASBACE, DIGITO_CHAVE_ASBACE_LENGTH)); + + disponibilizeDigitosDaChaveAsbaceNeste(titulo); + } + + /** + * Calcula os dos dígitos verificadores da CHAVE ASBACE. + * + * @since 0.2 + */ + private void calculeDigitosNecessariosDaChaveASBACE() { + calculeChaveAsbaceDigito1(); + calculeChaveAsbaceDigito2(); + } + + /** + * Calcula o primeiro dígito da CHAVE ASBECE independente do segundo, mas o + * segundo DV depende deste e quando o segundo é calculado este pode, + * talvez, ser alterado. + * + * @since 0.2 + */ + private void calculeChaveAsbaceDigito1(){ + + final String chaveAasbace = writeFields(); + + int dig = Modulo.calculeMod10(chaveAasbace, 1, 2); + + if(dig == 0){ + this.digitoVerificador1DaChaveASBACE = dig; + }else{ + this.digitoVerificador1DaChaveASBACE = 10 - dig; + } + } + + /** + * Calcula o segundo dígito da CHAVE ASBECE, recursivamente dependendo do valor do primeiro DV. + * + * @since 0.2 + */ + private void calculeChaveAsbaceDigito2(){ + final String chaveAasbaceComDv1 = writeFields()+this.digitoVerificador1DaChaveASBACE; + + int digito2 = Modulo.calculeMod11(chaveAasbaceComDv1, 2, 7); + + if(digito2 == 0){ + this.digitoVerificador2DaChaveASBACE = digito2; + }else{ + + if(digito2 != 1){ + this.digitoVerificador2DaChaveASBACE = 11 - digito2; + }else{ + + int digito1Recalculado = this.digitoVerificador1DaChaveASBACE + 1; + + this.digitoVerificador1DaChaveASBACE = (digito1Recalculado == 10) ? 0 : digito1Recalculado; + + calculeChaveAsbaceDigito2(); + } + } + } + + /** + * Disponibiliza no objeto titulo os dígitos da CHAVE ASBACE = mesmo que o + * campo livre menos os dois ultimos digitos. + * + * @param titulo + * + * @since 0.2 + */ + private void disponibilizeDigitosDaChaveAsbaceNeste(Titulo titulo) { + + ParametrosBancariosMap parametrosBancarios = titulo.getParametrosBancarios(); + + if(parametrosBancarios == null){ + parametrosBancarios = new ParametrosBancariosMap(); + } + + parametrosBancarios.adicione(CHAVE_ASBACE_DIGITO1, this.digitoVerificador1DaChaveASBACE); + parametrosBancarios.adicione(CHAVE_ASBACE_DIGITO2, this.digitoVerificador2DaChaveASBACE); + + titulo.setParametrosBancarios(parametrosBancarios); + } + + /** + *

    + * 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 + */ + private void checkCarteiraComOuSemRegistro(Titulo titulo) { + + Integer codigoCarteira = titulo.getContaBancaria().getCarteira().getCodigo(); + + final boolean carteiraValida = codigoCarteira.equals(CARTEIRA_SEM_REGISTRO) || codigoCarteira.equals(CARTEIRA_COM_REGISTRO); + + Objects.checkArgument(carteiraValida, format("Código da carteira deve ser \"1-Sem registro impressão local\" ou \"2-Com registro impressão local\" e não [%s].", titulo.getContaBancaria().getCarteira().getCodigo())); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN10.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN10.java new file mode 100644 index 0000000..c310318 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN10.java @@ -0,0 +1,141 @@ +/* + * 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:08:37 + * + * ================================================================================ + * + * 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:08:37 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + + +/** + * + * O campo livre do Banco do Brasil com o nosso número de 10 dígitos deve seguir + * esta forma: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Posição TamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2569(6) ZEROSZEROS
    26-3279(7) Conta do cedente (sem dígito)Convênio (sem dígito)
    33-42109(10) Nosso NúmeroNosso Número
    43-4429(2) CarteiraCarteira
    + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since JRimum 1.0 + * + * @version 0.2 + */ +class CLBancoDoBrasilNN10 extends AbstractCLBancoDoBrasil { + /** + * + */ + private static final long serialVersionUID = -7675528811239346517L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 4; + + /** + *

    + * Dado um título, cria um campo livre para o padrão do Banco do Brasil + * que tenha o nosso número de tamanho 10. + *

    + * @param titulo título com as informações para geração do campo livre + */ + CLBancoDoBrasilNN10(Titulo titulo) { + super(FIELDS_LENGTH); + + ContaBancaria conta = titulo.getContaBancaria(); + + String nossoNumero = titulo.getNossoNumero(); + + this.add(new FixedField("", 6, Fillers.ZERO_LEFT)); + + this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 7, Fillers.ZERO_LEFT)); + + this.add(new FixedField(nossoNumero, 10, Fillers.ZERO_LEFT)); + + this.add(new FixedField(conta.getCarteira().getCodigo(), 2, Fillers.ZERO_LEFT)); + + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN11.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN11.java new file mode 100644 index 0000000..9eb75c1 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN11.java @@ -0,0 +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:08:50 + * + * ================================================================================ + * + * 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:08:50 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + * + * O campo livre do Banco do Brasil com o nosso número de 11 dígitos deve seguir + * esta forma: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Posição TamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-30119(11) Nosso número (sem dígito)Nosso número (sem dígito)
    31-3449(4) Código da agência (sem dígito)Código da Agência (sem dígito)
    35-4289(8) Código da conta (sem dígito)Convênio (sem dígito)
    43-4429(2) CarteiraCarteira
    + * + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBancoDoBrasilNN11 extends AbstractCLBancoDoBrasil { + + /** + * + */ + private static final long serialVersionUID = -4859699102593834115L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 4; + + /** + *

    + * Dado um título, cria um campo livre para o padrão do Banco do Brasil + * que tenha o nosso número de tamanho 11. + *

    + * @param titulo título com as informações para geração do campo livre + */ + CLBancoDoBrasilNN11(Titulo titulo) { + + super(FIELDS_LENGTH); + + ContaBancaria conta = titulo.getContaBancaria(); + String nossoNumero = titulo.getNossoNumero(); + + this.add(new FixedField(nossoNumero, 11, Fillers.ZERO_LEFT)); + + this.add(new FixedField(conta.getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); + this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 8, Fillers.ZERO_LEFT)); + + this.add(new FixedField(conta.getCarteira().getCodigo(), 2, Fillers.ZERO_LEFT)); + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN17Convenio6.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN17Convenio6.java new file mode 100644 index 0000000..d5b210b --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN17Convenio6.java @@ -0,0 +1,137 @@ +/* + * 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: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:09:00 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + * + * O campo livre do Banco do Brasil com o nosso número de 17 dígitos e convênio + * de 7 posições deve seguir esta forma: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2569(6)Conta do cedente (sem dígito)Convênio (sem dígito)
    26-42179(17)Nosso Número (sem dígito)Nosso Número (sem dígito)
    43-4429(2)Fixo 21 (serviço)Fixo 21 (serviço)
    + * + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBancoDoBrasilNN17Convenio6 extends AbstractCLBancoDoBrasil{ + + /** + * + */ + private static final long serialVersionUID = 3035422743112225831L; + + /** + * + */ + private static final int SERVICO = 21; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 3; + + /** + *

    + * Dado um título, cria um campo livre para o padrão do Banco do Brasil + * que tenha o nosso número de tamanho 17. + *

    + * @param titulo título com as informações para geração do campo livre + */ + CLBancoDoBrasilNN17Convenio6(Titulo titulo) { + super(FIELDS_LENGTH); + + ContaBancaria conta = titulo.getContaBancaria(); + String nossoNumero = titulo.getNossoNumero(); + + this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 6, Fillers.ZERO_LEFT)); + + this.add(new FixedField(nossoNumero, 17, Fillers.ZERO_LEFT)); + this.add(new FixedField(SERVICO, 2)); + + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN17Convenio7.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN17Convenio7.java new file mode 100644 index 0000000..05dddbb --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoBrasilNN17Convenio7.java @@ -0,0 +1,91 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; + +/** + * + * O campo livre do Banco do Brasil com o nosso número de 17 dígitos e convênio + * de 7 posições deve seguir esta forma: + * + + * + * + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBancoDoBrasilNN17Convenio7 extends AbstractCLBancoDoBrasil { + + /** + * {@code serialVersionUID = 2347714390743602306L} + */ + private static final long serialVersionUID = 2347714390743602306L; + + /** + * Número de campos = 3. + */ + protected static final Integer FIELDS_LENGTH = Integer.valueOf(3); + + /** + * Tamanho do campo Constante = 6. + */ + protected static final Integer CONSTANT_LENGTH = Integer.valueOf(6); + + /** + * Valor do campo Constante = 0. + */ + protected static final Integer CONSTANT_VALUE = Integer.valueOf(0); + + /** + * Constante em forma de campo {@link #CONSTANT_VALUE} e + * {@link #CONSTANT_LENGTH}, valor escrito: "000000". + */ + private static final FixedField CONSTANT_FIELD = new FixedField(CONSTANT_VALUE, CONSTANT_LENGTH, Fillers.ZERO_LEFT); + + /** + * Tamanho do campo Nosso Número = 17. + */ + protected static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(17); + + /** + * Tamanho do campo Carteira = 2. + */ + protected static final Integer CARTEIRA_LENGTH = Integer.valueOf(2); + + /** + *

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

    + * + * @since 0.2 + */ + protected CLBancoDoBrasilNN17Convenio7() { + + super(FIELDS_LENGTH); + } + + @Override + protected void checkValues(Titulo titulo) { + + checkNossoNumero(titulo); + checkTamanhoDoNossoNumero(titulo, NN17); + checkCarteiraNotNull(titulo); + checkCodigoDaCarteira(titulo); + checkCodigoDaCarteiraMenorOuIgualQue(titulo, 99); + } + + @Override + protected void addFields(Titulo titulo) { + + this.add(CONSTANT_FIELD); + this.add(new FixedField(titulo.getNossoNumero(),NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getCarteira().getCodigo(), CARTEIRA_LENGTH, Fillers.ZERO_LEFT)); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java new file mode 100644 index 0000000..17edfad --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java @@ -0,0 +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.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoIntermedium.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoIntermedium.java new file mode 100644 index 0000000..2f0bd39 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoIntermedium.java @@ -0,0 +1,141 @@ +/* + * 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: 11/08/2010 - 10:23: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: 11/08/2010 - 10:23:00 + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + + +/** + * O campo livre do Banco Intermedium deve seguir esta forma: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Posição TamanhoPictureConteúdo
    20-2344 Código da agência
    24-2522 Constante = 70
    26-361111 Nosso número sem o dígito
    37-4266 Código da conta
    43-4311 Dígito da conta
    44-4411 Constante = 0
    + * + * + * @author Gilmar P.S.L + * @author Lukas Antunes + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBancoIntermedium extends AbstractCLBancoIntermedium { + + /** + * + */ + private static final long serialVersionUID = 858563493013156459L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 6; + + private static final Integer CONSTANTE_70 = Integer.valueOf(70); + + private static final Integer CONSTANTE_0 = Integer.valueOf(0); + + /** + *

    + * Dado um título, cria um campo livre para banco Intermedium (077). + *

    + * + * @param titulo - título com as informações para geração do campo livre + */ + CLBancoIntermedium(Titulo titulo) { + + super(FIELDS_LENGTH); + + this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); + this.add(new FixedField(CONSTANTE_70, 2)); + this.add(new FixedField(titulo.getNossoNumero(), 11, Fillers.ZERO_LEFT)); + this.add(new FixedField( titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), 6, Fillers.ZERO_LEFT)); + this.add(new FixedField( titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), 1, Fillers.ZERO_LEFT)); + this.add(new FixedField(CONSTANTE_0, 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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoReal.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoReal.java new file mode 100644 index 0000000..deecadc --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoReal.java @@ -0,0 +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.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.text.Strings; +import org.jrimum.vallia.digitoverificador.Modulo; +import org.jrimum.vallia.digitoverificador.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.digitoverificador.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaNaoRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaNaoRegistrada.java new file mode 100644 index 0000000..ea7b1e0 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaNaoRegistrada.java @@ -0,0 +1,120 @@ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroBancoRural.CODIGO_REDUZIDO; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + *

    + * O campo livre do Banco Rural, para cobrança não registrada, deve seguir esta + * forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2019(1)Tipo de Cobrança - 9Tipo de Cobrança - 9
    21-2339(3)Código da AgênciaAgência Cedente
    24-2639(3)Código Reduzido do ClienteO código reduzido deverá ser + * solicitado ao gerente da agência.
    27-41159(15)Seu númeroNosso número
    42-4439(3)Constante "000"Zeros
    + * + * @author Gilmar P.S.L. + */ +class CLBancoRuralCobrancaNaoRegistrada extends AbstractCLBancoRural{ + + /** + * + */ + private static final long serialVersionUID = -837754906530330855L; + + /** + * Número de campos. + */ + private static final Integer FIELDS_LENGTH = Integer.valueOf(5); + + /** + * Tipo de Cobrança = 9. + */ + private static final Integer TIPO_COBRANCA = Integer.valueOf(9); + + /** + * Constante + */ + private static final String ZEROS = "000"; + + /** + *

    + * Dado um título, cria um campo livre para cobrança não registrada do Banco + * Rural. + *

    + * + * @param titulo + * - Título com as informações para geração do campo livre + */ + CLBancoRuralCobrancaNaoRegistrada(Titulo titulo) { + + super(FIELDS_LENGTH); + + this.add( new FixedField( TIPO_COBRANCA , 1 ) ); + this.add( new FixedField( titulo.getContaBancaria().getAgencia().getCodigo(), 3 , Fillers.ZERO_LEFT ) ); + this.add( new FixedField(titulo.getParametrosBancarios().getValor(CODIGO_REDUZIDO), 3, Fillers.ZERO_LEFT ) ); + this.add( new FixedField( titulo.getNossoNumero(), 15 , Fillers.ZERO_LEFT ) ); + this.add( new FixedField( ZEROS, 3)); + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaNaoRegistradaSeguradora.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaNaoRegistradaSeguradora.java new file mode 100644 index 0000000..18fb120 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaNaoRegistradaSeguradora.java @@ -0,0 +1,127 @@ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroBancoRural.CODIGO_REDUZIDO; +import static org.jrimum.bopepo.parametro.ParametroBancoRural.VALOR_IOS; + +import java.math.BigDecimal; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.text.DecimalFormat; + +/** + *

    + * O campo livre do Banco Rural, para cobrança sem registro (apólice de seguro + * com I.O.S.), deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2019(1)Tipo de Cobrança - 4Tipo de Cobrança - 4
    21-2339(3)Código da AgênciaAgência Cedente
    24-2639(3)Código Reduzido do ClienteO código reduzido deverá ser + * solicitado ao gerente da agência.
    27-36109(10)Seu númeroNosso número
    37-3719(1)Dígito seu NúmeroDígito nosso número
    42-4439(3)Valor I.O.S. 05 (cinco) inteiros, + * 02 (duas) decimaisValor do imposto
    + * + * @author Gilmar P.S.L. + */ +class CLBancoRuralCobrancaNaoRegistradaSeguradora extends AbstractCLBancoRural{ + + /** + * + */ + private static final long serialVersionUID = -2427800425370567806L; + + /** + * Número de campos. + */ + private static final Integer FIELDS_LENGTH = Integer.valueOf(6); + + /** + * Tipo de Cobrança = 4. + */ + private static final Integer TIPO_COBRANCA = Integer.valueOf(4); + + /** + *

    + * Dado um título, cria um campo livre para cobrança sem registro – apólice de seguro com I.O.S.. + *

    + * + * @param titulo + * - título com as informações para geração do campo livre + */ + CLBancoRuralCobrancaNaoRegistradaSeguradora(Titulo titulo) { + + super(FIELDS_LENGTH); + + this.add( new FixedField( TIPO_COBRANCA , 1 ) ); + this.add( new FixedField( titulo.getContaBancaria().getAgencia().getCodigo(), 3 , Fillers.ZERO_LEFT ) ); + this.add( new FixedField(titulo.getParametrosBancarios().getValor(CODIGO_REDUZIDO), 3, Fillers.ZERO_LEFT ) ); + this.add( new FixedField( titulo.getNossoNumero(), 10 , Fillers.ZERO_LEFT ) ); + this.add( new FixedField( titulo.getDigitoDoNossoNumero(), 1 , Fillers.ZERO_LEFT ) ); + this.add( new FixedField(titulo.getParametrosBancarios().getValor(VALOR_IOS), 7, DecimalFormat.NUMBER_DD_BR.copy(), Fillers.ZERO_LEFT)); + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaRegistrada.java new file mode 100644 index 0000000..47d2dae --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoRuralCobrancaRegistrada.java @@ -0,0 +1,131 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + *

    + * O campo livre do Banco Rural, para cobrança registrada, deve seguir esta + * forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2019(1)Tipo de Cobrança - 0Tipo de Cobrança - 0
    21-2339(3)Código da AgênciaAgência Cedente
    24-3299(9)Conta CorrenteConta do Cedente
    33-3319(1)Dígito da Conta CorrenteDígito da Conta do Cedente
    34-4079(7)Nosso NúmeroNosso Número
    41-4119(1)Dígito do Nosso NúmeroDígito do Nosso Número
    42-4439(3)Constante "000"Zeros
    + * + * @author Fernando Dias + * @author Gilmar P.S.L. + */ +class CLBancoRuralCobrancaRegistrada extends AbstractCLBancoRural{ + + private static final long serialVersionUID = -5166628254198207874L; + + /** + * Número de campos. + */ + private static final Integer FIELDS_LENGTH = Integer.valueOf(7); + + /** + * Tipo de Cobrança = 0. + */ + private static final Integer TIPO_COBRANCA = Integer.valueOf(0); + + /** + * Constante + */ + private static final String ZEROS = "000"; + + /** + *

    + * Dado um título, cria um campo livre para cobrança registrada do Banco + * Rural. + *

    + * + * @param titulo + * - título com as informações para geração do campo livre + */ + CLBancoRuralCobrancaRegistrada(Titulo titulo) { + + super(FIELDS_LENGTH); + + this.add( new FixedField( TIPO_COBRANCA , 1 ) ); + this.add( new FixedField( titulo.getContaBancaria().getAgencia().getCodigo(), 3 , Fillers.ZERO_LEFT ) ); + this.add( new FixedField( titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), 9, Fillers.ZERO_LEFT ) ); + this.add( new FixedField( titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), 1 ) ); + this.add( new FixedField( titulo.getNossoNumero(), 7 , Fillers.ZERO_LEFT ) ); + this.add( new FixedField( titulo.getDigitoDoNossoNumero(), 1 ) ); + this.add( new FixedField( ZEROS, 3)); + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSafraCobrancaNaoRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSafraCobrancaNaoRegistrada.java new file mode 100644 index 0000000..9059be0 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSafraCobrancaNaoRegistrada.java @@ -0,0 +1,164 @@ +/* + * 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: 21/04/2008 - 21:54: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: 21/04/2008 - 21:54:06 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; + +/** + *

    + * O campo livre do Bradesco deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2019(1)Sistema = constante 7Valor fixo 7
    21-2669(6)Fixo atribuído pelo banco (*) + * Identificação numérica com cinco números + um dígito verificadorNúmero da conta + DV
    27-4317 9(17)Livre do cliente - Variável + * conforme necessidade do clienteNosso Número (sem dígito)
    44-4419Tipo cobrança = constante 4 - + * Express Emitido pelo ClienteValor fixo 4
    + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBancoSafraCobrancaNaoRegistrada extends AbstractCLBancoSafra { + + /** + * {@code serialVersionUID = -6573340701469029151L} + */ + private static final long serialVersionUID = -6573340701469029151L; + + /** + * Tamanho do número de campos = 5. + */ + protected 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 Dígito da Conta = 1. + */ + private static final Integer CONTA_DIGITO_LENGTH = Integer.valueOf(1); + + /** + * Tamanho do campo Nosso Número = 17. + */ + private static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(17); + + /** + * Cria um campo livre instanciando o número de fields ({@code FIELDS_LENGTH} + * ) deste campo. + * + * @since 0.2 + */ + protected CLBancoSafraCobrancaNaoRegistrada() { + + 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, 999999); + checkDigitoDoCodigoDoNumeroDaConta(titulo); + checkNossoNumero(titulo); + checkTamanhoDoNossoNumero(titulo, NN17); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#addFields(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + */ + @Override + protected void addFields(Titulo titulo) { + + this.add(SISTEMA_CONSTANT_FIELD); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), CONTA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), CONTA_DIGITO_LENGTH)); + this.add(new FixedField(titulo.getNossoNumero(), NOSSO_NUMERO_LENGTH)); + this.add(new FixedField(TipoDeCobranca.EXPRESS_BOLETO_EMITIDO_PELO_CLIENTE.codigo(), TIPO_COBRANCA_FIELD_LENGTH)); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSafraCobrancaRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSafraCobrancaRegistrada.java new file mode 100644 index 0000000..5289c09 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSafraCobrancaRegistrada.java @@ -0,0 +1,181 @@ +/* + * 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: 21/04/2008 - 20:31: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: 21/04/2008 - 20:31:39 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; + +/** + *

    + * O campo livre do Bradesco deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2019(1)Sistema = constante 7Valor fixo 7
    21-34149(14)Código do cliente = Agência + + * ContaCódigo do cliente = (Ag[4] + + * dv[1]) + (Cc[8] + dv[1])
    35-439 9(9)Número do Nosso Número(Sem o + * digito verificador)Nosso Número do título exatamente + * com 9 dígitos (sem dígito verificador)
    44-4419Tipo cobrança = constante 2 - + * Eletrônica Emitido pelo ClienteValor fixo 2
    + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBancoSafraCobrancaRegistrada extends AbstractCLBancoSafra { + + /** + * {@code serialVersionUID = -4532989921797507161L} + */ + private static final long serialVersionUID = -4532989921797507161L; + + /** + * Tamanho do número de campos = 7. + */ + protected 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 Dígito da Agência = 1. + */ + private static final Integer AGENCIA_DIGITO_LENGTH = Integer.valueOf(1); + + /** + * Tamanho do campo Conta = 8. + */ + private static final Integer CONTA_LENGTH = Integer.valueOf(8); + + /** + * Tamanho do campo Dígito da Conta = 1. + */ + private static final Integer CONTA_DIGITO_LENGTH = Integer.valueOf(1); + + /** + * Tamanho do campo Nosso Número = 9. + */ + private static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(9); + + /** + * Cria um campo livre instanciando o número de fields ({@code FIELDS_LENGTH} + * ) deste campo. + * + * @since 0.2 + */ + protected CLBancoSafraCobrancaRegistrada() { + + 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); + checkDigitoDoCodigoDaAgencia(titulo); + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 999999); + checkDigitoDoCodigoDoNumeroDaConta(titulo); + checkNossoNumero(titulo); + checkTamanhoDoNossoNumero(titulo, NN9); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#addFields(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + */ + @Override + protected void addFields(Titulo titulo) { + + this.add(SISTEMA_CONSTANT_FIELD); + this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), AGENCIA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), AGENCIA_DIGITO_LENGTH)); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), CONTA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), CONTA_DIGITO_LENGTH)); + this.add(new FixedField(titulo.getNossoNumero(), NOSSO_NUMERO_LENGTH)); + this.add(new FixedField(TipoDeCobranca.DIRETA_BOLETO_EMITIDO_PELO_CLIENTE.codigo(), TIPO_COBRANCA_FIELD_LENGTH)); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSantander.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSantander.java new file mode 100644 index 0000000..66e4e2c --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoSantander.java @@ -0,0 +1,184 @@ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroBancoSantander.IOF_SEGURADORA; + +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; + +/** + *

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

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo
    20-2019(01)Fixo "9"
    21-2779(7)Conta do cedente padrão Santander
    28-40139(13) + *

    + * Nosso Número com zeros a esquerda. OBS: Caso o arquivo de + * registro para os títulos seja de 400 bytes (CNAB) + *

    + *
      + *
    • Banco 353 (Banco Santander) - Utilizar somente 08 posições do Nosso Numero (07 posições + + * DV), zerando os 05 primeiros dígitos
    • + *
    • Banco 008 (Meridional do Brasil S/A) - Utilizar somente 09 posições do Nosso Numero (08 posições + + * DV), zerando os 04 primeiros dígitos
    • + *
    + *
    41-4119(1) + *

    + * IOF – Seguradoras (Se 7% informar 7. Limitado a 9%) + *

    + *

    + * Demais clientes usar 0 (zero) + *

    + *
    42-4439(3) + *
      + *
    • 101 - Cobrança Simples Rápida COM Registro
    • + *
    • 102 - Cobrança simples – SEM Registro
    • + *
    • 104 - Cobrança Simples Eletrônica - COM Registro
    • + *
    • 201 - Penhor Rápida com Registro
    • + *
    + *
    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Dani Schinniger + */ +class CLBancoSantander extends AbstractCLSantander implements CampoLivre { + + /** + * + */ + private static final long serialVersionUID = -412221524249334574L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 5; + + /** + * Constante informada no manual. + */ + private static final Integer CONSTANTE = Integer.valueOf(9); + + /** + * 101- Cobrança Simples Rápida COM Registro + */ + private static final int CARTEIRA_RAPIDA_COM_REGISTRO = 101; + + /** + * 201- Penhor Rápida com Registro + */ + private static final int CARTEIRA_RAPIDA_SEM_REGISTRO = 201; + + /** + * 102- Cobrança simples – SEM Registro + */ + private static final int CARTEIRA_SIMPLES_SEM_REGISTRO = 102; + + /** + * 104- Cobrança Simples Eletrônica - COM Registro + */ + private static final int COBRANCA_SIMPLES_ELETRONICA_COM_REGISTRO = 104; + + CLBancoSantander(Titulo titulo) { + super(FIELDS_LENGTH); + + ContaBancaria conta = titulo.getContaBancaria(); + StringBuilder nossoNumero = new StringBuilder(titulo.getNossoNumero()); + nossoNumero.append(titulo.getDigitoDoNossoNumero()); + + this.add(new FixedField(CONSTANTE, 1)); + this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 7, Fillers.ZERO_LEFT)); +// this.add(new FixedField(conta.getNumeroDaConta().getDigitoDaConta(), 1)); + + this.add(new FixedField(nossoNumero.toString(), 13, Fillers.ZERO_LEFT)); + + // IOF – Seguradoras + + if (titulo.hasParametrosBancarios() + && Objects.isNotNull(titulo.getParametrosBancarios().getValor( + IOF_SEGURADORA))) { + + this.add(new FixedField(titulo + .getParametrosBancarios().getValor(IOF_SEGURADORA), 1)); + + } else { + + this.add(new FixedField(0, 1)); + } + + // Tipo de Modalidade Carteira + + switch (conta.getCarteira().getCodigo()) { + + case CARTEIRA_RAPIDA_COM_REGISTRO: + case CARTEIRA_RAPIDA_SEM_REGISTRO: + case CARTEIRA_SIMPLES_SEM_REGISTRO: + case COBRANCA_SIMPLES_ELETRONICA_COM_REGISTRO: + + this.add(new FixedField(conta.getCarteira().getCodigo(), 3, + Fillers.ZERO_LEFT)); + + break; + + default: + + Exceptions.throwIllegalArgumentException(String.format( + "CARTEIRA [%s] NÃO SUPORTADA!", conta.getCarteira() + .getCodigo())); + } + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoobCobrancaNaoRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoobCobrancaNaoRegistrada.java new file mode 100644 index 0000000..062dc35 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBancoobCobrancaNaoRegistrada.java @@ -0,0 +1,238 @@ +/* + * 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: 17/02/2011 - 12:40:00 + * + * ================================================================================ + * + * 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: 17/02/2011 - 12:40:00 + */ + +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroBancoob.MODALIDADE_DE_COBRANCA; +import static org.jrimum.bopepo.parametro.ParametroBancoob.NUMERO_DA_PARCELA; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; + +/** + *

    + * O campo livre do bradesco deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2019(1)CarteiraCarteira
    21-2449(4)Agência Cedente (Cooperativa) (sem o dígito + * verificador, completar com zeros a esquerda quando necessário)Código da Agência (sem dígito)
    25-2629(2)ModalidadeModalidade
    27-3379(7)Código do Cliente (sem o dígito + * verificador, completar com zeros a esquerda quando necessário)Conta do Beneficiário (sem dígito)
    34-4079(7)Número do título(sem o dígito + * verificador, completar com zeros a esquerda quando necessário)Nosso Número (sem dígito)
    41-4119(1)Dígito verificador do Nosso NúmeroDígito verificador do Nosso Número
    42-4439(3)Número da Parcela (completar com zeros a esquerda quando necessário)Número da Parcela
    + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * + * @author Gilmar P.S.L + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class CLBancoobCobrancaNaoRegistrada extends AbstractCLBancoob{ + + /** + * {@code serialVersionUID = 2864939240695151533L} + */ + private static final long serialVersionUID = 2864939240695151533L; + + /** + * Número de campos = 6. + */ + protected static final Integer FIELDS_LENGTH = 8; + + /** + * Tamanho do campo Carteira = 1. + */ + protected static final Integer CARTEIRA_LENGTH = Integer.valueOf(1); + + /** + * Tamanho do campo Agência = 4. + */ + protected static final Integer AGENCIA_LENGTH = Integer.valueOf(4); + + /** + * Tamanho do campo código da modalidade de cobrança = 2. + */ + protected static final Integer MODALIDADE_DE_COBRANCA_LENGTH = Integer.valueOf(2); + + /** + * Valor do código da modalidade de cobrança (01) = SIMPLES. + */ + protected static final Integer COBRANCA_SIMPLES = 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 Verificador do Nosso Número = 1. + */ + private static final Integer DV_NOSSO_NUMERO_LENGTH = Integer.valueOf(1); + + /** + * Tamanho do campo Conta = 6. + */ + private static final Integer CONTA_LENGTH = Integer.valueOf(6); + + /** + * Tamanho do campo Dígito da conta = 1 + */ + private static final Integer DV_CONTA_LENGTH = 1; + + /** + * Valor do número de parcelas = 1. + */ + private static final Integer UMA_PARCELA = Integer.valueOf(1); + + /** + * Tamanho do campo Conta = 3. + */ + private static final Integer NUMERO_DA_PARCELA_LENGTH = 3; + + /** + *

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

    + * + * @since 0.2 + */ + protected CLBancoobCobrancaNaoRegistrada() { + super(FIELDS_LENGTH); + } + + @Override + protected void checkValues(Titulo titulo) { + + checkCarteiraNotNull(titulo); + checkCodigoDaCarteira(titulo); + checkCodigoDaCarteiraMenorOuIgualQue(titulo, 9); + checkAgenciaNotNull(titulo); + checkCodigoDaAgencia(titulo); + checkCodigoDaAgenciaMenorOuIgualQue(titulo, 9999); + checkNossoNumero(titulo); + checkTamanhoDoNossoNumero(titulo, NN7); + checkDigitoDoNossoNumero(titulo); + checkTamanhoDigitoDoNossoNumero(titulo, DV_NOSSO_NUMERO_LENGTH); + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 9999999); + checkDigitoDoCodigoDoNumeroDaConta(titulo); + checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 999999); + } + + @Override + protected void addFields(Titulo titulo) { + + Integer codigoDaModalidadeDeCobranca = COBRANCA_SIMPLES; + Integer numeroDaParcela = UMA_PARCELA; + + if (titulo.hasParametrosBancarios()) { + + if (titulo.getParametrosBancarios().contemComNome(MODALIDADE_DE_COBRANCA)) { + checkParametroBancario(titulo, MODALIDADE_DE_COBRANCA); + codigoDaModalidadeDeCobranca = titulo.getParametrosBancarios().getValor(MODALIDADE_DE_COBRANCA); + } + + if (titulo.getParametrosBancarios().contemComNome(NUMERO_DA_PARCELA)) { + checkParametroBancario(titulo, NUMERO_DA_PARCELA); + numeroDaParcela = titulo.getParametrosBancarios().getValor(NUMERO_DA_PARCELA); + } + } + + this.add(new FixedField(titulo.getContaBancaria().getCarteira().getCodigo(), CARTEIRA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), AGENCIA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(codigoDaModalidadeDeCobranca, MODALIDADE_DE_COBRANCA_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(), DV_CONTA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getNossoNumero(),NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getDigitoDoNossoNumero(),DV_NOSSO_NUMERO_LENGTH)); + this.add(new FixedField(numeroDaParcela, NUMERO_DA_PARCELA_LENGTH, Fillers.ZERO_LEFT)); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanestes.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanestes.java new file mode 100644 index 0000000..397381a --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanestes.java @@ -0,0 +1,222 @@ +/* + * 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: Dec 13, 2008 - 10:40:38 AM + * + * ================================================================================ + * + * 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: Dec 13, 2008 - 10:40:38 AM + * + */ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.utilix.Objects.exists; + +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.vallia.digitoverificador.Modulo; +import org.jrimum.vallia.digitoverificador.TipoDeModulo; + +/** + * + *

    + * Representação do campo livre usado para boletos com carteiras (cobrança) + * sem registro, caucionadas e com registro. O tipo de cobrança de carteira caucionada + * se enquadra no conceito de cobrança registrada, sendo diferenciada pelo código + * da carteira. + *

    + * + *

    + * Layout:
    + *

    + *

    + * Cobrança Normal - CAMPO LIVRE - Chave ASBACE + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoCampo Livre No Código De + * Barras (20 a 44)
    20 a 27Nosso Número (sem os dois dígitos)
    28 a 38Conta Corrente
    39 a 39Produto = 2-Sem registro; 3-Caucionada; 4,5,6 e 7-Cobrança com registro
    40 a 42Constante = "021" Código do BANESTES
    43 a 44Duplo Dígito referente às posições 20 a 42
    + *

    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério Valerio + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBanestes extends AbstractCLBanestes { + + /** + * + */ + private static final long serialVersionUID = 476678476727564241L; + + private static final Integer FIELDS_LENGTH = 5; + + public CLBanestes(Titulo titulo) { + + super(FIELDS_LENGTH); + + this.add(new FixedField(Integer.valueOf(titulo.getNossoNumero()), 8, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), 11, Fillers.ZERO_LEFT)); + + final Integer codigoDaCarteiraDeCobranca = titulo.getContaBancaria().getCarteira().getCodigo(); + + if (exists(codigoDaCarteiraDeCobranca)) { + this.add(new FixedField(codigoDaCarteiraDeCobranca, 1)); + + } else { + + final TipoDeCobranca tipoDeCobranca = titulo.getContaBancaria().getCarteira().getTipoCobranca(); + + if (tipoDeCobranca == null) { + throw new CampoLivreException("Tipo de cobrança da carteira não foi especificado!"); + } + + switch (tipoDeCobranca) { + + case SEM_REGISTRO: + this.add(new FixedField(2, 1)); + break; + + case COM_REGISTRO: + if (codigoDaCarteiraDeCobranca >= 3 && codigoDaCarteiraDeCobranca <= 7) { + + this.add(new FixedField(codigoDaCarteiraDeCobranca, 1)); + break; + + } else { + throw new CampoLivreException("Código da carteira de cobrança com registro deve ser" + + " especificado com 3,4,5,6 ou 7. Valor atual = [" + codigoDaCarteiraDeCobranca + "]"); + } + default: + throw new CampoLivreException("Tipo de cobrança [" + tipoDeCobranca + "] não é suportado!"); + + } + } + this.add(new FixedField(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigo().byteValue(), 3, Fillers.ZERO_LEFT)); + this.add(new FixedField(calculaDuploDV(), 2, Fillers.ZERO_LEFT)); + } + + /** + * Calcula duplo dígito verificador da posição 0 à 23 do campo livre (Chave ASBACE).. + * + * @return Duplo dígito verificador. + * + */ + private byte calculaDuploDV() { + final byte duploDV; + + String fields = writeFields(); + + byte primeiroDV = calculaPrimeiroDV(fields); + + final byte segundoDV; + + // resto proveniente do módulo 11 com pesos de 2 a 7 + int restoDoModulo11 = new Modulo(TipoDeModulo.MODULO11, 7, 2).calcule(fields + primeiroDV); + + if (restoDoModulo11 == 0) { + segundoDV = 0; + } else if (restoDoModulo11 == 1) { + if (primeiroDV == 9) { + primeiroDV = 0; + } else { + primeiroDV++; + } + segundoDV = (byte) new Modulo(TipoDeModulo.MODULO11, 7, 2).calcule(fields + primeiroDV); + } else { + segundoDV = (byte) (11 - restoDoModulo11); + } + + duploDV = Byte.parseByte(String.valueOf(primeiroDV) + String.valueOf(segundoDV)); + + return duploDV; + } + + /** + * Calcula o primeiro dígito verificador. + * + * @param fields + * + * @return O primeiro dígito verificador dos dois existentes na chave ASBACE (Campo livre). + */ + private byte calculaPrimeiroDV(String fields) { + final byte primeiroDV; + + // resto proveniente do módulo 10 + byte restoDoModulo10 = (byte) new Modulo(TipoDeModulo.MODULO10).calcule(fields); + + // se não houver resto, primeiroDV = 0 + // caso contrário, primeiroDV = 10 - resto + primeiroDV = (byte) ((restoDoModulo10 == 0) ? 0 : 10 - restoDoModulo10); + return primeiroDV; + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanrisulCobrancaNaoRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanrisulCobrancaNaoRegistrada.java new file mode 100644 index 0000000..698c028 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanrisulCobrancaNaoRegistrada.java @@ -0,0 +1,158 @@ +/* + * 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/07/2008 - 11:15: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: 19/07/2008 - 11:15:33 + * + */ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + *

    + * O campo livre do Barisul para cobrança não registrada (Cobrança Direta + * "sem registro" - Sistema BDL/Carteira de Letras) deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2019(1)Tipo de Cobrança: constante = 2 + * "2" Cobrança Direta, Fichário + * emitido pelo CLIENTE.
    21-2119(1)Constante "1"Constante "1"
    22-2549(4)Código da Agência sem digito + * verificadorCódigo da Agência, com quatro + * dígitos, sem o Número de Controle.
    26-3279(7)Código do Cedente sem dígito + * verificadorCódigo do Cedente sem Número de + * Controle.
    33-4089(8)Seu número sem dígito verificador + * Nosso Número sem Número de + * Controle
    41-4229(2)Constante "40"Constante "40"
    43-4429(2)Dois dígitos verificadores + * calculados com os campos anteriores pelos (módulos 10 e 11)Duplo Dígito referente às + * posições 20 a 42 (módulos 10 e 11)
    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério Valerio + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBanrisulCobrancaNaoRegistrada extends AbstractCLBanrisul { + + /** + * + */ + private static final long serialVersionUID = -6078207986734440842L; + + private static final Integer FIELDS_LENGTH = 7; + + CLBanrisulCobrancaNaoRegistrada(Titulo titulo) { + super(FIELDS_LENGTH); + + this.add(new FixedField(2, 1)); + this.add(new FixedField("1", 1)); + 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(Integer.valueOf(titulo.getNossoNumero()), 8, Fillers.ZERO_LEFT)); + this.add(new FixedField("40", 2)); + + this.add(new FixedField(calculaDuploDigito(concateneOsCamposExistentesAteOMomento()), 2)); + + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanrisulCobrancaRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanrisulCobrancaRegistrada.java new file mode 100644 index 0000000..2150f9d --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBanrisulCobrancaRegistrada.java @@ -0,0 +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: 02/08/2008 - 13:39:46 + * + * ================================================================================ + * + * 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: 02/08/2008 - 13:39:46 + * + */ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + *

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

    + * + *

    + * O campo livre do Barisul para cobrança registrada (Cobrança Normal + * "com registro" - Sistema BDL/Carteira de Letras) deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2019(1)Tipo de Cobrança: constante = 1 + * "1" Cobrança Normal, Fichário + * emitido pelo BANRISUL
    21-2119(1)Constante "1"Constante "1"
    22-2549(4)Código da Agência sem digito + * verificadorCódigo da Agência, com quatro + * dígitos, sem o Número de Controle.
    26-3279(7)Código do Cedente sem dígito + * verificadorCódigo do Cedente sem Número de + * Controle.
    33-4089(8)Seu número sem dígito verificador + * Nosso Número sem Número de + * Controle
    41-4229(2)Constante "40"Constante "40"
    43-4429(2)Dois dígitos verificadores + * calculados com os campos anteriores pelos (módulos 10 e 11)Duplo Dígito referente às + * posições 20 a 42 (módulos 10 e 11)
    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério Valerio + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBanrisulCobrancaRegistrada extends AbstractCLBanrisul { + + /** + * + */ + private static final long serialVersionUID = 1577477244182494602L; + + private static final Integer FIELDS_LENGTH = 7; + + CLBanrisulCobrancaRegistrada(Titulo titulo) { + super(FIELDS_LENGTH); + + this.add(new FixedField(1, 1)); + this.add(new FixedField("1", 1)); + 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(Integer.valueOf(titulo.getNossoNumero()),8, Fillers.ZERO_LEFT)); + this.add(new FixedField("40", 2)); + this.add(new FixedField(calculaDuploDigito(concateneOsCamposExistentesAteOMomento()),2)); + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBradesco.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBradesco.java new file mode 100644 index 0000000..7965e07 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLBradesco.java @@ -0,0 +1,195 @@ +/* + * 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:27 + * + * ================================================================================ + * + * 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:27 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; + +/** + *

    + * O campo livre do Bradesco 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 a esquerda quando necessário)Código da Agência (sem dígito)
    24-2529(2)Código da CarteiraCódigo da Carteira
    26-3611 9(11)Número do Nosso Número(Sem o digito verificador)Nosso Número (sem dígito)
    37-437 9(7)Conta do Cedente (Sem o digito verificador, completar com zeros a esquerda quando necessário)Conta do Cedente (sem dígito)
    44-4419Constante "0"Zero Fixo
    + * + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +class CLBradesco extends AbstractCLBradesco { + + /** + * {@code serialVersionUID = -1253549781074159862L} + */ + private static final long serialVersionUID = -1253549781074159862L; + + /** + * Número de campos = 5. + */ + private static final Integer FIELDS_LENGTH = Integer.valueOf(5); + + /** + * Tamanho do campo Agência = 4. + */ + private static final Integer AGENCIA_LENGTH = Integer.valueOf(4); + + /** + * Tamanho do campo Carteira = 2. + */ + private static final Integer CARTEIRA_LENGTH = Integer.valueOf(2); + + /** + * Tamanho do campo Nosso Número = 11. + */ + private static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(11); + + /** + * Tamanho do campo Conta = 7. + */ + private static final Integer CONTA_LENGTH = Integer.valueOf(7); + + /** + * Tamanho do campo Constante = 1. + */ + private static final Integer CONSTANT_LENGTH = Integer.valueOf(1); + + /** + * Valor do campo Constante = 0. + */ + private static final Integer CONSTANT_VALUE = Integer.valueOf(0); + + /** + * Constante em forma de campo {@linkplain #CONSTANT_VALUE} e {@linkplain #CONSTANT_LENGTH}. + */ + private static final FixedField CONSTANT_FIELD = new FixedField(CONSTANT_VALUE, CONSTANT_LENGTH); + + /** + * Cria um campo livre instanciando o número de fields ({@code FIELDS_LENGTH}) deste campo. + * + * @since 0.2 + */ + protected CLBradesco() { + + 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); + checkCarteiraNotNull(titulo); + checkCodigoDaCarteira(titulo); + checkCodigoDaCarteiraMenorOuIgualQue(titulo, 99); + checkNossoNumero(titulo); + checkTamanhoDoNossoNumero(titulo, NN11); + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 9999999); + } + + /** + * {@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().getCarteira().getCodigo(), CARTEIRA_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getNossoNumero(), NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), CONTA_LENGTH, Fillers.ZERO_LEFT)); + this.add(CONSTANT_FIELD); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java new file mode 100644 index 0000000..4a02937 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java @@ -0,0 +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.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java new file mode 100644 index 0000000..b949bac --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java @@ -0,0 +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.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSIGCB.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSIGCB.java new file mode 100644 index 0000000..1377e69 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSIGCB.java @@ -0,0 +1,242 @@ +/* + * 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: 28/07/2010 - 21:05: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: 28/07/2010 - 21:05:00 + * + */ + +package org.jrimum.bopepo.campolivre; +import static org.jrimum.vallia.digitoverificador.Modulo.MOD11; + +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.vallia.digitoverificador.Modulo; + +/** + *

    + * O campo livre para o modelo SIGCB segue esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoConteúdo
    01-056Código do Cedente
    061Dígito Verificador do Código do Cedente
    07-093Nosso Número – Seqüência 1
    101Constante 1
    11-133Nosso Número – Seqüência 2
    141Constante 2
    15-239Nosso Número – Seqüência 3
    241Dígito Verificador do Campo Livre
    + * + * @author Gilmar P.S.L + * @author Rogério Kleinkauf + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +class CLCaixaEconomicaFederalSIGCB extends AbstractCLCaixaEconomicaFederal { + + /** + * + */ + private static final long serialVersionUID = -7642075752245778160L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 8; + + /** + * Modalidade de cobrança. + */ + private static final int COBRANCA_REGISTRADA = 1; + + /** + * Modalidade de cobrança. + */ + private static final int COBRANCA_NAO_REGISTRADA = 2; + + /** + * Constante que indica emissão de boleto pelo cedente. + */ + private static final int EMISSAO_CEDENTE = 4; + + /** + *

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

    + * + * @param titulo + * - Título com as informações para geração do campo livre. + */ + CLCaixaEconomicaFederalSIGCB(Titulo titulo) { + + super(FIELDS_LENGTH); + + ContaBancaria conta = titulo.getContaBancaria(); + String nossoNumero = titulo.getNossoNumero(); + + Integer dVCodigoDoCedente = calculeDigitoVerificador(conta.getNumeroDaConta().getCodigoDaConta().toString()); + + this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 6, Fillers.ZERO_LEFT)); + this.add(new FixedField(dVCodigoDoCedente, 1)); + this.add(new FixedField(nossoNumero.substring(0, 3), 3)); + + if(conta.getCarteira().isComRegistro()){ + + this.add(new FixedField(COBRANCA_REGISTRADA, 1)); + + }else{ + + this.add(new FixedField(COBRANCA_NAO_REGISTRADA, 1)); + } + + this.add(new FixedField(nossoNumero.substring(3, 6), 3)); + this.add(new FixedField(EMISSAO_CEDENTE, 1)); + this.add(new FixedField(nossoNumero.substring(6, 15), 9)); + + this.add(new FixedField(calculeDigitoVerificador(gereCampoLivre()), 1)); + } + + /** + * Gera o número que serve para calcular o digito verificador do campoLivre, que é todo o campo livre menos o dígito verificador. + + *

    + * Os campos utilizados são: + *

      + *
    • Código do Cedente: 06 posições
    • + *
    • Dígito Verificador do Código do Cedente: 01 posição
    • + *
    • Nosso Número – Seqüência 1: 03 posições
    • + *
    • Constante 1: 01 posição
    • + *
    • Nosso Número – Seqüência 2: 03 posições
    • + *
    • Constante 2: 01 posição
    • + *
    • Nosso Número – Seqüência 3: 09 posições
    • + *
    + *

    + * + * @return String com campos, exceto o dígito verificador. + * + * @since 0.2 + */ + private String gereCampoLivre() { + + return writeFields(); + } + + /** + * Este dígito é calculado através do Módulo 11 com os pesos 2 e 9. + * + * @param numeroParaCalculo + * @return digito + * + * @since 0.2 + */ + private int calculeDigitoVerificador(String numeroParaCalculo) { + + int soma = Modulo.calculeSomaSequencialMod11(numeroParaCalculo.toString(), 2, 9); + + int dvCampoLivre; + + if (soma < MOD11) { + + dvCampoLivre = MOD11 - soma; + + } else { + + int restoDiv11 = soma % MOD11; + + int subResto = MOD11 - restoDiv11; + + if (subResto > 9) { + + dvCampoLivre = 0; + + } else { + + dvCampoLivre = subResto; + } + } + + return dvCampoLivre; + } + + @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!"); + } +} \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSINCO.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSINCO.java new file mode 100644 index 0000000..540ef4b --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSINCO.java @@ -0,0 +1,126 @@ +/* + * 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:45 + * + * ================================================================================ + * + * 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:45 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + *

    + * O campo livre para o modelo SINCO segue esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoConteúdo
    011Número "1" (valor fixo)
    02-076Código do cliente CEDENTE (fornecido pela CAIXA)
    081Número "9" (valor fixo)
    09-2517Posições livres do "nosso número"
    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +class CLCaixaEconomicaFederalSINCO extends AbstractCLCaixaEconomicaFederal { + + private static final long serialVersionUID = -7642075752245778160L; + + /** + * Quantidade de campos. Tamanho da lista de campos. + */ + 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. + */ + CLCaixaEconomicaFederalSINCO(Titulo titulo) { + super(FIELDS_LENGTH); + + ContaBancaria conta = titulo.getContaBancaria(); + + String nossoNumero = titulo.getNossoNumero(); + + this.add(new FixedField(1, 1)); + + this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 6, Fillers.ZERO_LEFT)); + + this.add(new FixedField(9, 1)); + this.add(new FixedField(nossoNumero, 17)); + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCecred.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCecred.java new file mode 100644 index 0000000..78ba94a --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLCecred.java @@ -0,0 +1,97 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.parametro.ParametroCECRED; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; + +/** + *

    + * O campo livre do CECRED - Cooperativa Central de Crédito Urbano deve seguir esta forma: + *

    + * + * TODO tabela com campos + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * + * @author Gilmar P.S.L + * @author Douglas Ramiro + * + * @since 0.2 + * + * @version 0.2 + */ +public class CLCecred extends AbstractCLBancoDeBrasilia{ + + /** + * + */ + private static final long serialVersionUID = 7075964070090557563L; + + /** + * Número de campos = 3. + */ + private static final Integer FIELDS_LENGTH = Integer.valueOf(3); + + /** + * Tamanho do campo Convênio = 6. + */ + private static final Integer CONVENIO_LENGTH = Integer.valueOf(6); + + /** + * Tamanho do campo Nosso Número = 17. + */ + private static final Integer NOSSO_NUMERO_LENGTH = Integer.valueOf(17); + + /** + * Tamanho do campo Carteira = 2. + */ + private static final Integer CARTEIRA_LENGTH = Integer.valueOf(2); + + /** + *

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

    + * + * @since 0.2 + */ + protected CLCecred() { + super(FIELDS_LENGTH); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#checkValues(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + * + * @since 0.2 + */ + @Override + protected void checkValues(Titulo titulo) { + + checkParametroBancario(titulo, ParametroCECRED.CODIGO_DO_CONVENIO); + checkParametroBancarioMenorOuIgualQue(titulo, ParametroCECRED.CODIGO_DO_CONVENIO, 999999); + checkNossoNumero(titulo); + checkTamanhoDoNossoNumero(titulo, 17); + checkCarteiraNotNull(titulo); + checkCodigoDaCarteira(titulo); + checkCodigoDaCarteiraMenorOuIgualQue(titulo, 99); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#addFields(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + * + * @since 0.2 + */ + @Override + protected void addFields(Titulo titulo) { + + this.add(new FixedField(titulo.getParametrosBancarios().getValor(ParametroCECRED.CODIGO_DO_CONVENIO), CONVENIO_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getNossoNumero(), NOSSO_NUMERO_LENGTH, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getCarteira().getCodigo(), CARTEIRA_LENGTH, Fillers.ZERO_LEFT)); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLHSBCCobrancaNaoRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLHSBCCobrancaNaoRegistrada.java new file mode 100644 index 0000000..672b904 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLHSBCCobrancaNaoRegistrada.java @@ -0,0 +1,226 @@ +/* + * 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:27 + * + * ================================================================================ + * + * 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:27 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroHSBC.IDENTIFICADOR_CNR; + +import java.util.Calendar; +import java.util.Date; + +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; + +/** + *

    + * O campo livre do HSBC, para cobrança não registrada(CNR), deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Posição TamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-2679(7) Conta do cedente (sem dígito)Código do cedente
    27-39139(13) Nosso número (sem dígito) + * Número bancário - Código do documento, sem os dígitos + * verificadores e tipo identificador. + *
    40-4349(4) Fator de vencimentoou Data do vencimento no formato juliano
    44-4419(1) 2 FIXOCódigo do Aplicativo CNR = 2
    + * + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +class CLHSBCCobrancaNaoRegistrada extends AbstractCLHSBC { + + /** + * + */ + private static final long serialVersionUID = -1253549781074159862L; + + /** + * + */ + private static final Integer FIELDS_LENGTH = 4; + + /** + *

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

    + * + * @param titulo + * título com as informações para geração do campo livre + */ + CLHSBCCobrancaNaoRegistrada(Titulo titulo) { + + super(FIELDS_LENGTH); + + checkExistsParametrosBancarios(titulo); + checkExistsParametroTipoIdentificadorCNR(titulo + .getParametrosBancarios()); + + Integer tipoIdentificadorCNR = titulo + .getParametrosBancarios().getValor(IDENTIFICADOR_CNR); + + ContaBancaria conta = titulo.getContaBancaria(); + String nossoNumero = titulo.getNossoNumero(); + + // Conta do cedente (sem dígito) + this.add(new FixedField( + conta.getNumeroDaConta().getCodigoDaConta(), 7, + Fillers.ZERO_LEFT)); + + // Nosso número (sem dígito) + this.add(new FixedField(nossoNumero, 13, Fillers.ZERO_LEFT)); + + this.add(new FixedField(getDataVencimentoFormatoJuliano( + tipoIdentificadorCNR, titulo.getDataDoVencimento()), 4, + Fillers.ZERO_LEFT)); + + // 2 FIXO (Código do Aplicativo CNR - Cob. Não Registrada) + this.add(new FixedField(2, 1)); + + } + + private String getDataVencimentoFormatoJuliano(Integer tipoIdentificadorCNR, Date vencimento) { + + final int SEM_VENCIMENTO = 5; + final int COM_VENCIMENTO = 4; + + switch (tipoIdentificadorCNR) { + + case SEM_VENCIMENTO: + + return "0000"; + + case COM_VENCIMENTO: + + return getVencimentoFormatoJuliano(vencimento); + + default: + return Exceptions.throwIllegalStateException("Tipo de identificador CNR desconhecido!"); + } + } + + private String getVencimentoFormatoJuliano(Date vencimento) { + + Calendar c = Calendar.getInstance(); + c.setTime(vencimento); + + return new StringBuilder(String.valueOf(c.get(Calendar.DAY_OF_YEAR))) + .append(String.valueOf(c.get(Calendar.YEAR) % 10)) + .toString(); + } + + private void checkExistsParametrosBancarios(Titulo titulo) { + + if (Objects.isNull(titulo.getParametrosBancarios()) + && titulo.getParametrosBancarios().isVazio()) { + + throw new CampoLivreException( + "Parâmetros bancários nulos em \"Titulo.parametrosBancarios\". O parâmetro bancário de nome e tipo [ IDENTIFICADOR_CNR ] deve ser fornecido para este caso."); + + } + } + + private void checkExistsParametroTipoIdentificadorCNR(ParametrosBancariosMap parametros) { + + Integer tipoIdentificadorCNR = parametros + .getValor(IDENTIFICADOR_CNR); + + if (Objects.isNull(tipoIdentificadorCNR)) { + + throw new CampoLivreException( + "Parâmetro bancário [ IDENTIFICADOR_CNR ] não encontrado em \"Titulo.parametrosBancarios\". O nome do parâmetro deve ser IDENTIFICADOR_CNR."); + } + } + + @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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLHSBCCobrancaRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLHSBCCobrancaRegistrada.java new file mode 100644 index 0000000..6220e35 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLHSBCCobrancaRegistrada.java @@ -0,0 +1,144 @@ +/* + * 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: 14/08/2010 - 22:33:26 + * + * ================================================================================ + * + * 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: 14/08/2010 - 22:33:26 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + *

    + * O campo livre do HSBC, para cobrança registrada(CSB), deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Posição TamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-30119(11) Nosso número com dígitoNúmero Bancário
    31-3449(4) Código da Agência.Código da Agência.
    35-4179(7) Conta Corrente.Conta de cobrança.
    42-4329(2) Código da carteira="00"Código da carteira="00"
    44-4429(2) Constante="1"Código do aplicativo da Cobrança (COB) = "1"
    + * + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +class CLHSBCCobrancaRegistrada extends AbstractCLHSBC{ + + /** + * + */ + private static final long serialVersionUID = -5052841093486791338L; + + private static final Integer FIELDS_LENGTH = 6; + + private static final String CODIGO_DA_CARTEIRA = "00"; + + private static final Integer CODIGO_DO_APLICATIVO = Integer.valueOf(1); + + /** + * *

    + * Dado um título, cria um campo livre para cobrança registrada do banco HSBC. + *

    + * + * @param titulo - título com as informações para geração do campo livre + */ + CLHSBCCobrancaRegistrada(Titulo titulo) { + + super(FIELDS_LENGTH); + + this.add(new FixedField(titulo.getNossoNumero(), 10, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getDigitoDoNossoNumero(), 1)); + 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(CODIGO_DA_CARTEIRA, 2)); + this.add(new FixedField(CODIGO_DO_APLICATIVO, 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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLItauComCarteirasEspeciais.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLItauComCarteirasEspeciais.java new file mode 100644 index 0000000..66ad1f0 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLItauComCarteirasEspeciais.java @@ -0,0 +1,185 @@ +/* + * 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 org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + * Campo livre padrão do Banco Itaú + * + *

    + * Constrói o campo livre no caso especial, ou seja, quando a carteira for: + * 106, 107, 122, 142, 143, 195, 196 ou 198. + *

    + * + *

    + *

    Layout do Banco Itaú para o campo livre ESPECIAL

    + *
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    + * 
    PosiçãoTamanhoPictureConteúdo
    20 a 2239(03)Carteira
    23 a 3089(08)Nosso número
    31 a 3779(07)Seu Número (Número do Documento)
    38 a 4259(05)Código do Cliente (fornecido pelo Banco)
    43 a 4319(01)DAC dos campos acima (posições 20 a 42 veja anexo 3)
    44 a 4419(01)Zero
    + *
    + * 

    + * + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +class CLItauComCarteirasEspeciais extends AbstractCLItau { + + /** + * + */ + private static final long serialVersionUID = -1532454262023154419L; + + /** + * Tamanho do campo livre para carteiras especiais. + */ + private static final Integer FIELDS_LENGTH = 6; + + /** + * Dado um título, cria o campo livre do Banco Itaú para carteiras + * especiais. + * + * @param titulo + * título com as informações para geração do campo livre + */ + public CLItauComCarteirasEspeciais(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(titulo.getNumeroDoDocumento(), 7, Fillers.ZERO_LEFT)); + + //Aqui é o código do cedente, simbolizado pelo código da conta bancária. + this.add(new FixedField(conta.getNumeroDaConta().getCodigoDaConta(), 5, Fillers.ZERO_LEFT)); + + this.add(new FixedField(calculeDigitoDoCampoLivreEspecial( + conta.getCarteira().getCodigo(), + titulo.getNossoNumero(), + titulo.getNumeroDoDocumento(), + conta.getNumeroDaConta().getCodigoDaConta()), 1)); + this.add(new FixedField(0, 1)); + } + + /** + * Calcula o dígito verificador para o campo livre especial a partir do + * código da carteira, do nosso número, do número do documento e do código + * da conta. + * + * @param codigoDaCarteira + * @param nossoNumero + * @param numeroDoDocumento + * @param codigoDaConta + * @return Integer digito + * + * @since 0.2 + */ + private Integer calculeDigitoDoCampoLivreEspecial(Integer codigoDaCarteira, + String nossoNumero, String numeroDoDocumento, Integer codigoDaConta) { + + StringBuilder campo = new StringBuilder(); + + campo.append(Fillers.ZERO_LEFT.fill(codigoDaCarteira.intValue(), 3)); + campo.append(Fillers.ZERO_LEFT.fill(nossoNumero, 8)); + campo.append(Fillers.ZERO_LEFT.fill(numeroDoDocumento, 7)); + campo.append(Fillers.ZERO_LEFT.fill(codigoDaConta, 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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java new file mode 100644 index 0000000..03ef346 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java @@ -0,0 +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.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLMercantilDoBrasil.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLMercantilDoBrasil.java new file mode 100644 index 0000000..7965d6e --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLMercantilDoBrasil.java @@ -0,0 +1,167 @@ +/* + * 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.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLSicredi.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLSicredi.java new file mode 100644 index 0000000..7622b9e --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLSicredi.java @@ -0,0 +1,276 @@ +/* + * 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: 15/01/2010 - 20:40:59 + * + * ================================================================================ + * + * 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: 15/01/2010 - 20:40:59 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static java.lang.String.format; +import static java.math.BigDecimal.ZERO; +import static org.jrimum.bopepo.parametro.ParametroBancoSicredi.POSTO_DA_AGENCIA; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Objects; +import org.jrimum.vallia.digitoverificador.Modulo; +import org.jrimum.vallia.digitoverificador.TipoDeModulo; + +/** + *

    + * O campo livre do banco Sicredi deve seguir esta forma: + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    PosiçãoTamanhoPictureConteúdo (terminologia padrão)Conteúdo (terminologia do banco)
    20-201tipo de cobrança: "1" ou "3"Código numérico correspondente ao tipo de cobrança: "1"- Com Registro ou "3"- Sem Registro
    21-211Constante correspondente ao tipo de carteira: "1"- carteira simples. Embora no código fonte do manual mencione outras duas possibilidades "2"-Caucionada ou "3"-Descontada.Código númerico correspondente ao tipo de carteira: "1" - carteira simples
    22-298Nosso Número (8)Nosso Número
    30-301DV do Nosso Número (1)Dígito Verificador do Nosso Número
    31-344Cooperativa de crédito / agência cedenteCooperativa de crédito / agência cedente
    35-362Unidade de atendimento / posto da agênica cedenteUnidade de atendimento / posto da agênica cedente
    37-415Código do CedenteCódigo do Cedente
    42-421Filler: 1 (um) quando o campo "valor do documento" diferente de 0 (zero), caso contrário zero.1 (um) quando o campo "valor do documento" diferente de 0 (zero), caso contrário zero.
    43-431Constante "0"- ZeroZero Fixo
    44-441Dígito verificador do campo livre calculado por módulo 11 com aproveitamento total (resto igual a (0) zero ou (1) um o Dígito será (0) zero)Dígito verificador do campo livre calculado por módulo 11 com aproveitamento total (resto igual a (0) zero ou (1) um o Dígito será (0) zero)
    + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +class CLSicredi extends AbstractCLSicredi { + + /** + * {@code serialVersionUID = 7697120719706717353L} + */ + private static final long serialVersionUID = 7697120719706717353L; + + /** + * Número de campos = 10. + */ + private static final Integer FIELDS_LENGTH = 10; + + /** + * Código númerico correspondente ao tipo de cobrança: "1" - Com Registro. + */ + private static final String COBRANCA_COM_REGISTRO = "1"; + + /** + * Código númerico correspondente ao tipo de cobrança: "3" - Sem Registro. + */ + private static final String COBRANCA_SEM_REGISTRO = "3"; + + /** + * Valor constante do campo "Tipo da Carteira": "1" - carteira simples. + */ + private static final Integer CARTEIRA_SIMPLES_VALUE = Integer.valueOf(1); + + /** + * Segunda posição do campo livre. + */ + private static final FixedField FIELD_CARTEIRA = new FixedField(CARTEIRA_SIMPLES_VALUE, 1); + + /** + * Instância de módulo 11 para cálculo do DV do campo livre. + */ + private static final Modulo modulo11 = new Modulo(TipoDeModulo.MODULO11); + + /** + * Cria um campo livre instanciando o número de fields ({@code FIELDS_LENGTH}) deste campo. + * + * @since 0.2 + */ + protected CLSicredi() { + + super(FIELDS_LENGTH); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#checkValues(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + */ + @Override + protected void checkValues(Titulo titulo){ + + checkCarteiraNotNull(titulo); + checkCodigoDaCarteira(titulo); + checkCarteiraSimples(titulo); + checkRegistroDaCarteiraNotNull(titulo); + checkNossoNumero(titulo); + checkTamanhoDoNossoNumero(titulo, NN8); + checkDigitoDoNossoNumero(titulo); + checkTamanhoDigitoDoNossoNumero(titulo, 1); + checkCodigoDaAgencia(titulo); + checkCodigoDaAgenciaMenorOuIgualQue(titulo, 99999); + checkParametroBancario(titulo, POSTO_DA_AGENCIA); + checkNumeroDaContaNotNull(titulo); + checkCodigoDoNumeroDaConta(titulo); + checkCodigoDoNumeroDaContaMenorOuIgualQue(titulo, 99999); + checkValor(titulo); + } + + /** + * {@inheritDoc} + * + * @see org.jrimum.bopepo.campolivre.AbstractCampoLivre#addFields(org.jrimum.domkee.financeiro.banco.febraban.Titulo) + */ + @Override + protected void addFields(Titulo titulo) { + + if(titulo.getContaBancaria().getCarteira().isComRegistro()){ + + this.add(new FixedField(COBRANCA_COM_REGISTRO, 1)); + + }else{ + + this.add(new FixedField(COBRANCA_SEM_REGISTRO, 1)); + } + + this.add(FIELD_CARTEIRA); + this.add(new FixedField(titulo.getNossoNumero(), 8, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getDigitoDoNossoNumero(), 1, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getParametrosBancarios().getValor(POSTO_DA_AGENCIA), 2, Fillers.ZERO_LEFT)); + this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), 5, Fillers.ZERO_LEFT)); + + if (titulo.getValor().compareTo(ZERO) == 1) { + + this.add(new FixedField("1", 1)); + + } else { + + this.add(new FixedField("0", 1)); + } + + this.add(new FixedField("0", 1)); + this.add(new FixedField(calculeDigitoVerificador(), 1)); + } + + /** + * Verifica se o código da carteira da conta bancária do título é igual 1 + * (carteira simples), caso contrário lança uma {@code + * IllegalArgumentException}. + * + * @param titulo + */ + private void checkCarteiraSimples(Titulo titulo) { + + Objects.checkArgument( + titulo.getContaBancaria().getCarteira().getCodigo().equals(CARTEIRA_SIMPLES_VALUE), + format("Apenas a carteira de código [1] \"carteira simples\" é permitida e não o código [%s]!", titulo.getContaBancaria().getCarteira().getCodigo()) + ); + } + + /** + * Calcula o dígito verificador deste campo livre (posição 25 do campo livre + * 44 do código de barras) com módulo 11 a partir das 24 posições deste + * campo livre. + * + * @return dígito verificador + * + * @since 0.2 + */ + private Integer calculeDigitoVerificador() { + + final int resto = modulo11.calcule(writeFields()); + + if (resto == 0 || resto == 1) { + + return Integer.valueOf(0); + + } else{ + + return Integer.valueOf(modulo11.valor() - resto); + } + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java new file mode 100644 index 0000000..c4d1c08 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java @@ -0,0 +1,161 @@ +package org.jrimum.bopepo.campolivre; + +import org.apache.commons.lang.StringUtils; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaRegistrada.java new file mode 100644 index 0000000..9fb87c8 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaRegistrada.java @@ -0,0 +1,192 @@ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.utilix.text.DateFormat.YYMMDD; + +import java.util.Date; + +import org.apache.commons.lang.StringUtils; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivre.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivre.java new file mode 100644 index 0000000..53f6b34 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivre.java @@ -0,0 +1,57 @@ +/* + * 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:10: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:10:11 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.texgit.TextStream; + + +/** + *

    + * Essa é uma Interace com um propósito de marcar e agrupar tipos campo livre. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @see AbstractCampoLivre + * + * @since 0.2 + * + * @version 0.2 + */ +public interface CampoLivre extends TextStream{ + + /** + * Tamanho do Campo Livre, igual para qualquer que seja o banco. + */ + Integer STRING_LENGTH = 25; +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivreException.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivreException.java new file mode 100644 index 0000000..6dc6b9d --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivreException.java @@ -0,0 +1,85 @@ +/* + * 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: 21/04/2008 - 21:14: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: 21/04/2008 - 21:14:40 + * + */ + +package org.jrimum.bopepo.campolivre; + +/** + *

    + * Qualquer exceção gerada durante a geração de um campo livre gera uma CampoLivreException. Centraliza e localiza os problemas relativos a geração de um campo livre. + *

    + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @see org.jrimum.bopepo.campolivre.CampoLivre + * + * @since 0.2 + * + * @version 0.2 + */ +public class CampoLivreException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = 893327780214327141L; + + /** + * + */ + public CampoLivreException() { + super(); + } + + /** + * @param message + * @param cause + */ + public CampoLivreException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + */ + public CampoLivreException(String message) { + super(message); + } + + /** + * @param cause + */ + public CampoLivreException(Throwable cause) { + super(cause); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivreFactory.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivreFactory.java new file mode 100644 index 0000000..53b77f1 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/CampoLivreFactory.java @@ -0,0 +1,134 @@ +/* + * 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:58 + * + * ================================================================================ + * + * 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:58 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.apache.commons.lang.StringUtils.containsAny; +import static org.apache.commons.lang.StringUtils.isNumeric; +import static org.apache.commons.lang.StringUtils.strip; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.texgit.type.component.Fillers; +import org.jrimum.texgit.type.component.FixedField; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.Strings; + + +/** + *

    + * Esta classe tem como finalidade encapsular toda a lógica de criação de um + * campo livre e de fornecer para o pacote + * org.jrimum.bopepo.campolivre + * um único ponto de acesso ao mesmo. + *

    + * + * + * @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 CampoLivreFactory { + + /** + *

    + * Devolve um CampoLivre de acordo com o Banco contido na conta bancária do título. + *

    + *

    + * Caso exista implementação para o banco o retorno terá uma referência não nula. + *

    + * + * @param titulo + * + * @return Uma referência para um CampoLivre. + * @throws NotSupportedBancoException + * @throws NotSupportedCampoLivreException + */ + public static CampoLivre create(Titulo titulo) throws NotSupportedBancoException, NotSupportedCampoLivreException { + + return AbstractCampoLivre.create(titulo); + } + + /** + * Devolve um CampoLivre a partir de uma String. + * + * @param strCampoLivre + * + * @return Referência para uma instância anônima de CampoLivre. + * + * @throws NullPointerException + * @throws IllegalArgumentException + */ + public static CampoLivre create(String strCampoLivre) { + Objects.checkNotNull(strCampoLivre); + + strCampoLivre = strip(strCampoLivre); + + Strings.checkNotBlank(strCampoLivre, "O Campo Livre não deve ser vazio!"); + + Objects.checkArgument(strCampoLivre.length() == CampoLivre.STRING_LENGTH, "O tamanho do Campo Livre [ " + strCampoLivre + " ] deve ser igual a 25 e não ["+strCampoLivre.length()+"]!"); + Objects.checkArgument(!containsAny(strCampoLivre, " "), "O Campo Livre [ " + strCampoLivre + " ] não deve conter espaços em branco!"); + Objects.checkArgument(isNumeric(strCampoLivre),"O Campo Livre [ " + strCampoLivre + " ] deve ser uma String numérica!"); + + return valueOf(strCampoLivre); + } + + private static CampoLivre valueOf(String strCampoLivre) { + CampoLivre campoLivre = new CampoLivre() { + private static final long serialVersionUID = -7592488081807235080L; + + FixedField campo = new FixedField(EMPTY, + STRING_LENGTH, Fillers.ZERO_LEFT); + + public void read(String str) { + campo.read(str); + } + + public String write() { + return campo.write(); + } + }; + campoLivre.read(strCampoLivre); + return campoLivre; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return Objects.toString(this); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/NotSupportedBancoException.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/NotSupportedBancoException.java new file mode 100644 index 0000000..456a0fa --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/NotSupportedBancoException.java @@ -0,0 +1,92 @@ +/* + * 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:10:19 + * + * ================================================================================ + * + * 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:10:19 + * + */ + + +package org.jrimum.bopepo.campolivre; + + +/** + *

    + * Exceção indicadora de não existência de um referido banco ou problemas com dados de um banco. + *

    + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class NotSupportedBancoException extends CampoLivreException { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private static String msg = "Banco não suportado por não haver " + + "implementações de Campo Livre para " + + "o mesmo."; + + + /** + * + */ + public NotSupportedBancoException() { + super(msg); + } + + /** + * @param message + * @param cause + */ + @SuppressWarnings("unused") + private NotSupportedBancoException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + */ + @SuppressWarnings("unused") + private NotSupportedBancoException(String message) { + super(message); + } + + /** + * @param cause + */ + @SuppressWarnings("unused") + private NotSupportedBancoException(Throwable cause) { + super(msg, cause); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/NotSupportedCampoLivreException.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/NotSupportedCampoLivreException.java new file mode 100644 index 0000000..61dc5b4 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/NotSupportedCampoLivreException.java @@ -0,0 +1,87 @@ +/* + * 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:10:27 + * + * ================================================================================ + * + * 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:10:27 + * + */ + + +package org.jrimum.bopepo.campolivre; + + +/** + * + *

    + * Exceção indicadora de não existência de um campolivre para os dados correntes de um boleto. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class NotSupportedCampoLivreException extends CampoLivreException { + + /** + * + */ + private static final long serialVersionUID = 1L; + + /** + * + */ + public NotSupportedCampoLivreException() { + super(); + } + + /** + * @param message + * @param cause + */ + public NotSupportedCampoLivreException(String message, Throwable cause) { + super(message, cause); + + } + + /** + * @param message + */ + public NotSupportedCampoLivreException(String message) { + super(message); + + } + + /** + * @param cause + */ + public NotSupportedCampoLivreException(Throwable cause) { + super(cause); + + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/package-info.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/package-info.java new file mode 100644 index 0000000..2dfc108 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/campolivre/package-info.java @@ -0,0 +1,35 @@ +/* + * 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: 14/08/2010 - 20:50:14 + * + * ================================================================================ + * + * 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: 14/08/2010 - 20:50:14 + * + */ + +/** + * Fábricas de campos livres para os bancos suportados. + * + * @author Gilmar P.S.L + */ +package org.jrimum.bopepo.campolivre; \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/package-info.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/package-info.java new file mode 100644 index 0000000..f53fae0 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/package-info.java @@ -0,0 +1,36 @@ +/* + * 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: 14/08/2010 - 20:50:14 + * + * ================================================================================ + * + * 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: 14/08/2010 - 20:50:14 + * + */ + +/** + * Classes e utilitários responsáveis pela geração de boletos e derivados como: + * {@link org.jrimum.bopepo.Boleto}, {@link org.jrimum.bopepo.BancosSuportados}, {@link org.jrimum.bopepo.CodigoDeBarras}, {@link org.jrimum.bopepo.LinhaDigitavel}, {@link org.jrimum.bopepo.BoletoUtil}, etc. + * + * @author Gilmar P.S.L + */ +package org.jrimum.bopepo; \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoDeBrasilia.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoDeBrasilia.java new file mode 100644 index 0000000..929e813 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoDeBrasilia.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013 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/2013 - 12:11:51 + * + * ================================================================================ + * + * Direitos autorais 2013 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/2013 - 12:11:51 + * + */ + +package org.jrimum.bopepo.parametro; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametroBancario; + + +/** + * Parâmetros bancários específicos para o + * {@link BancosSuportados#BANCO_DE_BRASILIA}. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public enum ParametroBancoDeBrasilia implements + ParametroBancario { + CHAVE_ASBACE_DIGITO1, CHAVE_ASBACE_DIGITO2; +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoRural.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoRural.java new file mode 100644 index 0000000..9228a35 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoRural.java @@ -0,0 +1,50 @@ +/* + * Copyright 2013 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/2013 - 12:11:51 + * + * ================================================================================ + * + * Direitos autorais 2013 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/2013 - 12:11:51 + * + */ + + +package org.jrimum.bopepo.parametro; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametroBancario; + + +/** + * Parâmetros bancários específicos para o + * {@link BancosSuportados#BANCO_RURAL}. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public enum ParametroBancoRural implements ParametroBancario{ + CODIGO_REDUZIDO, + VALOR_IOS; +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoSantander.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoSantander.java new file mode 100644 index 0000000..f1b94d1 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoSantander.java @@ -0,0 +1,54 @@ +/* + * Copyright 2013 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/2013 - 12:11:51 + * + * ================================================================================ + * + * Direitos autorais 2013 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/2013 - 12:11:51 + * + */ + + +package org.jrimum.bopepo.parametro; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametroBancario; + + +/** + * Parâmetros bancários específicos para o + * {@link BancosSuportados#BANCO_SANTANDER}. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public enum ParametroBancoSantander implements ParametroBancario{ + /** + * Chave de pesquisa em parâmetros bancários para saber se o boelto deve + * usar IOF – Seguradoras: (Se 7% informar 7. Limitado a 9%); Demais + * clientes usar 0 (zero). + */ + IOF_SEGURADORA; +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoSicredi.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoSicredi.java new file mode 100644 index 0000000..c94742c --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoSicredi.java @@ -0,0 +1,52 @@ +/* + * Copyright 2013 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/2013 - 12:11:51 + * + * ================================================================================ + * + * Direitos autorais 2013 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/2013 - 12:11:51 + * + */ + + +package org.jrimum.bopepo.parametro; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametroBancario; + + +/** + * Parâmetros bancários específicos para o + * {@link BancosSuportados#BANCO_SICREDI}. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public enum ParametroBancoSicredi implements ParametroBancario{ + /** + * Nome do parâmetro bancário contendo o valor do posto da agência SICREDI. + */ + POSTO_DA_AGENCIA; +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoob.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoob.java new file mode 100644 index 0000000..0c6391e --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroBancoob.java @@ -0,0 +1,50 @@ +/* + * Copyright 2013 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/2013 - 12:11:51 + * + * ================================================================================ + * + * Direitos autorais 2013 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/2013 - 12:11:51 + * + */ + + +package org.jrimum.bopepo.parametro; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametroBancario; + + +/** + * Parâmetros bancários específicos para o + * {@link BancosSuportados#BANCOOB}. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public enum ParametroBancoob implements ParametroBancario{ + MODALIDADE_DE_COBRANCA, + NUMERO_DA_PARCELA; +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroCECRED.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroCECRED.java new file mode 100644 index 0000000..70884b3 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroCECRED.java @@ -0,0 +1,47 @@ +/* + * Copyright 2014 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: 21/01/2014 - 13:57:10 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 21/01/2014 - 13:57:10 + * + */ + +package org.jrimum.bopepo.parametro; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametroBancario; + +/** + * Parâmetros bancários específicos para o {@link BancosSuportados#CECRED}. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public enum ParametroCECRED implements ParametroBancario { + CODIGO_DO_CONVENIO; +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroCaixaEconomicaFederal.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroCaixaEconomicaFederal.java new file mode 100644 index 0000000..04e0e5e --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroCaixaEconomicaFederal.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013 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/2013 - 12:11:51 + * + * ================================================================================ + * + * Direitos autorais 2013 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/2013 - 12:11:51 + * + */ + + +package org.jrimum.bopepo.parametro; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametroBancario; + + +/** + * Parâmetros bancários específicos para o + * {@link BancosSuportados#CAIXA_ECONOMICA_FEDERAL}. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public enum ParametroCaixaEconomicaFederal implements ParametroBancario{ + CODIGO_OPERACAO; +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroHSBC.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroHSBC.java new file mode 100644 index 0000000..883e787 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/ParametroHSBC.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013 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/2013 - 12:11:51 + * + * ================================================================================ + * + * Direitos autorais 2013 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/2013 - 12:11:51 + * + */ + + +package org.jrimum.bopepo.parametro; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametroBancario; + + +/** + * Parâmetros bancários específicos para o + * {@link BancosSuportados#HSBC}. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public enum ParametroHSBC implements ParametroBancario{ + IDENTIFICADOR_CNR +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/package-info.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/package-info.java new file mode 100644 index 0000000..9863edc --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/parametro/package-info.java @@ -0,0 +1,37 @@ +/* + * Copyright 2013 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: 06/10/2013 - 18:15:40 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 06/10/2013 - 18:15:40 + * + */ + +/** + * Classes e utilitários responsáveis pela geração de boletos e derivados como: + * {@link org.jrimum.bopepo.Boleto}, {@link org.jrimum.bopepo.BancosSuportados}, {@link org.jrimum.bopepo.CodigoDeBarras}, {@link org.jrimum.bopepo.LinhaDigitavel}, {@link org.jrimum.bopepo.BoletoUtil}, etc. + * + * @author Gilmar P.S.L + */ +package org.jrimum.bopepo.parametro; \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/CodigoDeBarras.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/CodigoDeBarras.java new file mode 100644 index 0000000..db491c3 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/CodigoDeBarras.java @@ -0,0 +1,110 @@ +/* + * 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 - 14:49: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 - 14:49:07 + * + */ + +package org.jrimum.bopepo.pdf; + +import static java.lang.String.format; + +import java.awt.Color; +import java.awt.Image; + +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.Strings; + +import com.lowagie.text.pdf.BarcodeInter25; + + +/** + * Classe geradora de código de barras no padrão FEBRABAN. + * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @version 0.2.3 + * + * @since 0.2 + */ +public class CodigoDeBarras { + + private String codigo; + + /** + * Classe não instanciável + * + * @throws IllegalStateException + * Caso haja alguma tentativa de utilização deste construtor. + * + * @since 0.2 + */ + @SuppressWarnings("unused") + private CodigoDeBarras() { + + Exceptions.throwIllegalStateException("Instanciação não permitida!"); + } + + public CodigoDeBarras(String codigo){ + + checkCodigo(codigo); + + this.codigo = codigo; + } + + public static CodigoDeBarras valueOf(String codigo){ + checkCodigo(codigo); + return new CodigoDeBarras(codigo); + } + + public String write(){ + + return codigo; + } + + public Image toImage(){ + + // Montando o código de barras. + BarcodeInter25 barCode = new BarcodeInter25(); + barCode.setCode(this.write()); + + barCode.setExtended(true); + barCode.setBarHeight(35); + barCode.setFont(null); + barCode.setN(3); + + return barCode.createAwtImage(Color.BLACK, Color.WHITE); + } + + private static void checkCodigo(String str) { + + Objects.checkNotNull(str, "Código nulo!"); + Strings.checkNotBlank(str, format("Código ausente! str = \"%s\"",str)); + Strings.checkNotNumeric(str, format("Código não contém apenas números! str = \"%s\"",str)); + Objects.checkArgument(str.length()==44, format("Código com tamanho diferente de 44 dígitos! str = \"%s\"",str)); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/Files.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/Files.java new file mode 100644 index 0000000..b2f1a58 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/Files.java @@ -0,0 +1,435 @@ +/* + * 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:54 + * + * ================================================================================ + * + * 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:54 + * + */ + +package org.jrimum.bopepo.pdf; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.WeakHashMap; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.Strings; + +/** + *

    + * Utilitário para manipular arquivos e fluxos de arquivos. + *

    + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class Files { + + private static final int DEFAULT_BUFFER_SIZE = 4096; + + public static final String ZIP_SUFFIX = ".zip"; + + /** + * Utility class pattern: classe não instanciável + * + * @throws IllegalStateException + * Caso haja alguma tentativa de utilização deste construtor. + */ + private Files() { + + Exceptions.throwIllegalStateException("Instanciação não permitida!"); + } + + /** + *

    + * Transforma um array de bytes em um arquivo. + *

    + * + * @param pathName + * - Caminho do arquivo para onde os bytes serão escritos. + * @param bytes + * - Bytes a serem copiados. + * + * @return Objeto File com o conteúdo sendo o dos bytes + * + * @throws FileNotFoundException + * @throws IOException + * @throws IllegalArgumentException + * Caso {@code pathName} ou {@code bytes} seja null, vazio ou + * contenha apenas espaços em branco + * @since 0.2 + */ + public static File bytesToFile(String pathName, byte[] bytes) + throws FileNotFoundException, IOException { + + Strings.checkNotBlank(pathName); + Objects.checkNotNull(bytes); + + return bytesToFile(new File(pathName), bytes); + } + + /** + *

    + * Transforma um array de bytes em um arquivo. + *

    + * + * @param file + * - arquivo para onde os bytes serão escritos. + * @param bytes + * - Bytes a serem copiados. + * + * @return Objeto File com o conteúdo sendo o dos bytes + * + * @throws FileNotFoundException + * @throws IOException + * @throws IllegalArgumentException + * Caso {@code pathName} ou {@code bytes} seja null, vazio ou + * contenha apenas espaços em branco + * + * @since 0.2 + */ + public static File bytesToFile(File file, byte[] bytes) + throws FileNotFoundException, IOException { + + Objects.checkNotNull(file); + Objects.checkNotNull(bytes); + + if (file.length() > Integer.MAX_VALUE) { + Exceptions.throwIllegalArgumentException( + "TAMANHO DO ARQUIVO MAIOR DO QUE O SUPORTADO: " + + Integer.MAX_VALUE); + } + + OutputStream out = new FileOutputStream(file); + + out.write(bytes); + out.flush(); + out.close(); + + return file; + } + + /** + *

    + * Transforma um array de bytes em um ByteArrayOutputStream. + *

    + * + * @param bytes + * - Bytes que serão escritos no objeto ByteArrayOutputStream + * + * @return ByteArrayOutputStream ou null + * + * @throws IOException + * @throws IllegalArgumentException + * Caso os {@code bytes} sejam {@code null}. + * + * @since 0.2 + */ + public static ByteArrayOutputStream bytesToStream(byte[] bytes) + throws IOException { + + Objects.checkNotNull(bytes); + + ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + byteOut.write(bytes); + + return byteOut; + } + + /** + * Retorna o conteúdo do arquivo em um array de bytes. + * + * @param file + * @return Conteúdo em um array de bytes. + * @throws IOException + * @throws IllegalArgumentException + * Caso o {@code file} seja {@code null}. + */ + public static byte[] fileToBytes(File file) throws IOException { + + Objects.checkNotNull(file); + + InputStream is = new FileInputStream(file); + + byte[] bytes = new byte[(int) file.length()]; + + int offset = 0; + int numRead = 0; + + while ((offset < bytes.length) + && ((numRead = is.read(bytes, offset, bytes.length - offset)) >= 0)) { + offset += numRead; + } + + is.close(); + + Objects.checkArgument(offset == bytes.length, + "Não foi possível completar a leitura do arquivo: " + + file.getName()); + + return bytes; + } + + /** + * Retorna o conteúdo do {@code InputStream} em um array de bytes. + * + *

    + * Fecha o {@code InputStream} após leitura. + *

    + * + * @param input + * @return Conteúdo em um array de bytes. + * @throws IOException + * @throws IllegalArgumentException + * Caso o {@code input} seja {@code null}. + */ + public static byte[] toByteArray(InputStream input) throws IOException { + + Objects.checkNotNull(input); + + ByteArrayOutputStream output = new ByteArrayOutputStream(); + + byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; + + int n = 0; + + while (-1 != (n = input.read(buffer))) { + + output.write(buffer, 0, n); + } + + input.close(); + + return output.toByteArray(); + } + + public static File zip(File f){ + + return zip(f.getName(), f); + } + + public static File zip(String zipedName, File f){ + + try { + + return bytesToFile(File.createTempFile(zipedName, ZIP_SUFFIX),zip(toByteArray(f), f.getName())); + + } catch (IOException e) { + + throw new IllegalStateException(e); + } + } + + public static byte[] zip(byte[] fileToZip, String fileZipedName){ + + ByteArrayOutputStream obout = new ByteArrayOutputStream(); + + ZipOutputStream out = null; + + try { + + out = new ZipOutputStream(obout); + out.setMethod(ZipOutputStream.DEFLATED); + out.putNextEntry(new ZipEntry(fileZipedName)); + + out.write(fileToZip); + + + } catch (IOException e) { + + throw new IllegalStateException(e); + + }finally{ + + if(out != null){ + + try { + + // Close the input stream and return bytes + out.close(); + + } catch (Exception e) { + + return Exceptions.throwIllegalStateException(e); + } + } + } + + return obout.toByteArray(); + } + + public static File zip(Collection files){ + + Map toZip = new WeakHashMap(files.size()); + + for(File f : files){ + toZip.put(f.getName(), f); + } + + return zip(toZip); + } + + public static File zip(Map files){ + + return zip("ZipedFiles", files); + } + + public static File zip(String zipedName, Map files){ + + Map bytFiles = new HashMap(files.size()); + + for (Entry nameAndFile : files.entrySet()) { + + bytFiles.put(nameAndFile.getKey(), toByteArray(nameAndFile + .getValue())); + } + + try { + + return bytesToFile(File.createTempFile(zipedName,ZIP_SUFFIX),zipBytes(bytFiles)); + + } catch (IOException e) { + + throw new IllegalStateException(e); + } + } + + public static byte[] zipBytes(Map files) { + + // Create a buffer for reading the files + byte[] buf = new byte[DEFAULT_BUFFER_SIZE]; + + ByteArrayOutputStream outs = new ByteArrayOutputStream(); + + try { + // Create the ZIP file + ZipOutputStream out = new ZipOutputStream(outs); + + // Compress the files + for (Entry entry : files.entrySet()) { + + if (entry.getValue() != null) { + + ByteArrayInputStream in = new ByteArrayInputStream(entry + .getValue()); + + // Add ZIP entry to output stream. + out.putNextEntry(new ZipEntry(normalizeName(entry.getKey()))); + + // Transfer bytes from the file to the ZIP file + int len; + + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + + // Complete the entry + out.closeEntry(); + in.close(); + } + } + + // Complete the ZIP file + out.close(); + + return outs.toByteArray(); + + } catch (IOException e) { + + throw new IllegalStateException(e); + } + } + + public static byte[] toByteArray(File file){ + + try{ + + InputStream is = new FileInputStream(file); + + long length = file.length(); + + if (length > Integer.MAX_VALUE) { + Exceptions.throwIllegalArgumentException(String.format("File is too large! Max file length capacity is %s bytes.",length)); + } + + byte[] bytes = new byte[(int)length]; + + int offset = 0; + int numRead = 0; + while ((offset < bytes.length) + && ((numRead=is.read(bytes, offset, bytes.length-offset)) >= 0)) { + offset += numRead; + } + + is.close(); + + if (offset < bytes.length) { + throw new IOException("Could not completely read file "+file.getName()); + } + + return bytes; + + }catch (Exception e) { + return Exceptions.throwIllegalStateException(e); + } + } + + /** + * Gera uma string para ser utilizada como nome de arquivo. Ou como base de + * código para retirar acentos de um texto com Java Os nomes são sem acento + * e ao invés de " " é usado _ . + * + * @param name + * string a ser usada como nome borderoArquivo + * @return retorna o nome do borderoArquivo alterado. + */ + public static String normalizeName(String name) { + name = name.replaceAll(" ", "_"); + name = Strings.eliminateAccent(name); + name = name.replaceAll("[^\\p{ASCII}]", ""); + return name; + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PDFs.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PDFs.java new file mode 100644 index 0000000..413c6b4 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PDFs.java @@ -0,0 +1,188 @@ +/* + * 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 - 23:49: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 - 23:49:00 + * + */ + +package org.jrimum.bopepo.pdf; + +import java.io.ByteArrayOutputStream; +import java.util.Collection; + +import org.jrimum.utilix.Exceptions; + +import com.lowagie.text.Document; +import com.lowagie.text.DocumentException; +import com.lowagie.text.Image; +import com.lowagie.text.pdf.PdfCopy; +import com.lowagie.text.pdf.PdfReader; +import com.lowagie.text.pdf.PdfStamper; + +/** + * Serviços e atividades relacionadas a manipulação de PDF (provavelmente da lib + * iText). + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public class PDFs{ + + /** + *

    + * Muda um input field para uma imgem com as dimensões e possição do field. + *

    + * + * @param stamper + * @param positions + * @param image + * @return rectanglePDF + * @throws DocumentException + * + * @since 0.2 + */ + public static PdfRectangle changeFieldToImage(PdfStamper stamper, + float[] positions, Image image) throws DocumentException { + + PdfRectangle rect = new PdfRectangle(positions); + + return changeFieldToImage(stamper, rect, image); + } + + /** + *

    + * Muda um input field para uma imgem com as dimensões e possição do field. + *

    + * + * @param stamper + * @param rect + * @param image + * @return rectanglePDF + * @throws DocumentException + * + * @since 0.2 + */ + public static PdfRectangle changeFieldToImage(PdfStamper stamper, + PdfRectangle rect, Image image) throws DocumentException { + + // Ajustando o tamanho da imagem de acordo com o tamanho do campo. + // image.scaleToFit(rect.getWidth(), rect.getHeight()); + image.scaleAbsolute(rect.getWidth(), rect.getHeight()); + + // A rotina abaixo tem por objetivo deixar a imagem posicionada no + // centro + // do field, tanto na perspectiva horizontal como na vertical. + // Caso não se queira mais posicionar a imagem no centro do field, basta + // efetuar a chamada a seguir: + // "image.setAbsolutePosition + // (rect.getLowerLeftX(),rect.getLowerLeftY());" + image.setAbsolutePosition(rect.getLowerLeftX() + + (rect.getWidth() - image.getScaledWidth()) / 2, rect + .getLowerLeftY() + + (rect.getHeight() - image.getScaledHeight()) / 2); + + stamper.getOverContent(rect.getPage()).addImage(image); + + return rect; + } + + /** + * Junta varios arquivos pdf em um só. + * + * @param pdfFiles + * Coleção de array de bytes + * + * @return Arquivo PDF em forma de byte + * @since 0.2 + */ + public static byte[] mergeFiles(Collection pdfFiles) { + + return mergeFiles(pdfFiles, null); + } + + /** + * Junta varios arquivos pdf em um só. + * + * @param pdfFiles + * Coleção de array de bytes + * @param info + * Usa somente as informações + * (title,subject,keywords,author,creator) + * + * @return Arquivo PDF em forma de byte + * + * @since 0.2 + */ + public static byte[] mergeFiles(Collection pdfFiles, PdfDocInfo info) { + + try{ + + ByteArrayOutputStream byteOS = new ByteArrayOutputStream(); + + Document document = new Document(); + + PdfCopy copy = new PdfCopy(document, byteOS); + + document.open(); + + for (byte[] f : pdfFiles) { + + PdfReader reader = new PdfReader(f); + + for (int page = 1; page <= reader.getNumberOfPages(); page++) { + + copy.addPage(copy.getImportedPage(reader, page)); + } + + reader.close(); + } + + document.addCreationDate(); + + if(info != null){ + + document.addAuthor(info.author()); + document.addCreator(info.creator()); + document.addTitle(info.title()); + document.addSubject(info.subject()); + document.addKeywords(info.keywords()); + } + + copy.close(); + document.close(); + byteOS.close(); + + return byteOS.toByteArray(); + + }catch (Exception e) { + return Exceptions.throwIllegalStateException(e); + } + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java new file mode 100644 index 0000000..8dcb9c5 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java @@ -0,0 +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.type.component.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java new file mode 100644 index 0000000..c70bc3c --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java @@ -0,0 +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 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; + +import com.lowagie.text.pdf.PdfDate; + +/** + * 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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocMix.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocMix.java new file mode 100644 index 0000000..f1464a9 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocMix.java @@ -0,0 +1,1202 @@ +/* + * 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 - 14:49: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 - 14:49:07 + * + */ + +package org.jrimum.bopepo.pdf; + +import static org.apache.commons.lang.StringUtils.isBlank; +import static org.apache.commons.lang.StringUtils.isNotBlank; +import static org.jrimum.utilix.Collections.hasElement; +import static org.jrimum.utilix.Objects.checkNotNull; +import static org.jrimum.utilix.Objects.isNotNull; +import static org.jrimum.utilix.Objects.isNull; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.WeakHashMap; + +import org.apache.log4j.Logger; +import org.jrimum.utilix.Collections; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.Strings; + +import com.lowagie.text.Image; +import com.lowagie.text.pdf.AcroFields; +import com.lowagie.text.pdf.PdfBoolean; +import com.lowagie.text.pdf.PdfName; +import com.lowagie.text.pdf.PdfReader; +import com.lowagie.text.pdf.PdfStamper; + +/** + * Classe geradora de documentos PDF utilizando templates com fields. + * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @version 0.2.3 + * + * @since 0.2 + */ +public class PdfDocMix { + + private static final Logger LOG = Logger.getLogger(PdfDocMix.class); + + private PdfReader reader; + private PdfStamper stamper; + private AcroFields form; + + private ByteArrayOutputStream outputStream; + + private Map imagesInUseMap = new WeakHashMap(); + + /** + * Template em byte array. + */ + private byte[] template; + + /** + * Informações sobre o documento. + */ + private PdfDocInfo docInfo = PdfDocInfo.create(); + + /** + * Map dos campos de texto do documento com nome e valor. + */ + private Map txtMap; + + /** + * Map dos campos de imagem do documento com nome e valor. + */ + private Map imgMap; + + /** + * Modo full compression do PDF, default = true. + * + * @since 0.2 + */ + private boolean fullCompression = true; + + /** + * Remove todos os campos do PDF, default = true. + * + * @since 0.2 + */ + private boolean removeFields = true; + + /** + * Indicação de que o título do documento deve ser mostrado barra superior. + * + * @since 0.2 + */ + private Boolean displayDocTitle; + + /** + * Cria uma instância sem o template que será utilizado para construir o + * documento. + * + * @since 0.2 + */ + private PdfDocMix() {} + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param template + * + * @since 0.2 + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix(byte[] template) { + + checkTemplateFile(template); + setTemplate(template); + } + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param templateUrl + * + * @since 0.2 + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix(URL templateUrl) { + + checkTemplateFile(templateUrl); + setTemplate(templateUrl); + } + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param templateInput + * + * @since 0.2 + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix(InputStream templateInput) { + + checkTemplateFile(templateInput); + setTemplate(templateInput); + } + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param templatePath + * + * @since 0.2 + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix(String templatePath) { + + checkTemplatePath(templatePath); + setTemplate(templatePath); + } + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param templateFile + * + * @since 0.2 + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix(File templateFile) { + + checkTemplateFile(templateFile); + setTemplate(templateFile); + } + + /** + * Cria uma instância sem o template que será utilizado para construir o + * documento. + * + * @since 0.2 + * + * @return Esta instância após a operação + */ + public static PdfDocMix create() { + + return new PdfDocMix(); + } + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param template + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public static PdfDocMix createWithTemplate(byte[] template) { + + checkTemplateFile(template); + + return new PdfDocMix(template); + } + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param templateUrl + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public static PdfDocMix createWithTemplate(URL templateUrl) { + + checkTemplateFile(templateUrl); + + return new PdfDocMix(templateUrl); + } + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param templateInput + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public static PdfDocMix createWithTemplate(InputStream templateInput) { + + checkTemplateFile(templateInput); + + return new PdfDocMix(templateInput); + } + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param templatePath + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public static PdfDocMix createWithTemplate(String templatePath) { + + checkTemplatePath(templatePath); + + return new PdfDocMix(templatePath); + } + + /** + * Cria uma instância com o template que será utilizado para construir o + * documento. + * + * @param templateFile + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public static PdfDocMix createWithTemplate(File templateFile) { + + checkTemplateFile(templateFile); + + return new PdfDocMix(templateFile); + } + + /** + * Define o template que será utilizado para construir o + * documento. + * + * @param template + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix withTemplate(byte[] template) { + + checkTemplateFile(template); + + return setTemplate(template); + } + + /** + * Define o template que será utilizado para construir o + * documento. + * + * @param templateUrl + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix withTemplate(URL templateUrl) { + + checkTemplateFile(templateUrl); + + return setTemplate(templateUrl); + } + + /** + * Define o template que será utilizado para construir o + * documento. + * + * @param templateInput + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix withTemplate(InputStream templateInput) { + + checkTemplateFile(templateInput); + + return setTemplate(templateInput); + } + + /** + * Define o template que será utilizado para construir o + * documento. + * + * @param templatePath + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix withTemplate(String templatePath) { + + checkTemplatePath(templatePath); + + return setTemplate(templatePath); + } + + /** + * Define o template que será utilizado para construir o + * documento. + * + * @param templateFile + * + * @since 0.2 + * + * @return Esta instância após a operação + * + * @throws IllegalArgumentException + * Caso o {@code template} seja nulo + */ + public PdfDocMix withTemplate(File templateFile) { + + checkTemplateFile(templateFile); + + return setTemplate(templateFile); + } + + /** + * Retorna um {@code Map} com os campos e seus respectivos textos adicionados nessa + * instância. + * + * @return Map de campo,texto + * + * @since 0.2 + */ + public Map getTextFields() { + return this.txtMap; + } + + /** + * Coloca todos chave-valor na instância, caso uma chave existe o valor será + * substituído. Caso a instância não contenha valores ainda, atribui o + * {@code Map} informado para uso no preenchimento de campos de Texto na + * instância. + * + * @param txtMap + * Map com os campos(key) e textos(value) + * @return Esta instância após a operação + * + * @since 0.2 + */ + public PdfDocMix putAllTexts(Map txtMap) { + + Collections.checkNotEmpty(txtMap, "Campos ausentes!"); + + if (isNull(this.txtMap)) { + this.txtMap = txtMap; + }else{ + this.txtMap.putAll(txtMap); + } + + return this; + } + + /** + * Coloca um par {@code key,value} para uso no preenchimento de campos de + * Texto na instância. + * + * @param name + * Nome do campo + * @param value + * Valor em texto do campo + * + * @return Esta instância após a operação + * + * @since 0.2 + */ + public PdfDocMix put(String name, String value) { + + Strings.checkNotBlank(name, "Nome do campo ausente!"); + + if (isNull(txtMap)) { + this.txtMap = new WeakHashMap(); + } + + this.txtMap.put(name, value); + + return this; + } + + /** + * Retorna um {@code Map} com os campos e suas respectivas imagens + * adicionadas nessa instância. + * + * @return Map de campo,imagem + * + * @since 0.2 + */ + public Map getImageFields() { + return this.imgMap; + } + + /** + * Coloca todos chave-valor na instância, caso uma chave existe o valor + * será substituído. Caso a instância não contenha valores ainda, atribui o + * {@code Map} informado para uso no preenchimento de campos de Imagem na + * instância. + * + * @param imgMap + * Map com os campos(key) e imagens(value) + * @return Esta instância após a operação + * + * @since 0.2 + */ + public PdfDocMix putAllImages(Map imgMap) { + + Collections.checkNotEmpty(imgMap, "Campos ausentes!"); + + if (isNull(this.imgMap)) { + this.imgMap = imgMap; + }else{ + this.imgMap.putAll(imgMap); + } + + return this; + } + + /** + * Coloca um par {@code key,value} para uso no preenchimento de campos de + * Imagem na instância. + * + * @param name + * Nome do campo + * @param value + * Valor em {@link java.awt.Image} do campo + * + * @return Esta instância após a operação + * + * @since 0.2 + */ + public PdfDocMix put(String name, java.awt.Image value) { + + Strings.checkNotBlank(name, "Nome do campo ausente!"); + + if (isNull(imgMap)) { + this.imgMap = new WeakHashMap(); + } + + this.imgMap.put(name, value); + + return this; + } + + /** + * Habilita/Desabilita o modo full compression do PDF veja + * {@link com.lowagie.text.pdf.PdfStamper#setFullCompression()}. + * + *

    + * Itext doc: Sets the document's compression to the new 1.5 mode with + * object streams and xref streams. + *

    + * + * @param option + * Escolha de compressão + * + * @return Esta instância após a operação + * + * @since 0.2 + * + */ + public PdfDocMix withFullCompression(boolean option) { + this.fullCompression = option; + return this; + } + + /** + * Habilita/Desabilita a remoção dos campos do PDF. + * + *

    + * Por padrão os campos são removidos, ou seja, default = true. + *

    + * + * @param option + * Escolha por remoção + * + * @return Esta instância após a operação + * + * @since 0.2 + * + */ + public PdfDocMix removeFields(boolean option) { + this.removeFields = option; + return this; + } + + /** + * Define o Título do documento. + * + * @param title + * + * @return Esta instância após a operação + */ + public PdfDocMix withTitle(String title){ + docInfo.title(title); + return this; + } + + /** + * Define o Autor do documento. + * + * @param author + * + * @return Esta instância após a operação + */ + public PdfDocMix withAuthor(String author){ + docInfo.author(author); + return this; + } + + /** + * Define o Assunto do documento. + * + * @param subject + * + * @return Esta instância após a operação + */ + public PdfDocMix withSubject(String subject){ + docInfo.subject(subject); + return this; + } + + /** + * Define as Palavras-chave do documento. + * + * @param keywords + * + * @return Esta instância após a operação + */ + public PdfDocMix withKeywords(String keywords){ + docInfo.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 PdfDocMix withCreator(String creator){ + docInfo.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 + */ + public PdfDocMix withCreation(Calendar date){ + docInfo.creation(date); + return this; + } + + /** + * Redefine as meta-informações do documento, ex: título, autor, data de + * criação, etc. + * + *

    + * Todas as informações anteriormente atribuídas por: + * {@linkplain #withTitle(String)}, {@linkplain #withSubject(String)}, etc. serão + * substituídas pelo conteúdo do {@code docInfo} nessa operação. + *

    + * + * @param docInfo + * Informações sobre o documento + * + * @return Esta instância após a operação + * + * @see org.jrimum.bopepo.pdf.PdfDocInfo + */ + public PdfDocMix withDocInfo(PdfDocInfo docInfo){ + + checkNotNull(docInfo, "Valor null para docInfo não permitido!"); + + this.docInfo = docInfo; + + return this; + } + + /** + * Define se o título do documento será exibido na barra superior do PDF. + * + *

    + * Caso não seja informada uma opção, prevalece a definição do template PDF. + *

    + * + * @param option + * + * @return Esta instância após a operação + */ + public PdfDocMix withDisplayDocTilteOption(boolean option){ + + this.displayDocTitle = option; + + return this; + } + + /** + * Retorna o documento em forma de arquivo PDF. + * + * @param destPath + * Caminho completo do arquivo o qual o documento será gerado + * @return Documento em forma de arquivo PDF + * + * @since 0.2 + * + */ + public File toFile(String destPath) { + + checkDestPath(destPath); + + return toFile(new File(destPath)); + } + + /** + * Retorna o documento em forma de arquivo PDF. + * + * @param destURL + * URL do arquivo o qual o documento será gerado + * @return Documento em forma de arquivo PDF + * + * @since 0.2 + * + */ + public File toFile(URL destURL){ + + checkDestURL(destURL); + + try { + + return toFile(new File(destURL.toURI())); + + } catch (Exception e) { + + LOG.error( + "Erro durante a criação do arquivo! " + + e.getLocalizedMessage(), e); + + return Exceptions.throwIllegalStateException( + "Erro ao tentar criar arquivo! " + "Causado por " + + e.getLocalizedMessage(), e); + } + } + + /** + * Retorna o documento em forma de arquivo PDF. + * + * @param destFile + * Arquivo o qual o boleto será gerado + * @return Documento em forma de arquivo PDF + * @throws IllegalStateException + * Caso ocorral algum problema imprevisto + * + * @since 0.2 + * + */ + public File toFile(File destFile) { + + checkDestFile(destFile); + + try { + + process(); + + return Files.bytesToFile(destFile, outputStream.toByteArray()); + + } catch (Exception e) { + + LOG.error( + "Erro durante a criação do arquivo! " + + e.getLocalizedMessage(), e); + + return Exceptions.throwIllegalStateException( + "Erro ao tentar criar arquivo! " + "Causado por " + + e.getLocalizedMessage(), e); + } + } + + /** + * Retorna o arquivo PDF em um stream de array de bytes. + * + * @return O PDF em stream + * + * @since 0.2 + * + */ + public ByteArrayOutputStream toStream() { + + try { + + process(); + + return Files.bytesToStream(outputStream.toByteArray()); + + } catch (Exception e) { + + LOG.error( + "Erro durante a criação do stream! " + + e.getLocalizedMessage(), e); + + return Exceptions.throwIllegalStateException( + "Erro durante a criação do stream! " + "Causado por " + + e.getLocalizedMessage(), e); + } + } + + /** + * Retorna o arquivo PDF em array de bytes. + * + * @return O PDF em array de bytes + * + * @since 0.2 + * + */ + public byte[] toBytes() { + + try { + + process(); + + return outputStream.toByteArray(); + + } catch (Exception e) { + + LOG.error( + "Erro durante a criação do array de bytes! " + + e.getLocalizedMessage(), e); + + return Exceptions.throwIllegalStateException( + "Erro durante a criação do array de bytes! " + + "Causado por " + e.getLocalizedMessage(), e); + } + } + + /** + * Retorna o uma cópia do template atual do viewer em array de bytes. + * + * @return Template em bytes + * + * @since 0.2 + * + */ + public byte[] getTemplate() { + + return template.clone(); + } + + /** + * Define o template que será utilizado para construir o documento. + * + * @param template + * + * @return Esta instância após a operação + * + * @since 0.2 + * + */ + private PdfDocMix setTemplate(byte[] template) { + this.template = template; + return this; + } + + /** + * Define o template que será utilizado para construir o documento. + * + * @param templateUrl + * + * @return Esta instância após a operação + * + * @since 0.2 + * + */ + private PdfDocMix setTemplate(URL templateUrl) { + try { + setTemplate(templateUrl.openStream()); + return this; + } catch (Exception e) { + return Exceptions.throwIllegalStateException(e); + } + } + + /** + * Define o template que será utilizado para construir o documento. + * + * @param templateInput + * + * @return Esta instância após a operação + * + * @since 0.2 + * + */ + private PdfDocMix setTemplate(InputStream templateInput) { + try { + setTemplate(Files.toByteArray(templateInput)); + return this; + } catch (Exception e) { + return Exceptions.throwIllegalStateException(e); + } + } + + /** + * Define o template que será utilizado para construir o documento. + * + * @param templatePath + * + * @return Esta instância após a operação + * + * @since 0.2 + * + */ + private PdfDocMix setTemplate(String templatePath) { + setTemplate(new File(templatePath)); + return this; + } + + /** + * Define o template que será utilizado para construir o documento. + * + * @param templateFile + * + * @return Esta instância após a operação + * + * @since 0.2 + * + */ + private PdfDocMix setTemplate(File templateFile) { + try { + setTemplate(Files.fileToBytes(templateFile)); + return this; + } catch (Exception e) { + return Exceptions.throwIllegalStateException(e); + } + } + + /** + * Indica se o viewer foi habilitado a comprimir o pdf do documento gerado. + * + * @see #withFullCompression(boolean) + * + * @return indicativo de compressão + * + * @since 0.2 + * + */ + private boolean isFullCompression() { + return this.fullCompression; + } + + /** + * Indica se o viewer foi habilitado para remover todos os campos do pdf + * gerado. + * + * @see #removeFields + * + * @return indicativo de compressão + * + * @since 0.2 + */ + private boolean isRemoveFields() { + return removeFields; + } + + /** + * Executa os seguintes métodos na sequência: + *
      + *
    1. {@linkplain #init()}
    2. + *
    3. {@linkplain #fillFields()}
    4. + *
    5. {@linkplain #end()}
    6. + *
    + * + * @since 0.2 + */ + private void process() { + + init(); + fillFields(); + end(); + } + + /** + * Inicializa os principais objetos para a escrita dos dados do documento no + * template PDF: {@code stamper}, {@code reader} e {@code outputStream}. + * + * @since 0.2 + */ + private void init() { + + try { + + reader = new PdfReader(getTemplate()); + + outputStream = new ByteArrayOutputStream(); + + stamper = new PdfStamper(reader, outputStream); + + final String JRIMUM = "jrimum.org/bopepo"; + + String creator = docInfo.creator(); + + if(isBlank(creator)){ + withCreator(JRIMUM); + }else{ + withCreator(creator+" by ("+JRIMUM+")"); + } + + if(isNull(docInfo.creation())){ + docInfo.creation(Calendar.getInstance()); + } + + stamper.setMoreInfo((HashMap)docInfo.toMap()); + + if(isNotNull(displayDocTitle)){ + stamper.addViewerPreference(PdfName.DISPLAYDOCTITLE, displayDocTitle ? PdfBoolean.PDFTRUE : PdfBoolean.PDFFALSE); + } + + form = stamper.getAcroFields(); + + } catch (Exception e) { + + Exceptions.throwIllegalStateException(e); + } + } + + /** + * Preenche todos os campos do formulário PDF com os dados do documento + * contido na instância. + * + * @since 0.2 + */ + private void fillFields() { + + setTextFields(); + setImageFields(); + } + + /** + * Adiciona, caso existam, os textos definidos em + * {@linkplain #put(String, String)} ou {@linkplain #putAllTexts(Map)}. + * + * @since 0.2 + */ + private void setTextFields() { + + if (hasElement(txtMap)) { + for (Entry e : txtMap.entrySet()) { + try { + form.setField(e.getKey(), e.getValue()); + } catch (Exception ex) { + Exceptions.throwIllegalStateException(ex); + } + } + } + } + + /** + * Coloca as imagens dos campos no pdf de acordo com o nome dos campos do + * documento atribuídos no map e templante. + * + * @since 0.2 + */ + private void setImageFields() { + + if (hasElement(imgMap)) { + for (Entry e : imgMap.entrySet()) { + setImage(e.getKey(),e.getValue()); + } + } + } + + /** + * Coloca uma imagem no pdf de acordo com o nome do field no templante. + * + * @param fieldName + * @param image + * + * @since 0.2 + */ + private void setImage(String fieldName, java.awt.Image image) { + + float posImgField[]; + + if (isNotBlank(fieldName)) { + + posImgField = form.getFieldPositions(fieldName); + + if (isNotNull(posImgField)) { + try { + PDFs.changeFieldToImage(stamper, posImgField, getPdfImage(image)); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + }else{ + LOG.warn("Posicionamento do campo de imagem nao encontrado! CAMPO: "+fieldName); + } + } + } + + public Image getPdfImage(java.awt.Image image){ + + Image pdfImage = imagesInUseMap.get(image); + + if(isNull(pdfImage)){ + try { + pdfImage = Image.getInstance(image, null); + imagesInUseMap.put(image, pdfImage); + } catch (Exception ex) { + Exceptions.throwIllegalStateException(ex); + } + } + return pdfImage; + } + + /** + * Finaliza a escrita de dados no template através do fechamento do + * {@code stamper}, {@code reader} e {@code outputStream}. + * + * @since 0.2 + */ + private void end() { + + if (isFullCompression()) { + stamper.setFullCompression(); + } + + if (isRemoveFields()) { + stamper.setFreeTextFlattening(true); + stamper.setFormFlattening(true); + reader.removeFields(); + } else { + stamper.setFreeTextFlattening(false); + stamper.setFormFlattening(false); + } + + reader.consolidateNamedDestinations(); + + reader.eliminateSharedStreams(); + + try { + // Send immediately + outputStream.flush(); + // close All in this order + outputStream.close(); + reader.close(); + stamper.close(); + + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + } + + 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 checkDestURL(URL url) { + + Objects.checkNotNull(url, + "URL destinada a geração do(s) documentos(s) nula!"); + } + + private static void checkDestFile(File file) { + + Objects.checkNotNull(file, + "Arquivo destinado a geração do(s) documentos(s) nulo!"); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocReader.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocReader.java new file mode 100644 index 0000000..a6420f7 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfDocReader.java @@ -0,0 +1,301 @@ +/* + * 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 static org.jrimum.utilix.Collections.hasElement; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.jrimum.utilix.Exceptions; + +import com.lowagie.text.pdf.AcroFields; +import com.lowagie.text.pdf.PdfReader; + +/** + * Leitor de documentos PDF. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public class PdfDocReader{ + + private final PdfReader reader; + private final AcroFields form; + private final PdfDocInfo docInfo; + + /** + * Modo de criação não utilizado e não permitido. + */ + @SuppressWarnings("unused") + private PdfDocReader() { + Exceptions.throwIllegalStateException("Estado não permitido!"); + reader = null; + this.form = null; + this.docInfo = null; + } + + /** + * Ler e analisa o documento. + * + * @param pdfIn + * Byte array contendo o documento + */ + @SuppressWarnings("unchecked") + public PdfDocReader(byte[] pdfIn){ + PdfReader r = null; + try { + r = new PdfReader(pdfIn); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + this.reader = r; + this.form = reader.getAcroFields(); + this.docInfo = PdfDocInfo.create(this.reader.getInfo()); + } + + /** + * Ler e analisa o documento. + * + * @param is + * Stream contendo o documento + */ + @SuppressWarnings("unchecked") + public PdfDocReader(InputStream is){ + PdfReader r = null; + try { + r = new PdfReader(is); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + this.reader = r; + this.form = reader.getAcroFields(); + this.docInfo = PdfDocInfo.create(this.reader.getInfo()); + } + + /** + * Ler e analisa o documento. + * + * @param url + * URL do documento + */ + @SuppressWarnings("unchecked") + public PdfDocReader(URL url){ + PdfReader r = null; + try { + r = new PdfReader(url); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + this.reader = r; + this.form = reader.getAcroFields(); + this.docInfo = PdfDocInfo.create(this.reader.getInfo()); + } + + /** + * Ler e analisa o documento. + * + * @param file + * Arquivo contendo o documento + */ + @SuppressWarnings("unchecked") + public PdfDocReader(File file){ + PdfReader r = null; + try { + r = new PdfReader(new FileInputStream(file)); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + this.reader = r; + this.form = reader.getAcroFields(); + this.docInfo = PdfDocInfo.create(this.reader.getInfo()); + } + + /** + * Ler e analisa o documento. + * + * @param pdfIn + * Byte array contendo o documento + * @param ownerPassword + * Senha para ler o documento. + */ + @SuppressWarnings("unchecked") + public PdfDocReader(byte[] pdfIn, byte[] ownerPassword){ + PdfReader r = null; + try { + r = new PdfReader(pdfIn,ownerPassword); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + this.reader = r; + this.form = reader.getAcroFields(); + this.docInfo = PdfDocInfo.create(this.reader.getInfo()); + } + + /** + * Ler e analisa o documento. + * + * @param is + * Stream contendo o documento + * @param ownerPassword + * Senha para ler o documento. + */ + @SuppressWarnings("unchecked") + public PdfDocReader(InputStream is, byte[] ownerPassword){ + PdfReader r = null; + try { + r = new PdfReader(is,ownerPassword); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + this.reader = r; + this.form = reader.getAcroFields(); + this.docInfo = PdfDocInfo.create(this.reader.getInfo()); + } + + /** + * Ler e analisa o documento. + * + * @param url + * URL do documento + * @param ownerPassword + * Senha para ler o documento. + */ + @SuppressWarnings("unchecked") + public PdfDocReader(URL url, byte[] ownerPassword){ + PdfReader r = null; + try { + r = new PdfReader(url,ownerPassword); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + this.reader = r; + this.form = reader.getAcroFields(); + this.docInfo = PdfDocInfo.create(this.reader.getInfo()); + } + + /** + * Ler e analisa o documento. + * + * @param file + * Arquivo contendo o documento + * @param ownerPassword + * Senha para ler o documento. + */ + @SuppressWarnings("unchecked") + public PdfDocReader(File file, byte[] ownerPassword){ + PdfReader r = null; + try { + r = new PdfReader(new FileInputStream(file),ownerPassword); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + this.reader = r; + this.form = reader.getAcroFields(); + this.docInfo = PdfDocInfo.create(this.reader.getInfo()); + } + + /** + * Retorna, ou não, o valor de um campo procurando pelo seu nome + * ("fully qualified" ou não). + * + * @param name + * Nome do campo + * @return Valor do campo + */ + public String getField(String name){ + + return this.form.getField(name); + } + + /** + * Retorna todos os nomes de campos contidos no documento. Os nomes são + * dados na forma "fully qualified". + * + * @return Coleção de nomes em um {@linkplain java.util.Set} + */ + @SuppressWarnings("unchecked") + public Collection getFieldsNames() { + + return form.getFields().keySet(); + } + + /** + * Retorna todos os campos contidos no documento. Os nomes dos campos são + * dados na forma "fully qualified". + * + * @return Map(campo,valor) + */ + public Map getFields(){ + + Collection names = getFieldsNames(); + + if(hasElement(names)){ + Map fields = new HashMap(names.size()); + for(String name : names){ + fields.put(name, getField(name)); + } + return fields; + } + + return Collections.emptyMap(); + } + + /** + * Retorna as informações sobre o documento: Título, Autor, etc. + * + * @return info + */ + public PdfDocInfo getInfo(){ + + return this.docInfo; + } + + /** + * Fecha o leitor. Necessário para liberar o recurso. + */ + public void close(){ + try { + this.reader.close(); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfRectangle.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfRectangle.java new file mode 100644 index 0000000..8d28798 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/PdfRectangle.java @@ -0,0 +1,121 @@ +/* + * 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 - 12:57: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 - 12:57:00 + * + */ + +package org.jrimum.bopepo.pdf; + +import com.lowagie.text.Rectangle; + +/** + *

    + * Classe adapter para facilitar as operações com os fields pdf com a lib iText. + *

    + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public class PdfRectangle extends Rectangle { + + private int page; + + /** + *Constrói um retângulo com os seguintes valores do array: + *[page, llx, lly, urx, ury]. + */ + public PdfRectangle(float[] positions) { + super(positions[1], positions[2], positions[3], positions[4]); + page = (int) positions[0]; + } + + /** + * @param llx - lower left x + * @param lly - lower left y + * @param urx - upper right x + * @param ury - upper right y + */ + public PdfRectangle(float llx, float lly, float urx, float ury) { + super(llx, lly, urx, ury); + } + + /** + * Cria um retângulo iniciando da origem (0,0). + * + * @param urx - upper right x + * @param ury - upper right y + */ + public PdfRectangle(float urx, float ury) { + super(urx, ury); + } + + /** + * Cria um retângulo a partir do objeto Rectangle. + * @param rect + */ + public PdfRectangle(Rectangle rect) { + super(rect); + } + + /** + * @return page + */ + public int getPage() { + return page; + } + + /** + * @return llx - lower left x + */ + public float getLowerLeftX() { + return this.llx; + } + + /** + * @return lly - lower left y + */ + public float getLowerLeftY() { + return lly; + } + + /** + * + * @return urx - upper right x + */ + public float getUpperRightX() { + return urx; + } + + /** + * @return ury - upper right y + */ + public float getUpperRightY() { + return ury; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/package-info.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/package-info.java new file mode 100644 index 0000000..8b84e60 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/pdf/package-info.java @@ -0,0 +1,35 @@ +/* + * 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: 14/08/2010 - 20:50:14 + * + * ================================================================================ + * + * 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: 14/08/2010 - 20:50:14 + * + */ + +/** + * Classes com o propósito de suportar funcionalidades de manipulação de documentos PDF. + * + * @author Gilmar P.S.L + */ +package org.jrimum.bopepo.pdf; \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/BoletoCampo.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/BoletoCampo.java new file mode 100644 index 0000000..4e77144 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/BoletoCampo.java @@ -0,0 +1,107 @@ +/* + * Copyright 2013 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: 29/08/2013 - 19:19:25 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 29/08/2013 - 19:19:25 + * + */ + +package org.jrimum.bopepo.view; + +/** + * Enumeração com todos os campos padrão FEBRABAN utilizados no boleto. + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public enum BoletoCampo { + + /* + * Campos em ordem alfabetica + */ + + //Ficha de Compensação + txtFcAceite, + txtFcAgenciaCodigoCedente, + txtFcCarteira, + txtFcCedente, + txtFcCodBanco, + txtFcCodigoBarra, + txtFcDataDocumento, + txtFcDataProcessamento, + txtFcDataVencimento, + txtFcDescontoAbatimento, + txtFcEspecie, + txtFcEspecieDocumento, + txtFcInstrucaoAoCaixa1, + txtFcInstrucaoAoCaixa2, + txtFcInstrucaoAoCaixa3, + txtFcInstrucaoAoCaixa4, + txtFcInstrucaoAoCaixa5, + txtFcInstrucaoAoCaixa6, + txtFcInstrucaoAoCaixa7, + txtFcInstrucaoAoCaixa8, + txtFcLinhaDigitavel, + txtFcLocalPagamento, + txtFcLogoBanco, + txtFcMoraMulta, + txtFcNossoNumero, + txtFcNumeroDocumento, + txtFcOutraDeducao, + txtFcOutroAcrescimo, + txtFcQuantidade, + txtFcSacadoL1, + txtFcSacadoL2, + txtFcSacadoL3, + txtFcSacadorAvalistaL1, + txtFcSacadorAvalistaL2, + txtFcSacadorAvalistaL3, + txtFcUsoBanco, + txtFcValor, + txtFcValorCobrado, + txtFcValorDocumento, + //Recibo do Sacado + txtRsAgenciaCodigoCedente, + txtRsCedente, + txtRsCodBanco, + txtRsCpfCnpj, + txtRsDataVencimento, + txtRsDescontoAbatimento, + txtRsEspecie, + txtRsInstrucaoAoSacado, + txtRsLinhaDigitavel, + txtRsLogoBanco, + txtRsMoraMulta, + txtRsNossoNumero, + txtRsNumeroDocumento, + txtRsOutraDeducao, + txtRsOutroAcrescimo, + txtRsQuantidade, + txtRsSacado, + txtRsValorCobrado, + txtRsValorDocumento +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/BoletoViewer.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/BoletoViewer.java new file mode 100644 index 0000000..c0b28c3 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/BoletoViewer.java @@ -0,0 +1,1453 @@ +/* + * 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.lang.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.text.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/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/PdfViewer.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/PdfViewer.java new file mode 100644 index 0000000..43a9a7f --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/PdfViewer.java @@ -0,0 +1,478 @@ +/* + * 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:05:16 + * + * ================================================================================ + * + * 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:05:16 + * + */ + +package org.jrimum.bopepo.view; + +import static org.jrimum.utilix.Objects.isNull; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.log4j.Logger; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.pdf.Files; +import org.jrimum.bopepo.pdf.PdfDocMix; +import org.jrimum.bopepo.view.info.BoletoInfoViewBuilder; +import org.jrimum.utilix.Exceptions; + +/** + *

    + * Classe utilizada para preencher o PDF do boleto com os dados do título e boleto. + *

    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +class PdfViewer { + + private static Logger log = Logger.getLogger(PdfViewer.class); + + private final ResourceBundle resourceBundle; + + private PdfDocMix doc; + private Boleto boleto; + private byte[] template; + + /** + * Para uso interno do componente + * + * @since 0.2 + * + */ + protected PdfViewer() { + + resourceBundle = new ResourceBundle(); + doc = PdfDocMix.create(); + } + + /** + * Para uso interno do componente + * + * @param boleto + * + * @since 0.2 + * + */ + protected PdfViewer(Boleto boleto) { + + this(); + + this.boleto = boleto; + } + + /** + * Para uso interno do componente + * + * @param boleto Boleto para visualização + * @param template Template a ser utilizado na visualização + * + * @since 0.2 + * + */ + protected PdfViewer(Boleto boleto, byte[] template) { + + this(boleto); + + setTemplate(template); + } + + /** + * Retorna o boleto em forma de arquivo PDF. + * + * @param destPath + * Caminho completo do arquivo o qual o boleto será gerado + * @return Boleto em forma de arquivo PDF + * + * @since 0.2 + * + */ + protected File getFile(String destPath) { + + + return getFile(new File(destPath)); + } + + /** + * Retorna o boleto em forma de arquivo PDF. + * + * @param destFile + * Arquivo o qual o boleto será gerado + * @return Boleto em forma de arquivo PDF + * @throws IllegalStateException + * Caso ocorral algum problema imprevisto + * + * @since 0.2 + * + */ + protected File getFile(File destFile) { + + try { + + processarPdf(); + + return doc.toFile(destFile); + + } catch (Exception e) { + + log.error("Erro durante a criação do arquivo! " + e.getLocalizedMessage(), e); + + return Exceptions.throwIllegalStateException("Erro ao tentar criar arquivo! " +"Causado por " + e.getLocalizedMessage(), e); + } + } + + /** + * Retorna o arquivo PDF em um stream de array de bytes. + * + * @return O PDF em stream + * + * @since 0.2 + * + */ + protected ByteArrayOutputStream getStream() { + + try { + + processarPdf(); + + return doc.toStream(); + + } catch (Exception e) { + + log.error("Erro durante a criação do stream! " + e.getLocalizedMessage(), e); + + return Exceptions.throwIllegalStateException("Erro durante a criação do stream! " +"Causado por " + e.getLocalizedMessage(), e); + } + } + + /** + * Retorna o arquivo PDF em array de bytes. + * + * @return O PDF em array de bytes + * + * @since 0.2 + * + */ + protected byte[] getBytes() { + + try { + + processarPdf(); + + return doc.toBytes(); + + } catch (Exception e) { + + log.error("Erro durante a criação do array de bytes! " + e.getLocalizedMessage(), e); + + return Exceptions.throwIllegalStateException("Erro durante a criação do array de bytes! " +"Causado por " + e.getLocalizedMessage(), e); + } + } + + /** + * Retorna o template atual do viewer em array de bytes. + * + * @return Template em bytes + * + * @since 0.2 + * + */ + protected byte[] getTemplate() { + return template; + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param template + * + * @since 0.2 + * + */ + protected void setTemplate(byte[] template) { + this.template = template; + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param templateUrl + * + * @since 0.2 + * + */ + protected void setTemplate(URL templateUrl) { + try { + setTemplate(templateUrl.openStream()); + } catch (IOException e) { + Exceptions.throwIllegalStateException(e); + } + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param templateInput + * + * @since 0.2 + * + */ + protected void setTemplate(InputStream templateInput) { + try { + setTemplate(Files.toByteArray(templateInput)); + } catch (IOException e) { + Exceptions.throwIllegalStateException(e); + } + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param templatePath + * + * @since 0.2 + * + */ + protected void setTemplate(String templatePath) { + setTemplate(new File(templatePath)); + } + + /** + * Define o template que será utilizado para construir o boleto. + * + * @param templateFile + * + * @since 0.2 + * + */ + protected void setTemplate(File templateFile) { + try { + setTemplate(Files.fileToBytes(templateFile)); + } catch (IOException e) { + Exceptions.throwIllegalStateException(e); + } + } + + /** + * Habilita o modo full compression do PDF veja + * {@link com.lowagie.text.pdf.PdfStamper#setFullCompression()}. + * + *

    + * Itext doc: Sets the document's compression to the new 1.5 mode with + * object streams and xref streams. + *

    + * + * @param option + * Escolha de compressão. + * + * @since 0.2 + * + */ + protected void setFullCompression(boolean option){ + doc.withFullCompression(option); + } + + /** + * Define o título do documento PDF gerado. + * + * @param title + * para ser exibido como título do documento PDF + * + * @since 0.2 + */ + protected void setTitle(String title){ + doc.withTitle(title); + } + + /** + * Define se o título do documento PDF gerado será mostrado ou não (padrão true). + * + * @param option + * para exibir título do documento PDF (true) + * + * @since 0.2 + */ + protected void setDisplayTitle(boolean option) { + doc.withDisplayDocTilteOption(option); + } + + /** + * Define o autor do documento PDF gerado. + * + * @param author + * do documento PDF + * + * @since 0.2 + */ + protected void setAuthor(String author){ + doc.withAuthor(author); + } + + /** + * Define o assunto do documento PDF gerado. + * + * @param subject + * do documento PDF + * + * @since 0.2 + */ + protected void setSubject(String subject) { + doc.withSubject(subject); + } + + /** + * Define as palavras chave do documento PDF gerado. + * + * @param keywords + * do documento PDF + * + * @since 0.2 + */ + protected void setKeywords(String keywords) { + doc.withKeywords(keywords); + } + + /** + * Define se o os campos do documento PDF gerado devem ser removidos ou não (padrão true). + * + * @param option + * para remover campos do documento PDF (true) + * + * @since 0.2 + */ + protected void setRemoveFields(boolean option) { + doc.removeFields(option); + } + + /** + * @return the boleto + * + * @since 0.2 + * + */ + protected Boleto getBoleto() { + return this.boleto; + } + + /** + * Define o boleto a ser usado no preenchimento do PDF. + * + * @param boleto + * + * @since 0.2 + */ + protected void setBoleto(Boleto boleto) { + this.boleto = boleto; + } + + + /** + * Processa o PDF colocando os dados do Boleto no PDF. + * + * @since 0.2 + */ + private void processarPdf(){ + + byte[] template = null; + + if (isTemplateFromResource()) { + template = getTemplateFromResource(); + } else { + template = getTemplate(); + } + + doc.withTemplate(template); + + BoletoInfoViewBuilder builder = new BoletoInfoViewBuilder(this.resourceBundle,this.boleto).build(); + + doc.putAllTexts(builder.texts()); + doc.putAllImages(builder.images()); + } + + /** + * Retorna o template padrão a ser usado, dependendo se o boleto é com ou + * sem sacador avalsita. + * + * @return URL do template padrão + * + * @since 0.2 + * + */ + private byte[] getTemplateFromResource() { + + if (boleto.getTitulo().hasSacadorAvalista()) { + + return resourceBundle.getTemplateComSacadorAvalista(); + + } else { + + return resourceBundle.getTemplateSemSacadorAvalista(); + } + } + + /** + * Verifica se o template que será utilizado virá do resource ou é externo, + * ou seja, se o usuário definiu ou não um template. + * + * @return true caso o template que pode ser definido pelo usuário for null; + * false caso o usuário tenha definido um template. + * + * @since 0.2 + * + */ + private boolean isTemplateFromResource() { + + return isNull(getTemplate()); + } + + + /** + * Exibe os valores de instância. + * + * @see org.jrimum.utilix.Objects#toString() + */ + @Override + public String toString() { + + ToStringBuilder tsb = new ToStringBuilder(this); + + tsb.append(boleto); + + return tsb.toString(); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java new file mode 100644 index 0000000..ac1fae3 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java @@ -0,0 +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; + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/ResourceBundle.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/ResourceBundle.java new file mode 100644 index 0000000..3c8c98d --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/ResourceBundle.java @@ -0,0 +1,185 @@ +/* + * 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: 27/09/2011 - ‎16:11:14 + * + * ================================================================================ + * + * 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: 27/09/2011 - ‎16:11:14 + * + */ + +package org.jrimum.bopepo.view; + +import static java.lang.String.format; +import static org.jrimum.utilix.Objects.isNull; + +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Map; +import java.util.TreeMap; + +import javax.imageio.ImageIO; + +import org.jrimum.bopepo.pdf.Files; +import org.jrimum.utilix.ClassLoaders; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.text.Strings; + +/** + * Acessa os resources usados pelo Bopepo e os mantém nesta instância para as + * próximas chamadas. + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public class ResourceBundle { + + /** + * Nome do arquivo pdf. + */ + public static final String BOLETO_TEMPLATE_COM_SACADOR_AVALISTA = "BoletoTemplateComSacadorAvalista.pdf"; + + /** + * Nome do arquivo pdf. + */ + public static final String BOLETO_TEMPLATE_SEM_SACADOR_AVALISTA = "BoletoTemplateSemSacadorAvalista.pdf"; + + /** + * Imagens usadas na instancia. + */ + private final Map imagensLogoBanco; + + /** + * Template do projeto usando na isntancia. + */ + private byte[] defaultTemplateComSacadorAvalista; + + /** + * Template do projeto usando na isntancia. + */ + private byte[] defaultTemplateSemSacadorAvalista; + + /** + * Inicia a instancia com os valores padrões necessários. + */ + public ResourceBundle(){ + imagensLogoBanco = new TreeMap(); + } + + /** + * + * + * @return template em bytes + */ + public byte[] getTemplateComSacadorAvalista() { + + if (isNull(defaultTemplateComSacadorAvalista)) { + + defaultTemplateComSacadorAvalista = loadPdf("BoletoTemplateComSacadorAvalista.pdf"); + } + + return defaultTemplateComSacadorAvalista; + } + + public byte[] getTemplateSemSacadorAvalista() { + + if (isNull(defaultTemplateSemSacadorAvalista)) { + + defaultTemplateSemSacadorAvalista = loadPdf("BoletoTemplateSemSacadorAvalista.pdf"); + } + + return defaultTemplateSemSacadorAvalista; + } + + public Image getLogotipoDoBanco(String codigo){ + + Image logo = imagensLogoBanco.get(codigo); + + if(isNull(logo)){ + logo = loadLogotipoDoBanco(codigo); + imagensLogoBanco.put(codigo, logo); + } + + return logo; + } + + private BufferedImage loadLogotipoDoBanco(String codigo){ + + final String path = "/img/%s.png"; + + Strings.checkNotBlank(codigo,"Codigo do banco não informado!"); + + final String logo = format(path, codigo); + + URL url = ClassLoaders.getResource(logo, this.getClass()); + + Objects.checkNotNull(url, format("Logo não \"%s\" não encontrada!",logo)); + + BufferedImage imageLogo = null; + + try { + imageLogo = ImageIO.read(url); + Objects.checkNotNull(imageLogo); + } catch (IOException e) { + Exceptions.throwIllegalStateException("Erro ao tentar ler a imagem logotipo do banco "+codigo,e); + } + + return imageLogo; + } + + private byte[] loadPdf(String fileName){ + + byte[] pdf = null; + InputStream is = null; + + try { + + is = ClassLoaders.getResource( + "/pdf/"+fileName, + this.getClass()).openStream(); + + pdf = Files.toByteArray(is); + + } catch (Exception e) { + + Exceptions.throwIllegalStateException(e); + + }finally{ + if(is != null){ + try { + is.close(); + } catch (Exception e) { + Exceptions.throwIllegalStateException(e); + } + } + } + + return pdf; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/BoletoInfoView.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/BoletoInfoView.java new file mode 100644 index 0000000..f1c3ac3 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/BoletoInfoView.java @@ -0,0 +1,50 @@ +/* + * Copyright 2013 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: 17/10/2013 - 00:09:30 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 17/10/2013 - 00:09:30 + * + */ + +package org.jrimum.bopepo.view.info; + +import java.awt.Image; +import java.util.Map; + +/** + * Contém todos os campos de imagem e texto usados para preencher o boleto. + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public interface BoletoInfoView { + + public Map texts(); + + public Map images(); +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/BoletoInfoViewBuilder.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/BoletoInfoViewBuilder.java new file mode 100644 index 0000000..4af5223 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/BoletoInfoViewBuilder.java @@ -0,0 +1,308 @@ +/* + * Copyright 2013 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: 17/12/2013 - 19:09:47 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 17/12/2013 - 19:09:47 + * + */ + +package org.jrimum.bopepo.view.info; + +import static org.jrimum.utilix.Objects.isNotNull; + +import java.awt.Image; +import java.util.Map; +import java.util.Map.Entry; +import java.util.WeakHashMap; + +import org.apache.log4j.Logger; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.BoletoCampo; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.BoletoInfoCampoView; +import org.jrimum.bopepo.view.info.campo.BoletoInfoCampoViewFactory; +import org.jrimum.utilix.Collections; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; + +/** + * Lê os dados do Boleto e monta-os para uso em {@linkplain #texts()} e {@linkplain #images()}. + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public class BoletoInfoViewBuilder { + + private static Logger log = Logger.getLogger(BoletoInfoViewBuilder.class); + + private final Map text; + private final Map image; + + private final Map boletoTextosExtra; + private final Map boletoImagensExtra; + + private final BoletoInfoCampoView boletoInfoCampo; + + + /** + * Modo de instanciação não permitido. + * + * @throws IllegalStateException + * Caso haja alguma tentativa de utilização deste construtor. + */ + @SuppressWarnings("unused") + private BoletoInfoViewBuilder(){ + Exceptions.throwIllegalStateException("Instanciação não permitida!"); + text = null; + image = null; + boletoTextosExtra = null; + boletoImagensExtra = null; + boletoInfoCampo = null; + } + + public BoletoInfoViewBuilder(ResourceBundle resourceBundle, Boleto boleto){ + + Objects.checkNotNull(resourceBundle); + Objects.checkNotNull(boleto); + + text = new WeakHashMap(); + image = new WeakHashMap(); + + this.boletoTextosExtra = boleto.getTextosExtras(); + this.boletoImagensExtra = boleto.getImagensExtras(); + this.boletoInfoCampo = BoletoInfoCampoViewFactory.create(resourceBundle, boleto); + } + + public Map texts(){ + + return new WeakHashMap(text); + } + + public Map images(){ + + return new WeakHashMap(image); + } + + /** + * Preenche todos os campos com os dados do boleto contido na instância. + * + * @return Esta instância após operação + * + * @since 0.2 + */ + public BoletoInfoViewBuilder build(){ + + setLogotipoDoBanco(); + setCodigoDoBanco(); + setLinhaDigitavel(); + setCedente(); + setAgenciaCodigoCedente(); + setEspecie(); + setNossoNumero(); + setNumeroDocumento(); + setCprfCedente(); + setDataVencimeto(); + setValorDocumento(); + setDescontoAbatimento(); + setOutraDeducao(); + setMoraMulta(); + setOutroAcrescimo(); + setValorCobrado(); + setInstrucaoAoSacado(); + setInstrucaoAoCaixa(); + setSacado(); + setLocalPagamento(); + setDataDocumento(); + setEspecieDoc(); + setAceite(); + setDataProcessamento(); + setSacadorAvalista(); + setCodigoDeBarras(); + setCarteira(); + setTodosOsCamposTexto(); + setTodosOsCamposImagem(); + + return this; + } + + private void setInstrucaoAoSacado(){ + text.put(BoletoCampo.txtRsInstrucaoAoSacado.name(), boletoInfoCampo.getTextoRsInstrucaoAoSacado()); + } + + private void setCprfCedente(){ + text.put(BoletoCampo.txtRsCpfCnpj.name(), boletoInfoCampo.getTextoRsCpfCnpj()); + } + + private void setDataProcessamento(){ + text.put(BoletoCampo.txtFcDataProcessamento.name(), boletoInfoCampo.getTextoFcDataProcessamento()); + } + + private void setLocalPagamento(){ + text.put(BoletoCampo.txtFcLocalPagamento.name(), boletoInfoCampo.getTextoFcLocalPagamento()); + } + + private void setAceite(){ + text.put(BoletoCampo.txtFcAceite.name(), boletoInfoCampo.getTextoFcAceite()); + } + + private void setEspecieDoc(){ + text.put(BoletoCampo.txtFcEspecieDocumento.name(), boletoInfoCampo.getTextoFcEspecieDocumento()); + } + + private void setDataDocumento(){ + text.put(BoletoCampo.txtFcDataDocumento.name(), boletoInfoCampo.getTextoFcDataDocumento()); + } + + private void setCarteira(){ + text.put(BoletoCampo.txtFcCarteira.name(), boletoInfoCampo.getTextoFcCarteira()); + } + + private void setSacado(){ + text.put(BoletoCampo.txtRsSacado.name(), boletoInfoCampo.getTextoRsSacado()); + text.put(BoletoCampo.txtFcSacadoL1.name(), boletoInfoCampo.getTextoFcSacadoL1()); + text.put(BoletoCampo.txtFcSacadoL2.name(), boletoInfoCampo.getTextoFcSacadoL2()); + text.put(BoletoCampo.txtFcSacadoL3.name(), boletoInfoCampo.getTextoFcSacadoL3()); + } + + private void setSacadorAvalista(){ + text.put(BoletoCampo.txtFcSacadorAvalistaL1.name(), boletoInfoCampo.getTextoFcSacadorAvalistaL1()); + text.put(BoletoCampo.txtFcSacadorAvalistaL2.name(), boletoInfoCampo.getTextoFcSacadorAvalistaL2()); + text.put(BoletoCampo.txtFcSacadorAvalistaL3.name(), boletoInfoCampo.getTextoFcSacadorAvalistaL3()); + } + + private void setInstrucaoAoCaixa(){ + text.put(BoletoCampo.txtFcInstrucaoAoCaixa1.name(), boletoInfoCampo.getTextoFcInstrucaoAoCaixa1()); + text.put(BoletoCampo.txtFcInstrucaoAoCaixa2.name(), boletoInfoCampo.getTextoFcInstrucaoAoCaixa2()); + text.put(BoletoCampo.txtFcInstrucaoAoCaixa3.name(), boletoInfoCampo.getTextoFcInstrucaoAoCaixa3()); + text.put(BoletoCampo.txtFcInstrucaoAoCaixa4.name(), boletoInfoCampo.getTextoFcInstrucaoAoCaixa4()); + text.put(BoletoCampo.txtFcInstrucaoAoCaixa5.name(), boletoInfoCampo.getTextoFcInstrucaoAoCaixa5()); + text.put(BoletoCampo.txtFcInstrucaoAoCaixa6.name(), boletoInfoCampo.getTextoFcInstrucaoAoCaixa6()); + text.put(BoletoCampo.txtFcInstrucaoAoCaixa7.name(), boletoInfoCampo.getTextoFcInstrucaoAoCaixa7()); + text.put(BoletoCampo.txtFcInstrucaoAoCaixa8.name(), boletoInfoCampo.getTextoFcInstrucaoAoCaixa8()); + } + + private void setMoraMulta(){ + text.put(BoletoCampo.txtRsMoraMulta.name(), boletoInfoCampo.getTextoRsMoraMulta()); + text.put(BoletoCampo.txtFcMoraMulta.name(), boletoInfoCampo.getTextoFcMoraMulta()); + } + + private void setOutroAcrescimo(){ + text.put(BoletoCampo.txtRsOutroAcrescimo.name(), boletoInfoCampo.getTextoRsOutroAcrescimo()); + text.put(BoletoCampo.txtFcOutroAcrescimo.name(), boletoInfoCampo.getTextoFcOutroAcrescimo()); + } + + private void setOutraDeducao(){ + text.put(BoletoCampo.txtRsOutraDeducao.name(), boletoInfoCampo.getTextoRsOutraDeducao()); + text.put(BoletoCampo.txtFcOutraDeducao.name(), boletoInfoCampo.getTextoFcOutraDeducao()); + } + + private void setDescontoAbatimento(){ + text.put(BoletoCampo.txtRsDescontoAbatimento.name(), boletoInfoCampo.getTextoRsDescontoAbatimento()); + text.put(BoletoCampo.txtFcDescontoAbatimento.name(), boletoInfoCampo.getTextoFcDescontoAbatimento()); + } + private void setValorDocumento(){ + text.put(BoletoCampo.txtRsValorDocumento.name(), boletoInfoCampo.getTextoRsValorDocumento()); + text.put(BoletoCampo.txtFcValorDocumento.name(), boletoInfoCampo.getTextoFcValorDocumento()); + } + + private void setValorCobrado(){ + text.put(BoletoCampo.txtRsValorCobrado.name(), boletoInfoCampo.getTextoRsValorCobrado()); + text.put(BoletoCampo.txtFcValorCobrado.name(), boletoInfoCampo.getTextoFcValorCobrado()); + } + + private void setDataVencimeto(){ + text.put(BoletoCampo.txtRsDataVencimento.name(), boletoInfoCampo.getTextoRsDataVencimento()); + text.put(BoletoCampo.txtFcDataVencimento.name(), boletoInfoCampo.getTextoFcDataVencimento()); + } + + private void setNumeroDocumento(){ + text.put(BoletoCampo.txtRsNumeroDocumento.name(), boletoInfoCampo.getTextoRsNumeroDocumento()); + text.put(BoletoCampo.txtFcNumeroDocumento.name(), boletoInfoCampo.getTextoFcNumeroDocumento()); + } + + private void setCedente(){ + text.put(BoletoCampo.txtRsCedente.name(), boletoInfoCampo.getTextoRsCedente()); + text.put(BoletoCampo.txtFcCedente.name(), boletoInfoCampo.getTextoFcCedente()); + } + + private void setEspecie(){ + text.put(BoletoCampo.txtRsEspecie.name(), boletoInfoCampo.getTextoRsEspecie()); + text.put(BoletoCampo.txtFcEspecie.name(), boletoInfoCampo.getTextoFcEspecie()); + } + + private void setCodigoDoBanco(){ + text.put(BoletoCampo.txtRsCodBanco.name(), boletoInfoCampo.getTextoRsCodigoBanco()); + text.put(BoletoCampo.txtFcCodBanco.name(), boletoInfoCampo.getTextoFcCodigoBanco()); + } + + private void setAgenciaCodigoCedente(){ + text.put(BoletoCampo.txtRsAgenciaCodigoCedente.name(), boletoInfoCampo.getTextoRsAgenciaCodigoCedente()); + text.put(BoletoCampo.txtFcAgenciaCodigoCedente.name(), boletoInfoCampo.getTextoFcAgenciaCodigoCedente()); + } + + private void setNossoNumero(){ + text.put(BoletoCampo.txtRsNossoNumero.name(), boletoInfoCampo.getTextoRsNossoNumero()); + text.put(BoletoCampo.txtFcNossoNumero.name(), boletoInfoCampo.getTextoFcNossoNumero()); + } + + private void setLogotipoDoBanco(){ + if (isNotNull(boletoInfoCampo.getImagemFcLogoBanco())) { + image.put(BoletoCampo.txtRsLogoBanco.name(),boletoInfoCampo.getImagemRsLogoBanco()); + image.put(BoletoCampo.txtFcLogoBanco.name(),boletoInfoCampo.getImagemFcLogoBanco()); + } else { + log.warn("Banco sem imagem definida. O nome da instituição será usado como logo."); + text.put(BoletoCampo.txtRsLogoBanco.name(),boletoInfoCampo.getTextoRsLogoBanco()); + text.put(BoletoCampo.txtFcLogoBanco.name(),boletoInfoCampo.getTextoFcLogoBanco()); + } + } + + private void setLinhaDigitavel(){ + text.put(BoletoCampo.txtRsLinhaDigitavel.name(), boletoInfoCampo.getTextoRsLinhaDigitavel()); + text.put(BoletoCampo.txtFcLinhaDigitavel.name(), boletoInfoCampo.getTextoFcLinhaDigitavel()); + } + + private void setCodigoDeBarras(){ + image.put(BoletoCampo.txtFcCodigoBarra.name(), boletoInfoCampo.getImagemFcCodigoBarra()); + } + + private void setTodosOsCamposTexto(){ + if (Collections.hasElement(this.boletoTextosExtra)) { + for (Entry entry : boletoTextosExtra.entrySet()) { + text.put(entry.getKey(), entry.getValue()); + } + } + } + + private void setTodosOsCamposImagem(){ + if (Collections.hasElement(boletoImagensExtra)) { + for (Entry entry : boletoImagensExtra.entrySet()) { + image.put(entry.getKey(), entry.getValue()); + } + } + } +} \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/AbstractBoletoInfoCampoView.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/AbstractBoletoInfoCampoView.java new file mode 100644 index 0000000..bb259b3 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/AbstractBoletoInfoCampoView.java @@ -0,0 +1,343 @@ +/* + * Copyright 2014 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/01/2014 - 22:11:18 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 22:11:18 + * + */ + +package org.jrimum.bopepo.view.info.campo; + + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.apache.commons.lang.StringUtils.isNotBlank; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoAgenciaCodigoCedente.getTextoAgenciaCodigoCedente; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoCodigoBanco.getTextoCodigoDoBanco; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoEndereco.getTextoEnderecoLinha1; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoEndereco.getTextoEnderecoLinha2; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoLogoBanco.getImagemBanco; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoNossoNumero.getTextoNossoNumero; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoPessoa.getTextoNomeCprfDaPessoa; +import static org.jrimum.utilix.Objects.isNotNull; +import static org.jrimum.utilix.Objects.whenNull; +import static org.jrimum.utilix.text.DateFormat.DDMMYYYY_B; +import static org.jrimum.utilix.text.DecimalFormat.MONEY_DD_BR; + +import java.awt.Image; +import java.math.BigDecimal; +import java.util.Date; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.pdf.CodigoDeBarras; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; + +/** + * @author Gilmar P.S.L. + * + */ +public abstract class AbstractBoletoInfoCampoView implements BoletoInfoCampoView{ + + private final ResourceBundle resourceBundle; + + private final Boleto boleto; + + /** + * Modo de instanciação não permitido. + * + * @throws IllegalStateException + * Caso haja alguma tentativa de utilização deste construtor. + */ + @SuppressWarnings("unused") + private AbstractBoletoInfoCampoView(){ + Exceptions.throwIllegalStateException("Instanciação não permitida!"); + resourceBundle = null; + boleto = null; + } + + public AbstractBoletoInfoCampoView(ResourceBundle resourceBundle, Boleto boleto){ + Objects.checkNotNull(resourceBundle); + Objects.checkNotNull(boleto); + this.resourceBundle = resourceBundle; + this.boleto = boleto; + } + + public String getTextoRsInstrucaoAoSacado() { + return getValue(boleto.getInstrucaoAoSacado()); + } + + public String getTextoRsCpfCnpj() { + return boleto.getTitulo().getCedente().getCPRF().getCodigoFormatado(); + } + + public String getTextoRsSacado(){ + return getTextoFcSacadoL1(); + } + + public String getTextoFcSacadoL1(){ + return getTextoNomeCprfDaPessoa(boleto.getTitulo().getSacado()); + } + + public String getTextoFcSacadoL2(){ + return getTextoEnderecoLinha1(boleto.getTitulo().getSacado()); + } + + public String getTextoFcSacadoL3(){ + return getTextoEnderecoLinha2(boleto.getTitulo().getSacado()); + } + + public String getTextoFcSacadorAvalistaL1(){ + return getTextoNomeCprfDaPessoa(boleto.getTitulo().getSacadorAvalista()); + } + + public String getTextoFcSacadorAvalistaL2(){ + return getTextoEnderecoLinha1(boleto.getTitulo().getSacadorAvalista()); + } + + public String getTextoFcSacadorAvalistaL3(){ + return getTextoEnderecoLinha2(boleto.getTitulo().getSacadorAvalista()); + } + + public String getTextoFcDataProcessamento(){ + return getValue(boleto.getDataDeProcessamento()); + } + + public String getTextoFcAceite(){ + return getValue(boleto.getTitulo().getAceite()); + } + + public String getTextoFcEspecieDocumento() { + return whenNull(boleto.getTitulo().getTipoDeDocumento(), EMPTY, boleto.getTitulo().getTipoDeDocumento().getSigla()); + } + + public String getTextoFcDataDocumento(){ + return getValue(boleto.getTitulo().getDataDoDocumento()); + } + + public String getTextoFcLocalPagamento(){ + return getValue(boleto.getLocalPagamento()); + } + + public String getTextoFcCarteira(){ + return whenNull(boleto.getTitulo().getContaBancaria().getCarteira(), EMPTY, boleto.getTitulo().getContaBancaria().getCarteira().getCodigo().toString()); + } + + public String getTextoFcInstrucaoAoCaixa1(){ + return getValue(boleto.getInstrucao1()); + } + + public String getTextoFcInstrucaoAoCaixa2(){ + return getValue(boleto.getInstrucao2()); + } + + public String getTextoFcInstrucaoAoCaixa3(){ + return getValue(boleto.getInstrucao3()); + } + + public String getTextoFcInstrucaoAoCaixa4(){ + return getValue(boleto.getInstrucao4()); + } + + public String getTextoFcInstrucaoAoCaixa5(){ + return getValue(boleto.getInstrucao5()); + } + + public String getTextoFcInstrucaoAoCaixa6(){ + return getValue(boleto.getInstrucao6()); + } + + public String getTextoFcInstrucaoAoCaixa7(){ + return getValue(boleto.getInstrucao7()); + } + + public String getTextoFcInstrucaoAoCaixa8(){ + return getValue(boleto.getInstrucao8()); + } + + public String getTextoRsMoraMulta(){ + return getTextoFcMoraMulta(); + } + + public String getTextoFcMoraMulta(){ + return getValue(boleto.getTitulo().getMora()); + } + + public String getTextoRsOutroAcrescimo(){ + return getTextoFcOutroAcrescimo(); + } + + public String getTextoFcOutroAcrescimo(){ + return getValue(boleto.getTitulo().getAcrecimo()); + } + + public String getTextoRsOutraDeducao(){ + return getTextoFcOutraDeducao(); + } + + public String getTextoFcOutraDeducao(){ + return getValue(boleto.getTitulo().getDeducao()); + } + + public String getTextoRsDescontoAbatimento(){ + return getTextoFcDescontoAbatimento(); + } + + public String getTextoFcDescontoAbatimento(){ + return getValue(boleto.getTitulo().getDesconto()); + } + + public String getTextoRsValorDocumento(){ + return getTextoFcValorDocumento(); + } + + public String getTextoFcValorDocumento(){ + return getValue(boleto.getTitulo().getValor()); + } + + public String getTextoRsValorCobrado(){ + return getTextoFcValorCobrado(); + } + + public String getTextoFcValorCobrado(){ + return getValue(boleto.getTitulo().getValorCobrado()); + } + + public String getTextoRsDataVencimento(){ + return getTextoFcDataVencimento(); + } + + public String getTextoFcDataVencimento(){ + return getValue(boleto.getTitulo().getDataDoVencimento()); + } + + public String getTextoRsNumeroDocumento(){ + return getTextoFcNumeroDocumento(); + } + + public String getTextoFcNumeroDocumento(){ + return getValue(boleto.getTitulo().getNumeroDoDocumento()); + } + + public String getTextoRsCedente(){ + return getTextoFcCedente(); + } + + public String getTextoFcCedente(){ + return getValue(boleto.getTitulo().getCedente().getNome()); + } + + public String getTextoRsEspecie(){ + return getTextoFcEspecie(); + } + + public String getTextoFcEspecie(){ + return getValue(boleto.getTitulo().getTipoDeMoeda()); + } + + public String getTextoRsCodigoBanco(){ + return getTextoFcCodigoBanco(); + } + + public String getTextoFcCodigoBanco(){ + return getTextoCodigoDoBanco(boleto.getTitulo().getContaBancaria()); + } + + public String getTextoRsAgenciaCodigoCedente(){ + return getTextoFcAgenciaCodigoCedente(); + } + + public String getTextoFcAgenciaCodigoCedente(){ + return getTextoAgenciaCodigoCedente(boleto.getTitulo().getContaBancaria()); + } + + public String getTextoRsNossoNumero(){ + return getTextoFcNossoNumero(); + } + + public String getTextoFcNossoNumero(){ + return getTextoNossoNumero(boleto.getTitulo()); + } + + public Image getImagemRsLogoBanco(){ + return getImagemFcLogoBanco(); + } + + public Image getImagemFcLogoBanco(){ + return getImagemBanco(resourceBundle, boleto.getTitulo().getContaBancaria()); + } + + public String getTextoRsLogoBanco(){ + return getTextoFcLogoBanco(); + } + + public String getTextoFcLogoBanco(){ + return boleto.getTitulo().getContaBancaria().getBanco().getNome(); + } + + public String getTextoRsLinhaDigitavel(){ + return getTextoFcLinhaDigitavel(); + } + + public String getTextoFcLinhaDigitavel(){ + return boleto.getLinhaDigitavel().write(); + } + + public Image getImagemFcCodigoBarra(){ + return CodigoDeBarras.valueOf(boleto.getCodigoDeBarras().write()).toImage(); + } + + protected final Boleto getBoleto(){ + return this.boleto; + } + + private String getValue(String value){ + if(isNotBlank(value)){ + return value; + } + return EMPTY; + } + + private String getValue(Date value){ + if(isNotNull(value)){ + return DDMMYYYY_B.format(value); + } + return EMPTY; + } + + private String getValue(BigDecimal value){ + if(isNotNull(value)){ + return MONEY_DD_BR.format(value); + } + return EMPTY; + } + + private > String getValue(T value){ + if(isNotNull(value)){ + return value.name(); + } + return EMPTY; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoAgenciaCodigoCedente.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoAgenciaCodigoCedente.java new file mode 100644 index 0000000..50e3509 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoAgenciaCodigoCedente.java @@ -0,0 +1,95 @@ +/* + * Copyright 2014 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: 17/01/2014 - 14:38:51 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 17/01/2014 - 14:38:51 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.apache.commons.lang.StringUtils.isNotBlank; +import static org.jrimum.utilix.Objects.isNotNull; + +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; + +/** + * Formata a agência e o número da conta. + * + * @author Gilmar P.S.L. + */ +public class BoletoInfoCampoAgenciaCodigoCedente { + + /** + * Retorna a agência e o número da conta no seguinte formato: {@code "1234-1 / 123456-0"}. + * + * + * @param conta + * @return string formatada para ser exibida no boleto + */ + public static String getTextoAgenciaCodigoCedente(ContaBancaria conta){ + + StringBuilder texto = new StringBuilder(EMPTY); + boolean temAgencia = false; + + + if (isNotNull(conta.getAgencia())) { + + temAgencia = true; + + if (isNotNull(conta.getAgencia().getCodigo())){ + texto.append(conta.getAgencia().getCodigo()); + } + + if (isNotBlank(conta.getAgencia().getDigitoVerificador().toString())) { + + texto.append("-"); + texto.append(conta.getAgencia().getDigitoVerificador()); + } + } + + if(isNotNull(conta.getNumeroDaConta())){ + + if(temAgencia){ + texto.append(" / "); + } + + if (isNotNull(conta.getNumeroDaConta().getCodigoDaConta())) { + + texto.append(conta.getNumeroDaConta().getCodigoDaConta()); + + if (isNotBlank(conta.getNumeroDaConta().getDigitoDaConta())) { + + texto.append("-"); + texto.append(conta.getNumeroDaConta().getDigitoDaConta()); + } + } + } + + return texto.toString(); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoCodigoBanco.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoCodigoBanco.java new file mode 100644 index 0000000..d2dad1b --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoCodigoBanco.java @@ -0,0 +1,54 @@ +/* + * Copyright 2014 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/01/2014 - 19:22:01 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 19:22:01 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; + +/** + * @author Gilmar P.S.L. + */ +public class BoletoInfoCampoCodigoBanco { + + /** + * Retorna o código de compensação do banco fomatado no estilo "001-9". + * + * + * @param conta + * @return string formatada para ser exibida no boleto + */ + public static String getTextoCodigoDoBanco(ContaBancaria conta){ + + String codigoCompensacao = conta.getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado(); + String digitoCompensacao = conta.getBanco().getCodigoDeCompensacaoBACEN().getDigito().toString(); + + return codigoCompensacao + "-" + digitoCompensacao; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoEndereco.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoEndereco.java new file mode 100644 index 0000000..b3c5946 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoEndereco.java @@ -0,0 +1,123 @@ +/* + * Copyright 2014 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: 17/01/2014 - 19:32:45 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 17/01/2014 - 19:32:45 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.apache.commons.lang.StringUtils.isNotBlank; +import static org.jrimum.utilix.Objects.isNotNull; + +import org.jrimum.domkee.comum.pessoa.endereco.Endereco; +import org.jrimum.domkee.financeiro.banco.febraban.EntidadeDeCobranca; + +/** + * @author Gilmar P.S.L. + */ +public class BoletoInfoCampoEndereco { + + public static String getTextoEnderecoLinha1(EntidadeDeCobranca pessoa){ + if (isNotNull(pessoa)) { + return getTextoEnderecoLinha1(pessoa.getNextEndereco()); + } + return EMPTY; + } + + public static String getTextoEnderecoLinha1(Endereco endereco){ + + final StringBuilder texto = new StringBuilder(EMPTY); + + if (isNotNull(endereco)) { + + boolean temBairro = false; + boolean temLocalidade = false; + + if (isNotBlank(endereco.getBairro())) { + temBairro = true; + texto.append(endereco.getBairro()); + } + + if (isNotBlank(endereco.getLocalidade())) { + temLocalidade = true; + if(temBairro){ + texto.append(" - "); + } + texto.append(endereco.getLocalidade()); + } + + if (isNotNull(endereco.getUF())) { + if(temBairro || temLocalidade){ + texto.append(" / "); + } + texto.append(endereco.getUF().getSigla()); + } + } + + return texto.toString(); + } + + public static String getTextoEnderecoLinha2(EntidadeDeCobranca pessoa){ + if (isNotNull(pessoa)) { + return getTextoEnderecoLinha2(pessoa.getNextEndereco()); + } + return EMPTY; + } + + public static String getTextoEnderecoLinha2(Endereco endereco){ + + final StringBuilder texto = new StringBuilder(EMPTY); + + if (isNotNull(endereco)) { + + if (isNotBlank(endereco.getLogradouro())) { + texto.append(endereco.getLogradouro()); + } + + if (isNotBlank(endereco.getNumero())) { + texto.append(", n°: ") + .append(endereco.getNumero()); + } + + if (isNotBlank(endereco.getComplemento())) { + texto.append(" / ") + .append(endereco.getComplemento()); + } + + if (isNotNull(endereco.getCEP()) && isNotBlank(endereco.getCEP().getCep())) { + texto.append(" - ") + .append("CEP: ") + .append(endereco.getCEP().getCep()); + } + + } + + return texto.toString(); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoLogoBanco.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoLogoBanco.java new file mode 100644 index 0000000..62c1d58 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoLogoBanco.java @@ -0,0 +1,65 @@ +/* + * Copyright 2014 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/01/2014 - 21:35:45 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 21:35:45 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.jrimum.bopepo.BancosSuportados.isSuportado; +import static org.jrimum.utilix.Objects.isNotNull; + +import java.awt.Image; + +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; + +/** + * @author Gilmar P.S.L. + * + */ +public class BoletoInfoCampoLogoBanco { + + public static Image getImagemBanco(ResourceBundle resourceBundle, ContaBancaria conta){ + + if (isNotNull(conta.getBanco().getImgLogo())) { + return conta.getBanco().getImgLogo(); + } + + if (isSuportado(conta.getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado())) { + + conta.getBanco().setImgLogo( + resourceBundle + .getLogotipoDoBanco(conta.getBanco() + .getCodigoDeCompensacaoBACEN() + .getCodigoFormatado())); + } + + return conta.getBanco().getImgLogo(); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoNossoNumero.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoNossoNumero.java new file mode 100644 index 0000000..aaf31b0 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoNossoNumero.java @@ -0,0 +1,66 @@ +/* + * Copyright 2014 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/01/2014 - 19:27:46 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 19:27:46 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.apache.commons.lang.StringUtils.isNotBlank; + +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + * Formata o Nosso Número do Título que é impresso no boleto. + * + * @author Gilmar P.S.L. + */ +public class BoletoInfoCampoNossoNumero { + + /** + * Retorna o nosso número fomatado no estilo "123456-7". + * + * + * @param titulo + * @return string formatada para ser exibida no boleto + */ + public static String getTextoNossoNumero(Titulo titulo) { + + StringBuilder texto = new StringBuilder(EMPTY); + + if (isNotBlank(titulo.getNossoNumero())) { + texto.append(titulo.getNossoNumero()); + + if (isNotBlank(titulo.getDigitoDoNossoNumero())) { + texto.append("-" + titulo.getDigitoDoNossoNumero()); + } + } + + return texto.toString(); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoPessoa.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoPessoa.java new file mode 100644 index 0000000..5cc3c90 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoPessoa.java @@ -0,0 +1,87 @@ +/* + * Copyright 2014 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/01/2014 - 14:01:19 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 14:01:19 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.jrimum.utilix.Objects.isNotNull; + +import org.jrimum.domkee.financeiro.banco.febraban.EntidadeDeCobranca; + +/** + * Formata os dados como CPRF e Nome de uma pessoa que são impressos no boleto. + * + * @author Gilmar P.S.L. + */ +public class BoletoInfoCampoPessoa { + + /** + * Retorna o texto formatado no estilo {@code "%nome, %tipo_de_cprf: %cprf"}: + * + *
      + *
    • "Fulando Da Silva, CPF: 111.111.111-11"
    • + *
    • "Empresa Boa, CNPJ: 00.123.456/0001-78"
    • + *
    + * + * @param pessoa + * @return string formatada para ser exibida no boleto + */ + public static String getTextoNomeCprfDaPessoa(EntidadeDeCobranca pessoa) { + StringBuilder sb = new StringBuilder(EMPTY); + boolean temNome = false; + + if (isNotNull(pessoa)) { + + if (isNotNull(pessoa.getNome())) { + temNome = true; + sb.append(pessoa.getNome()); + } + + if (isNotNull(pessoa.getCPRF())) { + + if(temNome){ + sb.append(", "); + } + + if (pessoa.getCPRF().isFisica()) { + sb.append("CPF: "); + + } else if (pessoa.getCPRF().isJuridica()) { + sb.append("CNPJ: "); + } + + sb.append(pessoa.getCPRF().getCodigoFormatado()); + } + } + + return sb.toString(); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoView.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoView.java new file mode 100644 index 0000000..ab66688 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoView.java @@ -0,0 +1,102 @@ +/* + * Copyright 2014 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/01/2014 - 22:10:01 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 22:10:01 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import java.awt.Image; + + +/** + * @author Gilmar P.S.L. + * + */ +public interface BoletoInfoCampoView { + + //Recibo do Sacado + public Image getImagemRsLogoBanco(); + public String getTextoRsLogoBanco(); + public String getTextoRsCodigoBanco(); + public String getTextoRsLinhaDigitavel(); + public String getTextoRsSacado(); + public String getTextoRsNossoNumero(); + public String getTextoRsCedente(); + public String getTextoRsAgenciaCodigoCedente(); + public String getTextoRsInstrucaoAoSacado(); + public String getTextoRsMoraMulta(); + public String getTextoRsOutroAcrescimo(); + public String getTextoRsOutraDeducao(); + public String getTextoRsDescontoAbatimento(); + public String getTextoRsValorDocumento(); + public String getTextoRsValorCobrado(); + public String getTextoRsDataVencimento(); + public String getTextoRsCpfCnpj(); + public String getTextoRsNumeroDocumento(); + public String getTextoRsEspecie(); + + //Ficha de Compensação + public Image getImagemFcLogoBanco(); + public String getTextoFcLogoBanco(); + public String getTextoFcCodigoBanco(); + public String getTextoFcLinhaDigitavel(); + public String getTextoFcNossoNumero(); + public String getTextoFcAgenciaCodigoCedente(); + public String getTextoFcDataProcessamento(); + public String getTextoFcAceite(); + public String getTextoFcEspecieDocumento(); + public String getTextoFcDataDocumento(); + public String getTextoFcLocalPagamento(); + public String getTextoFcCarteira(); + public String getTextoFcSacadoL1(); + public String getTextoFcSacadoL2(); + public String getTextoFcSacadoL3(); + public String getTextoFcSacadorAvalistaL1(); + public String getTextoFcSacadorAvalistaL2(); + public String getTextoFcSacadorAvalistaL3(); + public String getTextoFcInstrucaoAoCaixa1(); + public String getTextoFcInstrucaoAoCaixa2(); + public String getTextoFcInstrucaoAoCaixa3(); + public String getTextoFcInstrucaoAoCaixa4(); + public String getTextoFcInstrucaoAoCaixa5(); + public String getTextoFcInstrucaoAoCaixa6(); + public String getTextoFcInstrucaoAoCaixa7(); + public String getTextoFcInstrucaoAoCaixa8(); + public String getTextoFcMoraMulta(); + public String getTextoFcOutroAcrescimo(); + public String getTextoFcOutraDeducao(); + public String getTextoFcDescontoAbatimento(); + public String getTextoFcValorDocumento(); + public String getTextoFcValorCobrado(); + public String getTextoFcDataVencimento(); + public String getTextoFcNumeroDocumento(); + public String getTextoFcCedente(); + public String getTextoFcEspecie(); + public Image getImagemFcCodigoBarra(); + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoViewFactory.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoViewFactory.java new file mode 100644 index 0000000..492ae27 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoCampoViewFactory.java @@ -0,0 +1,82 @@ +/* + * Copyright 2014 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/01/2014 - 22:42:27 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 22:42:27 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.jrimum.utilix.Objects.isNotNull; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.caixa.BoletoInfoViewCaixaFactory; +import org.jrimum.bopepo.view.info.campo.hsbc.AbstractBoletoInfoViewHSBC; + +/** + * @author Gilmar P.S.L. + * + */ +public class BoletoInfoCampoViewFactory { + + public static BoletoInfoCampoView create(ResourceBundle resourceBundle, + Boleto boleto) { + + final BancosSuportados banco = BancosSuportados.suportados.get(boleto + .getTitulo().getContaBancaria().getBanco() + .getCodigoDeCompensacaoBACEN().getCodigoFormatado()); + + if (isNotNull(banco)) { + switch (banco) { + case BANCO_BRADESCO: return new BoletoInfoViewBradesco(resourceBundle, boleto); + // case BANCO_DO_BRASIL: return new ..; + // case BANCO_DO_NORDESTE_DO_BRASIL: return new ..; + // case BANCO_ABN_AMRO_REAL: return new ..; + case CAIXA_ECONOMICA_FEDERAL: return BoletoInfoViewCaixaFactory.create(resourceBundle, boleto); + case HSBC: return AbstractBoletoInfoViewHSBC.create(resourceBundle, boleto); + // case UNIBANCO: return new ..; + // case BANCO_ITAU: return new ..; + // case BANCO_SAFRA: return new ..; + // case BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL: return new ..; + // case MERCANTIL_DO_BRASIL: return new ..; + // case BANCO_DO_ESTADO_DO_ESPIRITO_SANTO: return new ..; + // case BANCO_RURAL: return new ..; + // case BANCO_SANTANDER: return new ..; + // case BANCO_INTEMEDIUM: return nCew ..; + case BANCO_SICREDI: return new BoletoInfoViewSicredi(resourceBundle, boleto); + // case BANCOOB: return new ..; + // case CITIBANK: return new ..; + // case BANCO_DE_BRASILIA: return new ..; + case CECRED: return new BoletoInfoViewCecred(resourceBundle, boleto); + } + } + + return new BoletoInfoViewDefault(resourceBundle, boleto); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewBradesco.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewBradesco.java new file mode 100644 index 0000000..752511a --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewBradesco.java @@ -0,0 +1,87 @@ +/* + * Copyright 2014 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/2014 - 02:21:50 + * + * ================================================================================ + * + * Direitos autorais 2014 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/2014 - 02:21:50 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.apache.commons.lang.StringUtils.isBlank; +import static org.apache.commons.lang.StringUtils.leftPad; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; + +/** + * @author Gilmar P.S.L. + */ +public class BoletoInfoViewBradesco extends AbstractBoletoInfoCampoView{ + + BoletoInfoViewBradesco(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + @Override + public String getTextoFcLocalPagamento() { + String textoFcLocalPagamento = super.getTextoFcLocalPagamento(); + return isBlank(textoFcLocalPagamento) ? "Pagável Preferencialmente na rede Bradesco ou no Bradesco expresso" : textoFcLocalPagamento; + } + + @Override + public String getTextoFcAgenciaCodigoCedente() { + Agencia agencia = getBoleto().getTitulo().getContaBancaria().getAgencia(); + NumeroDaConta numeroDaConta = getBoleto().getTitulo().getContaBancaria().getNumeroDaConta(); + + return leftPad(agencia.getCodigo().toString(), 4, "0") + + "-" + agencia.getDigitoVerificador() + + " / " + + leftPad(numeroDaConta.getCodigoDaConta().toString(), 7, "0") + + "-" + numeroDaConta.getDigitoDaConta(); + } + + @Override + public String getTextoRsAgenciaCodigoCedente() { + return getTextoFcAgenciaCodigoCedente(); + } + + @Override + public String getTextoFcNossoNumero() { + Carteira carteira = getBoleto().getTitulo().getContaBancaria().getCarteira(); + return leftPad(carteira.getCodigo().toString(), 2, "0") + + "/" + + getBoleto().getTitulo().getNossoNumero() + + "-" + getBoleto().getTitulo().getDigitoDoNossoNumero(); + } + + @Override + public String getTextoRsNossoNumero() { + return getTextoFcNossoNumero(); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewCecred.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewCecred.java new file mode 100644 index 0000000..f776315 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewCecred.java @@ -0,0 +1,78 @@ +/* + * Copyright 2014 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: 04/02/2014 - 21:28:09 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 04/02/2014 - 21:28:09 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.apache.commons.lang.StringUtils.isBlank; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; + +/** + * @author Gilmar P.S.L. + */ +public class BoletoInfoViewCecred extends AbstractBoletoInfoCampoView { + + BoletoInfoViewCecred(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + @Override + public String getTextoFcLocalPagamento() { + String textoFcLocalPagamento = super.getTextoFcLocalPagamento(); + return isBlank(textoFcLocalPagamento) ? "PAGAVEL PREFERENCIALMENTE NAS COOPERATIVAS DO SISTEMA CECRED." : textoFcLocalPagamento; + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoRsAgenciaCodigoCedente() + */ + @Override + public String getTextoRsAgenciaCodigoCedente() { + return getAgenciaCodigoCedente(); + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcAgenciaCodigoCedente() + */ + @Override + public String getTextoFcAgenciaCodigoCedente() { + return getAgenciaCodigoCedente(); + } + + private String getAgenciaCodigoCedente(){ + Integer agencia = super.getBoleto().getTitulo().getContaBancaria().getAgencia().getCodigo(); + String agDv = super.getBoleto().getTitulo().getContaBancaria().getAgencia().getDigitoVerificador(); + Integer numeroDaConta = super.getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getCodigoDaConta(); + String contaDv = super.getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getDigitoDaConta(); + + return String.format("%04d-%s / %07d-%s", agencia, agDv, numeroDaConta, contaDv); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewDefault.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewDefault.java new file mode 100644 index 0000000..ac2667a --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewDefault.java @@ -0,0 +1,45 @@ +/* + * Copyright 2014 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/01/2014 - 22:19:19 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 22:19:19 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; + +/** + * @author Gilmar P.S.L. + * + */ +class BoletoInfoViewDefault extends AbstractBoletoInfoCampoView{ + + BoletoInfoViewDefault(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewSicredi.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewSicredi.java new file mode 100644 index 0000000..a2a24a6 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/BoletoInfoViewSicredi.java @@ -0,0 +1,133 @@ +/* + * Copyright 2014 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: 31/01/2014 - 00:11:24 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 31/01/2014 - 00:11:24 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.parametro.ParametroBancoSicredi; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite; + +/** + * @author Gilmar P.S.L. + * + */ +public class BoletoInfoViewSicredi extends AbstractBoletoInfoCampoView{ + + BoletoInfoViewSicredi(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoRsCodigoBanco() + */ + @Override + public String getTextoRsCodigoBanco() { + return getTextoCodigoDoBanco(); + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcCodigoBanco() + */ + @Override + public String getTextoFcCodigoBanco() { + return getTextoCodigoDoBanco(); + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcLocalPagamento() + */ + @Override + public String getTextoFcLocalPagamento() { + return "Preferencialmente nas cooperativas de crédito do SICREDI"; + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoRsAgenciaCodigoCedente() + */ + @Override + public String getTextoRsAgenciaCodigoCedente() { + return getAgenciaCodigoCedente(); + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcAgenciaCodigoCedente() + */ + @Override + public String getTextoFcAgenciaCodigoCedente() { + return getAgenciaCodigoCedente(); + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoRsNossoNumero() + */ + @Override + public String getTextoRsNossoNumero() { + return getTextoNossoNumero(); + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcNossoNumero() + */ + @Override + public String getTextoFcNossoNumero() { + return getTextoNossoNumero(); + } + + /** + * @see org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView#getTextoFcAceite() + */ + @Override + public String getTextoFcAceite() { + Aceite aceite = super.getBoleto().getTitulo().getAceite(); + if(aceite == Aceite.A){ + return "SIM"; + } + return "NÃO"; + } + + private String getAgenciaCodigoCedente(){ + Integer agencia = super.getBoleto().getTitulo().getContaBancaria().getAgencia().getCodigo(); + Integer posto = super.getBoleto().getTitulo().getParametrosBancarios().getValor(ParametroBancoSicredi.POSTO_DA_AGENCIA); + Integer codigoCedente = super.getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getCodigoDaConta(); + + return String.format("%04d.%02d.%05d", agencia, posto, codigoCedente); + } + + private String getTextoNossoNumero() { + String nn = super.getTextoFcNossoNumero(); + return nn.substring(0,2)+"/"+nn.substring(2); + } + + private String getTextoCodigoDoBanco(){ + return super.getTextoFcCodigoBanco().replace("-0", "-X"); + } + +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaFactory.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaFactory.java new file mode 100644 index 0000000..6ec0cef --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaFactory.java @@ -0,0 +1,30 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.BoletoInfoCampoView; + +/** + * Factory para determinar qual a implementação da CAIXA será usada de acordo com o convênio (SIGCB, SINCO, SICOB). + * @author Rômulo Augusto + */ +public class BoletoInfoViewCaixaFactory { + + private static final int NN10 = 10; + private static final int NN14 = 14; + private static final int NN15 = 15; + private static final int NN17 = 17; + + public static BoletoInfoCampoView create(ResourceBundle resourceBundle, Boleto boleto) { + String nossoNumero = boleto.getTitulo().getNossoNumero(); + switch (nossoNumero.length()) { + + case NN10: return new BoletoInfoViewCaixaSICOB10(resourceBundle, boleto); + case NN14: return new BoletoInfoViewCaixaSICOB14(resourceBundle, boleto); + case NN15: return new BoletoInfoViewCaixaSIGCB(resourceBundle, boleto); + case NN17: return new BoletoInfoViewCaixaSINCO(resourceBundle, boleto); + } + + return null; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSICOB10.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSICOB10.java new file mode 100644 index 0000000..a860229 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSICOB10.java @@ -0,0 +1,43 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.jrimum.utilix.Objects.isNotNull; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.parametro.ParametroCaixaEconomicaFederal; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; + +/** + * View para o convênio SICOB, Nosso número com 10 dígitos, da CAIXA. + * + * @author Rômulo Augusto + */ +public class BoletoInfoViewCaixaSICOB10 extends AbstractBoletoInfoCampoView { + + public BoletoInfoViewCaixaSICOB10(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + @Override + public String getTextoFcCarteira() { + String textoCarteira = EMPTY; + Carteira carteira = getBoleto().getTitulo().getContaBancaria().getCarteira(); + if (isNotNull(carteira) && isNotNull(carteira.getTipoCobranca())) { + textoCarteira = (carteira.getTipoCobranca().equals(TipoDeCobranca.COM_REGISTRO)) ? "CR" : "SR"; + } + return textoCarteira; + } + + @Override + public String getTextoFcAgenciaCodigoCedente() { + Integer agencia = getBoleto().getTitulo().getContaBancaria().getAgencia().getCodigo(); + Integer codigoOperacao = getBoleto().getTitulo().getParametrosBancarios().getValor(ParametroCaixaEconomicaFederal.CODIGO_OPERACAO); + Integer codigoBeneficiario = getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getCodigoDaConta(); + String digitoDaConta = getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getDigitoDaConta(); + + return String.format("%04d.%03d.%08d-%s", agencia, codigoOperacao, codigoBeneficiario, digitoDaConta); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSICOB14.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSICOB14.java new file mode 100644 index 0000000..68733fe --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSICOB14.java @@ -0,0 +1,56 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import static org.apache.commons.lang.StringUtils.isBlank; +import static org.jrimum.utilix.Objects.isNotNull; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.parametro.ParametroCaixaEconomicaFederal; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; + +/** + * View para o convênio SICOB, Nosso número com 14 dígitos, da CAIXA. + * + * @author Rômulo Augusto + */ +public class BoletoInfoViewCaixaSICOB14 extends AbstractBoletoInfoCampoView { + + private static final int CODIGO_OPERACAO_PADRAO = 870; + + public BoletoInfoViewCaixaSICOB14(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + @Override + public String getTextoFcCarteira() { + return "SR"; + } + + @Override + public String getTextoFcAgenciaCodigoCedente() { + Integer agencia = getBoleto().getTitulo().getContaBancaria().getAgencia().getCodigo(); + Integer codigoOperacao = getCodigoOperacao(); + Integer codigoBeneficiario = getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getCodigoDaConta(); + String digitoDaConta = getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getDigitoDaConta(); + + return String.format("%04d.%03d.%08d-%s", agencia, codigoOperacao, codigoBeneficiario, digitoDaConta); + } + + private Integer getCodigoOperacao() { + Titulo titulo = getBoleto().getTitulo(); + Integer codigoOperacao = CODIGO_OPERACAO_PADRAO; + + if (titulo.hasParametrosBancarios() && isNotNull(titulo.getParametrosBancarios().getValor(ParametroCaixaEconomicaFederal.CODIGO_OPERACAO))) { + codigoOperacao = titulo.getParametrosBancarios().getValor(ParametroCaixaEconomicaFederal.CODIGO_OPERACAO); + } + + return codigoOperacao; + } + + @Override + public String getTextoFcLocalPagamento() { + String textoFcLocalPagamento = super.getTextoFcLocalPagamento(); + return isBlank(textoFcLocalPagamento) ? "PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE" : textoFcLocalPagamento; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSIGCB.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSIGCB.java new file mode 100644 index 0000000..9cb3fe3 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSIGCB.java @@ -0,0 +1,39 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import static org.apache.commons.lang.StringUtils.isBlank; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView; + +/** + * View para o convênio SIGCB da CAIXA. + * + * @author Rômulo Augusto + */ +public class BoletoInfoViewCaixaSIGCB extends AbstractBoletoInfoCampoView { + + private static final String EMISSAO_BENEFICIARIO = "4"; + + BoletoInfoViewCaixaSIGCB(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + @Override + public String getTextoFcNossoNumero() { + return getBoleto().getTitulo().getContaBancaria().getCarteira().getCodigo() + + EMISSAO_BENEFICIARIO + + super.getTextoFcNossoNumero(); + } + + @Override + public String getTextoFcCarteira() { + return (getBoleto().getTitulo().getContaBancaria().getCarteira().isComRegistro()) ? "RG" : "SR"; + } + + @Override + public String getTextoFcLocalPagamento() { + String textoFcLocalPagamento = super.getTextoFcLocalPagamento(); + return isBlank(textoFcLocalPagamento) ? "PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE" : textoFcLocalPagamento; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSINCO.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSINCO.java new file mode 100644 index 0000000..4e1c213 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/caixa/BoletoInfoViewCaixaSINCO.java @@ -0,0 +1,30 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView; + +/** + * View para o convênio SINCO da CAIXA. + * + * @author Rômulo Augusto + */ +public class BoletoInfoViewCaixaSINCO extends AbstractBoletoInfoCampoView { + + private static final String CARTEIRA_SINCO = "01"; + private static final int CONSTANTE_NOSSO_NUMERO = 9; + + BoletoInfoViewCaixaSINCO(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + @Override + public String getTextoFcNossoNumero() { + return CONSTANTE_NOSSO_NUMERO + super.getTextoFcNossoNumero(); + } + + @Override + public String getTextoFcCarteira() { + return CARTEIRA_SINCO; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/AbstractBoletoInfoViewHSBC.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/AbstractBoletoInfoViewHSBC.java new file mode 100644 index 0000000..ebc023c --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/AbstractBoletoInfoViewHSBC.java @@ -0,0 +1,48 @@ +package org.jrimum.bopepo.view.info.campo.hsbc; + +import static org.apache.commons.lang.StringUtils.isBlank; +import static org.apache.commons.lang.StringUtils.leftPad; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.AbstractBoletoInfoCampoView; +import org.jrimum.bopepo.view.info.campo.BoletoInfoCampoView; + +/** + * Define campos iguais para as cobranças registrada e não registrada. + * @author Rômulo Augusto + */ +public class AbstractBoletoInfoViewHSBC extends AbstractBoletoInfoCampoView { + + public static BoletoInfoCampoView create(ResourceBundle resourceBundle, Boleto boleto) { + if (boleto.getTitulo().getContaBancaria().getCarteira().isComRegistro()) { + return new BoletoInfoViewHSBCRegistrada(resourceBundle, boleto); + } + return new BoletoInfoViewHSBCNaoRegistrada(resourceBundle, boleto); + } + + public AbstractBoletoInfoViewHSBC(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + @Override + public String getTextoFcLocalPagamento() { + String textoFcLocalPagamento = super.getTextoFcLocalPagamento(); + return isBlank(textoFcLocalPagamento) ? "PAGAR PREFERENCIALMENTE EM AGÊNCIA DO HSBC" : textoFcLocalPagamento; + } + + @Override + public String getTextoFcAgenciaCodigoCedente() { + return leftPad(getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getCodigoDaConta().toString(), 7, "0"); + } + + @Override + public String getTextoFcNossoNumero() { + return getBoleto().getTitulo().getNossoNumero() + getBoleto().getTitulo().getDigitoDoNossoNumero(); + } + + @Override + public String getTextoRsNossoNumero() { + return getTextoFcNossoNumero(); + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/BoletoInfoViewHSBCNaoRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/BoletoInfoViewHSBCNaoRegistrada.java new file mode 100644 index 0000000..bf72f21 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/BoletoInfoViewHSBCNaoRegistrada.java @@ -0,0 +1,44 @@ +package org.jrimum.bopepo.view.info.campo.hsbc; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.apache.commons.lang.StringUtils.leftPad; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; + +/** + * View para a cobrança não registrada do HSBC. + * + * @author Rômulo Augusto + */ +public class BoletoInfoViewHSBCNaoRegistrada extends AbstractBoletoInfoViewHSBC{ + + public BoletoInfoViewHSBCNaoRegistrada(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + @Override + public String getTextoFcAgenciaCodigoCedente() { + return leftPad(getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getCodigoDaConta().toString(), 7, "0"); + } + + @Override + public String getTextoRsAgenciaCodigoCedente() { + return getTextoFcAgenciaCodigoCedente(); + } + + @Override + public String getTextoFcEspecieDocumento() { + return EMPTY; + } + + @Override + public String getTextoFcAceite() { + return EMPTY; + } + + @Override + public String getTextoFcCarteira() { + return "CNR"; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/BoletoInfoViewHSBCRegistrada.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/BoletoInfoViewHSBCRegistrada.java new file mode 100644 index 0000000..e43a4c6 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/hsbc/BoletoInfoViewHSBCRegistrada.java @@ -0,0 +1,45 @@ +package org.jrimum.bopepo.view.info.campo.hsbc; + +import static org.apache.commons.lang.StringUtils.leftPad; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.view.ResourceBundle; + +/** + * View para a cobrança registrada do HSBC. + * + * @author Rômulo Augusto + */ +public class BoletoInfoViewHSBCRegistrada extends AbstractBoletoInfoViewHSBC { + + public BoletoInfoViewHSBCRegistrada(ResourceBundle resourceBundle, Boleto boleto) { + super(resourceBundle, boleto); + } + + @Override + public String getTextoFcAgenciaCodigoCedente() { + String agencia = leftPad(getBoleto().getTitulo().getContaBancaria().getAgencia().getCodigo().toString(), 4, "0"); + String conta = leftPad(getBoleto().getTitulo().getContaBancaria().getNumeroDaConta().getCodigoDaConta().toString(), 7, "0"); + return agencia + conta; + } + + @Override + public String getTextoRsAgenciaCodigoCedente() { + return getTextoFcAgenciaCodigoCedente(); + } + + @Override + public String getTextoFcEspecieDocumento() { + return "PD"; + } + + @Override + public String getTextoFcAceite() { + return "NÃO"; + } + + @Override + public String getTextoFcCarteira() { + return "CSB"; + } +} diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/package-info.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/package-info.java new file mode 100644 index 0000000..dfec9b5 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/campo/package-info.java @@ -0,0 +1,37 @@ +/* + * Copyright 2014 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: 17/01/2014 - 18:44:56 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 17/01/2014 - 18:44:56 + * + */ + + +/** + * Classes que geram os dados formatados para campos do boleto. + * + * @author Gilmar P.S.L + */ +package org.jrimum.bopepo.view.info.campo; \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/package-info.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/package-info.java new file mode 100644 index 0000000..b752f57 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/info/package-info.java @@ -0,0 +1,36 @@ +/* + * Copyright 2013 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: 28/08/2013 - 13:47:41 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 28/08/2013 - 13:47:41 + * + */ + +/** + * Classes utilizadas para gerar os dados visualizados nos boletos + * com formatação específica dos dados para cada banco. + * + * @author Gilmar P.S.L + */ +package org.jrimum.bopepo.view.info; \ No newline at end of file diff --git a/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/package-info.java b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/package-info.java new file mode 100644 index 0000000..edb8359 --- /dev/null +++ b/jrimum-bopepo/src/main/java/org/jrimum/bopepo/view/package-info.java @@ -0,0 +1,35 @@ +/* + * 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: 14/08/2010 - 20:50:14 + * + * ================================================================================ + * + * 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: 14/08/2010 - 20:50:14 + * + */ + +/** + * Classes utilizadas para gerar e visualizar boletos. + * + * @author Gilmar P.S.L + */ +package org.jrimum.bopepo.view; \ No newline at end of file diff --git a/jrimum-bopepo/src/main/resources/img/001.png b/jrimum-bopepo/src/main/resources/img/001.png new file mode 100644 index 0000000000000000000000000000000000000000..e30cbc63f9cc243e153a51d14514b156ed677330 GIT binary patch literal 2440 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 literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/img/021.png b/jrimum-bopepo/src/main/resources/img/021.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f745f99672b2dd3726654604bd17fea166b774 GIT binary patch literal 3427 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 FV1lA>rcwX^ literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/img/033.png b/jrimum-bopepo/src/main/resources/img/033.png new file mode 100644 index 0000000000000000000000000000000000000000..4f70a8a57933202e8b7a7936f6c9c45b0b605d0e GIT binary patch literal 9234 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 o_AEU8PtMgZT!q5l=>c1v5u(ZE_W3xX%6zld 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 UnQSr4CjbBd07*qoM6N<$f^oANJpcdz literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/img/070.png b/jrimum-bopepo/src/main/resources/img/070.png new file mode 100644 index 0000000000000000000000000000000000000000..9fbb497999a51cd64acdf13490f92d906974ed92 GIT binary patch literal 16051 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 ma001Qj1^@s6#j@f?00001b5ch_0Itp) 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 literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/img/085.png b/jrimum-bopepo/src/main/resources/img/085.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0b3f50fd27501c13cac9ba0159deb14606a733 GIT binary patch literal 10929 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 Af&c&j literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/img/151.png b/jrimum-bopepo/src/main/resources/img/151.png new file mode 100644 index 0000000000000000000000000000000000000000..40618f4a12cd7710aedfd7523bc4ea0938015827 GIT binary patch literal 3460 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 FV1ik>Fg*YO literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/img/356.png b/jrimum-bopepo/src/main/resources/img/356.png new file mode 100644 index 0000000000000000000000000000000000000000..48d18027106c325e8f9c3e67a6b08442cedc4986 GIT binary patch literal 3007 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 FV1nS)-unOm literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/img/399.png b/jrimum-bopepo/src/main/resources/img/399.png new file mode 100644 index 0000000000000000000000000000000000000000..32369c149ac5c69cebcb739c7e1cc07690ea46ef GIT binary patch literal 4185 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 literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/img/409.png b/jrimum-bopepo/src/main/resources/img/409.png new file mode 100644 index 0000000000000000000000000000000000000000..d65bbad79ead7d758f72f24954f8644045aa9607 GIT binary patch literal 5929 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 z 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 ^v~P^yqCwy3U2(nu?hhx||*ssT!1i8_AGPs*)} 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

    g*-0*k)N}wyI8@DJ?sM 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 Xh_8FnwM-oF^V&eqM7Q*|W90t;-PoRW literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/pdf/BoletoTemplateComSacadorAvalista.odt b/jrimum-bopepo/src/main/resources/pdf/BoletoTemplateComSacadorAvalista.odt new file mode 100644 index 0000000000000000000000000000000000000000..29f182709f74507c229fddacee86141341980c9a GIT binary patch literal 14316 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 literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/pdf/BoletoTemplateComSacadorAvalista.pdf b/jrimum-bopepo/src/main/resources/pdf/BoletoTemplateComSacadorAvalista.pdf new file mode 100644 index 0000000000000000000000000000000000000000..182e4ea877c5261c79fddf2601e47f0b7d615db9 GIT binary patch literal 68125 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 Wk^NBlpYG#A1R!P}-xleIc=O$e}ywk^E=tr|n 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 UynQj%oPmNCN-HTD%rTVyAN}>slmGw# literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/pdf/BoletoTemplateSemSacadorAvalista.odt b/jrimum-bopepo/src/main/resources/pdf/BoletoTemplateSemSacadorAvalista.odt new file mode 100644 index 0000000000000000000000000000000000000000..fad79163fc60209ead47b0d38c645a9223723932 GIT binary patch literal 14019 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 H-#q<4xXS|+ literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/main/resources/pdf/BoletoTemplateSemSacadorAvalista.pdf b/jrimum-bopepo/src/main/resources/pdf/BoletoTemplateSemSacadorAvalista.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3639320126c5585115637e0be942238747978b2 GIT binary patch literal 65811 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 literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBancosSuportados.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBancosSuportados.java new file mode 100644 index 0000000..4b1dfa6 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBancosSuportados.java @@ -0,0 +1,79 @@ +/* + * 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:11: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 - 19:11:33 + * + */ + + +package org.jrimum.bopepo; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * @author Gilmar P.S.L. + */ +public class TestBancosSuportados{ + + /** + * Quantidade atual + */ + @Test + public void deve_ser_igual_a_quantidade_de_bancos_declarados_no_enum_e_a_quantidade_disponivel_como_suportado() { + + assertEquals(BancosSuportados.values().length, BancosSuportados.suportados.size()); + } + + /** + * Conferência de códigos + */ + @Test + public void deve_ter_o_codigos_bacen_igual_o_da_especificacao_febraban() { + + + //Bancos implementados: + assertEquals(BancosSuportados.BANCO_DO_BRASIL.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "001"); + assertEquals(BancosSuportados.BANCO_DO_NORDESTE_DO_BRASIL.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "004"); + assertEquals(BancosSuportados.CAIXA_ECONOMICA_FEDERAL.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "104"); + assertEquals(BancosSuportados.BANCO_BRADESCO.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "237"); + assertEquals(BancosSuportados.BANCO_ABN_AMRO_REAL.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "356"); + assertEquals(BancosSuportados.UNIBANCO.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "409"); + assertEquals(BancosSuportados.HSBC.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "399"); + assertEquals(BancosSuportados.BANCO_ITAU.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "341"); + assertEquals(BancosSuportados.BANCO_SAFRA.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "422"); + assertEquals(BancosSuportados.BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "041"); + assertEquals(BancosSuportados.MERCANTIL_DO_BRASIL.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "389"); + assertEquals(BancosSuportados.BANCO_DO_ESTADO_DO_ESPIRITO_SANTO.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "021"); + assertEquals(BancosSuportados.BANCO_RURAL.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "453"); + assertEquals(BancosSuportados.BANCO_SANTANDER.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "033"); + assertEquals(BancosSuportados.BANCO_INTEMEDIUM.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "077"); + assertEquals(BancosSuportados.BANCO_SICREDI.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "748"); + assertEquals(BancosSuportados.BANCOOB.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "756"); + assertEquals(BancosSuportados.CITIBANK.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "745"); + assertEquals(BancosSuportados.BANCO_DE_BRASILIA.create().getCodigoDeCompensacaoBACEN().getCodigoFormatado(), "070"); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBoleto.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBoleto.java new file mode 100644 index 0000000..2d73003 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBoleto.java @@ -0,0 +1,254 @@ +/* + * 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:11:45 + * + * ================================================================================ + * + * 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:11:45 + * + */ + +package org.jrimum.bopepo; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.awt.Image; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import javax.imageio.ImageIO; + +import org.jrimum.bopepo.campolivre.CampoLivre; +import org.jrimum.bopepo.campolivre.NotSupportedBancoException; +import org.jrimum.bopepo.campolivre.NotSupportedCampoLivreException; +import org.jrimum.bopepo.view.BoletoCampo; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeMoeda; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.utilix.ClassLoaders; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste da classe Boleto + *

    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ + +public class TestBoleto{ + + private Titulo titulo; + + private Date VENCIMENTO = new GregorianCalendar(2000, Calendar.JULY, 3).getTime(); + + private Boleto boleto; + + + @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); + + boleto = new Boleto(titulo); + + } + + /** + * Test method for {@link org.jrimum.bopepo.Boleto#Boleto(Titulo)}. + * @throws NotSupportedBancoException + * @throws NotSupportedCampoLivreException + */ + @Test + public void testGetInstance() throws NotSupportedBancoException, NotSupportedCampoLivreException { + + assertNotNull(boleto); + assertNotNull(boleto.getTitulo()); + + try{ + new Boleto(null); + assertTrue(false); + fail("Teste Falho!"); + + } catch(IllegalArgumentException illegalArgumentException){ + assertTrue(true); + } + } + + /** + * Test method for {@link org.jrimum.bopepo.Boleto#getCodigoDeBarras()}. + */ + @Test + public void testGetCodigoDeBarra() { + + assertNotNull(boleto.getCodigoDeBarras()); + + } + + /** + * Test method for {@link org.jrimum.bopepo.Boleto#getLinhaDigitavel()}. + */ + @Test + public void testGetLinhaDigitavel() { + assertNotNull(boleto.getLinhaDigitavel()); + } + + /** + * Test method for {@link org.jrimum.bopepo.Boleto#getDataDeProcessamento()}. + */ + @Test + public void testGetDataDeProcessamento() { + DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); + Date agora = new Date(); + + assertEquals(df.format(agora), df.format(boleto.getDataDeProcessamento())); + } + + @Test(expected = IllegalArgumentException.class) + public void testSetCampoLivreNull() { + + boleto = new Boleto(titulo, null); + } + + @SuppressWarnings("serial") + @Test + public void testSetCampoLivreTamanhoCorreto() { + + boleto = new Boleto(titulo, new CampoLivre() { + + public String write() { + return "1234567890123456789012345"; + } + + public void read(String g) { + } + }); + + assertNotNull(boleto.getCampoLivre()); + assertNotNull(boleto.getCampoLivre().write()); + assertEquals(CampoLivre.STRING_LENGTH.intValue(), boleto.getCampoLivre().write().length()); + } + + @Test(expected = IllegalArgumentException.class) + public void testSetCampoLivreTamanhoMaior() { + + boleto = new Boleto(titulo, new CampoLivre() { + + private static final long serialVersionUID = 1L; + + public String write() { + return "1234567890123456789012345000"; + } + + public void read(String g) { + } + }); + } + + @Test(expected = IllegalArgumentException.class) + public void testSetCampoLivreTamanhoMenor() { + + boleto = new Boleto(titulo, new CampoLivre() { + + private static final long serialVersionUID = 1L; + + public String write() { + return "12345678901234567890"; + } + + public void read(String g) { + } + }); + } + + @Test + public void deve_sobrescrever_os_campos_texto_padrao_do_boleto() throws Exception { + final String campoCendente = "txtFcCedente"; + final String conteudoOriginal = "Banco dos Desenvolvedores"; + final String conteudoSobrescrito = "Banco JRimum"; + boleto.addTextosExtras(campoCendente, conteudoOriginal); + assertEquals(boleto.getTextosExtras().get(campoCendente), conteudoOriginal); + + boleto.sobrescrevaCampo(BoletoCampo.txtFcCedente, conteudoSobrescrito); + + assertEquals(boleto.getTextosExtras().get(campoCendente), conteudoSobrescrito); + } + + @Test + public void deve_adicionar_campos_texto_ao_boleto() throws Exception { + final String campo = "meuCampo"; + final String conteudo = "Meu conteudo especial!"; + + boleto.addTextosExtras(campo, conteudo); + + assertEquals(boleto.getTextosExtras().get(campo), conteudo); + } + + @Test + public void deve_adicionar_campos_imagem_ao_boleto() throws Exception { + final String campo = "meuCampo"; + final Image conteudo = ImageIO.read(ClassLoaders.getResource("img/001.png")); + assertNotNull(conteudo); + + boleto.addImagensExtras(campo, conteudo); + + assertEquals(boleto.getImagensExtras().get(campo), conteudo); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBoletoUtil.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBoletoUtil.java new file mode 100644 index 0000000..f736100 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestBoletoUtil.java @@ -0,0 +1,404 @@ +package org.jrimum.bopepo; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; + +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * @author Gilmar P.S.L. + */ +public class TestBoletoUtil { + + private static final String CODIGO_DO_BANCO_EXPECTED = "399"; + + private static final String CODIGO_DA_MOEDA_EXPECTED = "9"; + + private static final String CODIGO_DV_GERAL_EXPECTED = "3"; + + private static final String FATOR_DE_VENCIMENTO_EXPECTED = "4371"; + + private static final String VALOR_NOMINAL_EXPECTED = "0000000965"; + + private static final String CAMPO_LIVRE_EXPECTED = "1234567000000000022226892"; + + private static final String CODIGO_DE_BARRAS_EXPECTED = new StringBuilder() + .append(CODIGO_DO_BANCO_EXPECTED) + .append(CODIGO_DA_MOEDA_EXPECTED) + .append(CODIGO_DV_GERAL_EXPECTED) + .append(FATOR_DE_VENCIMENTO_EXPECTED) + .append(VALOR_NOMINAL_EXPECTED) + .append(CAMPO_LIVRE_EXPECTED) + .toString(); + + private static String LINHA_DIGITAVEL_FORMATADA_EXPECTED = "39991.23452 67000.000009 00222.268922 3 43710000000965"; + private static String LINHA_DIGITAVEL_NUMERICA_EXPECTED = "39991234526700000000900222268922343710000000965"; + + private static final ArrayList INPUTS_CODIGO_DE_BARRAS = new ArrayList(); + + private static final ArrayList INPUTS_LINHAS_DIGITAVEIS_FORMATADAS = new ArrayList(); + private static final ArrayList INPUTS_LINHAS_DIGITAVEIS_NUMERICAS = new ArrayList(); + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + + /* + * ENTRADAS FORMATADAS + */ + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991.23452 67000.000009 00222.268922 3 43710000000 965"); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991.23452 67000.000009 00222.268922 3 4371000000096"); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991.23452 67000.000009 00222.268922 $ 43710000000965"); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991.23452 67000.000009 00222.26892 3 43710000000965"); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991.23452 67000.00000 00222.268922 3 43710000000965"); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991.2345 67000.000009 00222.268922 3 43710000000965"); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add(0 + LINHA_DIGITAVEL_FORMATADA_EXPECTED); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add(LINHA_DIGITAVEL_FORMATADA_EXPECTED + 0); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991.2345267000.00000900222.268922343710000000965"); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991234526700000000900222268922343710000000965"); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991$23452 67000$000009 00222$268922 3 43710000000965"); + INPUTS_LINHAS_DIGITAVEIS_FORMATADAS.add("39991#23452 67000#000009 00222#268922 3 43710000000965"); + /* + * ENTRADAS NÃO FORMATADAS + */ + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add("000000000000000000000000000000000000000000000000"); + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add("0000000000000000000000000000000000000000000000"); + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add("000000000000000000000000x0000000000000000000000"); + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add("000000000000000000000000 0000000000000000000000"); + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add(0 + LINHA_DIGITAVEL_NUMERICA_EXPECTED); + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add(0 + LINHA_DIGITAVEL_NUMERICA_EXPECTED + 0); + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add(LINHA_DIGITAVEL_NUMERICA_EXPECTED + 0); + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add(" 000000000000000000000000x0000000000000000000000"); + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add(" 000000000000000000000000x0000000000000000000000 "); + INPUTS_LINHAS_DIGITAVEIS_NUMERICAS.add("000000000000000000000000x0000000000000000000000 "); + /* + * ENTRADAS DE CÓDIGOS DE BARRAS + */ + INPUTS_CODIGO_DE_BARRAS.add("000000000000000000000000000000000000000000000000"); + INPUTS_CODIGO_DE_BARRAS.add("0000000000000000000000000000000000000000000000"); + INPUTS_CODIGO_DE_BARRAS.add("000000000000000000000009x9000000000000000000000"); + INPUTS_CODIGO_DE_BARRAS.add("000000000000000000000009 9000000000000000000000"); + INPUTS_CODIGO_DE_BARRAS.add(1 + CODIGO_DE_BARRAS_EXPECTED); + INPUTS_CODIGO_DE_BARRAS.add(1 + CODIGO_DE_BARRAS_EXPECTED + 2); + INPUTS_CODIGO_DE_BARRAS.add(CODIGO_DE_BARRAS_EXPECTED + 9); + INPUTS_CODIGO_DE_BARRAS.add(" 100000000000000000000009x9000000000000000000000"); + INPUTS_CODIGO_DE_BARRAS.add(" 100000000000000000000009x9000000000000000000002 "); + INPUTS_CODIGO_DE_BARRAS.add("000000000000000000000009x9000000000000000000001 "); + } + + @Test + public void testGetCampoLivreDaLinhaDigitavelFormatada() { + + assertEquals(CAMPO_LIVRE_EXPECTED, BoletoUtil.getCampoLivreDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertTrue(!CAMPO_LIVRE_EXPECTED.equals(BoletoUtil.getCampoLivreDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED.replace("0", "1")))); + } + + @Test + public void testGetValorDoTituloDaLinhaDigitavelFormatada() { + + assertEquals(VALOR_NOMINAL_EXPECTED, BoletoUtil.getValorDoTituloDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertTrue(!VALOR_NOMINAL_EXPECTED.equals(BoletoUtil.getValorDoTituloDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED.replace("0", "1")))); + } + + @Test + public void testGetFatorDeVencimentoDaLinhaDigitavelFormatada() { + + assertEquals(FATOR_DE_VENCIMENTO_EXPECTED, BoletoUtil.getFatorDeVencimentoDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertTrue(!FATOR_DE_VENCIMENTO_EXPECTED.equals(BoletoUtil.getFatorDeVencimentoDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED.replace("7", "9")))); + } + + @Test + public void testGetDigitoVerificadorGeralDaLinhaDigitavelFormatada() { + + assertEquals(CODIGO_DV_GERAL_EXPECTED, BoletoUtil.getDigitoVerificadorGeralDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertTrue(!CODIGO_DV_GERAL_EXPECTED.equals(BoletoUtil.getDigitoVerificadorGeralDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED.replace("3", "6")))); + } + + @Test + public void testGetCodigoDaMoedaDaLinhaDigitavelFormatada() { + + assertEquals(CODIGO_DA_MOEDA_EXPECTED, BoletoUtil.getCodigoDaMoedaDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertTrue(!CODIGO_DA_MOEDA_EXPECTED.equals(BoletoUtil.getCodigoDaMoedaDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED.replace("9", "5")))); + } + + @Test + public void testGetCodigoDoBancoDaLinhaDigitavelFormatada() { + + assertEquals(CODIGO_DO_BANCO_EXPECTED, BoletoUtil.getCodigoDoBancoDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertTrue(!CODIGO_DE_BARRAS_EXPECTED.equals(BoletoUtil.getCodigoDoBancoDaLinhaDigitavelFormatada(LINHA_DIGITAVEL_FORMATADA_EXPECTED.replace("9", "4")))); + } + + @Test + public void testGetCampoLivreDoCodigoDeBarras() { + + assertEquals(CAMPO_LIVRE_EXPECTED, BoletoUtil.getCampoLivreDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED)); + assertTrue(!CAMPO_LIVRE_EXPECTED.equals(BoletoUtil.getCampoLivreDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED.replace("0", "1")))); + } + + @Test + public void testGetValorDoTituloDoCodigoDeBarras() { + + assertEquals(VALOR_NOMINAL_EXPECTED, BoletoUtil.getValorDoTituloDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED)); + assertTrue(!VALOR_NOMINAL_EXPECTED.equals(BoletoUtil.getValorDoTituloDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED.replace("0", "1")))); + } + + @Test + public void testGetFatorDeVencimentoDoCodigoDeBarras() { + + assertEquals(FATOR_DE_VENCIMENTO_EXPECTED, BoletoUtil.getFatorDeVencimentoDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED)); + assertTrue(!FATOR_DE_VENCIMENTO_EXPECTED.equals(BoletoUtil.getFatorDeVencimentoDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED.replace("7", "9")))); + } + + @Test + public void testGetDigitoVerificadorGeralDoCodigoDeBarras() { + + assertEquals(CODIGO_DV_GERAL_EXPECTED, BoletoUtil.getDigitoVerificadorGeralDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED)); + assertTrue(!CODIGO_DV_GERAL_EXPECTED.equals(BoletoUtil.getDigitoVerificadorGeralDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED.replace("3", "6")))); + } + + @Test + public void testGetCodigoDaMoedaDoCodigoDeBarras() { + + assertEquals(CODIGO_DA_MOEDA_EXPECTED, BoletoUtil.getCodigoDaMoedaDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED)); + assertTrue(!CODIGO_DA_MOEDA_EXPECTED.equals(BoletoUtil.getCodigoDaMoedaDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED.replace("9", "5")))); + } + + @Test + public void testGetCodigoDoBancoDoCodigoDeBarras() { + + assertEquals(CODIGO_DO_BANCO_EXPECTED, BoletoUtil.getCodigoDoBancoDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED)); + assertTrue(!CODIGO_DE_BARRAS_EXPECTED.equals(BoletoUtil.getCodigoDoBancoDoCodigoDeBarras(CODIGO_DE_BARRAS_EXPECTED.replace("9", "4")))); + } + + @Test + public void testCodigoDeBarrasEmLinhaDigitavelFormatada() { + + assertEquals(CODIGO_DE_BARRAS_EXPECTED, BoletoUtil.linhaDigitavelFormatadaEmCodigoDeBarras(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertEquals(CODIGO_DE_BARRAS_EXPECTED, BoletoUtil.linhaDigitavelFormatadaEmCodigoDeBarras(" "+LINHA_DIGITAVEL_FORMATADA_EXPECTED+" ")); + assertTrue(!CODIGO_DE_BARRAS_EXPECTED.equals(BoletoUtil.linhaDigitavelFormatadaEmCodigoDeBarras(LINHA_DIGITAVEL_FORMATADA_EXPECTED.replace("8", "3")))); + } + + @Test + public void testCodigoDeBarrasLinhaDigitavelNumerica() { + + assertEquals(LINHA_DIGITAVEL_NUMERICA_EXPECTED, BoletoUtil.codigoDeBarrasEmLinhaDigitavelNumerica(CODIGO_DE_BARRAS_EXPECTED)); + assertEquals(LINHA_DIGITAVEL_NUMERICA_EXPECTED, BoletoUtil.codigoDeBarrasEmLinhaDigitavelNumerica(" "+CODIGO_DE_BARRAS_EXPECTED+" ")); + assertTrue(!LINHA_DIGITAVEL_NUMERICA_EXPECTED.equals(BoletoUtil.codigoDeBarrasEmLinhaDigitavelNumerica(CODIGO_DE_BARRAS_EXPECTED.replace("8", "3")))); + } + + @Test + public void testLinhaDigitavelFormatadaEmCodigoDeBarras() { + + assertEquals(CODIGO_DE_BARRAS_EXPECTED, BoletoUtil.linhaDigitavelFormatadaEmCodigoDeBarras(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertEquals(CODIGO_DE_BARRAS_EXPECTED, BoletoUtil.linhaDigitavelFormatadaEmCodigoDeBarras(" "+LINHA_DIGITAVEL_FORMATADA_EXPECTED+" ")); + assertTrue(!CODIGO_DE_BARRAS_EXPECTED.equals(BoletoUtil.linhaDigitavelFormatadaEmCodigoDeBarras(LINHA_DIGITAVEL_FORMATADA_EXPECTED.replace("8", "3")))); + } + + @Test + public void testLinhaDigitavelNumericaEmCodigoDeBarras() { + + assertEquals(CODIGO_DE_BARRAS_EXPECTED, BoletoUtil.linhaDigitavelNumericaEmCodigoDeBarras(LINHA_DIGITAVEL_NUMERICA_EXPECTED)); + assertEquals(CODIGO_DE_BARRAS_EXPECTED, BoletoUtil.linhaDigitavelNumericaEmCodigoDeBarras(" "+LINHA_DIGITAVEL_NUMERICA_EXPECTED+" ")); + assertTrue(!CODIGO_DE_BARRAS_EXPECTED.equals(BoletoUtil.linhaDigitavelNumericaEmCodigoDeBarras(LINHA_DIGITAVEL_NUMERICA_EXPECTED.replace("8", "3")))); + } + + @Test + public void testCheckFormatoCodigoDeBarras() { + for (String inputTest : INPUTS_CODIGO_DE_BARRAS) { + try { + BoletoUtil.checkFormatoCodigoDeBarras(inputTest); + fail("Controle de formatação falho."); + } catch (CodigoDeBarrasException e) { + assertTrue(true); + } + } + } + + @Test(expected = IllegalArgumentException.class) + public void testCheckExistsCodigoDeBarrasComArgumentoStringNull() { + + BoletoUtil.checkExistsCodigoDeBarras(null); + } + + @Test + public void testCheckExistsCodigoDeBarrasComArgumentoStringVazio() { + + StringBuilder emptyInput = new StringBuilder(""); + + for (int i = 0; i <= 60; i++) { + try { + BoletoUtil.checkExistsCodigoDeBarras(emptyInput.toString()); + fail("Controle de espaços falho."); + } catch (IllegalArgumentException e) { + assertTrue(true); + } + emptyInput.append(" "); + } + } + + + @Test + public void testIsCodigoDeBarrasValido() { + + assertTrue(!BoletoUtil.isCodigoDeBarrasValido(null)); + assertTrue(BoletoUtil.isCodigoDeBarrasValido(CODIGO_DE_BARRAS_EXPECTED)); + assertTrue(!BoletoUtil.isCodigoDeBarrasValido(CODIGO_DE_BARRAS_EXPECTED+0)); + assertTrue(!BoletoUtil.isCodigoDeBarrasValido(1+CODIGO_DE_BARRAS_EXPECTED)); + } + + @Test + public void testIsLinhaDigitavelFormatadaValida() { + + assertTrue(!BoletoUtil.isLinhaDigitavelFormatadaValida(null)); + assertTrue(BoletoUtil.isLinhaDigitavelFormatadaValida(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertTrue(!BoletoUtil.isLinhaDigitavelFormatadaValida(LINHA_DIGITAVEL_FORMATADA_EXPECTED+0)); + assertTrue(!BoletoUtil.isLinhaDigitavelFormatadaValida(LINHA_DIGITAVEL_NUMERICA_EXPECTED)); + } + + @Test + public void testIsLinhaDigitavelNumericaValida() { + + assertTrue(!BoletoUtil.isLinhaDigitavelNumericaValida(null)); + assertTrue(BoletoUtil.isLinhaDigitavelNumericaValida(LINHA_DIGITAVEL_NUMERICA_EXPECTED)); + assertTrue(!BoletoUtil.isLinhaDigitavelNumericaValida(0+LINHA_DIGITAVEL_NUMERICA_EXPECTED)); + assertTrue(!BoletoUtil.isLinhaDigitavelNumericaValida(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + } + + @Test + public void testCheckFormatoLinhaDigitavelFormatada() { + + for (String inputTest : INPUTS_LINHAS_DIGITAVEIS_FORMATADAS) { + try { + BoletoUtil.checkFormatoLinhaDigitavelFormatada(inputTest); + fail("Controle de formatação falho."); + } catch (LinhaDigitavelException e) { + assertTrue(true); + } + } + } + + @Test + public void testCheckFormatoLinhaDigitavelNumerica() { + for (String inputTest : INPUTS_LINHAS_DIGITAVEIS_NUMERICAS) { + try { + BoletoUtil.checkFormatoLinhaDigitavelNumerica(inputTest); + fail("Controle de formatação falho."); + } catch (LinhaDigitavelException e) { + assertTrue(true); + } + } + } + + @Test(expected = IllegalArgumentException.class) + public void testCheckExistsLinhaDigitavelComArgumentoStringNull() { + + BoletoUtil.checkExistsLinhaDigitavel(null); + } + + @Test + public void testCheckExistsLinhaDigitavelComArgumentoStringVazio() { + + StringBuilder emptyInput = new StringBuilder(""); + + for (int i = 0; i <= 60; i++) { + try { + BoletoUtil.checkExistsLinhaDigitavel(emptyInput.toString()); + fail("Controle de espaços falho."); + } catch (IllegalArgumentException e) { + assertTrue(true); + } + emptyInput.append(" "); + } + } + + @Test(expected = IllegalArgumentException.class) + public void testLinhaDigitavelFormatadaEmNumericaComArgumentoNull() { + + BoletoUtil.linhaDigitavelFormatadaEmNumerica(null); + } + + @Test + public void testLinhaDigitavelFormatadaEmNumericaComArgumentoStringVazio() { + + StringBuilder emptyInput = new StringBuilder(""); + + for (int i = 0; i <= 60; i++) { + try { + BoletoUtil.linhaDigitavelFormatadaEmNumerica(emptyInput + .toString()); + fail("Controle de espaços falho."); + } catch (IllegalArgumentException e) { + assertTrue(true); + } + emptyInput.append(" "); + } + } + + @Test + public void testLinhaDigitavelFormatadaEmNumericaComArgumentoStringDeFormatoNaoPrevisto() { + + for (String inputTest : INPUTS_LINHAS_DIGITAVEIS_FORMATADAS) { + try { + BoletoUtil.linhaDigitavelFormatadaEmNumerica(inputTest); + fail("Controle de formatação falho."); + } catch (LinhaDigitavelException e) { + assertTrue(true); + } + } + } + + @Test + public void testLinhaDigitavelFormatadaEmNumerica() { + + assertEquals(LINHA_DIGITAVEL_NUMERICA_EXPECTED,BoletoUtil.linhaDigitavelFormatadaEmNumerica(LINHA_DIGITAVEL_FORMATADA_EXPECTED)); + assertEquals(LINHA_DIGITAVEL_NUMERICA_EXPECTED,BoletoUtil.linhaDigitavelFormatadaEmNumerica(" "+LINHA_DIGITAVEL_FORMATADA_EXPECTED+" ")); + assertTrue(!LINHA_DIGITAVEL_NUMERICA_EXPECTED.equals(BoletoUtil.linhaDigitavelFormatadaEmNumerica(LINHA_DIGITAVEL_FORMATADA_EXPECTED.replace("8", "3")))); + } + + @Test(expected = IllegalArgumentException.class) + public void testLinhaDigitavelNumericaEmFormatadaComArgumentoNull() { + + BoletoUtil.linhaDigitavelNumericaEmFormatada(null); + } + + @Test + public void testLinhaDigitavelNumericaEmFormatadaComArgumentoStringVazio() { + + StringBuilder emptyInput = new StringBuilder(""); + + for (int i = 0; i <= 60; i++) { + try { + BoletoUtil.linhaDigitavelNumericaEmFormatada(emptyInput + .toString()); + fail("Controle de espaços falho."); + } catch (IllegalArgumentException e) { + assertTrue(true); + } + emptyInput.append(" "); + } + } + + @Test + public void testLinhaDigitavelNumericaEmFormatadaComArgumentoStringDeFormatoNaoPrevisto() { + + for (String inputTest : INPUTS_LINHAS_DIGITAVEIS_NUMERICAS) { + try { + BoletoUtil.linhaDigitavelNumericaEmFormatada(inputTest); + fail("Controle de formatação falho."); + } catch (LinhaDigitavelException e) { + assertTrue(true); + } + } + } + + @Test + public void testLinhaDigitavelNumericaEmFormatada() { + + assertEquals(LINHA_DIGITAVEL_FORMATADA_EXPECTED,BoletoUtil.linhaDigitavelNumericaEmFormatada(LINHA_DIGITAVEL_NUMERICA_EXPECTED)); + assertEquals(LINHA_DIGITAVEL_FORMATADA_EXPECTED,BoletoUtil.linhaDigitavelNumericaEmFormatada(" "+LINHA_DIGITAVEL_NUMERICA_EXPECTED+" ")); + assertTrue(!LINHA_DIGITAVEL_FORMATADA_EXPECTED.equals(BoletoUtil.linhaDigitavelNumericaEmFormatada(LINHA_DIGITAVEL_NUMERICA_EXPECTED.replace("8", "3")))); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestCodigoDeBarras.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestCodigoDeBarras.java new file mode 100644 index 0000000..e7f9f1d --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestCodigoDeBarras.java @@ -0,0 +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.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeMoeda; +import org.jrimum.domkee.financeiro.banco.febraban.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/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestFatorDeVencimento.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestFatorDeVencimento.java new file mode 100644 index 0000000..b7b1dc9 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestFatorDeVencimento.java @@ -0,0 +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:15:56 + * + * ================================================================================ + * + * 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:15:56 + * + */ +package org.jrimum.bopepo; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.apache.commons.lang.time.DateUtils; +import org.junit.Test; + + +public class TestFatorDeVencimento { + + private GregorianCalendar data = new GregorianCalendar(); + + @Test(expected = IllegalArgumentException.class) + public void testToFatorComDataNula() { + + FatorDeVencimento.toFator(null); + } + + @Test(expected = IllegalArgumentException.class) + public void testToFatorComDataMenorQueDataBase() { + + data.set(1997, Calendar.JANUARY, 1); + + FatorDeVencimento.toFator(data.getTime()); + } + + @Test(expected = IllegalArgumentException.class) + public void testToFatorComDataMaiorQueDataLimite() { + + data.set(2025, Calendar.FEBRUARY, 22); + + FatorDeVencimento.toFator(data.getTime()); + } + + @Test + public final void testToFator() { + + data.set(2000, Calendar.JULY, 3); + assertEquals(1000, FatorDeVencimento.toFator(data.getTime())); + + data.set(2000, Calendar.JULY, 5); + assertEquals(1002, FatorDeVencimento.toFator(data.getTime())); + + data.set(2025, Calendar.FEBRUARY, 21); + assertEquals(9999, FatorDeVencimento.toFator(data.getTime())); + } + + @Test(expected = IllegalArgumentException.class) + public void testToDateComFatorMenorQueLimiteBase() { + + FatorDeVencimento.toDate(-1); + } + + @Test(expected = IllegalArgumentException.class) + public void testToDateComFatorMaiorQueLimiteMaximo() { + + FatorDeVencimento.toDate(10000); + } + + @Test + public final void testToDate() { + + data.set(2000, Calendar.JULY, 3); + Date date = DateUtils.truncate(data.getTime() ,Calendar.DATE); + assertEquals(date, FatorDeVencimento.toDate(1000)); + + data.set(2000, Calendar.JULY, 5); + date = DateUtils.truncate(data.getTime() ,Calendar.DATE); + assertEquals(date, FatorDeVencimento.toDate(1002)); + + data.set(2025, Calendar.FEBRUARY, 21); + date = DateUtils.truncate(data.getTime() ,Calendar.DATE); + assertEquals(date, FatorDeVencimento.toDate(9999)); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestLinhaDigitavel.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestLinhaDigitavel.java new file mode 100644 index 0000000..607a78e --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/TestLinhaDigitavel.java @@ -0,0 +1,110 @@ +/* + * 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:17 + * + * ================================================================================ + * + * 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:17 + * + */ + + +package org.jrimum.bopepo; + +import static org.junit.Assert.assertEquals; + +import java.math.BigDecimal; +import java.util.Date; + +import org.jrimum.bopepo.campolivre.CampoLivre; +import org.jrimum.bopepo.campolivre.CampoLivreFactory; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeMoeda; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.utilix.text.DateFormat; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Gilmar P.S.L. + * + */ +public class TestLinhaDigitavel{ + + private CampoLivre clBradesco; + + private Titulo titulo; + + private CodigoDeBarras codigoDeBarras; + + private LinhaDigitavel linhaDigitavel; + + private Date VENCIMENTO = DateFormat.DDMMYYYY_B.parse("03/07/2000"); + + @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); + + linhaDigitavel = new LinhaDigitavel(codigoDeBarras); + + } + + /** + * Test method for {@link org.jrimum.bopepo.LinhaDigitavel#toString()}. + */ + @Test + public void testWrite() { + + assertEquals("23791.23405 51234.567892 01000.678902 2 10000000010023", linhaDigitavel.write()); + + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/AbstractCLBancoSafraBaseTest.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/AbstractCLBancoSafraBaseTest.java new file mode 100644 index 0000000..636d95d --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/AbstractCLBancoSafraBaseTest.java @@ -0,0 +1,42 @@ +package org.jrimum.bopepo.campolivre; + +import org.junit.Test; + +/** + * Classe base para os testes de campos livres do Banco Safra, contendo métodos + * básicos de testes comuns que se encontra no {@linkplain AbstractCLBancoSafra} + * . + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +public abstract class AbstractCLBancoSafraBaseTest extends AbstractCampoLivreBaseTest{ + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraNull() { + + testeSeNaoPermiteCarteiraNula(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraSemTipoDeCobranca() { + + testeSeNaoPermiteCarteiraSemTipoDeCobranca(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoNegativo() { + + testeSeNaoPermiteCarteiraComCodigoNegativo(); + + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoAcimaDe2Digitos() { + + testeSeNaoPermiteCarteiraComCodigoAcimaDoLimite(111); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/AbstractCampoLivreBaseTest.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/AbstractCampoLivreBaseTest.java new file mode 100644 index 0000000..f07bebf --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/AbstractCampoLivreBaseTest.java @@ -0,0 +1,439 @@ +/* + * 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: 15/02/2010 - 17:42: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: 15/02/2010 - 17:42:20 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.math.RoundingMode; + +import org.jrimum.domkee.financeiro.banco.ParametroBancario; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.junit.Test; + +/** + *

    + * Classe base para os testes de campos livres. Contém os métodos + * básicos de testes de qualquer campo livre. + *

    + *

    + * Todos os testes de campo livre devem herdar desta classe. + *

    + * + * @author Gilmar P.S.L + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public abstract class AbstractCampoLivreBaseTest { + + protected final Titulo titulo; + + private CampoLivre campoLivreToTest; + + private String campoLivreValidoAsString; + + public AbstractCampoLivreBaseTest() { + super(); + this.titulo = new Titulo(new ContaBancaria(), new Sacado("S"), new Cedente("C")); + } + + /* + * Testes para obrigatórios de todos os campos livres. + */ + + @Test + public final void seCriacaoDoCampoLivreOcorreSemFalha() { + + assertNotNull(campoLivreToTest); + } + + @Test + public final void seTamanhoDoCampoLivreEscritoIgualA25() { + campoLivreToTest.write().length(); + assertEquals(25, campoLivreToTest.write().length()); + } + + @Test + public final void seClasseDaInstaciaDoCampoLivreEstaCorreta() { + + @SuppressWarnings("unchecked") + Class classeGeradoraDoCampoLivre = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; + + assertEquals(classeGeradoraDoCampoLivre, campoLivreToTest.getClass()); + } + + @Test + public final void seCampoLivreEscritoEstaCorreto() { + campoLivreToTest.write(); + assertEquals(campoLivreValidoAsString, campoLivreToTest.write()); + } + + /* + * Testes para uso específico + */ + + protected final void testeSeNaoPermiteAgenciaNula() throws CampoLivreException{ + + titulo.getContaBancaria().setAgencia(null); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteAgenciaComCodigoZero() throws CampoLivreException{ + + titulo.getContaBancaria().setAgencia(new Agencia(-0)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteAgenciaComCodigoNegativo() throws IllegalArgumentException{ + + //uma exceção deve ser lançada aqui + titulo.getContaBancaria().setAgencia(new Agencia(-1)); + } + + protected final void testeSeNaoPermiteNumeroDaAgenciaComDigitosAcimaDoLimite(int limiteAcima) throws CampoLivreException { + + titulo.getContaBancaria().setAgencia(new Agencia(limiteAcima)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteDigitoDaAgenciaNulo() throws CampoLivreException { + + titulo.getContaBancaria().setAgencia(new Agencia(1)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteDigitoDaAgenciaNaoNumerico() throws CampoLivreException { + + titulo.getContaBancaria().setAgencia(new Agencia(1,"X")); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteCarteiraNula() throws CampoLivreException { + + titulo.getContaBancaria().setCarteira(null); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteCarteiraSemTipoDeCobranca() throws CampoLivreException{ + + titulo.getContaBancaria().setCarteira(new Carteira()); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteCarteiraComCodigoNegativo() throws CampoLivreException{ + + titulo.getContaBancaria().setCarteira(new Carteira(-1)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteCarteiraComCodigoAcimaDoLimite(int limiteAcima) throws CampoLivreException{ + + titulo.getContaBancaria().setCarteira(new Carteira(limiteAcima)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteNossoNumeroNulo() throws CampoLivreException{ + + titulo.setNossoNumero(null); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteNossoNumeroComBrancos(int nnLength) throws CampoLivreException{ + + StringBuilder nnBlank = new StringBuilder(nnLength); + + for(int i = 1; i <= nnLength; i++){ + nnBlank.append(" "); + } + + titulo.setNossoNumero(nnBlank.toString()); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteNossoNumeroComEspacos(int nnLength) throws CampoLivreException{ + + //Nosso número randômico + String nnRadom = nossoNumeroRadom(nnLength); + + char[] nn = nnRadom.toCharArray(); + + //Com espaço (+ ou -) no meio + nn[nnRadom.length()/2] = ' '; + + titulo.setNossoNumero(nn.toString()); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteNossoNumeroComTamanhoDiferenteDoEspecificado(int nnOutLength) throws CampoLivreException{ + + titulo.setNossoNumero(nossoNumeroRadom(nnOutLength)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteNumeroDaContaNulo() throws CampoLivreException{ + + titulo.getContaBancaria().setNumeroDaConta(null); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteNumeroDaContaComCodigoZero() throws CampoLivreException{ + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(0)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteNumeroDaContaComCodigoNegativo() throws CampoLivreException{ + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(-1)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteNumeroDaContaComCodigoAcimaDoLimite(int limiteAcima) throws CampoLivreException{ + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(limiteAcima)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteDigitoDaContaNulo() throws CampoLivreException { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(1)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteDigitoDaContaVazio() throws CampoLivreException { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(1,EMPTY)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteDigitoDaContaNegativo() throws CampoLivreException { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(1,"-1")); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteDigitoDaContaNaoNumerico() throws CampoLivreException { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(1,"X")); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteParametroBancarioNulo() throws CampoLivreException{ + + titulo.setParametrosBancarios(null); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteParametroBancarioAusente() throws CampoLivreException{ + + titulo.setParametrosBancarios(new ParametrosBancariosMap()); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteParametroBancarioSemValor(ParametroBancario parametro) throws IllegalArgumentException{ + + //uma exceção deve ser lançada aqui + titulo.setParametrosBancarios(new ParametrosBancariosMap(parametro, null)); + } + + protected final void testeSeNaoPermiteParametroBancarioComValorAcimaDoLimite(ParametroBancario parametro, Integer limiteAcima) throws IllegalArgumentException{ + + titulo.setParametrosBancarios(new ParametrosBancariosMap(parametro, limiteAcima)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + protected final void testeSeNaoPermiteValorDoTituloNulo() throws NullPointerException{ + + //uma exceção deve ser lançada aqui + titulo.setValor(null); + } + + protected final void testeSeNaoPermiteValorDoTituloNegativo() throws CampoLivreException{ + + titulo.setValor(BigDecimal.valueOf(-23.4150)); + + createCampoLivreToTest(); + + //uma exceção deve ser lançada aqui + writeCampoLivre(); + } + + /* + * Obtenção de novas instâncias. + */ + + public final void createCampoLivreToTest() { + this.campoLivreToTest = CampoLivreFactory.create(titulo); + } + + /* + * Acessores + */ + + /** + * Simplesmente escreve o campo livre executando o método {@code write()}. + * + * @return campo livre + */ + public final String writeCampoLivre(){ + + return campoLivreToTest.write(); + } + + protected final void setCampoLivreEsperadoComoString(String campoLivreValidoAsString) { + this.campoLivreValidoAsString = campoLivreValidoAsString; + } + + /* + * Helpers + */ + + /** + * Gera um nosso numero randomicamente com o tamanho determinado. + * + * @param nnLength + * @return geraNossoNumero + */ + private final String nossoNumeroRadom(int nnLength){ + + //Nosso número randômico + return new BigDecimal(Math.random()).movePointRight(nnLength).setScale(0,RoundingMode.DOWN).toString(); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDeBrasilia.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDeBrasilia.java new file mode 100644 index 0000000..4f10764 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDeBrasilia.java @@ -0,0 +1,181 @@ +/* + * Copyright 2013 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: 24/08/2013 - 19:54:00 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 24/08/2013 - 19:54:00 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroBancoDeBrasilia.CHAVE_ASBACE_DIGITO1; +import static org.jrimum.bopepo.parametro.ParametroBancoDeBrasilia.CHAVE_ASBACE_DIGITO2; +import static org.junit.Assert.assertEquals; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre do BRB - Banco de Brasília. + *

    + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBancoDeBrasilia extends AbstractCampoLivreBaseTest { + + private final int NOSSO_NUMERO_LENGTH = 6; + + @Before + public void setUp() { + + titulo.getContaBancaria().setBanco( + BancosSuportados.BANCO_DE_BRASILIA.create()); + + titulo.getContaBancaria().setAgencia(new Agencia(58)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(6002006)); + titulo.getContaBancaria().setCarteira(new Carteira(1,TipoDeCobranca.SEM_REGISTRO)); + titulo.setNossoNumero("000001"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0000586002006100000107045"); + assertEquals(4, titulo.getParametrosBancarios().getValor(CHAVE_ASBACE_DIGITO1)); + assertEquals(5, titulo.getParametrosBancarios().getValor(CHAVE_ASBACE_DIGITO2)); + } + + @Test + public void seGeraCorretoParaCarteiraComRegistro(){ + + titulo.getContaBancaria().setCarteira(new Carteira(2,TipoDeCobranca.COM_REGISTRO)); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0000586002006200000107031"); + + seCampoLivreEscritoEstaCorreto(); + assertEquals(3, titulo.getParametrosBancarios().getValor(CHAVE_ASBACE_DIGITO1)); + assertEquals(1, titulo.getParametrosBancarios().getValor(CHAVE_ASBACE_DIGITO2)); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaNula() { + + testeSeNaoPermiteAgenciaNula(); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteAgenciaComCodigoNegativo() { + + testeSeNaoPermiteAgenciaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaComCodigoZero() { + + testeSeNaoPermiteAgenciaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaAgenciaAcimaDe3Digitos() { + + testeSeNaoPermiteNumeroDaAgenciaComDigitosAcimaDoLimite(1000); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaNulo() { + + testeSeNaoPermiteNumeroDaContaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoZero() { + + testeSeNaoPermiteNumeroDaContaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoNegativo() { + + testeSeNaoPermiteNumeroDaContaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoAcimaDe7Digitos() { + + testeSeNaoPermiteNumeroDaContaComCodigoAcimaDoLimite(12345678); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroNulo() { + + testeSeNaoPermiteNossoNumeroNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComBrancos() { + + testeSeNaoPermiteNossoNumeroComBrancos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComEspacos() { + + testeSeNaoPermiteNossoNumeroComEspacos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComTamanhoDiferenteDe6() { + + testeSeNaoPermiteNossoNumeroComTamanhoDiferenteDoEspecificado(NOSSO_NUMERO_LENGTH - 1); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraNull() { + + testeSeNaoPermiteCarteiraNula(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoNegativo() { + + testeSeNaoPermiteCarteiraComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoAcimaDe2() { + + testeSeNaoPermiteCarteiraComCodigoAcimaDoLimite(3); + } + +} \ No newline at end of file diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN10.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN10.java new file mode 100644 index 0000000..b504490 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN10.java @@ -0,0 +1,67 @@ +/* + * 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: 15/02/2010 - 18:40:47 + * + * ================================================================================ + * + * 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: 15/02/2010 - 18:40:47 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do banco do brasil com o nosso número + * de tamanho igual a 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 TestCLBancoDoBrasilNN10 extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + titulo.getContaBancaria().setCarteira(new Carteira(5)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(6789)); + titulo.setNossoNumero("1234567890"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0000000006789123456789005"); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN11.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN11.java new file mode 100644 index 0000000..69a9cac --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN11.java @@ -0,0 +1,68 @@ +/* + * 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:13:47 + * + * ================================================================================ + * + * 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:13:47 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do banco do brasil com o nosso número + * de tamanho igual a 11. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBancoDoBrasilNN11 extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + titulo.getContaBancaria().setAgencia(new Agencia(1234, "1")); + titulo.getContaBancaria().setCarteira(new Carteira(5)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(6789)); + titulo.setNossoNumero("12345678901"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1234567890112340000678905"); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN17Convenio6.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN17Convenio6.java new file mode 100644 index 0000000..f2ba267 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN17Convenio6.java @@ -0,0 +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: 30/03/2008 - 18:13:58 + * + * ================================================================================ + * + * 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:13:58 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; + +/** + * + * Teste unitário do campo livre do banco do brasil com o nosso número + * de tamanho igual a 17 e convênio de 6 posições. + * + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBancoDoBrasilNN17Convenio6 extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(123456)); + titulo.setNossoNumero("12345678901234567"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1234561234567890123456721"); + } + +} \ No newline at end of file diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN17Convenio7.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN17Convenio7.java new file mode 100644 index 0000000..1559d1d --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoDoBrasilNN17Convenio7.java @@ -0,0 +1,35 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; + + +/** + * + * Teste unitário do campo livre do banco do brasil com o nosso número + * de tamanho igual a 17 e convênio de 7 posições. + * + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBancoDoBrasilNN17Convenio7 extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_DO_BRASIL.create()); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(1234567)); + titulo.getContaBancaria().setCarteira(new Carteira(23)); + titulo.setNossoNumero("12345678901234567"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0000001234567890123456723"); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoIntermedium.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoIntermedium.java new file mode 100644 index 0000000..7d29cc1 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoIntermedium.java @@ -0,0 +1,34 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do Banco Intermedium. + *

    + * + * @author Gilmar P.S.L + * @author Fernando Dias + * + */ +public class TestCLBancoIntermedium extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_INTEMEDIUM.create()); + titulo.getContaBancaria().setAgencia( new Agencia(54, "0")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(149666,"6")); + titulo.getContaBancaria().setCarteira(new Carteira(5)); + titulo.setNossoNumero("5611002"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0054700000561100214966660"); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoReal.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoReal.java new file mode 100644 index 0000000..1073b61 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoReal.java @@ -0,0 +1,69 @@ +/* + * 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:14: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:14:06 + * + */ + + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do banco real + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + * + */ +public class TestCLBancoReal extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_ABN_AMRO_REAL.create()); + titulo.getContaBancaria().setAgencia(new Agencia(1018)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(16324)); + titulo.setNumeroDoDocumento("1234567890123"); + titulo.setNossoNumero("1234567890123"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1018001632491234567890123"); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaNaoRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaNaoRegistrada.java new file mode 100644 index 0000000..ea8281c --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaNaoRegistrada.java @@ -0,0 +1,44 @@ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroBancoRural.CODIGO_REDUZIDO; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do banco Rural - Cobrança não Registrada. + *

    + * + * @author Gilmar P.S.L + * @author Fernando Dias + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBancoRuralCobrancaNaoRegistrada extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_RURAL.create()); + titulo.getContaBancaria().setAgencia(new Agencia(133, "1")); + titulo.getContaBancaria().setCarteira(new Carteira(5,TipoDeCobranca.SEM_REGISTRO)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(6789)); + titulo.setNossoNumero("123456789012345"); + + // Código Reduzido do Cliente fornecido pelo Banco + titulo.setParametrosBancarios( new ParametrosBancariosMap(CODIGO_REDUZIDO, 123)); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("9133123123456789012345000"); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaNaoRegistradaSeguradora.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaNaoRegistradaSeguradora.java new file mode 100644 index 0000000..f4cc6c8 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaNaoRegistradaSeguradora.java @@ -0,0 +1,51 @@ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroBancoRural.CODIGO_REDUZIDO; +import static org.jrimum.bopepo.parametro.ParametroBancoRural.VALOR_IOS; + +import java.math.BigDecimal; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do Banco Rural - Cobrança não Registrada Seguradora. + *

    + * + * @author Gilmar P.S.L + * @author Fernando Dias + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBancoRuralCobrancaNaoRegistradaSeguradora extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_RURAL.create()); + titulo.getContaBancaria().setAgencia(new Agencia(155, "1")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(1625462,"9")); + titulo.getContaBancaria().setCarteira(new Carteira(101, TipoDeCobranca.SEM_REGISTRO)); + titulo.setNossoNumero("0000022569"); + titulo.setDigitoDoNossoNumero("7"); + + ParametrosBancariosMap map = new ParametrosBancariosMap(); + map.adicione(VALOR_IOS, new BigDecimal("40.77")); + map.adicione(CODIGO_REDUZIDO, 1); + + titulo.setParametrosBancarios(map); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("4155001000002256970004077"); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaRegistrada.java new file mode 100644 index 0000000..a2bb957 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoRuralCobrancaRegistrada.java @@ -0,0 +1,38 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do banco Rural - Cobrança Registrada. + *

    + * + * @author Gilmar P.S.L + * @author Fernando Dias + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBancoRuralCobrancaRegistrada extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_RURAL.create()); + titulo.getContaBancaria().setAgencia(new Agencia(133, "1")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(6789,"1")); + titulo.getContaBancaria().setCarteira(new Carteira(5,TipoDeCobranca.COM_REGISTRO)); + titulo.setNossoNumero("1234567"); + titulo.setDigitoDoNossoNumero("1"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0133000006789112345671000"); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSafraCobrancaNaoRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSafraCobrancaNaoRegistrada.java new file mode 100644 index 0000000..5ec42a2 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSafraCobrancaNaoRegistrada.java @@ -0,0 +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: 21/04/2008 - 22:36:47 + * + * ================================================================================ + * + * 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: 21/04/2008 - 22:36:47 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre do banco safra 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 TestCLBancoSafraCobrancaNaoRegistrada extends AbstractCLBancoSafraBaseTest { + + private final int NOSSO_NUMERO_LENGTH = 17; + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_SAFRA.create()); + titulo.getContaBancaria().setAgencia(new Agencia(1730, "0")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(12110, "0")); + titulo.getContaBancaria().setCarteira(new Carteira(6, TipoDeCobranca.SEM_REGISTRO)); + titulo.setNossoNumero("12345678901234567"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("7121100123456789012345674"); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaNulo() { + + testeSeNaoPermiteNumeroDaContaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoZero() { + + testeSeNaoPermiteNumeroDaContaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoNegativo() { + + testeSeNaoPermiteNumeroDaContaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoAcimaDe8Digitos() { + + testeSeNaoPermiteNumeroDaContaComCodigoAcimaDoLimite(123456789); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaNulo() { + + testeSeNaoPermiteDigitoDaContaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaVazio() { + + testeSeNaoPermiteDigitoDaContaVazio(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaNegativo() { + + testeSeNaoPermiteDigitoDaContaNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaNaoNumerico() { + + testeSeNaoPermiteDigitoDaContaNaoNumerico(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroNulo() { + + testeSeNaoPermiteNossoNumeroNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComBrancos() { + + testeSeNaoPermiteNossoNumeroComBrancos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComEspacos() { + + testeSeNaoPermiteNossoNumeroComEspacos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComTamanhoDiferenteDe9() { + + testeSeNaoPermiteNossoNumeroComTamanhoDiferenteDoEspecificado(NOSSO_NUMERO_LENGTH - 1); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSafraCobrancaRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSafraCobrancaRegistrada.java new file mode 100644 index 0000000..4673c21 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSafraCobrancaRegistrada.java @@ -0,0 +1,182 @@ +/* + * 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: 21/04/2008 - 22:36:47 + * + * ================================================================================ + * + * 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: 21/04/2008 - 22:36:47 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre do banco safra para cobrança 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 TestCLBancoSafraCobrancaRegistrada extends AbstractCLBancoSafraBaseTest { + + private final int NOSSO_NUMERO_LENGTH = 9; + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_SAFRA.create()); + titulo.getContaBancaria().setAgencia(new Agencia(100, "0")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(727469,"8")); + titulo.getContaBancaria().setCarteira(new Carteira(70, TipoDeCobranca.COM_REGISTRO)); + titulo.setNossoNumero("960900152"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("7010000072746989609001522"); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaNula() { + + testeSeNaoPermiteAgenciaNula(); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteAgenciaComCodigoNegativo() { + + testeSeNaoPermiteAgenciaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaComCodigoZero() { + + testeSeNaoPermiteAgenciaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaAgenciaAcimaDe4Digitos() { + + testeSeNaoPermiteNumeroDaAgenciaComDigitosAcimaDoLimite(10000); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaAgenciaNulo() { + + testeSeNaoPermiteDigitoDaAgenciaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaAgenciaNaoNumerico() { + + testeSeNaoPermiteDigitoDaAgenciaNaoNumerico(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaNulo() { + + testeSeNaoPermiteNumeroDaContaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoZero() { + + testeSeNaoPermiteNumeroDaContaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoNegativo() { + + testeSeNaoPermiteNumeroDaContaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoAcimaDe8Digitos() { + + testeSeNaoPermiteNumeroDaContaComCodigoAcimaDoLimite(123456789); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaNulo() { + + testeSeNaoPermiteDigitoDaContaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaVazio() { + + testeSeNaoPermiteDigitoDaContaVazio(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaNegativo() { + + testeSeNaoPermiteDigitoDaContaNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaNaoNumerico() { + + testeSeNaoPermiteDigitoDaContaNaoNumerico(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroNulo() { + + testeSeNaoPermiteNossoNumeroNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComBrancos() { + + testeSeNaoPermiteNossoNumeroComBrancos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComEspacos() { + + testeSeNaoPermiteNossoNumeroComEspacos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComTamanhoDiferenteDe9() { + + testeSeNaoPermiteNossoNumeroComTamanhoDiferenteDoEspecificado(NOSSO_NUMERO_LENGTH - 1); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSantander.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSantander.java new file mode 100644 index 0000000..35af23e --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoSantander.java @@ -0,0 +1,63 @@ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroBancoSantander.IOF_SEGURADORA; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre do banco Santander. + *

    + * + * @author Gilmar P.S.L. + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBancoSantander extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_SANTANDER.create()); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(162546,"9")); + titulo.getContaBancaria().setCarteira(new Carteira(101, TipoDeCobranca.COM_REGISTRO, "101- Cobrança Simples Rápida COM Registro")); + titulo.setNossoNumero("00000000002"); + titulo.setDigitoDoNossoNumero("7"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("9162546900000000000270101"); + + } + + @Test + public void testIofSeguradora(){ + + titulo.setParametrosBancarios(new ParametrosBancariosMap(IOF_SEGURADORA, 8)); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("9162546900000000000278101"); + + seCampoLivreEscritoEstaCorreto(); + } + + @Test(expected = CampoLivreException.class) + public void testCarteiras(){ + + //Carteira nao autorizada + titulo.getContaBancaria().setCarteira(new Carteira(123)); + + createCampoLivreToTest(); + + seCampoLivreEscritoEstaCorreto(); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoobCobrancaNaoRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoobCobrancaNaoRegistrada.java new file mode 100644 index 0000000..ca57ddd --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBancoobCobrancaNaoRegistrada.java @@ -0,0 +1,98 @@ +/* + * 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: 17/02/2011 - 12:40:00 + * + * ================================================================================ + * + * 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: 17/02/2011 - 12:40:00 + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre do Banco Bancoob para cobrança não registrada. + *

    + * + * @author Gilmar P.S.L + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBancoobCobrancaNaoRegistrada extends AbstractCampoLivreBaseTest{ + + private final int NOSSO_NUMERO_LENGTH = 7; + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCOOB.create()); + titulo.getContaBancaria().setAgencia(new Agencia(4340)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(1, "0")); + titulo.getContaBancaria().setCarteira(new Carteira(1)); + titulo.setNossoNumero("0200000"); + titulo.setDigitoDoNossoNumero("1"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1434001000001002000001001"); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComTamanhoDiferenteDe7() { + testeSeNaoPermiteNossoNumeroComTamanhoDiferenteDoEspecificado(NOSSO_NUMERO_LENGTH + 1); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaNulo() { + testeSeNaoPermiteDigitoDaContaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaNaoNumero() { + testeSeNaoPermiteDigitoDaContaNaoNumerico(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaNegativo() { + testeSeNaoPermiteDigitoDaContaNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDaContaVazio() { + testeSeNaoPermiteDigitoDaContaVazio(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaMaiorQueSeisDigitos() { + testeSeNaoPermiteNumeroDaContaComCodigoAcimaDoLimite(1000000); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanestes.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanestes.java new file mode 100644 index 0000000..3d12ee4 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanestes.java @@ -0,0 +1,129 @@ +/* + * 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: Dec 13, 2008 - 1:07:16 PM + * + * ================================================================================ + * + * 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: Dec 13, 2008 - 1:07:16 PM + * + */ +package org.jrimum.bopepo.campolivre; + +import static org.junit.Assert.assertEquals; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + * + *

    + * Valida a implementação do campo livre para o Banco Banestes. + *

    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério Valerio + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBanestes extends AbstractCampoLivreBaseTest { + + @Before + public void setUp() { + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_DO_ESTADO_DO_ESPIRITO_SANTO.create()); + titulo.getContaBancaria().setCarteira(new Carteira(4, TipoDeCobranca.COM_REGISTRO)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(7730070)); + titulo.setNossoNumero("10297"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0001029700007730070402182"); + } + + /** + * Configura, no título, a carteira utilizada no teste. + * + * @param carteira + */ + private void setCarteiraDoTitulo(Carteira carteira) { + titulo.getContaBancaria().setCarteira(carteira); + } + + @Test + public void seOWriteRetornaOValorEsperadoParaUmaCarteiraSemRegistro() { + + final Carteira carteira = new Carteira(); + carteira.setTipoCobranca(TipoDeCobranca.SEM_REGISTRO); + setCarteiraDoTitulo(carteira); + + createCampoLivreToTest(); + + assertEquals("Testando um campo livre válido da carteira sem registro.", "0001029700007730070202108", writeCampoLivre()); + } + + @Test + public void seOWriteRetornaOValorEsperadoParaUmaCarteiraCaucionada() { + + setCarteiraDoTitulo(new Carteira(3, TipoDeCobranca.COM_REGISTRO)); + + createCampoLivreToTest(); + + assertEquals("Testando um campo livre válido da carteira caucionada.", "0001029700007730070302196", writeCampoLivre()); + } + + @Test(expected=CampoLivreException.class) + public void criacaoSemTipoDeCobranca() { + + setCarteiraDoTitulo(new Carteira()); + CampoLivreFactory.create(titulo); + } + + @Test(expected=CampoLivreException.class) + public void criacaoSemNumeroDaConta() { + + titulo.getContaBancaria().setNumeroDaConta(null); + CampoLivreFactory.create(titulo); + } + + @Test(expected=CampoLivreException.class) + public void criacaoSemNossoNumero() { + + titulo.setNossoNumero(null); + CampoLivreFactory.create(titulo); + } + + @Test(expected=CampoLivreException.class) + public void criacaoNossoNumeroMaiorQue8Digitos() { + + titulo.setNossoNumero("123456789"); + CampoLivreFactory.create(titulo); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanrisulCobrancaNaoRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanrisulCobrancaNaoRegistrada.java new file mode 100644 index 0000000..98ada5a --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanrisulCobrancaNaoRegistrada.java @@ -0,0 +1,121 @@ +/* + * 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: 02/08/2008 - 16:37:47 + * + * ================================================================================ + * + * 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: 02/08/2008 - 16:37:47 + * + */ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + * + *

    + * Valida a implementação do campo livre com cobrança não registrada para o Banco + * Banrisul. + *

    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério Valerio + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBanrisulCobrancaNaoRegistrada extends AbstractCampoLivreBaseTest { + + @Before + public void setUp() { + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL.create()); + titulo.getContaBancaria().setCarteira(new Carteira(1, TipoDeCobranca.SEM_REGISTRO)); + titulo.getContaBancaria().setAgencia(new Agencia(1102)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(9000150)); + titulo.setNossoNumero("22832563"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("2111029000150228325634059"); + } + + @Test(expected = CampoLivreException.class) + public void criacaoSemTipoDeCobranca() { + + titulo.getContaBancaria().setCarteira(new Carteira(1, null)); + CampoLivreFactory.create(titulo); + } + + @Test(expected = CampoLivreException.class) + public void criacaoSemAgencia() { + + titulo.getContaBancaria().setAgencia(null); + CampoLivreFactory.create(titulo); + } + + @Test(expected = CampoLivreException.class) + public void criacaoSemNumeroDaConta() { + + titulo.getContaBancaria().setNumeroDaConta(null); + CampoLivreFactory.create(titulo); + } + + @Test(expected = CampoLivreException.class) + public void criacaoSemNossoNumero() { + + titulo.setNossoNumero(null); + CampoLivreFactory.create(titulo); + } + + @Test(expected = CampoLivreException.class) + public void criacaoAgenciaComCodigoMaiorQue4Digitos() { + + titulo.getContaBancaria().setAgencia(new Agencia(10000, "1")); + CampoLivreFactory.create(titulo); + } + + @Test(expected = CampoLivreException.class) + public void criacaoNumeroDaContaMaiorQue7Digitos() { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(12345678)); + CampoLivreFactory.create(titulo); + } + + @Test(expected = CampoLivreException.class) + public void criacaoNossoNumeroMaiorQue8Digitos() { + + titulo.setNossoNumero("123456789"); + CampoLivreFactory.create(titulo); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanrisulCobrancaRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanrisulCobrancaRegistrada.java new file mode 100644 index 0000000..6b519a1 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBanrisulCobrancaRegistrada.java @@ -0,0 +1,121 @@ +/* + * 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/07/2008 - 10:58: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: 19/07/2008 - 10:58:09 + * + */ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + * + *

    + * Valida a implementação do campo livre com cobrança registrada + * para o Banco Banrisul. + *

    + * + * @author Gilmar P.S.L. + * @author Misael Barreto + * @author Rômulo Augusto + * @author Samuel Valério Valerio + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBanrisulCobrancaRegistrada extends AbstractCampoLivreBaseTest { + + @Before + public void setUp() { + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_DO_ESTADO_DO_RIO_GRANDE_DO_SUL.create()); + titulo.getContaBancaria().setCarteira(new Carteira(1, TipoDeCobranca.COM_REGISTRO)); + titulo.getContaBancaria().setAgencia(new Agencia(1102)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(9000150)); + titulo.setNossoNumero("22832563"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1111029000150228325634071"); + } + + @Test(expected=CampoLivreException.class) + public void criacaoSemTipoDeCobranca() { + + titulo.getContaBancaria().setCarteira(new Carteira(1, null)); + CampoLivreFactory.create(titulo); + } + + @Test(expected=CampoLivreException.class) + public void criacaoSemAgencia() { + + titulo.getContaBancaria().setAgencia(null); + CampoLivreFactory.create(titulo); + } + + @Test(expected=CampoLivreException.class) + public void criacaoSemNumeroDaConta() { + + titulo.getContaBancaria().setNumeroDaConta(null); + CampoLivreFactory.create(titulo); + } + + @Test(expected=CampoLivreException.class) + public void criacaoSemNossoNumero() { + + titulo.setNossoNumero(null); + CampoLivreFactory.create(titulo); + } + + @Test(expected=CampoLivreException.class) + public void criacaoAgenciaComCodigoMaiorQue4Digitos() { + + titulo.getContaBancaria().setAgencia(new Agencia(10000, "1")); + CampoLivreFactory.create(titulo); + } + + @Test(expected=CampoLivreException.class) + public void criacaoNumeroDaContaMaiorQue7Digitos() { + + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(12345678)); + CampoLivreFactory.create(titulo); + } + + @Test(expected=CampoLivreException.class) + public void criacaoNossoNumeroMaiorQue8Digitos(){ + + titulo.setNossoNumero("123456789"); + CampoLivreFactory.create(titulo); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBradesco.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBradesco.java new file mode 100644 index 0000000..60ea9f9 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLBradesco.java @@ -0,0 +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: 30/03/2008 - 18:14:15 + * + * ================================================================================ + * + * 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:14:15 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre do banco bradesco. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento + * Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLBradesco extends AbstractCampoLivreBaseTest { + + private final int NOSSO_NUMERO_LENGTH = 11; + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_BRADESCO.create()); + titulo.getContaBancaria().setAgencia(new Agencia(1234, "1")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(6789)); + titulo.getContaBancaria().setCarteira(new Carteira(5)); + titulo.setNossoNumero("12345678901"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1234051234567890100067890"); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaNula() { + + testeSeNaoPermiteAgenciaNula(); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteAgenciaComCodigoNegativo() { + + testeSeNaoPermiteAgenciaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaComCodigoZero() { + + testeSeNaoPermiteAgenciaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaAgenciaAcimaDe4Digitos() { + + testeSeNaoPermiteNumeroDaAgenciaComDigitosAcimaDoLimite(10000); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraNull() { + + testeSeNaoPermiteCarteiraNula(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoNegativo() { + + testeSeNaoPermiteCarteiraComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoAcimaDe2Digitos() { + + testeSeNaoPermiteCarteiraComCodigoAcimaDoLimite(111); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroNulo() { + + testeSeNaoPermiteNossoNumeroNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComBrancos() { + + testeSeNaoPermiteNossoNumeroComBrancos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComEspacos() { + + testeSeNaoPermiteNossoNumeroComEspacos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComTamanhoDiferenteDe11() { + + testeSeNaoPermiteNossoNumeroComTamanhoDiferenteDoEspecificado(NOSSO_NUMERO_LENGTH - 1); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaNulo() { + + testeSeNaoPermiteNumeroDaContaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoZero() { + + testeSeNaoPermiteNumeroDaContaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoNegativo() { + + testeSeNaoPermiteNumeroDaContaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoAcimaDe7Digitos() { + + testeSeNaoPermiteNumeroDaContaComCodigoAcimaDoLimite(12345678); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSICOBNossoNumero14.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSICOBNossoNumero14.java new file mode 100644 index 0000000..05e026b --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSICOBNossoNumero14.java @@ -0,0 +1,170 @@ +/* + * 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 org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre da Caixa Econômica Federal: "Cobrança Sem + * Registro SICOB - Nosso Número 16 posições. + *

    + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLCaixaEconomicaFederalSICOBNossoNumero14 extends AbstractCampoLivreBaseTest { + + private static final int NOSSO_NUMERO_LENGTH = 14; + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.CAIXA_ECONOMICA_FEDERAL.create()); + titulo.getContaBancaria().setAgencia(new Agencia(255, "5")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(78)); + titulo.getContaBancaria().setCarteira(new Carteira(8)); + titulo.setNossoNumero("00000000113732"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0007802558700000000113732"); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaNulo() { + + testeSeNaoPermiteNumeroDaContaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoZero() { + + testeSeNaoPermiteNumeroDaContaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoNegativo() { + + testeSeNaoPermiteNumeroDaContaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoAcimaDe5Digitos() { + + testeSeNaoPermiteNumeroDaContaComCodigoAcimaDoLimite(123456); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaNula() { + + testeSeNaoPermiteAgenciaNula(); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteAgenciaComCodigoNegativo() { + + testeSeNaoPermiteAgenciaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaComCodigoZero() { + + testeSeNaoPermiteAgenciaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaAgenciaAcimaDe4Digitos() { + + testeSeNaoPermiteNumeroDaAgenciaComDigitosAcimaDoLimite(10000); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraNull() { + + titulo.getContaBancaria().setCarteira(null); + + createCampoLivreToTest(); + + seCampoLivreEscritoEstaCorreto(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoNegativo() { + + titulo.getContaBancaria().setCarteira(new Carteira(-1)); + + createCampoLivreToTest(); + + seCampoLivreEscritoEstaCorreto(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraQueNaoSejaSemRegistro() { + + titulo.getContaBancaria().setCarteira(new Carteira(1)); + + createCampoLivreToTest(); + + seCampoLivreEscritoEstaCorreto(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroNulo() { + + testeSeNaoPermiteNossoNumeroNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComBrancos() { + + testeSeNaoPermiteNossoNumeroComBrancos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComEspacos() { + + testeSeNaoPermiteNossoNumeroComEspacos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComTamanhoDiferenteDe14() { + + testeSeNaoPermiteNossoNumeroComTamanhoDiferenteDoEspecificado(NOSSO_NUMERO_LENGTH - 1); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSIGCB.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSIGCB.java new file mode 100644 index 0000000..66d7413 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSIGCB.java @@ -0,0 +1,64 @@ +/* + * 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: 28/07/2010 - 21:05: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: 28/07/2010 - 21:05:00 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do banco caixa econômica federal para o serviço SIGCB. + *

    + * + * @author Gilmar P.S.L + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLCaixaEconomicaFederalSIGCB extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.CAIXA_ECONOMICA_FEDERAL.create()); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(5507,"7")); + titulo.getContaBancaria().setCarteira(new Carteira(24, TipoDeCobranca.COM_REGISTRO)); + titulo.setNossoNumero("000000000000019"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("0055077000100040000000190"); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSINCO.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSINCO.java new file mode 100644 index 0000000..5692079 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCaixaEconomicaFederalSINCO.java @@ -0,0 +1,63 @@ +/* + * 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:14:35 + * + * ================================================================================ + * + * 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:14:35 + * + */ + +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do banco caixa econômica federal para o serviço SINCO. + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLCaixaEconomicaFederalSINCO extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.CAIXA_ECONOMICA_FEDERAL.create()); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(2)); + titulo.setNossoNumero("10000000020061732"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1000002910000000020061732"); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCecred.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCecred.java new file mode 100644 index 0000000..14a8667 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLCecred.java @@ -0,0 +1,136 @@ +/* + * Copyright 2014 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: 21/01/2014 - 14:48:31 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 21/01/2014 - 14:48:31 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroCECRED.CODIGO_DO_CONVENIO; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre CECRED. + *

    + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLCecred extends AbstractCampoLivreBaseTest { + + private final int NOSSO_NUMERO_LENGTH = 9; + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.CECRED.create()); + titulo.getContaBancaria().setCarteira(new Carteira(1)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(12345678)); + titulo.setNossoNumero("12345678000123456"); + titulo.setParametrosBancarios(new ParametrosBancariosMap(CODIGO_DO_CONVENIO, 654321)); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("6543211234567800012345601"); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteParametroBancarioNulo() { + + testeSeNaoPermiteParametroBancarioNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteParametroBancarioPostoDaAgenciaAusente() { + + testeSeNaoPermiteParametroBancarioAusente(); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteParametroBancarioCodigoDoConvenioSemValor() { + + testeSeNaoPermiteParametroBancarioSemValor(CODIGO_DO_CONVENIO); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteParametroBancarioCodigoDoConvenioComValorAcimaDe6Digitos() { + + testeSeNaoPermiteParametroBancarioComValorAcimaDoLimite(CODIGO_DO_CONVENIO, 1234567); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroNulo() { + + testeSeNaoPermiteNossoNumeroNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComBrancos() { + + testeSeNaoPermiteNossoNumeroComBrancos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComEspacos() { + + testeSeNaoPermiteNossoNumeroComEspacos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComTamanhoDiferenteDe9() { + + testeSeNaoPermiteNossoNumeroComTamanhoDiferenteDoEspecificado(NOSSO_NUMERO_LENGTH - 1); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraNull() { + + testeSeNaoPermiteCarteiraNula(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoNegativo() { + + testeSeNaoPermiteCarteiraComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoAcimaDe2Digitos() { + + testeSeNaoPermiteCarteiraComCodigoAcimaDoLimite(100); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLHSBCCobrancaNaoRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLHSBCCobrancaNaoRegistrada.java new file mode 100644 index 0000000..306c8ee --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLHSBCCobrancaNaoRegistrada.java @@ -0,0 +1,42 @@ +/** + * + */ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroHSBC.IDENTIFICADOR_CNR; + +import java.util.Calendar; +import java.util.GregorianCalendar; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.jrimum.domkee.financeiro.banco.hsbc.TipoIdentificadorCNR; +import org.junit.Before; + +/** + * @author Gilmar P.S.L + * @author Misael Barreto + */ +public class TestCLHSBCCobrancaNaoRegistrada extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.HSBC.create()); + titulo.getContaBancaria().setAgencia(new Agencia(1234, "1")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(8351202,"2")); + titulo.getContaBancaria().setCarteira(new Carteira(1, TipoDeCobranca.SEM_REGISTRO)); + titulo.setNossoNumero("0000239104761"); + titulo.setDataDoVencimento(new GregorianCalendar(2008, Calendar.JULY, 4).getTime()); + titulo.setParametrosBancarios(new ParametrosBancariosMap(IDENTIFICADOR_CNR, TipoIdentificadorCNR.COM_VENCIMENTO.getConstante())); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("8351202000023910476118682"); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLHSBCCobrancaRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLHSBCCobrancaRegistrada.java new file mode 100644 index 0000000..9ee01fd --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLHSBCCobrancaRegistrada.java @@ -0,0 +1,42 @@ +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroHSBC.IDENTIFICADOR_CNR; + +import java.util.Calendar; +import java.util.GregorianCalendar; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.jrimum.domkee.financeiro.banco.hsbc.TipoIdentificadorCNR; +import org.junit.Before; + +/** + * @author Gilmar P.S.L + * @author Fernando Dias + */ +public class TestCLHSBCCobrancaRegistrada extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + //TODO FAZER TESTE REAL + + titulo.getContaBancaria().setBanco(BancosSuportados.HSBC.create()); + titulo.getContaBancaria().setAgencia(new Agencia(1234, "1")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(8351202,"2")); + titulo.getContaBancaria().setCarteira(new Carteira(1, TipoDeCobranca.SEM_REGISTRO)); + titulo.setNossoNumero("0000239104761"); + titulo.setDataDoVencimento(new GregorianCalendar(2008, Calendar.JULY, 4).getTime()); + titulo.setParametrosBancarios(new ParametrosBancariosMap(IDENTIFICADOR_CNR, TipoIdentificadorCNR.COM_VENCIMENTO.getConstante())); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("8351202000023910476118682"); + } + + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLItauComCarteirasEspeciais.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLItauComCarteirasEspeciais.java new file mode 100644 index 0000000..acb7bfd --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLItauComCarteirasEspeciais.java @@ -0,0 +1,71 @@ +/* + * 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 org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; + +/** + *

    + * Teste unitário do campo livre do banco itaú para carteiras especiais + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + * + */ +public class TestCLItauComCarteirasEspeciais extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_ITAU.create()); + titulo.getContaBancaria().setAgencia(new Agencia(57, "1")); + titulo.getContaBancaria().setCarteira(new Carteira(198)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(12345)); + titulo.setNumeroDoDocumento("1234567"); + titulo.setNossoNumero("12345678"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1981234567812345671234580"); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLItauPadrao.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLItauPadrao.java new file mode 100644 index 0000000..0a8fad5 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLItauPadrao.java @@ -0,0 +1,84 @@ +/* + * 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 static org.junit.Assert.assertEquals; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre do banco itaú para carteiras padrão + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + * + */ +public class TestCLItauPadrao extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_ITAU.create()); + titulo.getContaBancaria().setAgencia(new Agencia(57, "1")); + titulo.getContaBancaria().setCarteira(new Carteira(110)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(12345)); + titulo.setNumeroDoDocumento("1234567"); + titulo.setNossoNumero("12345678"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1101234567880057123457000"); + } + + @Test + public void testWriteParaCarteirasQueNaoPrecisamDeContaEAgencia() { + + titulo.getContaBancaria().setCarteira(new Carteira(198)); + + createCampoLivreToTest(); + + assertEquals(25, writeCampoLivre().length()); + assertEquals("1981234567812345671234580", writeCampoLivre()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLMercantilDoBrasil.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLMercantilDoBrasil.java new file mode 100644 index 0000000..27cc73b --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLMercantilDoBrasil.java @@ -0,0 +1,81 @@ +/* + * 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 - 20:55:13 + * + * ================================================================================ + * + * 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 - 20:55:13 + * + */ +package org.jrimum.bopepo.campolivre; + +import java.math.BigDecimal; + +import org.junit.Assert; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + *

    + * Teste unitário do campo livre do banco mercantil do brasil + *

    + * + * @author Gilmar P.S.L + * @author Misael Barreto + * @author Rômulo Augusto + * @author Nordeste Fomento Mercantil + * + * @since 0.2 + * + * @version 0.2 + * + */ +public class TestCLMercantilDoBrasil extends AbstractCampoLivreBaseTest { + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.MERCANTIL_DO_BRASIL.create()); + titulo.getContaBancaria().setAgencia(new Agencia(1234, "1")); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(123456789)); + titulo.setNossoNumero("1234567890"); + titulo.setDigitoDoNossoNumero("5"); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("1234123456789051234567892"); //Sem desconto + } + + @Test + public void testWriteComDesconto() { + + titulo.setDesconto(BigDecimal.TEN); + createCampoLivreToTest(); + + Assert.assertEquals("1234123456789051234567890", writeCampoLivre()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLSicredi.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLSicredi.java new file mode 100644 index 0000000..7b9affe --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLSicredi.java @@ -0,0 +1,237 @@ +/* + * 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: 25/11/2010 - 15:35: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: 25/11/2010 - 15:35:00 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.bopepo.parametro.ParametroBancoSicredi.POSTO_DA_AGENCIA; + +import java.math.BigDecimal; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + + +/** + *

    + * Teste unitário do campo livre do banco SICREDI. + *

    + * + * @author Gilmar P.S.L + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCLSicredi extends AbstractCampoLivreBaseTest { + + private final int NOSSO_NUMERO_LENGTH = 8; + + @Before + public void setUp(){ + + titulo.getContaBancaria().setBanco(BancosSuportados.BANCO_SICREDI.create()); + titulo.getContaBancaria().setAgencia(new Agencia(165)); + titulo.getContaBancaria().setCarteira(new Carteira(1, TipoDeCobranca.SEM_REGISTRO)); + titulo.getContaBancaria().setNumeroDaConta(new NumeroDaConta(623)); + titulo.setNossoNumero("07200003"); + titulo.setDigitoDoNossoNumero("1"); + titulo.setParametrosBancarios(new ParametrosBancariosMap(POSTO_DA_AGENCIA, 2)); + titulo.setValor(new BigDecimal("150.35")); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("3107200003101650200623101"); + } + + @Test + public void seEscritaOndeTituloNaoTemValorEstahCorreta(){ + + titulo.setValor(new BigDecimal("0.00")); + + createCampoLivreToTest(); + + setCampoLivreEsperadoComoString("3107200003101650200623004"); + + seCampoLivreEscritoEstaCorreto(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraComCodigoNegativo() { + + testeSeNaoPermiteCarteiraComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteCarteiraQueNaoSimples() { + + titulo.getContaBancaria().setCarteira(new Carteira(3, TipoDeCobranca.SEM_REGISTRO)); + + createCampoLivreToTest(); + + seCampoLivreEscritoEstaCorreto(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteRegistroDaCarteiraNull() { + + titulo.getContaBancaria().setCarteira(new Carteira(1)); + + createCampoLivreToTest(); + + seCampoLivreEscritoEstaCorreto(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroNulo() { + + testeSeNaoPermiteNossoNumeroNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComBrancos() { + + testeSeNaoPermiteNossoNumeroComBrancos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComEspacos() { + + testeSeNaoPermiteNossoNumeroComEspacos(NOSSO_NUMERO_LENGTH); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNossoNumeroComTamanhoDiferenteDe11() { + + testeSeNaoPermiteNossoNumeroComTamanhoDiferenteDoEspecificado(NOSSO_NUMERO_LENGTH - 1); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDoNossoNumeroAusente() { + + titulo.setDigitoDoNossoNumero(""); + + createCampoLivreToTest(); + + seCampoLivreEscritoEstaCorreto(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteDigitoDoNossoNumeroComTamanhoDiferenteDe1() { + + titulo.setDigitoDoNossoNumero("124"); + + createCampoLivreToTest(); + + seCampoLivreEscritoEstaCorreto(); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteAgenciaComCodigoNegativo() { + + testeSeNaoPermiteAgenciaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaComCodigoZero() { + + testeSeNaoPermiteAgenciaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteAgenciaNula() { + + testeSeNaoPermiteAgenciaNula(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaAgenciaAcimaDe4Digitos() { + + testeSeNaoPermiteNumeroDaAgenciaComDigitosAcimaDoLimite(10000); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteParametroBancarioNulo() { + + testeSeNaoPermiteParametroBancarioNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteParametroBancarioPostoDaAgenciaAusente() { + + testeSeNaoPermiteParametroBancarioAusente(); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteParametroBancarioPostoDaAgenciaSemValor() { + + testeSeNaoPermiteParametroBancarioSemValor(POSTO_DA_AGENCIA); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaNulo() { + + testeSeNaoPermiteNumeroDaContaNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoZero() { + + testeSeNaoPermiteNumeroDaContaComCodigoZero(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoNegativo() { + + testeSeNaoPermiteNumeroDaContaComCodigoNegativo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteNumeroDaContaComCodigoAcimaDe5Digitos() { + + testeSeNaoPermiteNumeroDaContaComCodigoAcimaDoLimite(123456); + } + + @Test(expected = NullPointerException.class) + public void seNaoPermiteValorDoTituloNulo() { + + testeSeNaoPermiteValorDoTituloNulo(); + } + + @Test(expected = CampoLivreException.class) + public void seNaoPermiteValorDoTituloNegativo() { + + testeSeNaoPermiteValorDoTituloNegativo(); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaNaoRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaNaoRegistrada.java new file mode 100644 index 0000000..b719261 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaNaoRegistrada.java @@ -0,0 +1,140 @@ +package org.jrimum.bopepo.campolivre; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.jrimum.domkee.financeiro.banco.febraban.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/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaRegistrada.java new file mode 100644 index 0000000..112282f --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCLUnibancoCobrancaRegistrada.java @@ -0,0 +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.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.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(); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCampoLivreFactory.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCampoLivreFactory.java new file mode 100644 index 0000000..5c0ae40 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/campolivre/TestCampoLivreFactory.java @@ -0,0 +1,110 @@ +/* + * 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: 23/02/2010 - 14:11: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: 23/02/2010 - 14:11:00 + * + */ + +package org.jrimum.bopepo.campolivre; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.apache.commons.lang.StringUtils; +import org.junit.Test; + +/** + *

    + * Teste da classe CampoLivreFactory. + *

    + * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @since 0.2 + * + * @version 0.2 + */ +public class TestCampoLivreFactory { + + private static final String CAMPO_LIVRE_EXEMPLO = "1234567890123456789012345"; + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteCriacaoComStringNula() { + + CampoLivreFactory.create((String)null); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteCriacaoComEmptyString() { + + CampoLivreFactory.create(StringUtils.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteCriacaoComBlankString() { + + CampoLivreFactory.create(" "); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteCriacaoComStringComWhiteSpaces() { + + CampoLivreFactory.create("12345678 9012345678 9012345"); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteCriacaoComStringComLengthMaiorQue25() { + + CampoLivreFactory.create("12345678901234567890123456"); + } + + @Test(expected = IllegalArgumentException.class) + public void seNaoPermiteCriacaoComStringComLengthMenorQue25() { + + CampoLivreFactory.create("123456789012345678901234"); + } + + @Test + public void seCriacaoDoCampoLivreOcorreSemFalha() { + + assertNotNull(CampoLivreFactory.create(CAMPO_LIVRE_EXEMPLO)); + } + + @Test + public void seTamanhoDoCampoLivreEscritoIgualA25() { + + assertEquals(25, CampoLivreFactory.create(CAMPO_LIVRE_EXEMPLO).write().length()); + } + + @Test + public void seCampoLivreEscritoEstaCorreto() { + + CampoLivre campoLivreCriado = CampoLivreFactory.create(CAMPO_LIVRE_EXEMPLO); + + assertEquals(CAMPO_LIVRE_EXEMPLO, campoLivreCriado.write()); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/BoletoBuilder.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/BoletoBuilder.java new file mode 100644 index 0000000..2b84eeb --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/BoletoBuilder.java @@ -0,0 +1,87 @@ +/* + * Copyright 2013 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/09/2013 - 00:05:33 + * + * ================================================================================ + * + * Direitos autorais 2013 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/09/2013 - 00:05:33 + * + */ + +package org.jrimum.bopepo.excludes; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.utilix.text.DateFormat; + +/** + * Criação de dados para testes. + * + * @author Gilmar P.S.L. + */ +public class BoletoBuilder { + + private Boleto boleto; + + public BoletoBuilder(){ + this.boleto = newDefaultValue(); + } + + public static Boleto defaultValue(){ + return newDefaultValue(); + } + + public static Boleto defaultValueSacadorAvalista(){ + return newDefaultValueSacadorAvalista(); + } + + public Boleto build(){ + return this.boleto; + } + + private static Boleto newDefaultValue() { + Boleto boleto = new Boleto(TituloBuilder.defaultValue()); + setDefaultValues(boleto); + return boleto; + } + + private static Boleto newDefaultValueSacadorAvalista() { + Boleto boleto = new Boleto(TituloBuilder.defaultValueSacadorAvalista()); + setDefaultValues(boleto); + return boleto; + } + + private static void setDefaultValues(Boleto boleto){ + + boleto.setLocalPagamento("Pagável preferencialmente na Rede X ou em qualquer Banco até o Vencimento."); + boleto.setInstrucaoAoSacado("Senhor sacado, sabemos sim que o valor cobrado não é o esperado, aproveite o DESCONTÃO!"); + boleto.setInstrucao1("PARA PAGAMENTO 1 até Hoje não cobrar nada!"); + boleto.setInstrucao2("PARA PAGAMENTO 2 até Amanhã Não cobre!"); + boleto.setInstrucao3("PARA PAGAMENTO 3 até Depois de amanhã, OK, não cobre."); + boleto.setInstrucao4("PARA PAGAMENTO 4 até 04/xx/xxxx de 4 dias atrás COBRAR O VALOR DE: R$ 01,00"); + boleto.setInstrucao5("PARA PAGAMENTO 5 até 05/xx/xxxx COBRAR O VALOR DE: R$ 02,00"); + boleto.setInstrucao6("PARA PAGAMENTO 6 até 06/xx/xxxx COBRAR O VALOR DE: R$ 03,00"); + boleto.setInstrucao7("PARA PAGAMENTO 7 até xx/xx/xxxx COBRAR O VALOR QUE VOCÊ QUISER!"); + boleto.setInstrucao8("APÓS o Vencimento, Pagável Somente na Rede X."); + boleto.setDataDeProcessamento(DateFormat.DDMMYYYY_B.parse("14/01/2020")); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/CedenteBuilder.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/CedenteBuilder.java new file mode 100644 index 0000000..6986cd1 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/CedenteBuilder.java @@ -0,0 +1,57 @@ +/* + * Copyright 2014 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/01/2014 - 15:36:43 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 15:36:43 + * + */ + +package org.jrimum.bopepo.excludes; + +import org.jrimum.domkee.financeiro.banco.febraban.Cedente; + +/** + * @author Gilmar P.S.L. + */ +public class CedenteBuilder { + + private Cedente ced; + + public CedenteBuilder(){ + this.ced = newDefaultValue(); + } + + public static Cedente defaultValue(){ + return newDefaultValue(); + } + + public Cedente build(){ + return this.ced; + } + + private static Cedente newDefaultValue(){ + return new Cedente("Projeto JRimum", "00.000.208/0001-00"); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/ContaBancariaBuilder.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/ContaBancariaBuilder.java new file mode 100644 index 0000000..a1f09ea --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/ContaBancariaBuilder.java @@ -0,0 +1,66 @@ +/* + * Copyright 2014 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/01/2014 - 18:47:22 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 18:47:22 + * + */ + +package org.jrimum.bopepo.excludes; + +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; + +/** + * @author Gilmar P.S.L. + */ +public class ContaBancariaBuilder { + + private ContaBancaria conta; + + public ContaBancariaBuilder(){ + this.conta = newDefaultValue(); + } + + public static ContaBancaria defaultValue(){ + return newDefaultValue(); + } + + public ContaBancaria build(){ + return this.conta; + } + + private static ContaBancaria newDefaultValue(){ + ContaBancaria conta = new ContaBancaria(BancosSuportados.BANCO_BRADESCO.create()); + conta.setNumeroDaConta(new NumeroDaConta(123456, "0")); + conta.setCarteira(new Carteira(30)); + conta.setAgencia(new Agencia(1234, "1")); + + return conta; + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/EnderecoBuilder.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/EnderecoBuilder.java new file mode 100644 index 0000000..c10dd29 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/EnderecoBuilder.java @@ -0,0 +1,102 @@ +/* + * Copyright 2014 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/01/2014 - 14:39:37 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 14:39:37 + * + */ + +package org.jrimum.bopepo.excludes; + +import org.jrimum.domkee.comum.pessoa.endereco.CEP; +import org.jrimum.domkee.comum.pessoa.endereco.Endereco; +import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa; + +/** + * @author Gilmar P.S.L. + */ +public class EnderecoBuilder { + + private Endereco end; + + public static Endereco defaultValue(){ + return newDefaultValue(); + } + + public EnderecoBuilder(){ + this.end = defaultValue(); + } + + public EnderecoBuilder withLocalidade(String localidade){ + end.setLocalidade(localidade); + return this; + } + + public EnderecoBuilder withBairro(String bairro){ + end.setBairro(bairro); + return this; + } + + public EnderecoBuilder withLogradouro(String logradouro){ + end.setLogradouro(logradouro); + return this; + } + + public EnderecoBuilder withNumero(String numero){ + end.setNumero(numero); + return this; + } + + public EnderecoBuilder with(String complemento){ + end.setComplemento(complemento); + return this; + } + + public EnderecoBuilder withCep(String cep){ + end.setCep(new CEP(cep)); + return this; + } + + public EnderecoBuilder with(UnidadeFederativa uf){ + this.end.setUF(uf); + return this; + } + + public Endereco build(){ + return end; + } + + private static Endereco newDefaultValue(){ + Endereco end = new Endereco(); + end.setUF(UnidadeFederativa.RN); + end.setLocalidade("Natal"); + end.setCep(new CEP("59064-120")); + end.setBairro("Grande Centro"); + end.setLogradouro("Rua poeta dos programas"); + end.setNumero("1"); + end.setComplemento("Apt 101"); + return end; + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/Images.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/Images.java new file mode 100644 index 0000000..ceae5a1 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/Images.java @@ -0,0 +1,81 @@ +/* + * Copyright 2013 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/09/2013 - 17:33:00 + * + * ================================================================================ + * + * Direitos autorais 2013 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/09/2013 - 17:33:00 + * + */ + +package org.jrimum.bopepo.excludes; + +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.image.BufferedImage; + +/** + * Operações com imagem em geral. + * + * @author Gilmar P.S.L. + */ +public class Images { + + /** + * Realiza a comparação entre imagens. + * + * @param b1 + * @param b2 + * @return true se são iguais. + */ + public static boolean areEqual(BufferedImage b1, BufferedImage b2) { + if (b1.getWidth() != b2.getWidth()) { + return false; + } + if (b1.getHeight() != b2.getHeight()) { + return false; + } + for (int i = 0; i < b1.getWidth(); i++) { + for (int j = 0; j < b1.getHeight(); j++) { + if (b1.getRGB(i, j) != b2.getRGB(i, j)) { + return false; + } + } + } + return true; + } + + /** + * Transforma em um BufferedImage. + * + * @param image + * @return BufferedImage + */ + public static BufferedImage toBufferedImage(Image image) { + final int grayScale = 10; + BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), + image.getHeight(null), grayScale); + Graphics2D g2d = bufferedImage.createGraphics(); + g2d.drawImage(image, null, null); + return bufferedImage; + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/PDFs.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/PDFs.java new file mode 100644 index 0000000..ea94b1f --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/PDFs.java @@ -0,0 +1,88 @@ +/* + * Copyright 2014 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: 12/01/2014 - 17:09:13 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 12/01/2014 - 17:09:13 + * + */ + +package org.jrimum.bopepo.excludes; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.Collection; +import java.util.Map; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.parser.ImageRenderInfo; +import com.itextpdf.text.pdf.parser.PdfImageObject; +import com.itextpdf.text.pdf.parser.PdfReaderContentParser; +import com.itextpdf.text.pdf.parser.RenderListener; +import com.itextpdf.text.pdf.parser.TextRenderInfo; + +/** + * Utilitário para operações com PDFs. + * + * @author Gilmar P.S.L. + */ +public class PDFs { + + public static Map> getImages(byte[] pdf) throws IOException{ + PdfReader reader = new PdfReader(pdf); + PdfReaderContentParser parser = new PdfReaderContentParser(reader); + ImageRenderListener listener = new ImageRenderListener(); + for (int i = 1; i <= reader.getNumberOfPages(); i++) { + parser.processContent(i, listener); + } + reader.close(); + return listener.getImages(); + } + + public static class ImageRenderListener implements RenderListener { + private Multimap images = ArrayListMultimap + .create(); + public void renderImage(ImageRenderInfo renderInfo) { + try { + PdfImageObject image = renderInfo.getImage(); + if (image == null) { + return; + } + final String ref = String.format("Ref-%s-%s", renderInfo.getRef() + .getNumber(), image.getFileType()); + images.put(ref, image.getBufferedImage()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + public Map> getImages(){ + return images.asMap(); + } + public void beginTextBlock() {} + public void endTextBlock() {} + public void renderText(TextRenderInfo renderInfo) {} + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/SacadoBuilder.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/SacadoBuilder.java new file mode 100644 index 0000000..ffd783e --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/SacadoBuilder.java @@ -0,0 +1,59 @@ +/* + * Copyright 2014 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/01/2014 - 15:20:04 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 15:20:04 + * + */ + +package org.jrimum.bopepo.excludes; + +import org.jrimum.domkee.financeiro.banco.febraban.Sacado; + +/** + * @author Gilmar P.S.L. + */ +public class SacadoBuilder { + + private Sacado sac; + + public SacadoBuilder(){ + this.sac = newDefaultValue(); + } + + public static Sacado defaultValue(){ + return newDefaultValue(); + } + + public Sacado build(){ + return this.sac; + } + + private static Sacado newDefaultValue(){ + Sacado sac = new Sacado("JRimum Developer Pronto Para Férias", "222.222.222-22"); + sac.addEndereco(EnderecoBuilder.defaultValue()); + return sac; + } +} \ No newline at end of file diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/SacadorAvalistaBuilder.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/SacadorAvalistaBuilder.java new file mode 100644 index 0000000..1d1d5e7 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/SacadorAvalistaBuilder.java @@ -0,0 +1,73 @@ +/* + * Copyright 2014 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/01/2014 - 18:39:58 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 18:39:58 + * + */ + +package org.jrimum.bopepo.excludes; + +import org.jrimum.domkee.comum.pessoa.endereco.Endereco; +import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa; +import org.jrimum.domkee.financeiro.banco.febraban.SacadorAvalista; + +/** + * @author Gilmar P.S.L. + */ +public class SacadorAvalistaBuilder { + + private SacadorAvalista sacador; + + public SacadorAvalistaBuilder(){ + this.sacador = newDefaultValue(); + } + + public static SacadorAvalista defaultValue(){ + return newDefaultValue(); + } + + public SacadorAvalista build(){ + return this.sacador; + } + + private static SacadorAvalista newDefaultValue(){ + + SacadorAvalista sacadorAvalista = new SacadorAvalista("Mastermum", "00.000.000/0001-91"); + + Endereco enderecoSacAval = new EnderecoBuilder() + .with(UnidadeFederativa.DF) + .withLocalidade("Brasília") + .withCep("70150-903") + .withBairro("Grande Centro") + .withLogradouro("Rua Eternamente Principal") + .withNumero("001") + .build(); + + sacadorAvalista.addEndereco(enderecoSacAval); + + return sacadorAvalista; + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/TituloBuilder.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/TituloBuilder.java new file mode 100644 index 0000000..650459e --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/excludes/TituloBuilder.java @@ -0,0 +1,94 @@ +/* + * Copyright 2014 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/01/2014 - 18:56:03 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 18:56:03 + * + */ + +package org.jrimum.bopepo.excludes; + +import java.math.BigDecimal; + +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite; +import org.jrimum.utilix.text.DateFormat; + +/** + * @author Gilmar P.S.L. + */ +public class TituloBuilder { + + private Titulo titulo; + + public TituloBuilder(){ + this.titulo = newDefaultValue(); + } + + public static Titulo defaultValue(){ + return newDefaultValue(); + } + + public static Titulo defaultValueSacadorAvalista(){ + return newDefaultValueSacadorAvalista(); + } + + public Titulo build(){ + return this.titulo; + } + + private static Titulo newDefaultValue() { + Titulo titulo = new Titulo(ContaBancariaBuilder.defaultValue(), + SacadoBuilder.defaultValue(), CedenteBuilder.defaultValue()); + setDefaultValues(titulo); + return titulo; + } + + private static Titulo newDefaultValueSacadorAvalista() { + Titulo titulo = new Titulo(ContaBancariaBuilder.defaultValue(), + SacadoBuilder.defaultValue(), CedenteBuilder.defaultValue(), + SacadorAvalistaBuilder.defaultValue()); + setDefaultValues(titulo); + return titulo; + } + + private static void setDefaultValues(Titulo titulo){ + + titulo.setNumeroDoDocumento("123456"); + titulo.setNossoNumero("99345678912"); + titulo.setDigitoDoNossoNumero("5"); + titulo.setValor(BigDecimal.valueOf(0.23)); + titulo.setDataDoDocumento(DateFormat.DDMMYYYY_B.parse("01/01/2020")); + titulo.setDataDoVencimento(DateFormat.DDMMYYYY_B.parse("07/09/2020")); + titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL); + titulo.setAceite(Aceite.A); + titulo.setDesconto(new BigDecimal(0.05)); + titulo.setDeducao(BigDecimal.ZERO); + titulo.setMora(BigDecimal.ZERO); + titulo.setAcrecimo(BigDecimal.ZERO); + titulo.setValorCobrado(BigDecimal.ZERO); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/functional/TestBoletoPdfFeatures.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/functional/TestBoletoPdfFeatures.java new file mode 100644 index 0000000..3a733b8 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/functional/TestBoletoPdfFeatures.java @@ -0,0 +1,86 @@ +/* + * Copyright 2013 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: 10/12/2013 - 19:18:43 + * + * ================================================================================ + * + * Direitos autorais 2013 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: 10/12/2013 - 19:18:43 + * + */ + + +package org.jrimum.bopepo.functional; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.pdf.PdfDocInfo; +import org.jrimum.bopepo.pdf.PdfDocReader; +import org.jrimum.bopepo.view.BoletoViewer; +import org.junit.Test; + +public class TestBoletoPdfFeatures { + + @Test + public void deve_ter_todos_os_meta_dados_do_boleto_em_pdf_definidos_pelo_usuario() { + byte[] boletoPdf = BoletoViewer.create(BoletoBuilder.defaultValue()) + .setPdfTitulo("Titulo") + .setPdfAssunto("Assunto") + .setPdfPalavrasChave("Palavras Chave") + .setPdfAutor("Autor") + .getPdfAsByteArray(); + + PdfDocInfo pdfMetaInfo = new PdfDocReader(boletoPdf).getInfo(); + + assertThat(pdfMetaInfo.title(), equalTo("Titulo")); + assertThat(pdfMetaInfo.subject(), equalTo("Assunto")); + assertThat(pdfMetaInfo.keywords(), equalTo("Palavras Chave")); + assertThat(pdfMetaInfo.author(), equalTo("Autor")); + } + + @Test + public void deve_comprimir_pdf_por_padrao() { + final boolean NAO = false; + byte[] boletoPdfComprimido = BoletoViewer.create(BoletoBuilder.defaultValue()).getPdfAsByteArray(); + byte[] boletoPdfNaoComprimido = BoletoViewer.create(BoletoBuilder.defaultValue()).setPdfFullCompression(NAO).getPdfAsByteArray(); + + assertTrue(boletoPdfComprimido.length < boletoPdfNaoComprimido.length); + } + + @Test + public void deve_remover_campos_por_padrao() { + final boolean NAO = false; + byte[] boletoPdfSemCampos = BoletoViewer.create(BoletoBuilder.defaultValue()).getPdfAsByteArray(); + byte[] boletoPdfComCampos = BoletoViewer.create(BoletoBuilder.defaultValue()).setPdfRemoverCampos(NAO).getPdfAsByteArray(); + + PdfDocReader pdfDocSemCampos = new PdfDocReader(boletoPdfSemCampos); + PdfDocReader pdfDocComCampos = new PdfDocReader(boletoPdfComCampos); + + assertThat(pdfDocSemCampos.getFields().size(), equalTo(0)); + assertThat(pdfDocComCampos.getFields().size(), not(equalTo(0))); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/functional/TestValoresDosCamposDoBoletoBradescoPDF.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/functional/TestValoresDosCamposDoBoletoBradescoPDF.java new file mode 100644 index 0000000..a762295 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/functional/TestValoresDosCamposDoBoletoBradescoPDF.java @@ -0,0 +1,178 @@ +/* + * Copyright 2014 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: 12/01/2014 - 17:33:16 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 12/01/2014 - 17:33:16 + * + */ + +package org.jrimum.bopepo.functional; + +import static java.lang.String.format; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.Set; + +import javax.imageio.ImageIO; + +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.excludes.Images; +import org.jrimum.bopepo.excludes.PDFs; +import org.jrimum.bopepo.pdf.CodigoDeBarras; +import org.jrimum.bopepo.pdf.PdfDocReader; +import org.jrimum.bopepo.view.BoletoCampo; +import org.jrimum.bopepo.view.BoletoViewer; +import org.junit.Test; + +import com.google.common.collect.Iterables; +import com.google.common.io.Resources; + + +/** + * @author Gilmar P.S.L. + */ +public class TestValoresDosCamposDoBoletoBradescoPDF { + + /** + * Por definição, o pdf do boleto contém apenas duas imagens: logo do banco e o código de barras. + * + * @throws IOException + */ + @Test + public void deve_gerar_boleto_com_apenas_duas_imagens() throws IOException{ + BoletoViewer boletoViewer = BoletoViewer + .create(BoletoBuilder.defaultValueSacadorAvalista()); + + Map> images = PDFs.getImages(boletoViewer.getPdfAsByteArray()); + + assertThat(images.size(), equalTo(2));//logo do banco e codigo de barras + + } + + @Test + public void deve_gerar_boleto_com_duas_logos_do_banco() throws IOException{ + BoletoViewer boletoViewer = BoletoViewer + .create(BoletoBuilder.defaultValueSacadorAvalista()); + + Map> imagensNoBoleto = PDFs.getImages(boletoViewer.getPdfAsByteArray()); + + Collection logosNoBoleto = getImagem(ImagemDoBoleto.LOGO_BANCO, imagensNoBoleto); + + BufferedImage logoBancoBradescoEsperado = ImageIO.read(Resources.getResource("img/237.png")); + + BufferedImage logo1Boleto = Iterables.get(logosNoBoleto, 0); + BufferedImage logo2Boleto = Iterables.get(logosNoBoleto, 1); + + + assertThat(logosNoBoleto.size(), equalTo(2)); + assertTrue(Images.areEqual(logo1Boleto, logoBancoBradescoEsperado)); + assertTrue(Images.areEqual(logo1Boleto, logo2Boleto)); + } + + @Test + public void deve_gerar_boleto_com_codigo_de_barras() throws IOException{ + BoletoViewer boletoViewer = BoletoViewer + .create(BoletoBuilder.defaultValueSacadorAvalista()); + + Map> imagesMap = PDFs.getImages(boletoViewer.getPdfAsByteArray()); + + Collection codigoDeBarrasImgCollection = getImagem(ImagemDoBoleto.CODIGO_DE_BARRAS, imagesMap); + + String codigoDeBarrasNumerico = boletoViewer.getBoleto().getCodigoDeBarras().write(); + + BufferedImage codigoDeBarrasImgEsperado = Images.toBufferedImage(CodigoDeBarras.valueOf(codigoDeBarrasNumerico).toImage()); + + assertThat(codigoDeBarrasImgCollection.size(), equalTo(1)); + assertTrue(Images.areEqual(codigoDeBarrasImgEsperado, codigoDeBarrasImgCollection.iterator().next())); + + //TODO Ler o código de barras e conferir o número + } + + @Test + public void deve_gerar_boleto_com_os_campos_texto_formatados_corretamente() throws IOException { + boolean NAO = false; + byte[] boletoPdf = BoletoViewer + .create(BoletoBuilder.defaultValueSacadorAvalista()) + .setPdfRemoverCampos(NAO) + .getPdfAsByteArray(); + + Map camposDoBoleto = new PdfDocReader(boletoPdf).getFields(); + Set> valoresEsperados = getValoresEsperadosParaBoletoBradescoPDF(); + + assertThat(camposDoBoleto.size(), equalTo(valoresEsperados.size())); + assertThat(camposDoBoleto.size(), equalTo(BoletoCampo.values().length)); + assertThatAreEquals(camposDoBoleto, valoresEsperados); + } + + private void assertThatAreEquals(Map camposDoBoleto, + Set> valoresEsperados) { + + for(Entry campoValorEsperado : valoresEsperados){ + + Object nomeDoCampoEsperado = campoValorEsperado.getKey(); + Object valorDoCampoEsperado = campoValorEsperado.getValue(); + String valorDoCampoNoBoleto = camposDoBoleto.get(nomeDoCampoEsperado); + + assertThat(format("Campo [%s] ",nomeDoCampoEsperado),valorDoCampoNoBoleto, equalTo(valorDoCampoEsperado)); + } + } + + private Set> getValoresEsperadosParaBoletoBradescoPDF() throws IOException { + Properties properties = new Properties(); + properties.load(Resources.getResource("ValoresEsperadosDosCamposParaBoletoBradescoPDF.properties").openStream()); + return properties.entrySet(); + } + + private Collection getImagem(ImagemDoBoleto imagem, Map> imagesMap){ + for (Collection images : imagesMap.values()) { + if(images.size() == imagem.quantidade()){ + return images; + } + } + return Collections.emptyList(); + } + + private enum ImagemDoBoleto{ + LOGO_BANCO(2), + CODIGO_DE_BARRAS(1); + private final int quantidade; + private ImagemDoBoleto(int q){ + quantidade = q; + } + public int quantidade(){ + return quantidade; + } + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/Resources.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/Resources.java new file mode 100644 index 0000000..e1028a0 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/Resources.java @@ -0,0 +1,77 @@ +/* + * 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: 23/09/2011 - 17:03:00 + * + * ================================================================================ + * + * 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: 23/09/2011 - 17:03:00 + * + */ + +package org.jrimum.bopepo.pdf; + +import java.io.InputStream; + +import org.jrimum.utilix.ClassLoaders; + +/** + * Classe para centralizar ponto de acesso aos resources usados nos testes, não instanciável. + * + *

    + * Note que um mesmo resouce é usado e mais de uma classe de teste. + *

    + * + * + * @author Gilmar P.S.L. + * + */ +public abstract class Resources { + + /** + * Mesmo título para ambos os arquivos. + */ + public static final String DOCUMENT_TITLE = "Arquivo para insumo em testes"; + + /** + * Arquivo no classpath sem fields. + * + * @return arquivo pronto para uso + */ + public static final InputStream crieInputStreamParaArquivoSemCampos(){ + return ClassLoaders.getResourceAsStream("ArquivoSemCampos.pdf"); + } + + /** + * Arquivo no classpath com 3 campos: + * + *
      + *
    • nomeDoTestador:"JRiboy Brasileiro da Ordem do Progresso"
    • + *
    • funcaoDoTestador:"Developer"
    • + *
    • nomeDoTeste:"A definir..."
    • + *
      + * + * @return arquivo pronto para uso + */ + public static final InputStream crieInputStreamParaArquivoComCampos(){ + return ClassLoaders.getResourceAsStream("ArquivoComCampos.pdf"); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestFiles.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestFiles.java new file mode 100644 index 0000000..c0bca56 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestFiles.java @@ -0,0 +1,106 @@ +/* + * 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: 24/02/2010 - 14:13:34 + * + * ================================================================================ + * + * 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: 24/02/2010 - 14:13:34 + * + */ + +package org.jrimum.bopepo.pdf; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + +import org.junit.Assert; + +import org.apache.commons.lang.StringUtils; +import org.junit.Test; + +/** + * Teste da classe Files. + * + * @author Rômulo Augusto + * + * @version 0.2.3 + * + * @since 0.2 + */ +public class TestFiles { + + @Test(expected = IllegalArgumentException.class) + public void testBytes2FilePathNameNull() throws FileNotFoundException, IOException { + String filePath = null; + Files.bytesToFile(filePath, new byte[] {}); + } + + @Test(expected = IllegalArgumentException.class) + public void testBytes2FileBytesNull() throws FileNotFoundException, IOException { + Files.bytesToFile("./target", null); + } + + @Test(expected = IllegalArgumentException.class) + public void testBytes2FilePathNameEmpty() throws FileNotFoundException, IOException { + Files.bytesToFile(StringUtils.EMPTY, new byte[] {}); + } + + @Test(expected = IllegalArgumentException.class) + public void testBytes2FilePathNameBlank() throws FileNotFoundException, IOException { + Files.bytesToFile(StringUtils.EMPTY, new byte[] {}); + } + + @Test + public void testBytes2File() throws FileNotFoundException, IOException { + + byte valor1 = (byte) 1; + byte valor2 = (byte) 2; + byte valor3 = (byte) 3; + + //Criar o arquivo antes de testar + String file = "./target/fileExistente"; + Assert.assertNotNull(Files.bytesToFile(file, new byte[] {valor1, valor2, valor3})); + new File(file).delete(); + } + + @Test(expected = IllegalArgumentException.class) + public void testBytes2StreamBytesNull() throws IOException { + Files.bytesToStream(null); + } + + @Test + public void testBytes2Stream() throws IOException { + + byte valor1 = (byte) 1; + byte valor2 = (byte) 2; + byte valor3 = (byte) 3; + + ByteArrayOutputStream out = Files.bytesToStream(new byte[] {valor1, valor2, valor3}); + + Assert.assertNotNull(out); + + out.close(); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDateConverter.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDateConverter.java new file mode 100644 index 0000000..46814b7 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDateConverter.java @@ -0,0 +1,91 @@ +/* + * 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 org.junit.Assert.assertEquals; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.junit.Test; + +/** + * Teste unitário da classe PdfDateConverter. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public class TestPdfDateConverter { + + @Test(expected=IllegalArgumentException.class) + public void seNaoPermiteConversaoDeValoresNulos(){ + + PdfDateConverter.convert(null); + } + + @Test + public void comTimeZoneZero(){ + + final String expectedDate = "D:20110930144532Z00'00'"; + + Calendar c = Calendar.getInstance(); + c.set(2011, Calendar.SEPTEMBER, 30, 14, 45, 32); + c.setTimeZone(TimeZone.getTimeZone("GMT")); + + assertEquals(expectedDate,PdfDateConverter.convert(c)); + } + + @Test + public void comTimeZoneMaiorQueZero(){ + + final String expectedDate = "D:20110930144532+05'23'"; + + Calendar c = Calendar.getInstance(); + c.set(2011, Calendar.SEPTEMBER, 30, 14, 45, 32); + c.setTimeZone(TimeZone.getTimeZone("GMT+05:23")); + + assertEquals(expectedDate,PdfDateConverter.convert(c)); + } + + @Test + public void comTimeZoneMenorQueZero(){ + + final String expectedDate = "D:20110930144532-05'23'"; + + Calendar c = Calendar.getInstance(); + c.set(2011, Calendar.SEPTEMBER, 30, 14, 45, 32); + c.setTimeZone(TimeZone.getTimeZone("GMT-05:23")); + + assertEquals(expectedDate,PdfDateConverter.convert(c)); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocInfo.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocInfo.java new file mode 100644 index 0000000..7b0ae2f --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocInfo.java @@ -0,0 +1,235 @@ +/* + * 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 static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; +import java.util.TimeZone; + +import org.junit.Before; +import org.junit.Test; + +/** + * Teste da unitário da classe {@linkplain PdfDocInfo}. + * + * @author Gilmar P.S.L. + */ +public class TestPdfDocInfo { + + private final String TITLE = "Modelo Geral"; + private final String SUBJECT = "Template para uso geral"; + private final String KEYWORDS = "Modelo, Artefato, Exemplo"; + private final String AUTHOR = "Gilmar P.S.L."; + private final String CREATOR = "Writer"; + private final String CREATION_DATE = "D:20110414170209-03'00'"; + private final String MOD_DATE = "D:20110414191242-03'00'"; + private final String PRODUCER = "BrOffice 3.3; modified using iText 5.0.6 (c) 1T3XT BVBA"; + + private Map info; + + @Before + public void setUp(){ + + info = new HashMap(8); + info.put("Title", TITLE); + info.put("Subject", SUBJECT); + info.put("Keywords", KEYWORDS); + info.put("Author", AUTHOR); + info.put("Creator", CREATOR); + info.put("Producer", PRODUCER); + info.put("CreationDate",CREATION_DATE); + info.put("ModDate", MOD_DATE); + } + + @Test + public void titleInfo(){ + + PdfDocInfo docInfo = PdfDocInfo.create().title(TITLE); + + assertEquals(TITLE, docInfo.title()); + } + + @Test + public void subjectInfo(){ + + PdfDocInfo docInfo = PdfDocInfo.create().subject(SUBJECT); + + assertEquals(SUBJECT, docInfo.subject()); + } + + @Test + public void keywordsInfo(){ + + PdfDocInfo docInfo = PdfDocInfo.create().keywords(KEYWORDS); + + assertEquals(KEYWORDS, docInfo.keywords()); + } + + @Test + public void authorInfo(){ + + PdfDocInfo docInfo = PdfDocInfo.create().author(AUTHOR); + + assertEquals(AUTHOR, docInfo.author()); + } + + @Test + public void creatorInfo(){ + + PdfDocInfo docInfo = PdfDocInfo.create().creator(CREATOR); + + assertEquals(CREATOR, docInfo.creator()); + } + + @Test + public void producerInfo(){ + + PdfDocInfo docInfo = PdfDocInfo.create(info); + + assertEquals(PRODUCER, docInfo.producer()); + } + + @Test + public void creationRawInfo(){ + + PdfDocInfo docInfo = PdfDocInfo.create(info); + + assertEquals(CREATION_DATE, docInfo.creationRaw()); + } + + @Test + public void creation(){ + + PdfDocInfo docInfo = PdfDocInfo.create(info); + + assertEquals(CREATION_DATE, PdfDateConverter.convert(docInfo.creation())); + } + + @Test + public void creationWithCalendar(){ + + final Calendar c = Calendar.getInstance(); + c.set(2011, Calendar.APRIL, 14, 17, 2, 9); + c.setTimeZone(TimeZone.getTimeZone("GMT-03:00")); + + PdfDocInfo docInfo = PdfDocInfo.create(); + + docInfo.creation(c); + + assertEquals(CREATION_DATE, PdfDateConverter.convert(docInfo.creation())); + } + + @Test + public void modificationRawInfo(){ + + PdfDocInfo docInfo = PdfDocInfo.create(info); + + assertEquals(MOD_DATE, docInfo.modificationRaw()); + } + + @Test + public void modification(){ + + PdfDocInfo docInfo = PdfDocInfo.create(info); + + assertEquals(MOD_DATE, PdfDateConverter.convert(docInfo.modification())); + } + + @Test + public void modificationWithCalendar(){ + + final Calendar c = Calendar.getInstance(); + c.set(2011, Calendar.APRIL, 14, 19, 12, 42); + c.setTimeZone(TimeZone.getTimeZone("GMT-03:00")); + + PdfDocInfo docInfo = PdfDocInfo.create(); + + docInfo.modification(c); + + assertEquals(MOD_DATE, PdfDateConverter.convert(docInfo.modification())); + } + + @Test + public void equalsInCaseEquals(){ + + PdfDocInfo docInfo1 = PdfDocInfo.create(info); + PdfDocInfo docInfo2 = PdfDocInfo.create(new HashMap(info)); + + assertEquals(docInfo1, docInfo2); + } + + @Test + public void equalsInCaseDiff(){ + + PdfDocInfo docInfo1 = PdfDocInfo.create(info); + + Map diffInfo = new HashMap(info); + diffInfo.put("Author", "OUTRO"); + + PdfDocInfo docInfo2 = PdfDocInfo.create(diffInfo); + + assertTrue("Deve ser diferente!",!docInfo1.equals(docInfo2)); + } + + @Test + public void hashCodeInCaseEquals(){ + + PdfDocInfo docInfo1 = PdfDocInfo.create(info); + PdfDocInfo docInfo2 = PdfDocInfo.create(new HashMap(info)); + + assertEquals(docInfo1.hashCode(), docInfo2.hashCode()); + } + + @Test + public void hashCodeInCaseDiff(){ + + PdfDocInfo docInfo1 = PdfDocInfo.create(info); + + Map diffInfo = new HashMap(info); + diffInfo.put("Author", "OUTRO"); + + PdfDocInfo docInfo2 = PdfDocInfo.create(diffInfo); + + assertTrue("Deve ser diferente!",docInfo1.hashCode() != docInfo2.hashCode()); + } + + @Test + public void docInfoToMap(){ + + PdfDocInfo docInfo = PdfDocInfo.create(info); + + assertEquals(info, docInfo.toMap()); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocMix.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocMix.java new file mode 100644 index 0000000..f0b5bca --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocMix.java @@ -0,0 +1,420 @@ +/* + * 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 - 14:49: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 - 14:49:07 + * + */ + +package org.jrimum.bopepo.pdf; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.awt.Image; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.FileUtils; +import org.junit.Test; + +/** + * Teste unitário da classe PdfDocMix. + * + * @author Gilmar P.S.L. + * @author Rômulo Augusto + * + * @version 0.2.3 + * + * @since 0.2 + */ +public class TestPdfDocMix { + + private PdfDocMix doc = null; + + @Test(expected=IllegalArgumentException.class) + public void seNaoPermiteCriarComTemplateNullBytes(){ + + byte[] NULL_BYTE_ARRAY = null; + + doc = PdfDocMix.createWithTemplate(NULL_BYTE_ARRAY); + } + + @Test(expected=IllegalArgumentException.class) + public void seNaoPermiteCriarComTemplateNullInputStream(){ + + InputStream NULL_INPUT_STREAM = null; + + doc = PdfDocMix.createWithTemplate(NULL_INPUT_STREAM); + } + + @Test(expected=IllegalArgumentException.class) + public void seNaoPermiteCriarComTemplateNullURL(){ + + URL NULL_URL = null; + + doc = PdfDocMix.createWithTemplate(NULL_URL); + } + + @Test(expected=IllegalArgumentException.class) + public void seNaoPermiteCriarComTemplateNullFile(){ + + File NULL_FILE = null; + + doc = PdfDocMix.createWithTemplate(NULL_FILE); + } + + @Test + public void sePermiteCriarComTemplateBytes(){ + + doc = PdfDocMix.createWithTemplate(EMPTY.getBytes()); + + assertNotNull(doc); + } + + @Test + public void sePermiteCriarComTemplateInputStream(){ + + doc = PdfDocMix.createWithTemplate(new ByteArrayInputStream(EMPTY.getBytes())); + + assertNotNull(doc); + } + + @Test + public void sePermiteCriarComTemplateURL() throws MalformedURLException{ + + doc = PdfDocMix.createWithTemplate(new URL("file:///")); + + assertNotNull(doc); + } + + @Test + public void sePermiteCriarComTemplateFile() throws IOException{ + + doc = PdfDocMix.createWithTemplate(File.createTempFile(this.getClass().getName(), EMPTY)); + + assertNotNull(doc); + } + + @Test + public void seTemplateEhAtribuidoCorretamenteNaInstancia(){ + + final String X = "TEMPLATE"; + + doc = new PdfDocMix(X.getBytes()); + + assertEquals(X, new String(doc.getTemplate())); + } + + @Test + public void sePermiteMudarTemplateCorretamenteBytes(){ + + doc = new PdfDocMix(EMPTY.getBytes()); + + assertEquals("DEVE SER EMPTY", EMPTY, new String(doc.getTemplate())); + + final String Y = "OUTRO_TEMPLATE"; + + doc.withTemplate(Y.getBytes()); + + assertEquals(Y, new String(doc.getTemplate())); + } + + @Test + public void seColocaTextoCorretamenteNaVariavel(){ + + doc = createDoc(); + + doc.put("k1", "v1"); + + Map definido = new HashMap(1); + definido.put("k1", "v1"); + + assertEquals(definido, doc.getTextFields()); + } + + @Test + public void seColocaTextosCorretamenteNaVariavel(){ + + doc = createDoc(); + + Map old = new HashMap(3); + old.put("k1", "v1"); + old.put("k2", "v2"); + + doc.putAllTexts(old); + + assertEquals(old, doc.getTextFields()); + + Map newOne = new HashMap(old); + newOne.put("k3", "v3"); + + doc.putAllTexts(newOne); + + assertEquals(old, doc.getTextFields()); + } + + @Test + public void seColocaImagemCorretamenteNaVariavel(){ + + doc = createDoc(); + + final Image img = null; + + doc.put("k1", img); + + Map definido = new HashMap(1); + definido.put("k1", img); + + assertEquals(definido, doc.getImageFields()); + } + + @Test + public void seColocaImagensCorretamenteNaVariavel(){ + + final Image img1 = null; + final Image img2 = null; + final Image img3 = null; + + doc = createDoc(); + + Map old = new HashMap(3); + old.put("k1", img1); + old.put("k2", img2); + + doc.putAllImages(old); + + assertEquals(old,doc.getImageFields()); + + Map newOne = new HashMap(old); + newOne.put("k3", img3); + + doc.putAllImages(newOne); + + assertEquals(newOne, doc.getImageFields()); + } + + @Test + public void seGeraDocumentoCorretamenteEmBytes() throws IOException{ + + doc = createDoc(); + + PdfDocReader readerArqBase = new PdfDocReader(Resources.crieInputStreamParaArquivoComCampos()); + + PdfDocReader readerArqNovo = new PdfDocReader(doc.toBytes()); + + assertTrue("DEVEM SER IGUAIS", + Resources.DOCUMENT_TITLE.equals(readerArqBase.getInfo().title()) + && + Resources.DOCUMENT_TITLE.equals(readerArqNovo.getInfo().title())); + + readerArqBase.close(); + readerArqNovo.close(); + } + + @Test + public void seRemoveCamposDeTextoCorretamente(){ + + doc = createDoc(); + + doc.put("k1", "v1"); + + PdfDocReader reader = new PdfDocReader(doc.toBytes()); + + assertTrue(reader.getFields().isEmpty()); + + reader.close(); + } + + @Test + public void seColocaTextoCorretamenteNoArquivo(){ + + doc = createDoc(); + + doc.put("nomeDoTestador", "Gilmar P.S.L."); + doc.put("funcaoDoTestador", "Tester"); + doc.put("nomeDoTeste", "sePutTextCorretamenteNoArquivo"); + + doc.removeFields(false); + + PdfDocReader reader = new PdfDocReader(doc.toBytes()); + + assertEquals(doc.getTextFields(), reader.getFields()); + + reader.close(); + } + + @Test + public void seColocaTituloCorretamenteNoArquivo(){ + + final String TITULO = "Titulo Corretamente No Arquivo?"; + + doc = createDoc(); + + doc.withTitle(TITULO); + + PdfDocReader reader = new PdfDocReader(doc.toBytes()); + + assertEquals(TITULO, reader.getInfo().title()); + + reader.close(); + } + + @Test + public void seColocaAssuntoCorretamenteNoArquivo(){ + + final String ASSUNTO = "Assunto Correto No Arquivo?"; + + doc = createDoc(); + + doc.withSubject(ASSUNTO); + + PdfDocReader reader = new PdfDocReader(doc.toBytes()); + + assertEquals(ASSUNTO, reader.getInfo().subject()); + + reader.close(); + } + + @Test + public void seColocaPalavrasChaveCorretamenteNoArquivo(){ + + final String PALAVRA_CHAVE = "palavras, chave, corretas, no arquivo?"; + + doc = createDoc(); + + doc.withKeywords(PALAVRA_CHAVE); + + PdfDocReader reader = new PdfDocReader(doc.toBytes()); + + assertEquals(PALAVRA_CHAVE, reader.getInfo().keywords()); + + reader.close(); + } + + @Test + public void seMudaDocinfo(){ + + final String NOVO_TITULO = "Título mudado agora!"; + + PdfDocInfo docInfo = PdfDocInfo.create(); + docInfo.title(NOVO_TITULO); + + doc = createDoc(); + + doc.withDocInfo(docInfo); + + PdfDocReader reader = new PdfDocReader(doc.toBytes()); + + assertEquals(NOVO_TITULO, reader.getInfo().title()); + + reader.close(); + } + + @Test + public void seColocaAutorCorretamenteNoArquivo(){ + + final String AUTOR = "Este (você) é o autor do arquivo?"; + + doc = createDoc(); + + doc.withAuthor(AUTOR); + + PdfDocReader reader = new PdfDocReader(doc.toBytes()); + + assertEquals(AUTOR, reader.getInfo().author()); + + reader.close(); + } + + @Test + public void seColocaCriadorCorretamenteNoArquivo(){ + + final String CRIADOR = "Minha Aplicação"; + + doc = createDoc(); + + doc.withCreator(CRIADOR); + + PdfDocReader reader = new PdfDocReader(doc.toBytes()); + + assertEquals(CRIADOR+" by (jrimum.org/bopepo)", reader.getInfo().creator()); + + reader.close(); + } + + @Test + public void seGeraDocumentoEmArquivoViaParamentroFile() throws IOException{ + + final String file = "ArquivoComCampos"; + final String filePath = "./src/test/resources/"+file+".pdf"; + + doc = createDoc(); + + PdfDocReader readerArqBase = new PdfDocReader(Resources.crieInputStreamParaArquivoComCampos()); + + final File arqBase = new File(filePath); + final File arqTest = File.createTempFile(file, ".pdf"); + + FileUtils.copyFile(arqBase, arqTest); + + doc.toFile(arqTest); + + PdfDocReader readerArqNovo = new PdfDocReader(arqBase); + + assertTrue("DEVEM SER IGUAIS", + Resources.DOCUMENT_TITLE.equals(readerArqBase.getInfo().title()) + && + Resources.DOCUMENT_TITLE.equals(readerArqNovo.getInfo().title())); + + readerArqBase.close(); + readerArqNovo.close(); + arqTest.delete(); + } + + /** + * Arquivo no classpath com 3 campos: + * + *
        + *
      • nomeDoTestador:"JRiboy Brasileiro da Ordem do Progresso"
      • + *
      • funcaoDoTestador:"Developer"
      • + *
      • nomeDoTeste:"A definir..."
      • + *
        + * + * @return doc pronto para uso + * + * @see org.jrimum.bopepo.pdf.Resources#crieInputStreamParaArquivoComCampos() + */ + private PdfDocMix createDoc(){ + return new PdfDocMix(Resources.crieInputStreamParaArquivoComCampos()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocReader.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocReader.java new file mode 100644 index 0000000..0f22a25 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/pdf/TestPdfDocReader.java @@ -0,0 +1,165 @@ +/* + * 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 static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.text.ParseException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.junit.After; +import org.junit.Test; + +/** + * Teste unitário da classe TestPdfDocReader. + * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public class TestPdfDocReader { + + private PdfDocReader reader; + + @Test + public void seDocInfoEstahCorreto() throws ParseException{ + + reader = crieReaderParaArquivoSemCampos(); + + PdfDocInfo info = reader.getInfo(); + + assertEquals(Resources.DOCUMENT_TITLE, info.title()); + assertEquals("Caso de teste", info.subject()); + assertEquals("Teste, JRimum", info.keywords()); + assertEquals("Gilmar P.S.L.", info.author()); + assertEquals("Writer", info.creator()); + assertEquals("BrOffice 3.3", info.producer()); + assertEquals("D:20110923112741-03'00'", info.creationRaw()); + } + + @Test + public void seGetFieldRetornaNullQuandoNaoTemCamposDisponiveis(){ + + reader = crieReaderParaArquivoSemCampos(); + + assertNull(reader.getField("teste")); + } + + @Test + public void seGetFieldsNamesRetornaVazioQuandoNaoTemCamposDisponiveis(){ + + reader = crieReaderParaArquivoSemCampos(); + + assertTrue(reader.getFieldsNames().isEmpty()); + } + + @Test + public void seGetFieldsRetornaVazioQuandoNaoTemCamposDisponiveis(){ + + reader = crieReaderParaArquivoSemCampos(); + + assertTrue(reader.getFields().isEmpty()); + } + + @Test + public void seGetFieldRetornaValorCorretoQuandoCamposEstaoDisponiveis(){ + + reader = crieReaderParaArquivoComCampos(); + + assertEquals("Developer",reader.getField("funcaoDoTestador")); + } + + @Test + public void seGetFieldsNamesRetornaValoresCorretosQuandoCamposEstaoDisponiveis(){ + + reader = crieReaderParaArquivoComCampos(); + + Set camposDefinidos = new HashSet(3); + + camposDefinidos.add("nomeDoTestador"); + camposDefinidos.add("funcaoDoTestador"); + camposDefinidos.add("nomeDoTeste"); + + assertEquals(camposDefinidos,reader.getFieldsNames()); + } + + @Test + public void seGetFieldsRetornaValoresCorretosQuandoCamposEstaoDisponiveis(){ + + reader = crieReaderParaArquivoComCampos(); + + Map definicao = new HashMap(3); + definicao.put("nomeDoTestador","JRiboy Brasileiro da Ordem do Progresso"); + definicao.put("funcaoDoTestador","Developer"); + definicao.put("nomeDoTeste","A definir..."); + + assertEquals(definicao, reader.getFields()); + } + + @After + public void tearDown(){ + reader.close(); + } + + /** + * Arquivo no classpath sem fields. + * + * @return reader pronto para uso + * + * @see org.jrimum.bopepo.pdf.Resources#crieInputStreamParaArquivoSemCampos() + */ + private PdfDocReader crieReaderParaArquivoSemCampos(){ + return new PdfDocReader(Resources.crieInputStreamParaArquivoSemCampos()); + } + + /** + * Arquivo no classpath com 3 campos: + * + *
          + *
        • nomeDoTestador:"JRiboy Brasileiro da Ordem do Progresso"
        • + *
        • funcaoDoTestador:"Developer"
        • + *
        • nomeDoTeste:"A definir..."
        • + *
          + * + * @return reader pronto para uso + * + * org.jrimum.bopepo.pdf.Resources#crieInputStreamParaArquivoComCampos() + */ + private PdfDocReader crieReaderParaArquivoComCampos(){ + return new PdfDocReader(Resources.crieInputStreamParaArquivoComCampos()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/TestBoletoViewer.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/TestBoletoViewer.java new file mode 100644 index 0000000..5bdafef --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/TestBoletoViewer.java @@ -0,0 +1,122 @@ +/* + * Copyright 2013 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/10/2013 - 00:36:20 + * + * ================================================================================ + * + * Direitos autorais 2013 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/10/2013 - 00:36:20 + * + */ + + +package org.jrimum.bopepo.view; + +import static org.mockito.Mockito.verify; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + + +/** + * @author Gilmar P.S.L. + */ +@RunWith(MockitoJUnitRunner.class) +public class TestBoletoViewer { + + @Mock + private PdfViewer pdfViewer; + + private BoletoViewer boletoViewer; + + @Before + public void setup(){ + boletoViewer = new BoletoViewer(pdfViewer); + } + + @Test + public void deve_chamar_metodo_de_definicao_da_compressao_em_pdfview(){ + boolean option = true; + + boletoViewer.setPdfFullCompression(option); + + verify(pdfViewer).setFullCompression(option); + } + + @Test + public void deve_chamar_metodo_de_definicao_do_titulo_em_pdfview(){ + String titulo = "Boleto de Pagamento"; + + boletoViewer.setPdfTitulo(titulo); + + verify(pdfViewer).setTitle(titulo); + } + + @Test + public void deve_chamar_metodo_de_definicao_da_opcao_de_mostrar_titulo_em_pdfview(){ + boolean opcao = true; + + boletoViewer.setPdfExibirTitulo(opcao); + + verify(pdfViewer).setDisplayTitle(opcao); + } + + @Test + public void deve_chamar_metodo_de_definicao_do_autor_em_pdfview(){ + String autor = "Eu"; + + boletoViewer.setPdfAutor(autor); + + verify(pdfViewer).setAuthor(autor); + } + + @Test + public void deve_chamar_metodo_de_definicao_do_assunto_em_pdfview(){ + String assunto = "Importante"; + + boletoViewer.setPdfAssunto(assunto); + + verify(pdfViewer).setSubject(assunto); + } + + @Test + public void deve_chamar_metodo_de_definicao_das_palavras_chave_em_pdfview(){ + String palavrasChave = "minhas, palavras, chaves"; + + boletoViewer.setPdfPalavrasChave(palavrasChave); + + verify(pdfViewer).setKeywords(palavrasChave); + } + + @Test + public void deve_chamar_metodo_de_definicao_da_opcao_de_remover_os_campos_em_pdfview(){ + boolean opcao = true; + + boletoViewer.setPdfRemoverCampos(opcao); + + verify(pdfViewer).setRemoveFields(opcao); + } + +} \ No newline at end of file diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/TestResourceBundle.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/TestResourceBundle.java new file mode 100644 index 0000000..7bebf9f --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/TestResourceBundle.java @@ -0,0 +1,107 @@ +/* + * Copyright 2013 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/09/2013 - 12:14:45 + * + * ================================================================================ + * + * Direitos autorais 2013 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/09/2013 - 12:14:45 + * + */ + +package org.jrimum.bopepo.view; + +import static org.jrimum.bopepo.view.ResourceBundle.BOLETO_TEMPLATE_COM_SACADOR_AVALISTA; +import static org.jrimum.bopepo.view.ResourceBundle.BOLETO_TEMPLATE_SEM_SACADOR_AVALISTA; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.io.IOException; + +import javax.imageio.ImageIO; + +import org.jrimum.bopepo.excludes.Images; +import org.junit.Test; + +import com.google.common.io.Resources; + +/** + * @author Gilmar P.S.L. + */ +public class TestResourceBundle { + + @Test + public void deve_carregar_a_logo_do_banco_do_resource() throws Exception { + + BufferedImage logoBanco001Esperado = ImageIO.read(Resources.getResource("img/001.png")); + assertNotNull(logoBanco001Esperado); + + BufferedImage logoBanco001Carregado = (BufferedImage) new ResourceBundle().getLogotipoDoBanco("001"); + assertNotNull(logoBanco001Carregado); + + assertTrue(Images.areEqual(logoBanco001Esperado, logoBanco001Carregado)); + } + + @Test + public void deve_carregar_o_mesmo_objeto_imagem_apos_o_primeiro_carregamento_de_uma_mesma_logo() throws Exception { + + ResourceBundle resourceBundle = new ResourceBundle(); + + Image logoBanco001Carregado = resourceBundle.getLogotipoDoBanco("001"); + assertNotNull(logoBanco001Carregado); + Image logoBanco001Carregado2 = resourceBundle.getLogotipoDoBanco("001"); + assertNotNull(logoBanco001Carregado2); + + assertEquals(logoBanco001Carregado, logoBanco001Carregado2); + } + + @Test + public void deve_carregar_o_boleto_template_sem_sacador_avalista() throws Exception { + + byte[] templateEsperado = getTempateEsperado(BOLETO_TEMPLATE_SEM_SACADOR_AVALISTA); + assertNotNull(templateEsperado); + + byte[] templateCarregado = new ResourceBundle().getTemplateSemSacadorAvalista(); + assertNotNull(templateCarregado); + + assertEquals(templateEsperado.length, templateCarregado.length); + } + + @Test + public void deve_carregar_o_boleto_template_com_sacador_avalista() throws Exception { + + byte[] templateEsperado = getTempateEsperado(BOLETO_TEMPLATE_COM_SACADOR_AVALISTA); + assertNotNull(templateEsperado); + + byte[] templateCarregado = new ResourceBundle().getTemplateComSacadorAvalista(); + assertNotNull(templateCarregado); + + assertEquals(templateEsperado.length, templateCarregado.length); + } + + private byte[] getTempateEsperado(String nomeDoTemplate) throws IOException { + + return Resources.asByteSource(Resources.getResource("pdf/"+nomeDoTemplate)).read(); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/TestBoletoInfoViewBuilder.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/TestBoletoInfoViewBuilder.java new file mode 100644 index 0000000..7c0d9c7 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/TestBoletoInfoViewBuilder.java @@ -0,0 +1,97 @@ +/* + * Copyright 2013 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/09/2013 - 01:13:22 + * + * ================================================================================ + * + * Direitos autorais 2013 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/09/2013 - 01:13:22 + * + */ + +package org.jrimum.bopepo.view.info; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.jrimum.utilix.Objects.whenNull; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.util.Map; +import java.util.TreeMap; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.excludes.Images; +import org.jrimum.bopepo.pdf.CodigoDeBarras; +import org.jrimum.bopepo.view.BoletoCampo; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.BoletoInfoViewBuilder; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Gilmar P.S.L. + */ +public class TestBoletoInfoViewBuilder { + + private Boleto boleto; + private ResourceBundle resourceBundle; + private BoletoInfoViewBuilder boletoInfoViewBuilder; + private java.util.ResourceBundle boletoDadosEsperados; + + @Before + public void setup(){ + + this.resourceBundle = new ResourceBundle(); + this.boleto = BoletoBuilder.defaultValueSacadorAvalista(); + this.boletoInfoViewBuilder = new BoletoInfoViewBuilder(resourceBundle, boleto).build(); + this.boletoDadosEsperados = java.util.ResourceBundle.getBundle("ValoresEsperadosDosCamposParaBoletoBradescoPDF"); + } + + @Test + public void deve_ter_todos_os_campos_de_texto_padrao_preenchidos_com_textos_formatados_para_exibir_no_boleto(){ + + Map camposTextoNoBoleto = new TreeMap (boletoInfoViewBuilder.texts()); + + for(BoletoCampo campo: BoletoCampo.values()){ + String textoEsperado = boletoDadosEsperados.getString(campo.name()); + String textoAtual = whenNull(camposTextoNoBoleto.get(campo.name()), EMPTY); + assertEquals("CAMPO: "+campo,textoEsperado,textoAtual); + } + } + + @Test + public void deve_ter_todos_os_campos_de_imagem_padrao_preenchidos_com_as_imagens_corretas_para_exibir_no_boleto(){ + + Map camposImagem = boletoInfoViewBuilder.images(); + + Image logoBancoBradescoEsperada = resourceBundle.getLogotipoDoBanco("237"); + assertEquals(logoBancoBradescoEsperada, camposImagem.get(BoletoCampo.txtRsLogoBanco.name())); + assertEquals(logoBancoBradescoEsperada, camposImagem.get(BoletoCampo.txtFcLogoBanco.name())); + + BufferedImage codigoDeBarrasEsperado = Images.toBufferedImage(CodigoDeBarras.valueOf(boleto.getCodigoDeBarras().write()).toImage()); + BufferedImage codigoDeBarradasCriado = Images.toBufferedImage(camposImagem.get(BoletoCampo.txtFcCodigoBarra.name())); + assertTrue(Images.areEqual(codigoDeBarrasEsperado,codigoDeBarradasCriado)); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoAgenciaCodigoCedente.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoAgenciaCodigoCedente.java new file mode 100644 index 0000000..8084bf3 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoAgenciaCodigoCedente.java @@ -0,0 +1,96 @@ +/* + * Copyright 2014 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: 17/01/2014 - 14:38:22 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 17/01/2014 - 14:38:22 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.hamcrest.Matchers.equalTo; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoAgenciaCodigoCedente.getTextoAgenciaCodigoCedente; +import static org.junit.Assert.*; + +import org.jrimum.bopepo.excludes.ContaBancariaBuilder; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Test; + +/** + * @author Gilmar P.S.L. + */ +public class TestBoletoInfoCampoAgenciaCodigoCedente { + + @Test + public void deve_retornar_agencia_com_dv_e_numero_da_conta_com_dv(){ + ContaBancaria conta = ContaBancariaBuilder.defaultValue(); + + assertThat(getTextoAgenciaCodigoCedente(conta), equalTo("1234-1 / 123456-0")); + } + + @Test + public void deve_retornar_agencia_sem_dv_e_numero_da_conta_com_dv(){ + ContaBancaria conta = ContaBancariaBuilder.defaultValue(); + conta.setAgencia(new Agencia(conta.getAgencia().getCodigo())); + + assertThat(getTextoAgenciaCodigoCedente(conta), equalTo("1234 / 123456-0")); + } + + @Test + public void deve_retornar_agencia_com_dv_e_numero_da_conta_sem_dv(){ + ContaBancaria conta = ContaBancariaBuilder.defaultValue(); + conta.setNumeroDaConta(new NumeroDaConta(conta.getNumeroDaConta().getCodigoDaConta())); + + assertThat(getTextoAgenciaCodigoCedente(conta), equalTo("1234-1 / 123456")); + } + + @Test + public void deve_retornar_agencia_sem_dv_e_numero_da_conta_sem_dv(){ + ContaBancaria conta = ContaBancariaBuilder.defaultValue(); + conta.setAgencia(new Agencia(conta.getAgencia().getCodigo())); + conta.setNumeroDaConta(new NumeroDaConta(conta.getNumeroDaConta().getCodigoDaConta())); + + assertThat(getTextoAgenciaCodigoCedente(conta), equalTo("1234 / 123456")); + } + + @Test + public void deve_nao_gerar_exceptions_quando_agencia_ausente(){ + ContaBancaria conta = ContaBancariaBuilder.defaultValue(); + conta.setAgencia(null); + + assertThat(getTextoAgenciaCodigoCedente(conta), equalTo("123456-0")); + } + + @Test + public void deve_nao_gerar_exceptions_quando_conta_ausente(){ + ContaBancaria conta = ContaBancariaBuilder.defaultValue(); + conta.setNumeroDaConta(null); + + assertThat(getTextoAgenciaCodigoCedente(conta), equalTo("1234-1")); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoCodigoBanco.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoCodigoBanco.java new file mode 100644 index 0000000..28f400a --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoCodigoBanco.java @@ -0,0 +1,54 @@ +/* + * Copyright 2014 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/01/2014 - 19:17:47 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 19:17:47 + * + */ + + +package org.jrimum.bopepo.view.info.campo; + +import static org.hamcrest.Matchers.equalTo; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoCodigoBanco.getTextoCodigoDoBanco; +import static org.junit.Assert.*; + +import org.jrimum.bopepo.excludes.ContaBancariaBuilder; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.junit.Test; + + +/** + * @author Gilmar P.S.L. + */ +public class TestBoletoInfoCampoCodigoBanco { + + @Test + public void deve_retornar_codigo_de_compensacao_com_dv(){ + ContaBancaria conta = ContaBancariaBuilder.defaultValue(); + + assertThat(getTextoCodigoDoBanco(conta), equalTo("237-2")); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoEndereco.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoEndereco.java new file mode 100644 index 0000000..100fc13 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoEndereco.java @@ -0,0 +1,265 @@ +/* + * Copyright 2014 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: 17/01/2014 - 19:32:45 + * + * ================================================================================ + * + * Direitos autorais 2014 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: 17/01/2014 - 19:32:45 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.*; + +import org.jrimum.bopepo.excludes.EnderecoBuilder; +import org.jrimum.domkee.comum.pessoa.endereco.CEP; +import org.jrimum.domkee.comum.pessoa.endereco.Endereco; +import org.jrimum.domkee.financeiro.banco.febraban.EntidadeDeCobranca; +import org.junit.Test; + +/** + * @author Gilmar P.S.L. + */ +public class TestBoletoInfoCampoEndereco { + + private static final String ENDERECO_ESPERADO_LINHA1 = "Grande Centro - Natal / RN"; + private static final String ENDERECO_ESPERADO_LINHA2 = "Rua poeta dos programas, n°: 1 / Apt 101 - CEP: 59064-120"; + + //LINHA1 + + @Test + public void deve_retornar_linha1_correta_para_entidade_de_cobraca(){ + + Endereco endereco = EnderecoBuilder.defaultValue(); + + EntidadeDeCobranca entidade = new EntidadeDeCobranca(""); + entidade.addEndereco(endereco); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(endereco), equalTo(ENDERECO_ESPERADO_LINHA1)); + } + + @Test + public void deve_retornar_linha1_vazia_para_entidade_de_cobraca_null(){ + EntidadeDeCobranca entidade = null; + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(entidade), equalTo(EMPTY)); + } + + @Test + public void deve_retornar_linha1_vazia_para_entidade_de_cobraca_com_endereco_null(){ + EntidadeDeCobranca entidade = new EntidadeDeCobranca(""); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(entidade), equalTo(EMPTY)); + } + + @Test + public void deve_retornar_linha1_correta_para_endereco(){ + + Endereco endereco = EnderecoBuilder.defaultValue(); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(endereco), equalTo(ENDERECO_ESPERADO_LINHA1)); + } + + + @Test + public void deve_retornar_linha1_para_endereco_quando_bairro_null(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setBairro(null); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(endereco), equalTo("Natal / RN")); + } + + @Test + public void deve_retornar_linha1_para_endereco_quando_bairro_blank(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setBairro(EMPTY); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(endereco), equalTo("Natal / RN")); + } + + @Test + public void deve_retornar_linha1_para_endereco_quando_localidade_null(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setLocalidade(null); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(endereco), equalTo("Grande Centro / RN")); + } + + @Test + public void deve_retornar_linha1_para_endereco_quando_localidade_blank(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setLocalidade(null); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(endereco), equalTo("Grande Centro / RN")); + } + + @Test + public void deve_retornar_linha1_para_endereco_quando_uf_null(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setUF(null); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(endereco), equalTo("Grande Centro - Natal")); + } + + @Test + public void deve_retornar_linha1_vazia_para_endereco_null(){ + Endereco endereco = null; + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha1(endereco), equalTo(EMPTY)); + } + + //LINHA2 + + @Test + public void deve_retornar_linha2_correta_para_entidade_de_cobraca(){ + + Endereco endereco = EnderecoBuilder.defaultValue(); + + EntidadeDeCobranca entidade = new EntidadeDeCobranca(""); + entidade.addEndereco(endereco); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo(ENDERECO_ESPERADO_LINHA2)); + } + + @Test + public void deve_retornar_linha2_vazia_para_entidade_de_cobraca_null(){ + EntidadeDeCobranca entidade = null; + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(entidade), equalTo(EMPTY)); + } + + @Test + public void deve_retornar_linha2_vazia_para_entidade_de_cobraca_com_endereco_null(){ + EntidadeDeCobranca entidade = new EntidadeDeCobranca(""); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(entidade), equalTo(EMPTY)); + } + + @Test + public void deve_retornar_linha2_correta_para_endereco(){ + + Endereco endereco = EnderecoBuilder.defaultValue(); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo(ENDERECO_ESPERADO_LINHA2)); + } + + @Test + public void deve_retornar_linha2_para_endereco_quando_logradouro_null(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setLogradouro(null); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo(", n°: 1 / Apt 101 - CEP: 59064-120")); + } + + @Test + public void deve_retornar_linha2_para_endereco_quando_logradouro_blank(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setLogradouro(""); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo(", n°: 1 / Apt 101 - CEP: 59064-120")); + } + + @Test + public void deve_retornar_linha2_para_endereco_quando_numero_null(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setNumero(null); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo("Rua poeta dos programas / Apt 101 - CEP: 59064-120")); + } + + @Test + public void deve_retornar_linha2_para_endereco_quando_numero_blank(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setNumero(""); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo("Rua poeta dos programas / Apt 101 - CEP: 59064-120")); + } + + @Test + public void deve_retornar_linha2_para_endereco_quando_complemento_null(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setComplemento(null); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo("Rua poeta dos programas, n°: 1 - CEP: 59064-120")); + } + + @Test + public void deve_retornar_linha2_para_endereco_quando_compplemento_blank(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + endereco.setComplemento(""); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo("Rua poeta dos programas, n°: 1 - CEP: 59064-120")); + } + + @Test + public void deve_retornar_linha2_para_endereco_quando_objeto_cep_null(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + CEP cep = null; + endereco.setCep(cep); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo("Rua poeta dos programas, n°: 1 / Apt 101")); + } + + @Test + public void deve_retornar_linha2_para_endereco_quando_codigo_cep_null(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + CEP cep = new CEP(); + endereco.setCep(cep); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo("Rua poeta dos programas, n°: 1 / Apt 101")); + } + + @Test + public void deve_retornar_linha2_para_endereco_quando_codigo_cep_blank(){ + Endereco endereco = EnderecoBuilder.defaultValue(); + + CEP cep = new CEP(""); + endereco.setCep(cep); + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo("Rua poeta dos programas, n°: 1 / Apt 101")); + } + + @Test + public void deve_retornar_linha2_vazia_para_endereco_null(){ + Endereco endereco = null; + + assertThat(BoletoInfoCampoEndereco.getTextoEnderecoLinha2(endereco), equalTo(EMPTY)); + } + +} \ No newline at end of file diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoLogoBanco.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoLogoBanco.java new file mode 100644 index 0000000..43266d4 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoLogoBanco.java @@ -0,0 +1,75 @@ +/* + * Copyright 2014 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/01/2014 - 21:35:25 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 21:35:25 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; + +import java.awt.Image; + +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.Banco; +import org.jrimum.domkee.financeiro.banco.febraban.CodigoDeCompensacaoBACEN; +import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria; +import org.junit.Test; + +/** + * @author Gilmar P.S.L. + */ +public class TestBoletoInfoCampoLogoBanco { + + @Test + public void deve_retornar_imagem_logo_quando_conta_contem_imagem(){ + Image imgLogo = mock(Image.class); + Banco banco = new Banco(); + banco.setImgLogo(imgLogo); + ContaBancaria conta = new ContaBancaria(); + conta.setBanco(banco); + ResourceBundle resourceBundle = null; + + Image logo = BoletoInfoCampoLogoBanco.getImagemBanco(resourceBundle, conta); + + assertThat(logo, equalTo(imgLogo)); + } + + @Test + public void deve_retornar_imagem_logo_do_resource_quando_conta_nao_contem_imagem(){ + ContaBancaria conta = new ContaBancaria(); + conta.setBanco(new Banco(new CodigoDeCompensacaoBACEN(1),"Banco do Brasil")); + ResourceBundle resourceBundle = new ResourceBundle(); + Image logoEsperada = resourceBundle.getLogotipoDoBanco("001"); + + Image logo = BoletoInfoCampoLogoBanco.getImagemBanco(resourceBundle, conta); + + assertThat(logo, equalTo(logoEsperada)); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoNossoNumero.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoNossoNumero.java new file mode 100644 index 0000000..4f63e64 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoNossoNumero.java @@ -0,0 +1,96 @@ +/* + * Copyright 2014 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/01/2014 - 14:25:25 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 14:25:25 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.hamcrest.Matchers.equalTo; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoNossoNumero.getTextoNossoNumero; +import static org.junit.Assert.assertThat; + +import org.jrimum.bopepo.excludes.TituloBuilder; +import org.jrimum.domkee.financeiro.banco.febraban.Titulo; +import org.junit.Test; + +/** + * @author Gilmar P.S.L. + */ +public class TestBoletoInfoCampoNossoNumero { + + @Test + public void deve_retornar_nosso_numero_sem_dv_quando_dv_null(){ + Titulo titulo = TituloBuilder.defaultValue(); + + titulo.setNossoNumero("123456"); + titulo.setDigitoDoNossoNumero(null); + + assertThat(getTextoNossoNumero(titulo), equalTo("123456")); + } + + @Test + public void deve_retornar_nosso_numero_sem_dv_quando_dv_vazio(){ + Titulo titulo = TituloBuilder.defaultValue(); + + titulo.setNossoNumero("123456"); + titulo.setDigitoDoNossoNumero(""); + + assertThat(getTextoNossoNumero(titulo), equalTo("123456")); + } + + @Test + public void deve_retornar_nosso_numero_com_dv_quando_dv_presente(){ + Titulo titulo = TituloBuilder.defaultValue(); + + titulo.setNossoNumero("123456"); + titulo.setDigitoDoNossoNumero("7"); + + assertThat(getTextoNossoNumero(titulo), equalTo("123456-7")); + } + + @Test + public void deve_retornar_string_vaiza_caso_nao_nosso_numero_null(){ + Titulo titulo = TituloBuilder.defaultValue(); + + titulo.setNossoNumero(null); + titulo.setDigitoDoNossoNumero("7"); + + assertThat(getTextoNossoNumero(titulo), equalTo("")); + } + + @Test + public void deve_retornar_string_vaiza_caso_nao_nosso_numero_vazio(){ + Titulo titulo = TituloBuilder.defaultValue(); + + titulo.setNossoNumero(""); + titulo.setDigitoDoNossoNumero("7"); + + assertThat(getTextoNossoNumero(titulo), equalTo("")); + } + +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoPessoa.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoPessoa.java new file mode 100644 index 0000000..df94681 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoPessoa.java @@ -0,0 +1,91 @@ +/* + * Copyright 2014 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/01/2014 - 13:47:35 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 13:47:35 + * + */ + + +package org.jrimum.bopepo.view.info.campo; + +import static org.hamcrest.Matchers.equalTo; +import static org.jrimum.bopepo.view.info.campo.BoletoInfoCampoPessoa.getTextoNomeCprfDaPessoa; +import static org.junit.Assert.*; + +import org.jrimum.domkee.financeiro.banco.febraban.EntidadeDeCobranca; +import org.junit.Test; + + +/** + * @author Gilmar P.S.L. + */ +public class TestBoletoInfoCampoPessoa { + + private EntidadeDeCobranca pessoa; + + @Test + public void deve_retornar_texto_formatado_para_pessoa_fisica(){ + String nome = "Uma Pessoa Física Desconhecida"; + String cpf = "222.222.222-22"; + pessoa = new EntidadeDeCobranca(nome, cpf); + String textoExperado = String.format("%s, CPF: %s",nome,cpf); + + assertThat(getTextoNomeCprfDaPessoa(pessoa), equalTo(textoExperado)); + } + + @Test + public void deve_retornar_texto_formatado_para_pessoa_juridica(){ + String nome = "Uma Pessoa Jurídica Qualquer"; + String cpf = "00.000.000/0001-91"; + pessoa = new EntidadeDeCobranca(nome, cpf); + String textoExperado = String.format("%s, CNPJ: %s",nome,cpf); + + assertThat(getTextoNomeCprfDaPessoa(pessoa), equalTo(textoExperado)); + } + + @Test + public void deve_retornar_apenas_nome_quando_cprf_null(){ + String nome = "Nome da Pessoa"; + pessoa = new EntidadeDeCobranca(nome); + + assertThat(getTextoNomeCprfDaPessoa(pessoa), equalTo(nome)); + } + + @Test + public void deve_retornar_apenas_cprf_quando_nome_null(){ + String cprf = "222.222.222-22"; + pessoa = new EntidadeDeCobranca(null,"222.222.222-22"); + + assertThat(getTextoNomeCprfDaPessoa(pessoa), equalTo("CPF: "+cprf)); + } + + @Test + public void deve_retornar_string_vazia_quando_pessoa_null(){ + + assertThat(getTextoNomeCprfDaPessoa(null), equalTo("")); + } + +} \ No newline at end of file diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoViewFactory.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoViewFactory.java new file mode 100644 index 0000000..0f8e71b --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoCampoViewFactory.java @@ -0,0 +1,59 @@ +/* + * Copyright 2014 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/01/2014 - 22:26:33 + * + * ================================================================================ + * + * Direitos autorais 2014 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/01/2014 - 22:26:33 + * + */ + +package org.jrimum.bopepo.view.info.campo; + +import static org.hamcrest.Matchers.instanceOf; +import static org.junit.Assert.assertThat; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.Banco; +import org.jrimum.domkee.financeiro.banco.febraban.CodigoDeCompensacaoBACEN; +import org.junit.Test; + +/** + * @author Gilmar P.S.L. + * + */ +public class TestBoletoInfoCampoViewFactory { + + @Test + public void deve_retornar_implementacao_padrao_para_bancos_nao_suportados(){ + ResourceBundle resourceBundle = new ResourceBundle(); + Boleto boleto = BoletoBuilder.defaultValue(); + boleto.getTitulo().getContaBancaria().setBanco(new Banco(new CodigoDeCompensacaoBACEN(999), "INEXISTENTE")); + + BoletoInfoCampoView infoCampo = BoletoInfoCampoViewFactory.create(resourceBundle, boleto); + + assertThat(infoCampo, instanceOf(BoletoInfoViewDefault.class)); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoViewBradesco.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoViewBradesco.java new file mode 100644 index 0000000..e0c465f --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoViewBradesco.java @@ -0,0 +1,53 @@ +package org.jrimum.bopepo.view.info.campo; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.Carteira; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Rômulo Augusto + */ +public class TestBoletoInfoViewBradesco { + + private BoletoInfoViewBradesco view; + private Boleto boleto; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + view = new BoletoInfoViewBradesco(mock(ResourceBundle.class), boleto); + } + + @Test + public void deve_retornar_local_de_pagamento_padrao() { + boleto.setLocalPagamento(null); + assertEquals("Pagável Preferencialmente na rede Bradesco ou no Bradesco expresso", view.getTextoFcLocalPagamento()); + } + + @Test + public void deve_retornar_agencia_e_conta_no_campo_agencia_codigo_cliente() { + boleto.getTitulo().getContaBancaria().setAgencia(new Agencia(1234,"5")); + boleto.getTitulo().getContaBancaria().setNumeroDaConta(new NumeroDaConta(1234567, "0")); + + assertEquals("1234-5 / 1234567-0", view.getTextoFcAgenciaCodigoCedente()); + assertEquals("1234-5 / 1234567-0", view.getTextoRsAgenciaCodigoCedente()); + } + + @Test + public void deve_retornar_carteira_e_nosso_numero_e_dv_com_traco() { + boleto.getTitulo().getContaBancaria().setCarteira(new Carteira(9)); + boleto.getTitulo().setNossoNumero("00000123456"); + boleto.getTitulo().setDigitoDoNossoNumero("2"); + + assertEquals("09/00000123456-2", view.getTextoFcNossoNumero()); + assertEquals("09/00000123456-2", view.getTextoRsNossoNumero()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoViewCecred.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoViewCecred.java new file mode 100644 index 0000000..cc39c8e --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/TestBoletoInfoViewCecred.java @@ -0,0 +1,42 @@ +package org.jrimum.bopepo.view.info.campo; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Rômulo Augusto + */ +public class TestBoletoInfoViewCecred { + + private BoletoInfoViewCecred view; + private Boleto boleto; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + view = new BoletoInfoViewCecred(mock(ResourceBundle.class), boleto); + } + + @Test + public void deve_retornar_local_de_pagamento_padrao() { + boleto.setLocalPagamento(null); + assertEquals("PAGAVEL PREFERENCIALMENTE NAS COOPERATIVAS DO SISTEMA CECRED.", view.getTextoFcLocalPagamento()); + } + + @Test + public void deve_retornar_agencia_e_conta_no_campo_agencia_codigo_cliente() { + boleto.getTitulo().getContaBancaria().setAgencia(new Agencia(1234,"5")); + boleto.getTitulo().getContaBancaria().setNumeroDaConta(new NumeroDaConta(1234567, "0")); + + assertEquals("1234-5 / 1234567-0", view.getTextoFcAgenciaCodigoCedente()); + assertEquals("1234-5 / 1234567-0", view.getTextoRsAgenciaCodigoCedente()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaFactory.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaFactory.java new file mode 100644 index 0000000..86d78d9 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaFactory.java @@ -0,0 +1,62 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.BoletoInfoCampoView; +import org.jrimum.bopepo.view.info.campo.caixa.BoletoInfoViewCaixaFactory; +import org.jrimum.bopepo.view.info.campo.caixa.BoletoInfoViewCaixaSIGCB; +import org.junit.Before; +import org.junit.Test; + +public class TestBoletoInfoViewCaixaFactory { + + private static final String NN10 = "0123456789"; + private static final String NN14 = "01234567890123"; + private static final String NN15 = "012345678901234"; + private static final String NN17 = "01234567890123456"; + + private Boleto boleto; + private ResourceBundle resourceBundle; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + resourceBundle = mock(ResourceBundle.class); + } + + @Test + public void deve_retornar_implementacao_para_convenio_sigcb() { + boleto.getTitulo().setNossoNumero(NN15); + BoletoInfoCampoView view = BoletoInfoViewCaixaFactory.create(resourceBundle, boleto); + + assertTrue(view instanceof BoletoInfoViewCaixaSIGCB); + } + + @Test + public void deve_retornar_implementacao_para_convenio_sinco() { + boleto.getTitulo().setNossoNumero(NN17); + BoletoInfoCampoView view = BoletoInfoViewCaixaFactory.create(resourceBundle, boleto); + + assertTrue(view instanceof BoletoInfoViewCaixaSINCO); + } + + @Test + public void deve_retornar_implementacao_para_convenio_sicob_nn_10_digitos() { + boleto.getTitulo().setNossoNumero(NN10); + BoletoInfoCampoView view = BoletoInfoViewCaixaFactory.create(resourceBundle, boleto); + + assertTrue(view instanceof BoletoInfoViewCaixaSICOB10); + } + + @Test + public void deve_retornar_implementacao_para_convenio_sicob_nn_14_digitos() { + boleto.getTitulo().setNossoNumero(NN14); + BoletoInfoCampoView view = BoletoInfoViewCaixaFactory.create(resourceBundle, boleto); + + assertTrue(view instanceof BoletoInfoViewCaixaSICOB14); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSICOB10.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSICOB10.java new file mode 100644 index 0000000..4c1c6ea --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSICOB10.java @@ -0,0 +1,53 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.parametro.ParametroCaixaEconomicaFederal; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Rômulo Augusto + */ +public class TestBoletoInfoViewCaixaSICOB10 { + + private BoletoInfoViewCaixaSICOB10 view; + + private Boleto boleto; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + view = new BoletoInfoViewCaixaSICOB10(mock(ResourceBundle.class), boleto); + } + + @Test + public void deve_retornar_carteira_rg_para_cobranca_rapida() { + boleto.getTitulo().getContaBancaria().getCarteira().setTipoCobranca(TipoDeCobranca.COM_REGISTRO); + assertEquals("CR", view.getTextoFcCarteira()); + } + + @Test + public void deve_retornar_carteira_sr_para_carteira_sem_registro() { + boleto.getTitulo().getContaBancaria().getCarteira().setTipoCobranca(TipoDeCobranca.SEM_REGISTRO); + assertEquals("SR", view.getTextoFcCarteira()); + } + + @Test + public void deve_retornar_agencia_codigo_cliente_no_formato_correto() { + boleto.getTitulo().getContaBancaria().setAgencia(new Agencia(34)); + boleto.getTitulo().getContaBancaria().getNumeroDaConta().setCodigoDaConta(12345); + boleto.getTitulo().getContaBancaria().getNumeroDaConta().setDigitoDaConta("0"); + boleto.getTitulo().setParametrosBancarios(new ParametrosBancariosMap(ParametroCaixaEconomicaFederal.CODIGO_OPERACAO, 870)); + + assertEquals("0034.870.00012345-0", view.getTextoFcAgenciaCodigoCedente()); + assertEquals("0034.870.00012345-0", view.getTextoRsAgenciaCodigoCedente()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSICOB14.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSICOB14.java new file mode 100644 index 0000000..c6ee60f --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSICOB14.java @@ -0,0 +1,61 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.parametro.ParametroCaixaEconomicaFederal; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.ParametrosBancariosMap; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Rômulo Augusto + */ +public class TestBoletoInfoViewCaixaSICOB14 { + + private BoletoInfoViewCaixaSICOB14 view; + + private Boleto boleto; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + view = new BoletoInfoViewCaixaSICOB14(mock(ResourceBundle.class), boleto); + } + + @Test + public void deve_retornar_carteira_sr() { + assertEquals("SR", view.getTextoFcCarteira()); + } + + @Test + public void deve_retornar_agencia_codigo_cliente_no_formato_correto() { + boleto.getTitulo().getContaBancaria().setAgencia(new Agencia(34)); + boleto.getTitulo().getContaBancaria().getNumeroDaConta().setCodigoDaConta(12345); + boleto.getTitulo().getContaBancaria().getNumeroDaConta().setDigitoDaConta("0"); + boleto.getTitulo().setParametrosBancarios(new ParametrosBancariosMap(ParametroCaixaEconomicaFederal.CODIGO_OPERACAO, 870)); + + assertEquals("0034.870.00012345-0", view.getTextoFcAgenciaCodigoCedente()); + assertEquals("0034.870.00012345-0", view.getTextoRsAgenciaCodigoCedente()); + } + + @Test + public void deve_retornar_agencia_codigo_cliente_no_formato_correto_quando_parametro_bancario_nao_informado() { + boleto.getTitulo().getContaBancaria().setAgencia(new Agencia(34)); + boleto.getTitulo().getContaBancaria().getNumeroDaConta().setCodigoDaConta(12345); + boleto.getTitulo().getContaBancaria().getNumeroDaConta().setDigitoDaConta("0"); + + assertEquals("0034.870.00012345-0", view.getTextoFcAgenciaCodigoCedente()); + assertEquals("0034.870.00012345-0", view.getTextoRsAgenciaCodigoCedente()); + } + + @Test + public void deve_retornar_local_de_pagamento_padrao_quando_nenhum_informado() { + boleto.setLocalPagamento(null); + assertEquals("PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE", view.getTextoFcLocalPagamento()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSIGCB.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSIGCB.java new file mode 100644 index 0000000..3895216 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSIGCB.java @@ -0,0 +1,70 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Rômulo Augusto + */ +public class TestBoletoInfoViewCaixaSIGCB { + + private static final int CARTEIRA_REGISTRADA = 1; + private static final int CARTEIRA_SEM_REGISTRO = 2; + private static final String EMISSAO_BENEFICIARIO = "4"; + private static final String NOSSO_NUMERO = "000000000000019"; + private static final String DIGITO_NOSSO_NUMERO = "5"; + + private BoletoInfoViewCaixaSIGCB view; + + private Boleto boleto; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + boleto.getTitulo().setNossoNumero(NOSSO_NUMERO); + boleto.getTitulo().setDigitoDoNossoNumero(DIGITO_NOSSO_NUMERO); + + view = new BoletoInfoViewCaixaSIGCB(mock(ResourceBundle.class), boleto); + } + + @Test + public void deve_retornar_nosso_numero_no_formato_correto_para_carteira_registrada() { + boleto.getTitulo().getContaBancaria().getCarteira().setCodigo(CARTEIRA_REGISTRADA); + + assertEquals(CARTEIRA_REGISTRADA + EMISSAO_BENEFICIARIO + NOSSO_NUMERO + "-" + DIGITO_NOSSO_NUMERO, view.getTextoFcNossoNumero()); + assertEquals(CARTEIRA_REGISTRADA + EMISSAO_BENEFICIARIO + NOSSO_NUMERO + "-" + DIGITO_NOSSO_NUMERO, view.getTextoRsNossoNumero()); + } + + @Test + public void deve_retornar_nosso_numero_no_formato_correto_para_carteira_sem_registro() { + boleto.getTitulo().getContaBancaria().getCarteira().setCodigo(CARTEIRA_SEM_REGISTRO); + + assertEquals(CARTEIRA_SEM_REGISTRO + EMISSAO_BENEFICIARIO + NOSSO_NUMERO + "-" + DIGITO_NOSSO_NUMERO, view.getTextoFcNossoNumero()); + assertEquals(CARTEIRA_SEM_REGISTRO + EMISSAO_BENEFICIARIO + NOSSO_NUMERO + "-" + DIGITO_NOSSO_NUMERO, view.getTextoRsNossoNumero()); + } + + @Test + public void deve_retornar_carteira_rg_para_registrada() { + boleto.getTitulo().getContaBancaria().getCarteira().setTipoCobranca(TipoDeCobranca.COM_REGISTRO); + assertEquals("RG", view.getTextoFcCarteira()); + } + + @Test + public void deve_retornar_carteira_sr_para_carteira_sem_registro() { + boleto.getTitulo().getContaBancaria().getCarteira().setTipoCobranca(TipoDeCobranca.SEM_REGISTRO); + assertEquals("SR", view.getTextoFcCarteira()); + } + + @Test + public void deve_retornar_local_de_pagamento_padrao_quando_nenhum_informado() { + boleto.setLocalPagamento(null); + assertEquals("PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE", view.getTextoFcLocalPagamento()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSINCO.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSINCO.java new file mode 100644 index 0000000..1fb660b --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/caixa/TestBoletoInfoViewCaixaSINCO.java @@ -0,0 +1,44 @@ +package org.jrimum.bopepo.view.info.campo.caixa; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.view.ResourceBundle; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Rômulo Augusto + */ +public class TestBoletoInfoViewCaixaSINCO { + + private static final int CONSTANTE = 9; + private static final String NOSSO_NUMERO = "00000001000105270"; + private static final String DIGITO_NOSSO_NUMERO = "8"; + + private BoletoInfoViewCaixaSINCO view; + + private Boleto boleto; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + view = new BoletoInfoViewCaixaSINCO(mock(ResourceBundle.class), boleto); + } + + @Test + public void deve_retornar_nosso_numero_no_formato_correto() { + boleto.getTitulo().setNossoNumero(NOSSO_NUMERO); + boleto.getTitulo().setDigitoDoNossoNumero(DIGITO_NOSSO_NUMERO); + + assertEquals(CONSTANTE + NOSSO_NUMERO + "-" + DIGITO_NOSSO_NUMERO, view.getTextoFcNossoNumero()); + assertEquals(CONSTANTE + NOSSO_NUMERO + "-" + DIGITO_NOSSO_NUMERO, view.getTextoRsNossoNumero()); + } + + @Test + public void deve_retornar_carteira_01() { + assertEquals("01", view.getTextoFcCarteira()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestAbstractBoletoInfoViewHSBC.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestAbstractBoletoInfoViewHSBC.java new file mode 100644 index 0000000..72ef0ff --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestAbstractBoletoInfoViewHSBC.java @@ -0,0 +1,41 @@ +package org.jrimum.bopepo.view.info.campo.hsbc; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.bopepo.view.info.campo.BoletoInfoCampoView; +import org.jrimum.domkee.financeiro.banco.febraban.TipoDeCobranca; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Rômulo Augusto + */ +public class TestAbstractBoletoInfoViewHSBC { + + private Boleto boleto; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + } + + @Test + public void deve_retornar_instancia_correta_para_cobranca_registrada() { + boleto.getTitulo().getContaBancaria().getCarteira().setTipoCobranca(TipoDeCobranca.COM_REGISTRO); + BoletoInfoCampoView view = AbstractBoletoInfoViewHSBC.create(mock(ResourceBundle.class), boleto); + + assertTrue(view instanceof BoletoInfoViewHSBCRegistrada); + } + + @Test + public void deve_retornar_instancia_correta_para_cobranca_nao_registrada() { + boleto.getTitulo().getContaBancaria().getCarteira().setTipoCobranca(TipoDeCobranca.SEM_REGISTRO); + BoletoInfoCampoView view = AbstractBoletoInfoViewHSBC.create(mock(ResourceBundle.class), boleto); + + assertTrue(view instanceof BoletoInfoViewHSBCNaoRegistrada); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestBoletoInfoViewHSBCNaoRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestBoletoInfoViewHSBCNaoRegistrada.java new file mode 100644 index 0000000..a9499c0 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestBoletoInfoViewHSBCNaoRegistrada.java @@ -0,0 +1,67 @@ +package org.jrimum.bopepo.view.info.campo.hsbc; + +import static org.apache.commons.lang.StringUtils.EMPTY; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Rômulo Augusto + */ +public class TestBoletoInfoViewHSBCNaoRegistrada { + + private BoletoInfoViewHSBCNaoRegistrada view; + private Boleto boleto; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + view = new BoletoInfoViewHSBCNaoRegistrada(mock(ResourceBundle.class), boleto); + } + + @Test + public void deve_retornar_local_de_pagamento_padrao() { + boleto.setLocalPagamento(null); + assertEquals("PAGAR PREFERENCIALMENTE EM AGÊNCIA DO HSBC", view.getTextoFcLocalPagamento()); + } + + @Test + public void deve_retornar_apenas_codigo_do_cliente_no_campo_agencia_codigo_cliente() { + boleto.getTitulo().getContaBancaria().setAgencia(new Agencia(1234)); + boleto.getTitulo().getContaBancaria().setNumeroDaConta(new NumeroDaConta(1234567, "0")); + + assertEquals("1234567", view.getTextoFcAgenciaCodigoCedente()); + assertEquals("1234567", view.getTextoRsAgenciaCodigoCedente()); + } + + @Test + public void deve_retornar_especie_documento_em_branco() { + assertEquals(EMPTY, view.getTextoFcEspecieDocumento()); + } + + @Test + public void deve_retornar_aceite_em_branco() { + assertEquals(EMPTY, view.getTextoFcAceite()); + } + + @Test + public void deve_retornar_nosso_numero_e_dv_sem_tracos() { + boleto.getTitulo().setNossoNumero("0000000123456"); + boleto.getTitulo().setDigitoDoNossoNumero("941"); + + assertEquals("0000000123456941", view.getTextoFcNossoNumero()); + assertEquals("0000000123456941", view.getTextoRsNossoNumero()); + } + + @Test + public void deve_retornar_carteira_constante() { + assertEquals("CNR", view.getTextoFcCarteira()); + } +} diff --git a/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestBoletoInfoViewHSBCRegistrada.java b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestBoletoInfoViewHSBCRegistrada.java new file mode 100644 index 0000000..caf5a41 --- /dev/null +++ b/jrimum-bopepo/src/test/java/org/jrimum/bopepo/view/info/campo/hsbc/TestBoletoInfoViewHSBCRegistrada.java @@ -0,0 +1,66 @@ +package org.jrimum.bopepo.view.info.campo.hsbc; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.jrimum.bopepo.Boleto; +import org.jrimum.bopepo.excludes.BoletoBuilder; +import org.jrimum.bopepo.view.ResourceBundle; +import org.jrimum.domkee.financeiro.banco.febraban.Agencia; +import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Rômulo Augusto + */ +public class TestBoletoInfoViewHSBCRegistrada { + + private BoletoInfoViewHSBCRegistrada view; + private Boleto boleto; + + @Before + public void setUp() { + boleto = BoletoBuilder.defaultValue(); + view = new BoletoInfoViewHSBCRegistrada(mock(ResourceBundle.class), boleto); + } + + @Test + public void deve_retornar_local_de_pagamento_padrao() { + boleto.setLocalPagamento(null); + assertEquals("PAGAR PREFERENCIALMENTE EM AGÊNCIA DO HSBC", view.getTextoFcLocalPagamento()); + } + + @Test + public void deve_retornar_agencia_e_numero_da_conta_no_campo_agencia_codigo_cliente() { + boleto.getTitulo().getContaBancaria().setAgencia(new Agencia(1234)); + boleto.getTitulo().getContaBancaria().setNumeroDaConta(new NumeroDaConta(1234567, "0")); + + assertEquals("12341234567", view.getTextoFcAgenciaCodigoCedente()); + assertEquals("12341234567", view.getTextoRsAgenciaCodigoCedente()); + } + + @Test + public void deve_retornar_especie_documento_padrao() { + assertEquals("PD", view.getTextoFcEspecieDocumento()); + } + + @Test + public void deve_retornar_aceite_padrao() { + assertEquals("NÃO", view.getTextoFcAceite()); + } + + @Test + public void deve_retornar_nosso_numero_e_dv_sem_tracos() { + boleto.getTitulo().setNossoNumero("0000000123456"); + boleto.getTitulo().setDigitoDoNossoNumero("941"); + + assertEquals("0000000123456941", view.getTextoFcNossoNumero()); + assertEquals("0000000123456941", view.getTextoRsNossoNumero()); + } + + @Test + public void deve_retornar_carteira_constante() { + assertEquals("CSB", view.getTextoFcCarteira()); + } +} diff --git a/jrimum-bopepo/src/test/resources/ArquivoComCampos.odt b/jrimum-bopepo/src/test/resources/ArquivoComCampos.odt new file mode 100644 index 0000000000000000000000000000000000000000..cdd4694b079f3b2ea9541dc2cd51d7afd28bf08c GIT binary patch literal 11981 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 Yysjn|D$5EDjTH59!9+t-<+`}~KU9VhjQ{`u literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/test/resources/ArquivoComCampos.pdf b/jrimum-bopepo/src/test/resources/ArquivoComCampos.pdf new file mode 100644 index 0000000000000000000000000000000000000000..37173f09c7d207450b602f6123dd081b0f0c685d GIT binary patch literal 25280 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%0AfX!LNE6|<3Fsm z_Di^Z-mQ<}23vhe@I1^%qENdpQRxjqAg-*?Y3~F^|8!SStq zVjbdK=F@hUT*0hnmvs3U6_iV5d?vKymX}!0hFq5bzWZRIOyZGrAwAt0S9k@%pjkF) zfW@HcskuVe&kxiLWaS&q^hL{P2QD@Byb=9@f7u!@l_VzHPU znyHXc&Md5v;K4yLk%t1Tpeg|5Nz;44FG|mmUeBB!m+y&SwxGsKg_^tIyBMC6RQZ!> zre~WzVIg#4&U0%sRnv*kv=?qg9)brfEQj@`W)BAq?xrn^`s9+Th;%k8^hS7non+EO zB=P385yH>)*$mkNj%mm{I_i^Vae+OjwHd$A%4hxkVnv~NjKOs_FJ!J5x3ORgqJ6zW z?t)hYTbt*$=l0(^B4FKAtN>2MdG)LMt47pKbZ)TGFJhefi}k5?XX|qg(L8Z}4o?!8 z3rJ?96b{Z55gHlJnIZt!R09fC6`Sjvd{nPUnAbZ#adF$LGCfb!m#lqJr{th*)1b`t z^^hs>1g+M&SGsGoxAZIQN4)Y(?Ww#Kesh>~Io_wWP8S2Rx+D!oq&olu8vr#={t8AU zRi{iy5tcHfLDc-Wn{OZ4D=H*kTt=Sm+#7R^m9&pt3IKNPe(qr1jjOcGyYSY|}sb+B;=KGp^#m#ra zYpuyVb8N@HyIxLXOw0qwxol5c z>OQC@lbjvK|MG&*5Edgc?2WqYl&i(e{MMny&$clHs!%KUZm68QqBYaJ`Rr4WkjHC+ zU#k2$$ePlJR$*F%+_Gqocja~|(4@Y|8gUu|Ej*4`GXC3uQB_O;#Re5-&h^09j!W)h zyDm^Gfe~$HQ95~^wO9^g@j*@1$dDAhKnuq#w`~H%()U^fN9{f^#ufmw$ciBvHL!U= z>Lq$7RyrpcY>%nfupvmj(dyghDdym((N%60G-GmW(X5@viHn(FaKQyQr&LA14ykNa zX*biLfwG0yjFv51yLXVd65`G?k5FwzzU-$m$4QMR$`0+jL^7mEtO#hbLd@4CPx^OK zSr&x?4IZbSquX&$!IlasmX*5M2Mv^q*@R|ig)!s#4HDOFU3~wVJxdG5pFKu|^ZpG| zQ&xCmBc4xMM%q#+Lprwi9+RkS*C@#oK;cmQ?s1z$oQD69>uPp&HuV)V84P)ZyZ!?- zyf)9tw~Vl8*%1u8v97w^9UJl&i?-4E?PSdW1o?B0y8jKvTAz^BTUc$uonf-{YsRF| zsv+{!+!A*>+;6XK?3VRM0E&uS!Z*!hvKPDGFaH@(Zk?-|dZliIHGk}JXqxSBM?#E0 zfNhym#*JQlm!%sCYFXMt`QZGm%evl6r?Wx+r;8%1U`Ab`U39*yYe2YHk5+^x3?-k# zSglReDHX*-E<;}S;D9)QraK4cCu^&F*CHuu2Y~yTuC+H&lwIH$^;S25J4L0OgTI4; zg)8uTN`|uGLwSBiuf{{u%<|EwRZEMM*!Ij6Qc&~E6yDrmy*zr3yPK+*VgK&D0-oTP zsdw5824&)sQfBJmQvQ+3c}4QRO?^g!RE3XS;V1DM?lZNA_GC| zK#>Ng^4PCH;F>Geg=$z2C+=hL0e-k`hg;|{`a`TRO9cR*EESEf_I>}$0HdPJj1DSu z!;IC2@VTx|YG{y*6LfWru7~2Dte8ltYXO@PX$X6muiOkL>IR5B%7c-*AJ&ai1E|v) z=Bw;!&F&UTd~s1YTqt+MT&SFQC`zOzie4NpfBPNn>Qyg$rQTl3NVC2QT;qzm1^KWU zIH{$2hypu>#l{LK;Zxs-ME3LV_gQyXN}kQia?qe{_B$A`Z8?p3jH);CXa_L64|0D` zg_u8a$vfy1IeDLPt;tuvX4rojW;~i-3M$hayB$z|oOFn!k6FxLj$gFBZHcIcbzN#r z`r)I{;`E1aSv`A>9#b(#Y?m17R6%9@XHf#*C?NT^5=c67Eghwid7C&p0_zr>V$T}utrF|y@*f-chrgw+rxPyvcs^~c zT|;JYffi72Q||+uJGOp+vsKqs7qg=A8hW6oaVnkPq*Y+Z2~Fim_2CoEo>9EPItlVj zJ*r$0I2M?>*}F*y%^!TV{xsbit$7(@`}cC>x>ip0z%a?s3h9s-DQYPe@@quNOo<#< z6eI@iP;6;TPDW%4mjDh8BPoRS<6O)*x5wF-jH)-Mi8 z8ySX5H5-X)RW3|ULTbaw?g)XoUMGIGIidMnPzLub{Q=IHxEHpFz>x$?gpJ`IjUENT zYka}FxA)Cplrsg8PIwS`vm8R^f%wCs@07;TD(hs5d8WEQ!2(bV0hjSfGre=*+?#O^ zp1M}Do3Rb8S0&f5!mCHeQU={;JO74X$Nmtfq{_c!y64ZuT+1=~8l6nY*;d|SO8pR4 z?)YKidot0>Vy(A8d_HIi-fk;pOq|xr3J7`=3Pw|yiTNglO*q#&D@^m_JG53e{;h7w z=2W$-Y(%Y|wg+!U-U+pXgjt7?G~$@$m4#ugg2c^GrHE=%3gLTTYEZ+^aG|ego;O5G1342^Y;Gas5hCz?NezGpr~=j==xV+%quadn z{UrutZ28En9Yu~V8$_!qnq?U{T)ALidjNY(q%fz^-tOuQ!iJoZhQZU!_7Y-P;-9YQ z5UoViLc-o)p#pUe(}#+4Mfz5S3y*nc+&mWh9&oK`4)rd&@~hg8&?E~RIr1EhN9Ju0rT|BQP7o*+v1rUb-sTJIthw%w>SVRdfVJJwM$5#)~f2L|X> z2yr>r1lWY*+LlG&4)O$c=?gqDcIDOleXC@Q#ZI}78$TKWshOhC<>E?O+gBtMay)T| zdWgs^IRPuwMC%{$(y) zH2z~ic0mn6ojHI1&kDNma%MYcH9%91Ck@LP!{x%?=UtS%7PG291$Q=Mvn5RESL#Z=F7h` zf;6Z!x;ZYl#r4{$&ho_jWVjTF3eRr1C|KO7xnn+uZz+qcb4@GU5_UjWqkrw#x%0w* zKzI8y^b=thUz_YXY57o@pn^Z=gKtFsr5{D16A{ll5E!KXXb+<<6%ck>YdY6ksXbL6 z5Rg*HEF$SD^|_`_Q}{ITM|TRV2D!t$XmsHDwgS`NG(2YEgdyeiT>UQyMMDye=d8C!rsVE-<>EEc9p02yt5s z^~88h?CzW&!I$QGYOpSHU*8+&S-EihKbT=f6d|z0e)!*lg4X}wCoS?Ikxlr2yJcT+ zq0MeN5nJ56yj)_Gp-)v^zjavuu_7H1YKIf2z6i zcqqT`Z~0^yD(!u;Jz6bk_N|aHOi4w^8W{{G%xGrpBvIOFUsPx>kxG#gZhazBu*zbPB&T>*b~e#1)4<4_?{RoLr(m@a4<# zP50GG4>eWd3Qv)@MhW`s9PT7F&ARp3nIS(EcJB5`VV0L|XjM_yyT-c9yiXp5U$5DD z+<3`T+>J*rhH%bfIaUcWBerY~@hdjIOVRtFooTv!$J)+Cs>Oi}tj= zczool=TAlI>c3=}Rr~tILZkwV4c#Q+CM9%WAi+o%O12ZVWH6X<3}cv1)%f zIk-A&ZB({2&+LU^V97(;Z9OOZvidvr^`$r0*5AFfOl_S4-{GYK(J8*^-l@p(Z8EZ< zS#J+HCY@i#ajq$syD7b}f?Qgg9sE4;F6T^GagBd+rE}?wa(`vplvj1*on%Ab3jO1I zEAynYNCEV#{-rL{(zg^GDf;{@FO;16O1q#k|Lv*qI_#?@4{IpTdlOdgAhw_PR%@vy zP$ZJ0R^5KxQ996XS5d9#+V)y2N?*BU!h|bP7XrGSZ)^OIcd)>Q1_4 z)n(Ud2u+1ras{^wGNp%-CHk*Qeab=Q4rxokn+#8ZM#g~R`P=?O>B5veeOgHaf29_I~+7=Zz<9c4uZ!Gv{&lNo%gikt)ijx^|}>Co?>rK9MF?@N(ZYlg$^nW!Y!Ez><8nbqb`v9Z~Bt4w0t(Z1O@=58r3_3p*9wi(7f80huOyy)6)RkzDx z$VwP&H|t|p|MvUqB&7$BhEBD&*u3PSYVivdeIJ5t;=@&Swn_{)rGzbhvmV&X>9xL9 zGp^P6u+2|NDt4ukEHYOky?nB8l5o<|=1r|fA}R7oGahi{^n5hFK3KQPO{gK%ww4R$ zHVX|&%ejsB?w7Y4wQlRIwGhU1N)}cKxCRmGXVVAk!+P}NGUy?J2H6Ua^yBJ_20ddX zx{Jd$DP$b`s{G_aU*@VggPWhV#Dx55gp!giRh4)t=@=-RFSi{VI3?qh{(Ggf)8aUV z=hB>N8Cx_07_}3Ytee*7VwQ2gk{flhR%S`Yo=x`;-CObs)s3{bTB%aHlP4vf z-Kt~qwG>fnxma-X0G!K<)9ygh_7M*djws>Qw?ZsJ{HmOloYu4vj*qU-3 z-(76e?r!ONzs=t*%WCoSw2+nIE5aSZZBib+T)NOQ@N(ZXdaHhG_=aM&uWFHk)?NX9 z@#^xTtb?n|bjvSEN!7my!e{L7?LZDAowO?H$QXU$X5O(olZ|9gFl2r54_WL*7;y)X z6H?y@XSEBDC7zV8IhOeBk8|^lBPdmWZJ17Li7q{Ib#21cW3BYsgmXlt(-z**maXh1 z<2&q8w4)QL(oKqSc*A6?Caa@Ke_T^!PWof-p_AJr?4&!aowV1#lBX57mRu)U`J+CX z8LZ7Z?Y2>GWrQoLeTUn*dr8-fw4w`LuL+_T&sM#*cOZ;=kzB6a_Oc{no5P%xYn20G z^otthO5Rl^3+P45afj`)v~^$b~Cex6I>EUN z-XxJA-6UaqdgdcvN%sp+!*+rHu{7_rtP19Jj9nOcSK#%`$b4o#<<+N-u)NrJ%A8}| z?NWxWi9>&WQe8MfJByLGk3si7qfzg*xlBcKyW(FDU5R@-WEb8$m_Kg?t@Kky;+qm$ zo_f?a?zr&-w7hw=ni7R{Z)DuU%CecSiW+(rF0vFz=J6%-K5tGUxp)y?_hI!^i`}m! zQkGM@6f4V+ca?v-_Zis;N3~okyMM>N-ad_3QRVwyV$L(O5m1w&V_w<+v7BiD!zH4QMWXxhJx=VwZ;F1C3uWQHcq zC7SUf0vz*XO!?S4#{E0%TpcdW{mN08&Q_e9wtT#uh0pWE=XAZfp`o)Dv5|8PyC%wX ztorQU*R*TP#n)y7_p0%}h@7f0{?*5@oSscL?%)Fz$b5Q?sr;wFT>ISFWtXJB9lL;@ zJv9AUj$}c?WK+Yz1?~r*J0|5_=|AI;JyG8mWz7w#@lFhh@>=;d-2BeOb1(EiYUkcL z6(H$SZIu>@4(-Ka>v!_m)TVdaA27`r8+Mi$HYsfO?0Shd8avOIXSjyhjeJzMP zU zZEk-%Cv3*6qQFldjpCK29^X1YX^m2}Ow#Jtf6PvAv|cwY;*Sknx$FA7TQOJN+M`tB z*S;INm%j%5``AV`l--F#D=adKXIBP2_-K`)J>>G_qphy(%y0vz^PQ^7d)En5wC6Rl zTN3Tkr#{rzu9QD#uIr>Q=iWU*@vTd5>x(9NUw%BGGp@NTD4;y$$P^9Uw{i=wi@s@J zpRwH%7Fs=4KQ=|B22ZCvdw_#> zPn-w^X(yaXADm|G%M4DOq$|CT$Q>rv`&e@p!);D{R@x4*%SKgMntct#s=AyeQdR&{KrTv=Cr?r-Ab!!=F>V!XW z3TZh!Er&{4b9Aqf?|J%r`qKjjvLUoRdGfhEul%RQ#(PYTrJXh-Y=cDV_8GXma-kG z9(5+?-=UoTY?;6@NW}Hyc(aBBxxY}OGuKQvX z=wGpir5K-LDcGQOZ11>?PT!O96*D?n;U?>!x2YCvYq+J$c5HAy`0ngDw!OnXn{zUP zyK&CD-s_ZeEpsF5jTPcnMzI%f{`4Sk%Yg!8LuBH+$CvgVUs*73f7Ashl=-_!Jh_!J zZR5-$pC90A49R~`t5SFIZ(3D&HR`2QvWqD)dHd0%FEZLSA6_-mBfZ{!EAon%hUwcM zd&yM2*facDW0_JS`C08uZlo-C1qm5a`{0?j{{En3@nLA!mVzN%L8&S3+Cwjs+&A}Nt zp8UnXIa5q@S{OV@3`-^838Tk~VX@!O6|)ZZW1$&bj=-43cjK}B1YB^o8@OG~^kt!q zXz-_F&Gu#SSF-{wxxP$}h1Du+6g>XTlaG)<2k;shaf2Lni6jc5i^q@<90r3yuow*4 z32iE1`mo(-98Vt>f5X?r#pLbJ}0RiNYv8Y}Yf{`!Z>Z#8w-lddW0-@3D^MzV9)m+Bss1$xBhhl*z3TIWB1FuV7@m+Th-ANAL` z)F^rPg`J6q`*sd)_~4_|TNiM0#!Tf3bCXHY+)Z5PI&IQ2eW%wNa_djXkdG!;g`IH7 z;czQA-Iw#2w8rAF5xu=l&%f)ovc}mfzGnuy(yllrd|nW=UU&P^%Ka%9P4j$~j7!Da z%I(zDHd*t6CBYb~-PL`9_x`zO^Ihu@_SAFNJ5{E%yEa81YtZ^KA-JGdn)k3nk=h)z z=k9{NbDE?JbeiV0O=()TH({Uo6Rpq3jy=6>XWns~lGlrKeYmb@5dX}qDsJFucFL1kZc#LjTjt^}*_t^_7}|9~wO*LQVt)~CMWhUbm7-~PO0 zL2mA+yq7Ff*|;St@)g-*!7lsGaOv{cD;2-Pp!i@raFF0A*w9w~t^$ZWYo0$#L^Wda zSgVIPmjkM?myjHpi} zk`M}oI?M}Vgaj@k27`j*2?RXsBRJ5<10Hw}Wx#tl4nBhyq{GW;7^2^!2N6Y=B?@iL zUCUv^^AQmdP=ACj;U7jIjmKvC=o)c-+`mU1VQkcqaAXj53?wFj|Q7?zyh#2p1?yK8i&so--8*9IunmW#(0wmj2v;N$OT~O z31q_X(vNW)4iDS|o{28tCL(3nMPgThu_%$dpv(T|63c-y#20`Bib^JqLI*-g3@r#3 zG1SDc5IqBQiWqJ{zX*n7ASoI*0#A^SMKFatkS?|xwjvvdB$TKRY=_U`9KZ!#0iI+kOCdrWLIum~1rYD+W&hhX7@9}^Y{P~c7iWO10Lkzo$B1&`}y#S%E8 z!2z;pYgUlJ>4ysaeUK>0TQEIYXbUD!vn?JEBArKt!Af8S=yYyNt*6_XBoWfoj6!@cp2Cw_r5g3hXfg*lsM# zWkzUIL;xy{fdQHhj0fuZ2;4l3T?-1hADQ5&t$Y;vX9H2+Ed&EbO@wxsvEBKO2;5tV z%%XGs!8&2bEH@UKJXVLDx$6d&8#w+_Tn-sro-Yb5+D}2@csyYd4#D9UVS)HxEg3nN z7Yi!jucz`tKa3vBTQTvHh2LlYcf4_~5>w|(z4%R?{<$KFmVDGOkdi%F0yF~w#m5qu z?1&}d7LgGWnYxIC5UAuuScHthEh0kDS);9kP-u(cl>l{6lf(688FQ^!d;!y)%hN)k zZ4f<%34?*b5NH?-5$qR9RB*u-(8!<L* zPc#n7fa4$y@*0of8Q}-y(eWhmNFNZP9+57F0jQP#Pt3IZAtr&_(Z)2*;ndCZL`3n7 zL##c(y3;K5^ib&4hzN+H_#TVSpCjOZ37uook0?6-89IrWMZ^(wlF0Z)gx{jm!=K~E zw7j~{g6sV!hbaEq03-eF&S=QO2C2s@b#nH{?9}I3m1;QzK#hw9E{Sj1%b{4 zFU(v|P$NA-NgVb%+T4%Dp}7gzT#n;#aY5VJJ0Ki?AD`jBFaXvzY*rwPXTf86uweCL z@j*^7X7l}gn8C(eH*2;4ynw?B2&)3vZF4*|{RFy3mM|x{@wl+;z$C(E`G6Akn<|TP zLK|C(OY~|M%bn)u$6|tN3oG|F75*nW~|^qF3+7mB7-<;pqK}!g6hEd zA8H~nQM6FTKn5M0u@64ah((CY7FEn4`i5z!(lOCa|wS4XM_g&SP&CG(eM+|pL_4*yJYwkVgdEU=+&bjxw=f2NlpnZsxiHL}jh)5G7qjaTN z;)nnd5fS0QR}ncQoMBi`7Z}*Z#R&lcV-YB%s5=r0K!Gs`3;^WcSG;NU?fB_STNQNV+%%$?(0$RIYCe&`JqX0)?CmiI2wlet-JrJ`8SJL6w1j3jD$J;7mI)EAHm6A2lqd%{Y{Ht?Z0br|D|^b zXD}Rw5j~HKOCi`JebeDS-}6J#vc$A68mG$dd)0QL()vXV-F3CY)}$Dmjldn zElC|i$?{SF?%{K>nSv?o7aaJU2ewz`v-r$QMNIuO$k~rJEvHe}V@@RCVsMcZ76nqb zCO{lCq2P05v4S@V0rY@(cvCxEc~mGg_AaG{p$MX2HiQ;@p}(TpOfV4 zt{SZwk0Q9T8O&azo!(w#lJ96zS|1-wR#3|m3|AIEu2FIR{tPxewTD7S0Wc;wZ*W*S z{?e?@{Wmtj4o+$`^XwVVrBxVGK1UUd_SgjJmlixO9Az%Cax+lrGg~dDp+M$(#I5Kr z@F70gy)BYQqa!}>V3n3%hnX8(wzg&&x)&~(xISuk1Nlk&v`?N%rjr5d{8ia+WC^cn zu&(r11nu%18eUzHZA`t|40Df`YKWra;jO8FeWD&?$dqSl&SUa^qzBa9mD{c5alA8r zD0%xBhj=Cp3x!?0?)hoGv6B}t`H=#r=9I)vSU|Xk2BEdMkq70W#YSBw9;cPlW!bmIUkSUp$S*{;HrXCWHhdvg?F$7 z>vTaP)Z3NI(~~hAXRL1~Tv*fa&ouRP;0S4`Iw>YiMeRKI)W76j3ky_})^d%Py+G33 zJV1_WDz{phZp@5-hKTFwWuNdw&b(M_jd7_cLmm5ggQu&Xi&H~=beCB|A1d^+7GA-DqkkZDTHEKlMH@I=D=+A(m4i5Mv*^L)JU*_~1QXI(y72E_N%U9np@j+m-Z+B) zbp|65b}$SUfQH&-$13YR6QjGZt{5^^Jc&r9DT%`>_nr-8JoZBKB!m8YR}F7(o$FL& zhYy#OZ?BGKxRxl1F`)2&!Z)0kMyNEYJ);fRZng?T-vC)7!!6f0--LHuH{Pw zHX>S9h>&CaXrZyJ5SB)I`c|^W$B96YKy+p8pqPoQR_~>%mBeT(l&Mi|?L7x6K7&i@ zhok#MbkzNIyN^@n-xPa$mw48$b-?@NcH|{NIS~W;01lH|Mif%rHda+$@2wRlwY_IA zH=8XA=+X{`O$}H)eZ_8p4g#o7!xOB#mAszyPt5Y&uG#e;JtMNU-c@HTVzWKruuT5_ zP58F}OobmE4A#>Lh9SH&N6fWjhNS80)=iHI4YG@9kG2<&$X>9xYaeimEN(6{H!x8! zB8rcS5B6YrR-W&|jYNKn0d?BZXCxnvz(dDsH#xtE+E?xyy^mZzh(TwX@Ik*IDl3~I4#m;D2i9kDk{&r_c@ybA~h_3+G;$sYDhZ5t0;?~o1&R#wq)Q8m!H zr&H_g7+1}ietV2+DQcaIRX&w$^hjx6>3b=8v+(JRjNNmMu4S}Y={`_70QviCG1{km zKQ7)@M!EBuFW%=oO_@t~zc#ktHQq?==5z11eD_AOZeNm0rv@H*P_cQB(e>#(c*okiZ?kg3zZ~{0gQxr9|@fssW+P!jQOk zLXOe~CTK`k^rS>~EZj3?Ebslzo0f)@_7zcP5lkgRu z(m5TbWZ;jsQ3*6`o?#W^gomH4Rcfs@wNuS4GEm9YQUr6}9B7DZ1Ud*^f>vHV+z~vv zzDM=y%=J&$qWzuiTwd=B#Th;T;>lLgseq=>+=O8xVJt=ZXmTscmymydKyM!#PZ zJYrAJ*ely(^42QyY}X)VHoHQ*R^|kB_;aGwfKTZiEjs^9gDbr)ClkfrT54WVHq}Tj z(dZPlLC_@{#=vf_GmkbJNYa%Q+~jyVJ{>c+bR$?T3dDHDzB}q1JVEPJV5qc(Y3{?0^H z5WqS*sFG9+2lYG;l|!;4o;*D6t(8r4FTiknDKnqBl3uz~#v0&0(#cy1U73u!#nDZY zf9VEI&6nW(BGo~Nry)T+0w7y7%GI=lLjIK+EI4e>iAP~l5sDQT4BrY z?gaotr&Y6_6`ltsiw4RBY2e~dW{HgV#$LH{ylZ@fvQs28tc=UgEg4mODC7Re-hJ$S^>5Sow)s zVAr~7=*pbSZFfq=RMc(~?~@vd_m=V&7Zq#eRo*y zgV}@hym*DJ-YD}0EVU+m%yEq{n(_%|-ZU~52Q^W$Hb_m~dFux?6pv3}*-mg$wLGSY zVxjN19?WmgSf27v?DG-3%XPNru^fFVsdrk*A=KodtLq!f5fZeu#5toQaXCFwCfqq8 zE>0Gtx^xcbwLSujH|y?AkV+%$?SZ%$Z}aY-G=_imv^d9Y>$?_ zGaJ!iho{hqO>&@nf#Ykq`2+){T3=kJU;0)>!%g|Qdxn9%7O6YqIAJ$(eKNNI4>knN zi5K@0-Z(gtCuEhqMijT}1p|r47#C>$tiH|ft+$-6R2Z`1X@Imd2kWixUy%_i;cwsJ zS7L-?k0*d(!G!gMf)f58k2?&F!7~Mlyy5^cULF_{f`THDa7A8YBQ+6OUL_Ef0?N(~ z0f7Pc$paBQ%K+xVt0FPL?@fxlZfGQMk7fWO!Ok!Y5DNkR$~ORil?Lt^`d)L@34wG} zkE z#tAEmg4#*o7tR3u1utlSt_Yn1DeQF(f`;vZir`&=fh5Gl#YM#AL?k4Q#KnMT#efo0 z0BLar(Z7g(SBF6nSp5AU0`Y|4m!TkuAEJL$|1JytK^uV#jHGoXWiS1q^Rrn23IRf4 z7zi5SLLjR^%4kh?c0}O%%semyk9w_X)!98>PEd+0|2&@zAcRvwG zjGOZ>KJMv!m-}uS4nuzDzd+~F`g@O(s3bs=&lG`_l;F`p*rH+IYpwCD6Tt;hNl7th zaXG&8ZU`r+i0ltv4^Z|-?a#Rs2TDi-#pM9fczMDQ5!%0-|M}Pw7(4_9i-7R#O*R&6 z>jV>lpxlsHMPB@qzgM|O4gFb(+8dcaYhCap(te%z4|T%C!O>tB`~3#|4ZepAqc3Dxoi>%oIUy8xW3 z_w+ca@2xG3)ZJ9J7hIvuix`);6Etq8Neib4m^&R06`ueme{RVS{zf)4jZw<#ewegf zF(Q3^8sg$Kv%EPxGoRmmn)`|0?x;UA=<8z-B5tX#{^z+3J|3d-IhRQ*xI!EPy4y*? z^p8rkx=-Zmn4@7)+j<=Fen-@9O}h_{m`HJ&D3tZC1a)Wi*C!u2y)!sC$QGsMtBMo< zy!B>^`FBnw(DWCU6aK5VJLm*Ye%$|W#lJ$t2y_Q)L|^l zH?KW9gZ;@}j@x=3t8L~YxHm-_ZB?PT8Az)6eZ(^?$JQabrZgXUAT`i;dRQ3<;#Qwu zEX_m;2u5$j&Uu)RRB}dnM3~Z7tfhciUhJ&k23(=8^0V0&H`(r+;EsoGmQl~Xe=+jf zZ&IK}$$SJEzjE{zk5YSY3*e=SBQEz_Ep`97cmQ(bo|tA>?sL8Ahk#ZG__gOb5v+#a zrt~f@8s(<-a_LBTIE5dQ_VmuW_{J`7FvZ0Vnz)jSs~JF!TtjRqoRc8NKTmf(> zzqK?rUB~v;~Bl9DbDhWKw9~3foCp- zeqMF#&s}q8WzurAW!TlCWO9285Wu4{y0yU}y0|zGukA9a^i(d7C5MHnyx!Xx?~0GA zPu`B5thRD%AG7b9!<)Y?e^>dYbF`jg*zCPAVI?4N)Ae?+ggAPkwUG4Uv!mOw(Zl(X z6TP!%W}c-@SCu8L#FY;T!K<__WHh{guqiXB+w^OIza%5kw@|xXgal4i% z#k*doBS35A*o}xA{O7eM(ntJ{s=f_MCr7x~zCS(Z|SREmo-s;Wa+L z?Tu=ANYsb%(0Z_;Ir-9>czdd8qa~^u&7-B1F!`EItKExcBlBC@*KuA( zLuZhFj+b(*d2<*e9-dB|TF(urzgRSC^KA0UV)oOqbaIvs=aDD8yV;13DA5tP4qJH( zik0raEN~H)){wQN~Ojd+YSP;9PW4q(a6>?@(J!wZ$5J4=N~p*1Wja z9M}}|w*A)NjeFUSZ2(Ch`?Y}0(-Dk8)fZZr1FL#(!29l47wkN?Xj*_7S%3PZYb}o5 zjORbe>c0A+3^|{%yIb-tFMCs@Cv8}Hd|^d&dv~U5ogJj`Z5R00co2W~(

          N^SYp z*g&%+u8n(hC1HEB6Hs4?@_W=zu{MO+`j+O56VUtoB6supx6{)P*uR7*etoMq-yTz6 zYg+ulcWk54*Xx6yhlS_O_>`?r4XD8#_*(l)u7!h0(M4`Q6Zq^Zx1IIip|ZJ{xjEso zur**zL+_)sUGJrGs_Z4;BE16e(Tj-5`nAH5-BG14TV?2btsg@YQZUjWag1`0U-1pR zi)9`=y1SDBK1lZ&0BwCdnZizo-kr6Ldb|4KWY3AQMRwZll_=Qch{L+|W-q|;mZe}K zs>8~uausM0!X=v=LT#{8!E4#}60 z?Qc)GzpTY>_myvnZu4h>c9yE^gPAf|S8pWsen?Fk`?9&zi0O}c9X@unz&h1q=Y{*u zX@g-0S@wBdKe4opUK`*1uN!k7-Mx0F`YM<5%rbW{y7)oZVE=bC{@>&F|Cjt<-fsWz zk5Y@ZwqVvAE0<*}epx}Jc|lLL_`FTvzo}pXQI3IO32X5^GPuIr3Nr|#^Qo`ro%A>l zN*)f@{CLdJ+??SUPy2A)VQ*q9=mYh*&5d;rm_pL_l z_@a~Dmi_z@=lXRGUL1SxetCPld$s4XJB+_7Rq3iEWWuYW#uD&4sed{zr?(Y{!#Q|) zY}xyxpXR=(X-W58prRk+7$6(4GlZM6vQ{{()q7M9yvKD~dPX^ORK7qBqd1^`Lc`~v z5KLvY)8n;wv8`VNpDl?vjApvk7jG)R-lBR-2|;vsH>P7Q$tq2m{5Q% z2w0l$l0SY}avkC(Titb*l)3^0m`HPh7Y+)xSUvI#sFPF7S8TAd@P@$y^rb|jkwscCsZ6xO6PwDTMBLnD;eyr11Kzuzz z-fMDp3XxNX=%#{h5@nQHq9jh-abXcGqy=4L6zI}uxuh3)Khv;Nt-_+O zm6GN(0`{%RCe%^A1aTsP6Wjdm?omUTZkJ1r=vO_1g$Vl{#s zwmu(xu_#!BzWNRQlsp1Mm#O_8o5R3dUfmT+C5qL!quCw%T2qRAwJ}!jswk7VB9Zb} zsB)VAhc~^AMWWWBx{dEG8F2%WmC2M0<3?PYhW9iT-#aD;7Hppz+_ba5ZqpibA|O}b zDb1E5ae#sganH(`Lzcc2E}4-sTYjSpuF<&FDOpuTMi(DFSqo*L95E*;8J$VA!m@SGn+ShnR9LM znbMpUS&YxN$qAq12F$@WWm)M1MxlMV`yg zr~Xh0lGm&*AFDjHMXy>S*yBCzJDNAYZGZR9Iwri?kFYiQxw(5lmW+t#=81i(>~EWI z%=n0_d%;LqL{m>q^yeNWp0}z<&_zBKqYGJAyzt(c83!}IK$>Op>F`HlayY}8P5rfF zjdQa+#0c%ez%Lz@&12q@w#p#QX(Hb5o6}U}-^>LL6eZUoYo-?HD9ReBhCz+p8$dE=()k(?aDw_4c zzCd8%UZUitxy<&C z(Z{bZtofti3hE=h-dRtYuLiBwmyjPu`g579T$Q)XDVBa!BqGR3#+h_2vQ9lk@7?+X zF@`CbU8BkBjm7t(AY#HSO|2J0AjCvOBKQw>18rgwCZd0*J`vub2W3AI>QAi$2_hmw z^3Flg#h?C}x%6ws)4uhC9GPEpo(^zA{(|$545=VBkW(0e$AiyH_q?lQ}h>{gM6z06=mWt zCQ2Ho-%{bWC+s`=sb0^_IPY|EwK_J}-`wD+*{mHx?XaVps_Fp{Q zKFYq&zXol>V)&qpbN;?G{!{bUKtc%W2j$Yqe}s4gZ8H225)skk|6K6fCYyYOtN#OR C#9w*< literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/test/resources/ArquivoSemCampos.pdf b/jrimum-bopepo/src/test/resources/ArquivoSemCampos.pdf new file mode 100644 index 0000000000000000000000000000000000000000..39f86404260fd9e01cf973d1bdccd227870c0914 GIT binary patch literal 26237 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 literal 0 HcmV?d00001 diff --git a/jrimum-bopepo/src/test/resources/ValoresEsperadosDosCamposParaBoletoBradescoPDF.properties b/jrimum-bopepo/src/test/resources/ValoresEsperadosDosCamposParaBoletoBradescoPDF.properties new file mode 100644 index 0000000..56e576e --- /dev/null +++ b/jrimum-bopepo/src/test/resources/ValoresEsperadosDosCamposParaBoletoBradescoPDF.properties @@ -0,0 +1,98 @@ +#/* +# * Copyright 2013 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/09/2013 - 19:02:44 +# * +# * ================================================================================ +# * +# * Direitos autorais 2013 JRimum Project +# * +# * Licenciado sob a Licena Apache= Verso 2.0 ("LICENA"); voc no pode usar +# * esse arquivo exceto em conformidade com a esta LICENA. Voc pode obter uma +# * cpia desta LICENA em http://www.apache.org/licenses/LICENSE-2.0 A menos que +# * haja exigncia legal ou acordo por escrito= a distribuio de software sob +# * esta LICENA se dar \u201CCOMO EST\u201D= SEM GARANTIAS OU CONDIES DE QUALQUER +# * TIPO= sejam expressas ou tcitas. Veja a LICENA para a redao especfica a +# * reger permisses e limitaes sob esta LICENA. +# * +# * Criado em: 08/09/2013 - 19:02:44 +# * +# */ + +############################ +# Dados para uso em testes # +############################ + +##Campos em ordem alfabetica + +#Ficha de Compensao +txtFcAceite=A +txtFcAgenciaCodigoCedente=1234-1 / 0123456-0 +txtFcCarteira=30 +txtFcCedente=Projeto JRimum +txtFcCodBanco=237-2 +##Imagem +txtFcCodigoBarra= +txtFcDataDocumento=01/01/2020 +txtFcDataProcessamento=14/01/2020 +txtFcDataVencimento=07/09/2020 +txtFcDescontoAbatimento=R$ 0,05 +txtFcEspecie=REAL +txtFcEspecieDocumento=DM +txtFcInstrucaoAoCaixa1=PARA PAGAMENTO 1 at Hoje no cobrar nada! +txtFcInstrucaoAoCaixa2=PARA PAGAMENTO 2 at Amanh No cobre! +txtFcInstrucaoAoCaixa3=PARA PAGAMENTO 3 at Depois de amanh, OK, no cobre. +txtFcInstrucaoAoCaixa4=PARA PAGAMENTO 4 at 04/xx/xxxx de 4 dias atrs COBRAR O VALOR DE: R$ 01,00 +txtFcInstrucaoAoCaixa5=PARA PAGAMENTO 5 at 05/xx/xxxx COBRAR O VALOR DE: R$ 02,00 +txtFcInstrucaoAoCaixa6=PARA PAGAMENTO 6 at 06/xx/xxxx COBRAR O VALOR DE: R$ 03,00 +txtFcInstrucaoAoCaixa7=PARA PAGAMENTO 7 at xx/xx/xxxx COBRAR O VALOR QUE VOC QUISER! +txtFcInstrucaoAoCaixa8=APS o Vencimento, Pagvel Somente na Rede X. +txtFcLinhaDigitavel=23791.23439 09934.567893 12012.345604 9 83710000000023 +txtFcLocalPagamento=Pagvel preferencialmente na Rede X ou em qualquer Banco at o Vencimento. +##Imagem +txtFcLogoBanco= +txtFcMoraMulta=R$ 0,00 +txtFcNossoNumero=30/99345678912-5 +txtFcNumeroDocumento=123456 +txtFcOutraDeducao=R$ 0,00 +txtFcOutroAcrescimo=R$ 0,00 +txtFcQuantidade= +txtFcSacadoL1=JRimum Developer Pronto Para Frias, CPF: 222.222.222-22 +txtFcSacadoL2=Grande Centro - Natal / RN +txtFcSacadoL3=Rua poeta dos programas, n: 1 / Apt 101 - CEP: 59064-120 +txtFcSacadorAvalistaL1=Mastermum, CNPJ: 00.000.000/0001-91 +txtFcSacadorAvalistaL2=Grande Centro - Braslia / DF +txtFcSacadorAvalistaL3=Rua Eternamente Principal, n: 001 / Apt 101 - CEP: 70150-903 +txtFcUsoBanco= +txtFcValor= +txtFcValorCobrado=R$ 0,00 +txtFcValorDocumento=R$ 0,23 +#Recibo do Sacado +txtRsAgenciaCodigoCedente=1234-1 / 0123456-0 +txtRsCedente=Projeto JRimum +txtRsCodBanco=237-2 +txtRsCpfCnpj=00.000.208/0001-00 +txtRsDataVencimento=07/09/2020 +txtRsDescontoAbatimento=R$ 0,05 +txtRsEspecie=REAL +txtRsInstrucaoAoSacado=Senhor sacado, sabemos sim que o valor cobrado no o esperado, aproveite o DESCONTO! +txtRsLinhaDigitavel=23791.23439 09934.567893 12012.345604 9 83710000000023 +##Imagem +txtRsLogoBanco= +txtRsMoraMulta=R$ 0,00 +txtRsNossoNumero=30/99345678912-5 +txtRsNumeroDocumento=123456 +txtRsOutraDeducao=R$ 0,00 +txtRsOutroAcrescimo=R$ 0,00 +txtRsQuantidade= +txtRsSacado=JRimum Developer Pronto Para Frias, CPF: 222.222.222-22 +txtRsValorCobrado=R$ 0,00 +txtRsValorDocumento=R$ 0,23 \ No newline at end of file diff --git a/jrimum-bopepo/src/test/resources/log4j.properties b/jrimum-bopepo/src/test/resources/log4j.properties new file mode 100644 index 0000000..6dd8fa6 --- /dev/null +++ b/jrimum-bopepo/src/test/resources/log4j.properties @@ -0,0 +1,50 @@ +#/* +# * Copyright 2013 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/09/2013 - 11:59:36 +# * +# * ================================================================================ +# * +# * Direitos autorais 2013 JRimum Project +# * +# * Licenciado sob a Licena Apache, Verso 2.0 ("LICENA"); voc no pode usar +# * esse arquivo exceto em conformidade com a esta LICENA. Voc pode obter uma +# * cpia desta LICENA em http://www.apache.org/licenses/LICENSE-2.0 A menos que +# * haja exigncia legal ou acordo por escrito, a distribuio de software sob +# * esta LICENA se dar \u201CCOMO EST\u201D, SEM GARANTIAS OU CONDIES DE QUALQUER +# * TIPO, sejam expressas ou tcitas. Veja a LICENA para a redao especfica a +# * reger permisses e limitaes sob esta LICENA. +# * +# * Criado em: 08/09/2013 - 11:59:36 +# * +# */ + + +###DEFALUT CONFIGURATIONS +### direct log messages to stdout ### +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p %t %c{2}.%M (%F:%L)-%m%n %x + +### direct messages to file jrimum-bopepo.log +#log4j.appender.file=org.apache.log4j.FileAppender +#log4j.appender.file.File=jrimum-bopepo.log +#log4j.appender.file.layout=org.apache.log4j.PatternLayout +#log4j.appender.file.layout.ConversionPattern=%d %p %t %c.%M (%F:%L)-%m%n %x + +## log all as ERROS. +log4j.rootCategory=ERROR, stdout + +###Testes +## Log para todo o jrimum em nivel trace +log4j.logger.org.jrimum.bopepo=ERROR, stdout +log4j.additivity.org.jrimum.bopepo=false \ No newline at end of file