From f18412b1eec92353742e64f24fda8027a03c0cb2 Mon Sep 17 00:00:00 2001
From: Braully Silva
* Classe que representa um problema ocorrido dentro de qualquer parte (pacote)
- * do projeto JRimum
+ * do projeto JRimum
*
- * Qualquer exceção que ocorra dentro do componente JRimum é sempre
+ * Qualquer exceção que ocorra dentro do componente JRimum é sempre
* wrapped por uma instância de uma
- * Enumeração dos bancos segundo o supervisão da BACEN em
- * funcionamento no país e que possuem pelo menos uma implementação de
- *
- * A partir de um
- * Para uma nova instância do Banco do Brasil faça:
- * Para utilizar somento o código de compensação:
- * Para saber se um banco é suportado pelo componete, veja a lista antes
- * (LinkParaLista) ou faça:
- * Obs: Os bancos Sudameris e Bandepe
- * foram incorporados ao Banco Real, portanto para gerar boletos bancários
- * dos bancos citados utilize este tipo enumerado.
- *
- * Construtor naturalmente
- * Verifica se exite suporte (implementação) de "Campos Livres" para o banco
- * representado pelo
- * Cria uma instância para o banco representado pelo tipo enumerado.
- *
- * Cada instância retornada por este método contém:
- * JRimumException
.
* ICampoLivre
.
- * 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:
- *
- *
- *
- *
- * IBanco bancoDoBrasil = EnumBancos.BANCO_DO_BRASIL.newInstance();
- *
- *
- *
- *
- * EnumBancos.BANCO_DO_BRASIL.getCodigoDeCompensacao();
- *
- *
- *
- *
- * EnumBancos.isSuportado(banco.getCodigoDeCompensacao)
- *
- *
- * Map
para pesquisa por bancos suportados no
- * componente.
- *
- * @since 0.2
- */
- public static final Mapprivate
responsável por criar uma
- * única instância para cada banco.
- * codigoDeCompensacao
.
- *
- *
- *
+ * 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.
+ *
+ * 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)
+ *
+ *
+ * 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"); + + /** + * SingletonMap
para pesquisa por bancos suportados no
+ * componente.
+ *
+ * @since 0.2
+ */
+ public static final Map
+ * Construtor naturalmente private
responsável por criar uma
+ * única instância para cada banco.
+ *
+ * Verifica se exite suporte (implementação) de "Campos Livres" para o banco
+ * representado pelo codigoDeCompensacao
.
+ *
+ * Cria uma instância para o banco representado pelo tipo enumerado. + *
+ *+ * Cada instância retornada por este método contém: + *
- * 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"
- *
- * Transforma um código de barras em uma linha digitável numérica. - *
- *
- * "dddddddddddddddddddddddddddddddddddddddddddd"
- * ⇒
- * "ddddddddddddddddddddddddddddddddddddddddddddddd"
- *
- * Transforma uma linha digitável no formato FEBRABAN em um código de - * barras. - *
- *
- * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd"
- *
- * ⇒
- * "dddddddddddddddddddddddddddddddddddddddddddd"
- *
- * Transforma uma linha digitável não formatada em um código de barras. - *
- *
- * "ddddddddddddddddddddddddddddddddddddddddddddddd"
- * ⇒
- * "dddddddddddddddddddddddddddddddddddddddddddd"
- *
- * Remove formatação e espaços de uma linha digitável no formato FEBRABAN: - *
- *
- * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd"
- *
- * ⇒
- * "ddddddddddddddddddddddddddddddddddddddddddddddd"
- *
- * Transforma linha digitável númerica em FEBRABAN: - *
- *
- * "ddddddddddddddddddddddddddddddddddddddddddddddd"
- * ⇒
- * "ddddd.ddddd ddddd.dddddd ddddd.dddddd d dddddddddddddd"
- *
- * 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. - *
- *- *
IllegalArgumentException
;
- * IllegalArgumentException
;LinhaDigitavelException
.- * 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. - *
- *- *
IllegalArgumentException
;
- * IllegalArgumentException
;LinhaDigitavelException
.- * 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. - *
- *- *
IllegalArgumentException
;
- * IllegalArgumentException
;LinhaDigitavelException
.
- * 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.
- *
- * 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.
- *
+ * 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. + *
+ *+ *
IllegalArgumentException
;
+ * IllegalArgumentException
;LinhaDigitavelException
.+ * 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. + *
+ *+ *
IllegalArgumentException
;
+ * IllegalArgumentException
;LinhaDigitavelException
.+ * 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. + *
+ *+ *
IllegalArgumentException
;
+ * IllegalArgumentException
;LinhaDigitavelException
.
+ * 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.
+ *
+ * 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.
+ *
*
- * Aplicação do seguinte requisito da FEBRABAN:
+ * Aplicação do seguinte requisito da FEBRABAN:
* Em cada um dos três primeiros campos, após a quinta (5) posição, deve ser
* inserido um ponto “.”, a fim de facilitar a visualização, para a
* digitação, quando necessário.
@@ -342,7 +342,7 @@ public String write(){
}
/**
- * Componhe o campo 1 da linha digitável com os seguintes dados:
+ * Componhe o campo 1 da linha digitável com os seguintes dados:
*
- * 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. - *
- * - *- *
- * Constrói um campo livre após executar os métodos - * {@link AbstractCampoLivre#checkValues(Titulo)} e - * {@link AbstractCampoLivre#addFields(Titulo)}, retornando em seguida esta - * instância pronta para escrita. - *
- * - * @param titulo - * - * @return a instância pronta para escrita - * - * @since 0.2 - */ - protected final CampoLivre build(Titulo titulo) { - - checkValues(titulo); - - addFields(titulo); - - return this; - } - - /** - *- * Usado pelo método {@link AbstractCampoLivre#build(Titulo)} para verificar - * a consistência do campo livre. Se algum inconsistência for verificada, - * este método deverá lança-la. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected abstract void checkValues(Titulo titulo); - - /** - *- * Usado pelo método {@link AbstractCampoLivre#build(Titulo)}, adiciona os - * campos do campo livre deixando-o pronto para escrita. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected abstract void addFields(Titulo titulo); - - /** - *- * Gera o campo livre a parir dos campos armazenados sem verificar se está - * compatível com número de fields declarado pelo campo livre. Isso implica - * que a string retornada poderá ser menor do que 25 caracteres. - *
- * - * @return string a partir dos campos contidos até o momento. - * - * @since 0.2 - */ - protected final String writeFields() { - - StringBuilder campoLivreAtual = new StringBuilder(); - - for (IFixedField> f : this) { - campoLivreAtual.append(f.write()); - } - - return campoLivreAtual.toString(); - } - - /* - * Validações inicias. - */ - /** - *- * Verifica se o título não é nulo, senão lança uma {@code - * IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - private static void checkTituloNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo, "Título não pode ser nulo!"); - } - - /** - *- * Verifica se a conta bancária do título não é nula, senão lança uma - * {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - private static void checkContaBancariaNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria(), "Conta bancária do título não pode ser nula!"); - } - - /** - *- * Verifica se o banco da conta bancária do título não é nulo, senão lança - * uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - private static void checkBancoNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getBanco(), "Banco da conta bancária do título não pode ser nulo!"); - - boolean expression = isCodigoDeCompensacaoOK(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado()); - - Objects.checkArgument(expression, format("Código de compensação [%s] inválido!", titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado())); - } - - /* - * Validações para subclasses. - */ - /** - *- * Verifica se a carteira da conta bancária do título não é nula, senão - * lança uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkCarteiraNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getCarteira(), "Carteira da conta bancária do título não pode ser nula!"); - } - - /** - *- * Verifica se o tipo da carteira da conta bancária do título não é nulo, - * senão lança uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkRegistroDaCarteiraNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getCarteira().getTipoCobranca(), "Tipo de cobrança (COM ou SEM registro) da carteira não pode ser nulo!"); - } - - /** - *- * Verifica se o código da carteira da conta bancária do título não é nulo e - * se é um número > 0, caso contrário lança uma {@code - * IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkCodigoDaCarteira(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getCarteira().getCodigo(), "Código da carteira não pode ser nulo!"); - - boolean expression = titulo.getContaBancaria().getCarteira().getCodigo() > 0; - - Objects.checkArgument(expression, format("Código da carteira deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getCarteira().getCodigo())); - } - - /** - *- * Verifica se o código da carteira da conta bancária do título é um número - * menor que ou igual ao limite informado, caso contrário lança uma {@code - * IllegalArgumentException}. - *
- * - * @param titulo - * @param limite - Limite máximo permitido - * - * @since 0.2 - */ - protected final static void checkCodigoDaCarteiraMenorOuIgualQue(Titulo titulo, int limite) { - - boolean expression = titulo.getContaBancaria().getCarteira().getCodigo() <= limite; - - Objects.checkArgument(expression, format("Código [%s] da carteira deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getCarteira().getCodigo(), limite)); - } - - /** - *- * Verifica se a agência da conta bancária do título não é nula, senão lança - * uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkAgenciaNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getAgencia(), "Agência bancária do título não pode ser nula!"); - } - - /** - *- * Verifica se o código do número da agência bancária não é nulo e se é um - * número > 0, caso contrário lança uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkCodigoDaAgencia(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getAgencia().getCodigo(), "Código da agência bancária não pode ser nulo!"); - - boolean expression = titulo.getContaBancaria().getAgencia().getCodigo() > 0; - - Objects.checkArgument(expression, format("Código da agência bancária deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getAgencia().getCodigo())); - } - - /** - *- * Verifica se o código do número da agência da conta bancária do título é - * um número menor que ou igual ao limite informado, caso contrário lança - * uma {@code - * IllegalArgumentException}. - *
- * - * @param titulo - * @param limite - Limite máximo permitido - * - * @since 0.2 - */ - protected final static void checkCodigoDaAgenciaMenorOuIgualQue(Titulo titulo, int limite) { - - boolean expression = titulo.getContaBancaria().getAgencia().getCodigo() <= limite; - - Objects.checkArgument(expression, format("Código [%s] da agência deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getAgencia().getCodigo(), limite)); - } - - /** - *- * Verifica se o dígito verificador da agência da conta bancária não é nulo, - * não é vazio e se é numérico, caso contrário lança uma {@code - * IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkDigitoDoCodigoDaAgencia(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), "Dígito verificador da agência bancária não pode ser nulo!"); - Strings.checkNotBlank(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), format("Dígito verificador [\"%s\"] da agência bancária não pode ser vazio!", titulo.getContaBancaria().getAgencia().getDigitoVerificador())); - Strings.checkNotNumeric(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), format("Nesse contexto o dígito verificador [\"%s\"] da agência bancária deve ser numérico!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); - } - - /** - *- * Verifica se o número da conta da conta bancária do título não é nulo, - * senão lança uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkNumeroDaContaNotNull(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta(), "Número da conta bancária do título não pode ser nulo!"); - } - - /** - *- * Verifica se o código do do número da conta bancária não é nulo e se é um - * número > 0, caso contrário lança uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkCodigoDoNumeroDaConta(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), "Código do número da conta bancária não pode ser nulo!"); - - boolean expression = titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta() > 0; - - Objects.checkArgument(expression, format("Código do número da conta bancária deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta())); - } - - /** - *- * Verifica se o código do número da conta bancária do título é um número - * menor que ou igual ao limite informado, caso contrário lança uma {@code - * IllegalArgumentException}. - *
- * - * @param titulo - * @param limite - Limite máximo permitido - * - * @since 0.2 - */ - protected final static void checkCodigoDoNumeroDaContaMenorOuIgualQue(Titulo titulo, int limite) { - - boolean expression = titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta() <= limite; - - Objects.checkArgument(expression, format("Código [%s] do número da conta deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), limite)); - } - - /** - *- * Verifica se o dígito verificador do número da conta bancária não é nulo, - * não é vazio e se é numérico, caso contrário lança uma {@code - * IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkDigitoDoCodigoDoNumeroDaConta(Titulo titulo) { - - Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), "Dígito verificador do número da conta bancária não pode ser nulo!"); - Strings.checkNotBlank(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), format("Dígito verificador [\"%s\"] do número da conta bancária não pode ser vazio!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); - Strings.checkNotNumeric(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), format("Nesse contexto o dígito verificador [\"%s\"] do número da conta deve ser numérico!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); - } - - /** - *- * Verifica se onosso número do título não é nulo, não é vazio e se é - * numérico, caso contrário lança uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkNossoNumero(Titulo titulo) { - - Objects.checkNotNull(titulo.getNossoNumero(), "Nosso número do título não pode ser nulo!"); - Strings.checkNotBlank(titulo.getNossoNumero(), format("Nosso número [\"%s\"] do título não pode ser vazio!", titulo.getNossoNumero())); - Strings.checkNotNumeric(titulo.getNossoNumero(), format("Nosso número [\"%s\"] do título deve conter somente dígitos numéricos!", titulo.getNossoNumero())); - } - - /** - *- * Verifica se o nosso número do título tem o tamanho determinado, caso - * contrário lança uma {@code IllegalArgumentException} com a mensagem - * "Tamanho do nosso número [%s] diferente do esperado [%s]!". - *
- * - * @param titulo - * @param length - Tamanho que deve ser - * - * @since 0.2 - */ - protected final static void checkTamanhoDoNossoNumero(Titulo titulo, int length) { - - checkTamanhoNossoNumero(titulo, length, format( - "Tamanho [%s] do nosso número [\"%s\"] diferente do esperado [%s]!", - StringUtils.length(titulo.getNossoNumero()), titulo.getNossoNumero(), length)); - } - - /** - *- * Verifica se o nosso número do título tem o tamanho determinado, caso - * contrário lança uma {@code IllegalArgumentException} com a mensagem - * determinada. - *
- * - * @param titulo - * @param length - Tamanho que deve ser - * @param msg - Mensagem para erro - * - * @since 0.2 - */ - protected final static void checkTamanhoNossoNumero(Titulo titulo, int length, String msg) { - - Objects.checkArgument(titulo.getNossoNumero().length() == length, msg); - } - - /** - *- * Verifica se o dígito verificador do nosso número do título não é nulo, - * não é vazio e se é numérico (natural positivo), caso contrário lança uma - * {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkDigitoDoNossoNumero(Titulo titulo) { - - Objects.checkNotNull(titulo.getDigitoDoNossoNumero(), "Dígito verificador do nosso número do título não pode ser nulo!"); - Strings.checkNotBlank(titulo.getDigitoDoNossoNumero(), format("Dígito verificador [\"%s\"] do nosso número do título não pode ser vazio!", titulo.getDigitoDoNossoNumero())); - Strings.checkNotNumeric(titulo.getDigitoDoNossoNumero(), format("Nesse contexto o dígito verificador [\"%s\"] do nosso número deve ser um número inteiro positivo!", titulo.getDigitoDoNossoNumero())); - } - - /** - *- * Verifica se o dígito do nosso número do título tem o tamanho determinado, - * caso contrário lança uma {@code IllegalArgumentException} com a mensagem - * "Tamanho [%s] do dígito do nosso número [\"%s\"] diferente do - * esperado [%s]!". - *
- * - * @param titulo - * @param length - Tamanho que deve ser - * - * @since 0.2 - */ - protected final static void checkTamanhoDigitoDoNossoNumero(Titulo titulo, int length) { - - checkTamanhoDigitoDoNossoNumero(titulo, length, format( - "Tamanho [%s] do dígito do nosso número [\"%s\"] diferente do esperado [%s]!", - StringUtils.length(titulo.getDigitoDoNossoNumero()), titulo.getDigitoDoNossoNumero(), length)); - } - - /** - *- * Verifica se o dígito do nosso número do título tem o tamanho determinado, - * caso contrário lança uma {@code IllegalArgumentException} com a mensagem - * determinada. - *
- * - * @param titulo - * @param length - Tamanho que deve ser - * @param msg - Mensagem para erro - * - * @since 0.2 - */ - protected final static void checkTamanhoDigitoDoNossoNumero(Titulo titulo, int length, String msg) { - - Objects.checkArgument(titulo.getDigitoDoNossoNumero().length() == length, msg); - } - - /** - *- * Verifica se o valor do título não é nulo e é positivo, caso contrário - * lança uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * - * @since 0.2 - */ - protected final static void checkValor(Titulo titulo) { - - Objects.checkNotNull(titulo.getValor(), "Valor do título não pode ser nulo!"); - Objects.checkArgument(titulo.getValor().compareTo(ZERO) >= 0, format("O valor do título deve ser um número positivo ou zero e não [%s].", titulo.getValor())); - } - - /** - *- * Verifica se o título contém {@code ParametrosBancariosMap} e se este - * contém um valor não é nulo do parâmetro determinado, caso contrário lança - * uma {@code IllegalArgumentException}. - *
- * - * @param titulo - * @param param Parâmetro a ser validado - * - * @since 0.2 - */ - protected final static void checkParametroBancario(Titulo titulo, ParametroBancario> param) { - - Objects.checkNotNull(titulo.getParametrosBancarios(), format("O parâmetro bancário [\"%s\"] é necessário! [titulo.getParametrosBancarios() == null]", param)); - Objects.checkArgument(titulo.getParametrosBancarios().contemComNome(param), format("Parâmetro bancário [\"%s\"] não encontrado!", param)); - Objects.checkNotNull(titulo.getParametrosBancarios().getValor(param), format("Parâmetro bancário [\"%s\"] não contém valor!", param)); - } - - /** - *- * Verifica se o título com o parâmetro informado é um número inteiro menor - * que ou igual ao limite informado, caso contrário lança uma - * {@code IllegalArgumentException}. - *
- * - * @param titulo - * @param param Parâmetro a ser validado - * @param limite Limite máximo permitido - * - * @since 0.2 - */ - protected final static void checkParametroBancarioMenorOuIgualQue(Titulo titulo, ParametroBancario> param, int limite) { - - checkParametroBancario(titulo, param); - - int valor = titulo.getParametrosBancarios().getValor(param).intValue(); - - boolean expression = valor <= limite; - - Objects.checkArgument(expression, format("Parâmetro [%s] com valor [%s] deve ser um número menor que ou igual a [%s].", param, valor, limite)); - } - - /** - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - - return Objects.toString(this); - } - -} +/* + * Copyright 2008 JRimum Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by + * applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS + * OF ANY KIND, either express or implied. See the License for the specific + * language governing permissions and limitations under the License. + * + * Created at: 30/03/2008 - 18:07:11 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/03/2008 - 18:07:11 + * + */ +package org.jrimum.bopepo.campolivre; + +import static java.lang.String.format; +import static java.math.BigDecimal.ZERO; +import static org.jrimum.domkee.banco.Banco.isCodigoDeCompensacaoOK; + +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.jrimum.bopepo.BancosSuportados; +import org.jrimum.domkee.banco.ParametroBancario; +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.BlockOfFields; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.Strings; +import org.jrimum.texgit.IFixedField; + +/** + *+ * Esta classe é responsável por determinar a interface campo livre e também + * determinar qual implementação de campo livre se aplica a um determinado + * título. + *
+ * + *+ * Uma outra forma de analisar esta classe é sob o prisma de uma Abstract + * Factory. + *
+ * + *+ *
+ * Constrói um campo livre após executar os métodos + * {@link AbstractCampoLivre#checkValues(Titulo)} e + * {@link AbstractCampoLivre#addFields(Titulo)}, retornando em seguida esta + * instância pronta para escrita. + *
+ * + * @param titulo + * + * @return a instância pronta para escrita + * + * @since 0.2 + */ + protected final CampoLivre build(Titulo titulo) { + + checkValues(titulo); + + addFields(titulo); + + return this; + } + + /** + *+ * Usado pelo método {@link AbstractCampoLivre#build(Titulo)} para verificar + * a consistência do campo livre. Se algum inconsistência for verificada, + * este método deverá lança-la. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected abstract void checkValues(Titulo titulo); + + /** + *+ * Usado pelo método {@link AbstractCampoLivre#build(Titulo)}, adiciona os + * campos do campo livre deixando-o pronto para escrita. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected abstract void addFields(Titulo titulo); + + /** + *+ * Gera o campo livre a parir dos campos armazenados sem verificar se está + * compatível com número de fields declarado pelo campo livre. Isso implica + * que a string retornada poderá ser menor do que 25 caracteres. + *
+ * + * @return string a partir dos campos contidos até o momento. + * + * @since 0.2 + */ + protected final String writeFields() { + + StringBuilder campoLivreAtual = new StringBuilder(); + + for (IFixedField> f : this) { + campoLivreAtual.append(f.write()); + } + + return campoLivreAtual.toString(); + } + + /* + * Validações inicias. + */ + /** + *+ * Verifica se o título não é nulo, senão lança uma {@code + * IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + private static void checkTituloNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo, "Título não pode ser nulo!"); + } + + /** + *+ * Verifica se a conta bancária do título não é nula, senão lança uma + * {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + private static void checkContaBancariaNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria(), "Conta bancária do título não pode ser nula!"); + } + + /** + *+ * Verifica se o banco da conta bancária do título não é nulo, senão lança + * uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + private static void checkBancoNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getBanco(), "Banco da conta bancária do título não pode ser nulo!"); + + boolean expression = isCodigoDeCompensacaoOK(titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado()); + + Objects.checkArgument(expression, format("Código de compensação [%s] inválido!", titulo.getContaBancaria().getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado())); + } + + /* + * Validações para subclasses. + */ + /** + *+ * Verifica se a carteira da conta bancária do título não é nula, senão + * lança uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkCarteiraNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getCarteira(), "Carteira da conta bancária do título não pode ser nula!"); + } + + /** + *+ * Verifica se o tipo da carteira da conta bancária do título não é nulo, + * senão lança uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkRegistroDaCarteiraNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getCarteira().getTipoCobranca(), "Tipo de cobrança (COM ou SEM registro) da carteira não pode ser nulo!"); + } + + /** + *+ * Verifica se o código da carteira da conta bancária do título não é nulo e + * se é um número > 0, caso contrário lança uma {@code + * IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkCodigoDaCarteira(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getCarteira().getCodigo(), "Código da carteira não pode ser nulo!"); + + boolean expression = titulo.getContaBancaria().getCarteira().getCodigo() > 0; + + Objects.checkArgument(expression, format("Código da carteira deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getCarteira().getCodigo())); + } + + /** + *+ * Verifica se o código da carteira da conta bancária do título é um número + * menor que ou igual ao limite informado, caso contrário lança uma {@code + * IllegalArgumentException}. + *
+ * + * @param titulo + * @param limite - Limite máximo permitido + * + * @since 0.2 + */ + protected final static void checkCodigoDaCarteiraMenorOuIgualQue(Titulo titulo, int limite) { + + boolean expression = titulo.getContaBancaria().getCarteira().getCodigo() <= limite; + + Objects.checkArgument(expression, format("Código [%s] da carteira deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getCarteira().getCodigo(), limite)); + } + + /** + *+ * Verifica se a agência da conta bancária do título não é nula, senão lança + * uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkAgenciaNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getAgencia(), "Agência bancária do título não pode ser nula!"); + } + + /** + *+ * Verifica se o código do número da agência bancária não é nulo e se é um + * número > 0, caso contrário lança uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkCodigoDaAgencia(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getAgencia().getCodigo(), "Código da agência bancária não pode ser nulo!"); + + boolean expression = titulo.getContaBancaria().getAgencia().getCodigo() > 0; + + Objects.checkArgument(expression, format("Código da agência bancária deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getAgencia().getCodigo())); + } + + /** + *+ * Verifica se o código do número da agência da conta bancária do título é + * um número menor que ou igual ao limite informado, caso contrário lança + * uma {@code + * IllegalArgumentException}. + *
+ * + * @param titulo + * @param limite - Limite máximo permitido + * + * @since 0.2 + */ + protected final static void checkCodigoDaAgenciaMenorOuIgualQue(Titulo titulo, int limite) { + + boolean expression = titulo.getContaBancaria().getAgencia().getCodigo() <= limite; + + Objects.checkArgument(expression, format("Código [%s] da agência deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getAgencia().getCodigo(), limite)); + } + + /** + *+ * Verifica se o dígito verificador da agência da conta bancária não é nulo, + * não é vazio e se é numérico, caso contrário lança uma {@code + * IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkDigitoDoCodigoDaAgencia(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), "Dígito verificador da agência bancária não pode ser nulo!"); + Strings.checkNotBlank(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), format("Dígito verificador [\"%s\"] da agência bancária não pode ser vazio!", titulo.getContaBancaria().getAgencia().getDigitoVerificador())); + Strings.checkNotNumeric(titulo.getContaBancaria().getAgencia().getDigitoVerificador(), format("Nesse contexto o dígito verificador [\"%s\"] da agência bancária deve ser numérico!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); + } + + /** + *+ * Verifica se o número da conta da conta bancária do título não é nulo, + * senão lança uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkNumeroDaContaNotNull(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta(), "Número da conta bancária do título não pode ser nulo!"); + } + + /** + *+ * Verifica se o código do do número da conta bancária não é nulo e se é um + * número > 0, caso contrário lança uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkCodigoDoNumeroDaConta(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), "Código do número da conta bancária não pode ser nulo!"); + + boolean expression = titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta() > 0; + + Objects.checkArgument(expression, format("Código do número da conta bancária deve ser um número inteiro natural positivo e não [%s].", titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta())); + } + + /** + *+ * Verifica se o código do número da conta bancária do título é um número + * menor que ou igual ao limite informado, caso contrário lança uma {@code + * IllegalArgumentException}. + *
+ * + * @param titulo + * @param limite - Limite máximo permitido + * + * @since 0.2 + */ + protected final static void checkCodigoDoNumeroDaContaMenorOuIgualQue(Titulo titulo, int limite) { + + boolean expression = titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta() <= limite; + + Objects.checkArgument(expression, format("Código [%s] do número da conta deve ser um número menor que ou igual a [%s].", titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), limite)); + } + + /** + *+ * Verifica se o dígito verificador do número da conta bancária não é nulo, + * não é vazio e se é numérico, caso contrário lança uma {@code + * IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkDigitoDoCodigoDoNumeroDaConta(Titulo titulo) { + + Objects.checkNotNull(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), "Dígito verificador do número da conta bancária não pode ser nulo!"); + Strings.checkNotBlank(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), format("Dígito verificador [\"%s\"] do número da conta bancária não pode ser vazio!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); + Strings.checkNotNumeric(titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta(), format("Nesse contexto o dígito verificador [\"%s\"] do número da conta deve ser numérico!", titulo.getContaBancaria().getNumeroDaConta().getDigitoDaConta())); + } + + /** + *+ * Verifica se onosso número do título não é nulo, não é vazio e se é + * numérico, caso contrário lança uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkNossoNumero(Titulo titulo) { + + Objects.checkNotNull(titulo.getNossoNumero(), "Nosso número do título não pode ser nulo!"); + Strings.checkNotBlank(titulo.getNossoNumero(), format("Nosso número [\"%s\"] do título não pode ser vazio!", titulo.getNossoNumero())); + Strings.checkNotNumeric(titulo.getNossoNumero(), format("Nosso número [\"%s\"] do título deve conter somente dígitos numéricos!", titulo.getNossoNumero())); + } + + /** + *+ * Verifica se o nosso número do título tem o tamanho determinado, caso + * contrário lança uma {@code IllegalArgumentException} com a mensagem + * "Tamanho do nosso número [%s] diferente do esperado [%s]!". + *
+ * + * @param titulo + * @param length - Tamanho que deve ser + * + * @since 0.2 + */ + protected final static void checkTamanhoDoNossoNumero(Titulo titulo, int length) { + + checkTamanhoNossoNumero(titulo, length, format( + "Tamanho [%s] do nosso número [\"%s\"] diferente do esperado [%s]!", + StringUtils.length(titulo.getNossoNumero()), titulo.getNossoNumero(), length)); + } + + /** + *+ * Verifica se o nosso número do título tem o tamanho determinado, caso + * contrário lança uma {@code IllegalArgumentException} com a mensagem + * determinada. + *
+ * + * @param titulo + * @param length - Tamanho que deve ser + * @param msg - Mensagem para erro + * + * @since 0.2 + */ + protected final static void checkTamanhoNossoNumero(Titulo titulo, int length, String msg) { + + Objects.checkArgument(titulo.getNossoNumero().length() == length, msg); + } + + /** + *+ * Verifica se o dígito verificador do nosso número do título não é nulo, + * não é vazio e se é numérico (natural positivo), caso contrário lança uma + * {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkDigitoDoNossoNumero(Titulo titulo) { + + Objects.checkNotNull(titulo.getDigitoDoNossoNumero(), "Dígito verificador do nosso número do título não pode ser nulo!"); + Strings.checkNotBlank(titulo.getDigitoDoNossoNumero(), format("Dígito verificador [\"%s\"] do nosso número do título não pode ser vazio!", titulo.getDigitoDoNossoNumero())); + Strings.checkNotNumeric(titulo.getDigitoDoNossoNumero(), format("Nesse contexto o dígito verificador [\"%s\"] do nosso número deve ser um número inteiro positivo!", titulo.getDigitoDoNossoNumero())); + } + + /** + *+ * Verifica se o dígito do nosso número do título tem o tamanho determinado, + * caso contrário lança uma {@code IllegalArgumentException} com a mensagem + * "Tamanho [%s] do dígito do nosso número [\"%s\"] diferente do + * esperado [%s]!". + *
+ * + * @param titulo + * @param length - Tamanho que deve ser + * + * @since 0.2 + */ + protected final static void checkTamanhoDigitoDoNossoNumero(Titulo titulo, int length) { + + checkTamanhoDigitoDoNossoNumero(titulo, length, format( + "Tamanho [%s] do dígito do nosso número [\"%s\"] diferente do esperado [%s]!", + StringUtils.length(titulo.getDigitoDoNossoNumero()), titulo.getDigitoDoNossoNumero(), length)); + } + + /** + *+ * Verifica se o dígito do nosso número do título tem o tamanho determinado, + * caso contrário lança uma {@code IllegalArgumentException} com a mensagem + * determinada. + *
+ * + * @param titulo + * @param length - Tamanho que deve ser + * @param msg - Mensagem para erro + * + * @since 0.2 + */ + protected final static void checkTamanhoDigitoDoNossoNumero(Titulo titulo, int length, String msg) { + + Objects.checkArgument(titulo.getDigitoDoNossoNumero().length() == length, msg); + } + + /** + *+ * Verifica se o valor do título não é nulo e é positivo, caso contrário + * lança uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * + * @since 0.2 + */ + protected final static void checkValor(Titulo titulo) { + + Objects.checkNotNull(titulo.getValor(), "Valor do título não pode ser nulo!"); + Objects.checkArgument(titulo.getValor().compareTo(ZERO) >= 0, format("O valor do título deve ser um número positivo ou zero e não [%s].", titulo.getValor())); + } + + /** + *+ * Verifica se o título contém {@code ParametrosBancariosMap} e se este + * contém um valor não é nulo do parâmetro determinado, caso contrário lança + * uma {@code IllegalArgumentException}. + *
+ * + * @param titulo + * @param param Parâmetro a ser validado + * + * @since 0.2 + */ + protected final static void checkParametroBancario(Titulo titulo, ParametroBancario> param) { + + Objects.checkNotNull(titulo.getParametrosBancarios(), format("O parâmetro bancário [\"%s\"] é necessário! [titulo.getParametrosBancarios() == null]", param)); + Objects.checkArgument(titulo.getParametrosBancarios().contemComNome(param), format("Parâmetro bancário [\"%s\"] não encontrado!", param)); + Objects.checkNotNull(titulo.getParametrosBancarios().getValor(param), format("Parâmetro bancário [\"%s\"] não contém valor!", param)); + } + + /** + *+ * Verifica se o título com o parâmetro informado é um número inteiro menor + * que ou igual ao limite informado, caso contrário lança uma + * {@code IllegalArgumentException}. + *
+ * + * @param titulo + * @param param Parâmetro a ser validado + * @param limite Limite máximo permitido + * + * @since 0.2 + */ + protected final static void checkParametroBancarioMenorOuIgualQue(Titulo titulo, ParametroBancario> param, int limite) { + + checkParametroBancario(titulo, param); + + int valor = titulo.getParametrosBancarios().getValor(param).intValue(); + + boolean expression = valor <= limite; + + Objects.checkArgument(expression, format("Parâmetro [%s] com valor [%s] deve ser um número menor que ou igual a [%s].", param, valor, limite)); + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + return Objects.toString(this); + } + +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java b/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java index fad80283..727fd8f8 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLBancoDoNordesteDoBrasil.java @@ -1,218 +1,218 @@ -/* - * Copyright 2010 JRimum Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * Created at: 16/12/2010 - 13:24:00 - * - * ================================================================================ - * - * Direitos autorais 2010 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Created at: 16/12/2010 - 13:24:00 - * - */ - - -package org.jrimum.bopepo.campolivre; - -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; - -/** - *- * O campo livre do Banco do Nordeste deve seguir esta forma: - *
- * - *Posição | - *Tamanho | - *Picture | - *Conteúdo (terminologia padrão) | - *Conteúdo (terminologia do banco) | - *
---|---|---|---|---|
20-23 | - *4 | - *9(4) | - *Agência Cedente (sem o digito verificador, completar com zeros à esquerda quando necessário) | - *Código da Agência (sem dígito) | - *
24-30 | - *7 | - *9(7) | - *Conta do Cedente (sem o dígito verificador, completar com zeros à esquerda quando necessário) | - *Conta do Cedente (sem dígito) | - *
31-31 | - *1 | - *9(1) | - *Dígito da Conta do Cedente | - *Dígito da Conta do Cedente | - *
32-38 | - *7 | - *9(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-39 | - *1 | - *9(1) | - *Dígito do Nosso Número | - *Dígito do Nosso Número (No. Bancário) | - *
40-41 | - *2 | - *9(2) | - *Carteira (utilizar o código da carteira) | - *Carteira (Tipo de Operação) | - *
42-44 | - *3 | - *9(3) | - *Preenchar campo com ZEROS. | - *Campo zerado | - *
- * 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+ * O campo livre do Banco do Nordeste deve seguir esta forma: + *
+ * + *Posição | + *Tamanho | + *Picture | + *Conteúdo (terminologia padrão) | + *Conteúdo (terminologia do banco) | + *
---|---|---|---|---|
20-23 | + *4 | + *9(4) | + *Agência Cedente (sem o digito verificador, completar com zeros à esquerda quando necessário) | + *Código da Agência (sem dígito) | + *
24-30 | + *7 | + *9(7) | + *Conta do Cedente (sem o dígito verificador, completar com zeros à esquerda quando necessário) | + *Conta do Cedente (sem dígito) | + *
31-31 | + *1 | + *9(1) | + *Dígito da Conta do Cedente | + *Dígito da Conta do Cedente | + *
32-38 | + *7 | + *9(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-39 | + *1 | + *9(1) | + *Dígito do Nosso Número | + *Dígito do Nosso Número (No. Bancário) | + *
40-41 | + *2 | + *9(2) | + *Carteira (utilizar o código da carteira) | + *Carteira (Tipo de Operação) | + *
42-44 | + *3 | + *9(3) | + *Preenchar campo com ZEROS. | + *Campo zerado | + *
+ * 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*** COBRANÇA SEM REGISTRO ***
- * O campo livre do Banco Real deve seguir esta forma: - * - *Posição | - *Tamanho | - *Picture | - *Conteúdo (terminologia padrão) | - *Conteúdo (terminologia do banco) | - *
---|---|---|---|---|
20-23 | - *4 | - *9(4) | - *Código da agência (sem dígito) | - *Agência - Código da agência do cedente | - *
24-30 | - *7 | - *9(7) | - *Código da conta (sem dígito) | - *Conta - Número da conta do cedente | - *
31-31 | - *1 | - *9(1) | - *Dígito verificador | - *Digitão - Dígito de cobrança | - *
32-44 | - *13 | - *9(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 | - *
- * 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
- * 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. - *
- *Nosso Número | - *1234567890123 | - *
Agência | - *4444 | - *
Conta Corrente | - *7777777 | - *
*** COBRANÇA SEM REGISTRO ***
+ * O campo livre do Banco Real deve seguir esta forma: + * + *Posição | + *Tamanho | + *Picture | + *Conteúdo (terminologia padrão) | + *Conteúdo (terminologia do banco) | + *
---|---|---|---|---|
20-23 | + *4 | + *9(4) | + *Código da agência (sem dígito) | + *Agência - Código da agência do cedente | + *
24-30 | + *7 | + *9(7) | + *Código da conta (sem dígito) | + *Conta - Número da conta do cedente | + *
31-31 | + *1 | + *9(1) | + *Dígito verificador | + *Digitão - Dígito de cobrança | + *
32-44 | + *13 | + *9(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 | + *
+ * 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
+ * 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. + *
+ *Nosso Número | + *1234567890123 | + *
Agência | + *4444 | + *
Conta Corrente | + *7777777 | + *
- * Layout:
+ * Layout:
*
* Cobrança Normal - CAMPO LIVRE - Chave ASBACE diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java b/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java index b1975661..5db3635f 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero10.java @@ -1,217 +1,217 @@ -package org.jrimum.bopepo.campolivre; - -import static java.lang.String.format; -import static org.jrimum.bopepo.parametro.ParametroCaixaEconomicaFederal.CODIGO_OPERACAO; - -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Objects; - -/** - *
- * O campo livre da Caixa Econômica Federal para cobrança simples (CS), rápida(CR) e sem registro (SR) - * - SICOB, deve seguir esta forma: - *
- * - *Posição | - *Tamanho | - *Picture | - *Conteúdo (terminologia padrão) | - *Conteúdo (terminologia do banco) | - *
---|---|---|---|---|
20-29 | - *10 | - *9(10) | - *Nosso Número | - *
- * Nosso Número no padrão de uma das
- * três cobranças (simples, rápida ou sem registro)
- *
- * Exemplos: |
- *
30-33 | - *4 | - *9(4) | - *Código da Agência | - *Código da Agência Cedente | - *
34-36 | - *3 | - *9(3) | - *Código da Operação | - *Operação Código | - *
37-44 | - *8 | - *9(8) | - *Código do número da conta | - *Código fornecido pela Agência | - *
- * 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- * 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: - *
- * Verifica se o nosso número informado tem o padrão esperado de acordo com - * o código da carteira informada. - *
- *- * Obs: Como não há uma garantia documental de que todo nosso número que - * começa com "3" pertencerá somente a carteira 11, então o mais - * coerente é não amarrar o início do nosso número a determinada carteira, - * mas sim o contrário, ou seja, amarrar que toda carteira 11 tem de ter o - * nosso número iniciando com 3". O mesmo raciocíno serve para as outras - * carteiras. - *
- * - * @param nossoNumero - * - Nosso Número - * @param codigoDaCarteira - * - Código da carteira - */ - private void checkPadraoNossoNumeroPorCodigoDaCarteira(String nossoNumero, Integer codigoDaCarteira){ - switch (codigoDaCarteira) { - case 11: - if(!nossoNumero.startsWith("3")){ - Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 11 (cobrança simples), o nosso número [%s] deve começar com 3!", nossoNumero)); - } - break; - - case 12: - if(!nossoNumero.startsWith("9")){ - Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 12 (cobrança rápida), o nosso número [%s] deve começar com 9!", nossoNumero)); - } - break; - - case 14: - if(!nossoNumero.startsWith("80") && !nossoNumero.startsWith("81") && !nossoNumero.startsWith("82")){ - Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 14 (cobrança sem registro), o nosso número [%s] deve começar com 80, 81 ou 82!", nossoNumero)); - } - break; - } - } - - - @Override - protected void addFields(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - @Override - protected void checkValues(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } -} +package org.jrimum.bopepo.campolivre; + +import static java.lang.String.format; +import static org.jrimum.bopepo.parametro.ParametroCaixaEconomicaFederal.CODIGO_OPERACAO; + +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; + +/** + *+ * O campo livre da Caixa Econômica Federal para cobrança simples (CS), rápida(CR) e sem registro (SR) + * - SICOB, deve seguir esta forma: + *
+ * + *Posição | + *Tamanho | + *Picture | + *Conteúdo (terminologia padrão) | + *Conteúdo (terminologia do banco) | + *
---|---|---|---|---|
20-29 | + *10 | + *9(10) | + *Nosso Número | + *
+ * Nosso Número no padrão de uma das
+ * três cobranças (simples, rápida ou sem registro)
+ *
+ * Exemplos: |
+ *
30-33 | + *4 | + *9(4) | + *Código da Agência | + *Código da Agência Cedente | + *
34-36 | + *3 | + *9(3) | + *Código da Operação | + *Operação Código | + *
37-44 | + *8 | + *9(8) | + *Código do número da conta | + *Código fornecido pela Agência | + *
+ * 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+ * 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: + *
+ * Verifica se o nosso número informado tem o padrão esperado de acordo com + * o código da carteira informada. + *
+ *+ * Obs: Como não há uma garantia documental de que todo nosso número que + * começa com "3" pertencerá somente a carteira 11, então o mais + * coerente é não amarrar o início do nosso número a determinada carteira, + * mas sim o contrário, ou seja, amarrar que toda carteira 11 tem de ter o + * nosso número iniciando com 3". O mesmo raciocíno serve para as outras + * carteiras. + *
+ * + * @param nossoNumero + * - Nosso Número + * @param codigoDaCarteira + * - Código da carteira + */ + private void checkPadraoNossoNumeroPorCodigoDaCarteira(String nossoNumero, Integer codigoDaCarteira){ + switch (codigoDaCarteira) { + case 11: + if(!nossoNumero.startsWith("3")){ + Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 11 (cobrança simples), o nosso número [%s] deve começar com 3!", nossoNumero)); + } + break; + + case 12: + if(!nossoNumero.startsWith("9")){ + Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 12 (cobrança rápida), o nosso número [%s] deve começar com 9!", nossoNumero)); + } + break; + + case 14: + if(!nossoNumero.startsWith("80") && !nossoNumero.startsWith("81") && !nossoNumero.startsWith("82")){ + Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 14 (cobrança sem registro), o nosso número [%s] deve começar com 80, 81 ou 82!", nossoNumero)); + } + break; + } + } + + + @Override + protected void addFields(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + @Override + protected void checkValues(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java b/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java index e53e7b6b..8d3a9230 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLCaixaEconomicaFederalSICOBNossoNumero14.java @@ -1,222 +1,222 @@ -/* - * Copyright 2011 JRimum Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by - * applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS - * OF ANY KIND, either express or implied. See the License for the specific - * language governing permissions and limitations under the License. - * - * Created at: 14/04/2011 - 20:16:07 - * - * ================================================================================ - * - * Direitos autorais 2011 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 14/04/2011 - 20:16:07 - * - */ - -package org.jrimum.bopepo.campolivre; - -import static java.lang.String.format; - -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Objects; - -/** - *- * O campo livre da Caixa para Cobrança Sem Registro SICOB - Nosso Número 16 - * posições, deve seguir esta forma: - *
- * - *Posição | - *Tamanho | - *Picture | - *Conteúdo (terminologia padrão) | - *Conteúdo (terminologia do banco) | - *
---|---|---|---|---|
20-24 | - *5 | - *9(5) | - *Código do Cliente(sem dígito - * verificador) | - *Código do Cliente Cedente - * fornecido pela CAIXA | - *
25-28 | - *4 | - *9(4) | - *Código da Agência(sem dígito - * verificador) | - *CNPJ da Agência da Conta do - * Cliente Cedente | - *
29-29 | - *1 | - *9(1) | - *Código da Carteira = 8 | - *Código da Carteira = 8 | - *
30-30 | - *1 | - *9(1) | - *Constante = 7 | - *Constante = 7 | - *
31-44 | - *14 | - *9(14) | - *Nosso Número(sem dígito - * verificador) | - *Nosso Número do Cliente com 14 - * posições | - *
- * 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
- * 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.
- *
+ * O campo livre da Caixa para Cobrança Sem Registro SICOB - Nosso Número 16 + * posições, deve seguir esta forma: + *
+ * + *Posição | + *Tamanho | + *Picture | + *Conteúdo (terminologia padrão) | + *Conteúdo (terminologia do banco) | + *
---|---|---|---|---|
20-24 | + *5 | + *9(5) | + *Código do Cliente(sem dígito + * verificador) | + *Código do Cliente Cedente + * fornecido pela CAIXA | + *
25-28 | + *4 | + *9(4) | + *Código da Agência(sem dígito + * verificador) | + *CNPJ da Agência da Conta do + * Cliente Cedente | + *
29-29 | + *1 | + *9(1) | + *Código da Carteira = 8 | + *Código da Carteira = 8 | + *
30-30 | + *1 | + *9(1) | + *Constante = 7 | + *Constante = 7 | + *
31-44 | + *14 | + *9(14) | + *Nosso Número(sem dígito + * verificador) | + *Nosso Número do Cliente com 14 + * posições | + *
+ * 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+ * Motivo extraído do manual do banco: + * + * Carteira Sem Registro Eletrônica com Nosso Número de 16 posições, + * sendo que 14 destas posições são para livre uso pelo Cedente. Apenas + * Clientes Cedentes com Código do Cedente na operação 870 podem operar com + * a Cobrança Sem Registro com 16 posições de Nosso Número. + *
+ * + * @param titulo + */ + private void checkCarteiraSemRegistro(Titulo titulo) { + + Objects.checkArgument( + titulo.getContaBancaria().getCarteira().getCodigo().equals(CARTEIRA_SEM_REGISTRO), + format("Apenas a carteira de código [8] \"Carteira Sem Registro Eletrônica\" é permitida e não o código [%s]!", titulo.getContaBancaria().getCarteira().getCodigo()) + ); + } + +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java b/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java index 9120d98a..08842a27 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLItauPadrao.java @@ -1,297 +1,297 @@ -/* - * Copyright 2008 JRimum Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * Created at: 16/04/2008 - 23:09:08 - * - * ================================================================================ - * - * Direitos autorais 2008 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode - * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob esta - * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam - * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões - * e limitações sob esta LICENÇA. - * - * Criado em: 16/04/2008 - 23:09:08 - * - */ - -package org.jrimum.bopepo.campolivre; - -import java.util.Arrays; - -import org.jrimum.domkee.banco.ContaBancaria; -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Exceptions; - -/** - * - * - *- * Campo livre padrão do Banco Itaú - *
- * - *- *
Posição | - *Tamanho | - *Picture | - *Conteúdo | - *
---|---|---|---|
20 a 22 | - *3 | - *9(03) | - *Carteira | - *
23 a 30 | - *8 | - *9(08) | - *Nosso número | - *
31 a 31 | - *1 | - *9(01) | - *DAC [Agência /Conta/Carteira/Nosso Número] | - *
32 a 35 | - *4 | - *9(04) | - *N.º da Agência cedente | - *
36 a 40 | - *5 | - *9(05) | - *N.º da Conta Corrente | - *
41 a 41 | - *1 | - *9(01) | - *DAC [Agência/Conta Corrente] | - *
42 a 44 | - *3 | - *9(03) | - *Zeros | - *
- * 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- * 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:
- *
+ * Campo livre padrão do Banco Itaú + *
+ * + *+ *
Posição | + *Tamanho | + *Picture | + *Conteúdo | + *
---|---|---|---|
20 a 22 | + *3 | + *9(03) | + *Carteira | + *
23 a 30 | + *8 | + *9(08) | + *Nosso número | + *
31 a 31 | + *1 | + *9(01) | + *DAC [Agência /Conta/Carteira/Nosso Número] | + *
32 a 35 | + *4 | + *9(04) | + *N.º da Agência cedente | + *
36 a 40 | + *5 | + *9(05) | + *N.º da Conta Corrente | + *
41 a 41 | + *1 | + *9(01) | + *DAC [Agência/Conta Corrente] | + *
42 a 44 | + *3 | + *9(03) | + *Zeros | + *
+ * 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+ * 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: + *
- * Campo Livre para o Banco Mercantil do Brasil. Segue o seguinte formato:
- *
- *
Posição | - *Tamanho | - *Picture | - *Conteúdo | - *
---|---|---|---|
20-23 | - *4 | - *9 | - *Agência do Cedente(sem dígito) | - *
24-34 | - *11 | - *9 | - *Nosso Número (com dígito) | - *
35-43 | - *9 | - *9 | - *Código do Cedente (Contrato de Cobrança) | - *
44-44 | - *1 | - *9 | - *Indicador de desconto: =2 sem desconto =0 com desconto |
- *
- * 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-// * Calcula o dígito verificador do Nosso Número. -// *
-// *-// * É calculado através do módulo 11 a partir do código da agência e do Nosso Número. -// *
-// * -// * @param agencia Código da agência -// * @param nossoNumero Nosso Número -// * @return digito verificador -// * -// * @since 0.2 -// */ -// private int calculeDigitoVerificadorDoNossoNumero(Integer agencia, String nossoNumero) { -// -// Modulo modulo = new Modulo(EnumModulo.MODULO11); -// int resto = modulo.calcule(Fillers.ZERO_LEFT.fill(agencia, 4) + nossoNumero); -// -// int digito = modulo.valor() - resto; -// -// return digito; -// } - @Override - protected void addFields(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - @Override - protected void checkValues(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - -} +/* + * Copyright 2008 JRimum Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * Created at: 25/09/2008 - 21:23:20 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 25/09/2008 - 21:23:20 + * + */ +package org.jrimum.bopepo.campolivre; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +import org.jrimum.domkee.banco.ContaBancaria; +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Exceptions; + +/** + * + *
+ * Campo Livre para o Banco Mercantil do Brasil. Segue o seguinte formato:
+ *
+ *
Posição | + *Tamanho | + *Picture | + *Conteúdo | + *
---|---|---|---|
20-23 | + *4 | + *9 | + *Agência do Cedente(sem dígito) | + *
24-34 | + *11 | + *9 | + *Nosso Número (com dígito) | + *
35-43 | + *9 | + *9 | + *Código do Cedente (Contrato de Cobrança) | + *
44-44 | + *1 | + *9 | + *Indicador de desconto: =2 sem desconto =0 com desconto |
+ *
+ * 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+// * Calcula o dígito verificador do Nosso Número. +// *
+// *+// * É calculado através do módulo 11 a partir do código da agência e do Nosso Número. +// *
+// * +// * @param agencia Código da agência +// * @param nossoNumero Nosso Número +// * @return digito verificador +// * +// * @since 0.2 +// */ +// private int calculeDigitoVerificadorDoNossoNumero(Integer agencia, String nossoNumero) { +// +// Modulo modulo = new Modulo(EnumModulo.MODULO11); +// int resto = modulo.calcule(Fillers.ZERO_LEFT.fill(agencia, 4) + nossoNumero); +// +// int digito = modulo.valor() - resto; +// +// return digito; +// } + @Override + protected void addFields(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + @Override + protected void checkValues(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + +} diff --git a/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java b/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java index f3af03c6..924105a0 100644 --- a/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java +++ b/src/main/java/org/jrimum/bopepo/campolivre/CLUnibancoCobrancaNaoRegistrada.java @@ -1,161 +1,161 @@ -package org.jrimum.bopepo.campolivre; - -import org.apache.commons.lang3.StringUtils; -import org.jrimum.domkee.banco.ContaBancaria; -import org.jrimum.domkee.banco.Titulo; -import org.jrimum.texgit.Fillers; -import org.jrimum.texgit.FixedField; -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Objects; -import org.jrimum.utilix.Strings; - -/** - * - *- * Representação do campo livre usado para boletos com carteiras (cobrança) - * sem registro. - *
- * - *
- * Layout:
- *
- * Cobrança Especial (sem registro) - *
- * - *Posição | - *Campo Livre No Código De - * Barras (20 a 44) | - *
20 | - * - *Código da transação = 5 | - *
21 a 26 | - *Número do Cliente (Espécie de conta) | - *
27 | - *Dígito Verificador do Número do Cliente | - *
28 a 29 | - *zeros | - *
30 a 43 | - *Referência do Cliente (Nosso Número Gerado Pelo - * Cliente) | - *
44 | - *Dígito Verificador da Referência do Cliente | - *
- * 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+ * Representação do campo livre usado para boletos com carteiras (cobrança) + * sem registro. + *
+ * + *+ * Layout: + *
+ * Cobrança Especial (sem registro) + *
+ * + *Posição | + *Campo Livre No Código De + * Barras (20 a 44) | + *
20 | + * + *Código da transação = 5 | + *
21 a 26 | + *Número do Cliente (Espécie de conta) | + *
27 | + *Dígito Verificador do Número do Cliente | + *
28 a 29 | + *zeros | + *
30 a 43 | + *Referência do Cliente (Nosso Número Gerado Pelo + * Cliente) | + *
44 | + *Dígito Verificador da Referência do Cliente | + *
+ * 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- * Representação do campo livre usado para boletos com carteiras (cobrança) - * com registro. - *
- * - *
- * Layout:
- *
- * Cobrança Direta (com registro) - *
- * - *Posição | - *Campo Livre No Código De - * Barras (20 a 44) | - *
20 a 21 | - *Código da transação = 04 | - * - *
22 a 27 | - *Data do Vencimento do Título (AAMMDD) | - *
28 a 31 | - * - *Agência do Cedente | - *
32 | - * - *Dígito Verificador da Agência do Cedente | - *
33 a 43 | - *Nosso Número | - *
44 | - *Super Digito do Nosso Número (*) | - *
- * 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- * Calcula o Super Dígito do Nosso Número. - *
- * - *- * Super dígito do “Nosso Número” [calculado com o MÓDULO 11 (de 2 a 9)] - * obtido utilizando-se os algarismos do “Nosso Número” acrescido do número - * 1 à esquerda = [1/NNNNNNNNNNN] e multiplicando-se a sequência obetem-se a - * soma dos produtos. Em seguida multiplicando-se novamente a soma por 10 e - * depois realizando-se o módulo 11. - *
- * - * - * @param nossoNumero - * - * @return Dígito verficador calculado - * - * @see #calculeDigitoEmModulo11(String) - * @see org.jrimum.vallia.digitoverificador.Modulo - * - * @since 0.2 - */ - private String calculeSuperDigito(String nossoNumero) { - - return calculeDigitoEmModulo11("1" + nossoNumero); - } - - @Override - protected void addFields(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - @Override - protected void checkValues(Titulo titulo) { - // TODO IMPLEMENTAR - Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } -} +package org.jrimum.bopepo.campolivre; + +import static org.jrimum.utilix.DateFormat.YYMMDD; + +import java.util.Date; + +import org.apache.commons.lang3.StringUtils; +import org.jrimum.domkee.banco.ContaBancaria; +import org.jrimum.domkee.banco.Titulo; +import org.jrimum.texgit.Fillers; +import org.jrimum.texgit.FixedField; +import org.jrimum.utilix.Exceptions; +import org.jrimum.utilix.Objects; +import org.jrimum.utilix.Strings; + +/** + * + *+ * Representação do campo livre usado para boletos com carteiras (cobrança) + * com registro. + *
+ * + *+ * Layout: + *
+ * Cobrança Direta (com registro) + *
+ * + *Posição | + *Campo Livre No Código De + * Barras (20 a 44) | + *
20 a 21 | + *Código da transação = 04 | + * + *
22 a 27 | + *Data do Vencimento do Título (AAMMDD) | + *
28 a 31 | + * + *Agência do Cedente | + *
32 | + * + *Dígito Verificador da Agência do Cedente | + *
33 a 43 | + *Nosso Número | + *
44 | + *Super Digito do Nosso Número (*) | + *
+ * 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+ * Calcula o Super Dígito do Nosso Número. + *
+ * + *+ * Super dígito do “Nosso Número” [calculado com o MÓDULO 11 (de 2 a 9)] + * obtido utilizando-se os algarismos do “Nosso Número” acrescido do número + * 1 à esquerda = [1/NNNNNNNNNNN] e multiplicando-se a sequência obetem-se a + * soma dos produtos. Em seguida multiplicando-se novamente a soma por 10 e + * depois realizando-se o módulo 11. + *
+ * + * + * @param nossoNumero + * + * @return Dígito verficador calculado + * + * @see #calculeDigitoEmModulo11(String) + * @see org.jrimum.vallia.digitoverificador.Modulo + * + * @since 0.2 + */ + private String calculeSuperDigito(String nossoNumero) { + + return calculeDigitoEmModulo11("1" + nossoNumero); + } + + @Override + protected void addFields(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + @Override + protected void checkValues(Titulo titulo) { + // TODO IMPLEMENTAR + Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } +} diff --git a/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java b/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java index 92b3f6ec..211dda5e 100644 --- a/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java +++ b/src/main/java/org/jrimum/bopepo/pdf/PdfDateConverter.java @@ -1,163 +1,163 @@ -/* - * Copyright 2011 JRimum Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by - * applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS - * OF ANY KIND, either express or implied. See the License for the specific - * language governing permissions and limitations under the License. - * - * Created at: 30/09/2011 - 16:07:23 - * - * ================================================================================ - * - * Direitos autorais 2011 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 30/09/2011 - 16:07:23 - * - */ - -package org.jrimum.bopepo.pdf; - -import static java.lang.String.format; -import static org.jrimum.texgit.Fillers.ZERO_LEFT; -import static org.jrimum.utilix.Objects.isNotNull; - -import java.util.Calendar; -import java.util.TimeZone; - -import org.jrimum.utilix.Objects; - -/** - * Converte datas para o formato usando no padrão PDF. - * - *
- * PDF defines standard date format, which closely follows that of the
- * international standard ASN.1 (Abstract Syntax Notation One), defined in
- * ISO/IEC 8824. A date is a string of the form (D:YYYYMMDDHHmmSSOHH'mm')
- * where:
- *
- * The default values for MM and DD are both 01; all other numerical fields - * default to zero values. A plus sign (+) as the value of the O field signifies - * that local time is later than UT, a minus sign (-) that local time is earlier - * than UT, and the letter Z that local time is equal to UT. If no UT - * information is specified, the relationship of the specified time to UT is - * considered to be unknown. Whether or not the time zone is known, the rest of - * the date should be specified in local time. - *
- *- * For example, April 14, 2010, at 9:50 PM, U.S. Pacific Standard Time, is - * represented by the string (D:201004142150-08'00') - *
- * - * @author Gilmar P.S.L. - * - * @version 0.2.3 - * - * @since 0.2 - */ -public class PdfDateConverter { - - /** - * Converte a data para o formato de data do PDF: - * {@code D:YYYYMMDDHHmmSSOHH'mm'}, caso não exista um time zone, o fuso - * horário do meridiano de Greenwich então será usado, resultando em - * D:YYYYMMDDHHmm{@code "Z00'00'"}. - * - * @param date - * - * @return data no formato PDF: {@code D:YYYYMMDDHHmmSSOHH'mm'} - */ - public static String convert(final Calendar date) { - - Objects.checkNotNull(date, - "Null não pode ser convertido em uma data no formato PDF!"); - - final int NOT_INDEX = 1; - - StringBuilder dateTime = new StringBuilder("D:") - .append(date.get(Calendar.YEAR)) - .append(ZERO_LEFT.fill(date.get(Calendar.MONTH) + NOT_INDEX, 2)) - .append(ZERO_LEFT.fill(date.get(Calendar.DAY_OF_MONTH), 2)) - .append(ZERO_LEFT.fill(date.get(Calendar.HOUR_OF_DAY), 2)) - .append(ZERO_LEFT.fill(date.get(Calendar.MINUTE), 2)) - .append(ZERO_LEFT.fill(date.get(Calendar.SECOND), 2)) - .append(convertTimeZone(date)); - - return dateTime.toString(); - } - - /** - * Converte o time zone para o formato {@code "OHH'mm'"}, caso não exista um - * time zone, o fuso horário do meridiano de Greenwich então será usado, - * resultando no valor {@code "Z00'00'"}. - * - * @param date - * - * @return time zone no formato {@code "OHH'mm'"} - */ - private static String convertTimeZone(final Calendar date) { - - final int MINUTES_PER_HOUR = 60; - final int MILLISECONDS_PER_SECOND = 1000; - final int SECONDS_PER_MINUTE = 60; - - final TimeZone tz = date.getTimeZone(); - - String timeZone = "Z00'00'"; - - if (isNotNull(tz)) { - - final long offset = tz.getOffset(date.getTimeInMillis()); - - final long timeInMinutes = Math.abs(offset)/MILLISECONDS_PER_SECOND/SECONDS_PER_MINUTE; - - final String signal = offset == 0 ? "Z" : (offset > 0 ? "+" : "-"); - - long hours = 0; - long minutes = 0; - - if (timeInMinutes > MINUTES_PER_HOUR) { - - hours = timeInMinutes / MINUTES_PER_HOUR; - minutes = timeInMinutes % MINUTES_PER_HOUR; - - } else { - minutes = timeInMinutes; - } - - timeZone = format("%1$s%2$02d'%3$02d'", signal, hours, minutes); - } - - return timeZone; - } - -} +/* + * Copyright 2011 JRimum Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by + * applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS + * OF ANY KIND, either express or implied. See the License for the specific + * language governing permissions and limitations under the License. + * + * Created at: 30/09/2011 - 16:07:23 + * + * ================================================================================ + * + * Direitos autorais 2011 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar + * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob + * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER + * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a + * reger permissões e limitações sob esta LICENÇA. + * + * Criado em: 30/09/2011 - 16:07:23 + * + */ + +package org.jrimum.bopepo.pdf; + +import static java.lang.String.format; +import static org.jrimum.texgit.Fillers.ZERO_LEFT; +import static org.jrimum.utilix.Objects.isNotNull; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.jrimum.utilix.Objects; + +/** + * Converte datas para o formato usando no padrão PDF. + * + *+ * PDF defines standard date format, which closely follows that of the + * international standard ASN.1 (Abstract Syntax Notation One), defined in + * ISO/IEC 8824. A date is a string of the form (D:YYYYMMDDHHmmSSOHH'mm') + * where: + *
+ * The default values for MM and DD are both 01; all other numerical fields + * default to zero values. A plus sign (+) as the value of the O field signifies + * that local time is later than UT, a minus sign (-) that local time is earlier + * than UT, and the letter Z that local time is equal to UT. If no UT + * information is specified, the relationship of the specified time to UT is + * considered to be unknown. Whether or not the time zone is known, the rest of + * the date should be specified in local time. + *
+ *+ * For example, April 14, 2010, at 9:50 PM, U.S. Pacific Standard Time, is + * represented by the string (D:201004142150-08'00') + *
+ * + * @author Gilmar P.S.L. + * + * @version 0.2.3 + * + * @since 0.2 + */ +public class PdfDateConverter { + + /** + * Converte a data para o formato de data do PDF: + * {@code D:YYYYMMDDHHmmSSOHH'mm'}, caso não exista um time zone, o fuso + * horário do meridiano de Greenwich então será usado, resultando em + * D:YYYYMMDDHHmm{@code "Z00'00'"}. + * + * @param date + * + * @return data no formato PDF: {@code D:YYYYMMDDHHmmSSOHH'mm'} + */ + public static String convert(final Calendar date) { + + Objects.checkNotNull(date, + "Null não pode ser convertido em uma data no formato PDF!"); + + final int NOT_INDEX = 1; + + StringBuilder dateTime = new StringBuilder("D:") + .append(date.get(Calendar.YEAR)) + .append(ZERO_LEFT.fill(date.get(Calendar.MONTH) + NOT_INDEX, 2)) + .append(ZERO_LEFT.fill(date.get(Calendar.DAY_OF_MONTH), 2)) + .append(ZERO_LEFT.fill(date.get(Calendar.HOUR_OF_DAY), 2)) + .append(ZERO_LEFT.fill(date.get(Calendar.MINUTE), 2)) + .append(ZERO_LEFT.fill(date.get(Calendar.SECOND), 2)) + .append(convertTimeZone(date)); + + return dateTime.toString(); + } + + /** + * Converte o time zone para o formato {@code "OHH'mm'"}, caso não exista um + * time zone, o fuso horário do meridiano de Greenwich então será usado, + * resultando no valor {@code "Z00'00'"}. + * + * @param date + * + * @return time zone no formato {@code "OHH'mm'"} + */ + private static String convertTimeZone(final Calendar date) { + + final int MINUTES_PER_HOUR = 60; + final int MILLISECONDS_PER_SECOND = 1000; + final int SECONDS_PER_MINUTE = 60; + + final TimeZone tz = date.getTimeZone(); + + String timeZone = "Z00'00'"; + + if (isNotNull(tz)) { + + final long offset = tz.getOffset(date.getTimeInMillis()); + + final long timeInMinutes = Math.abs(offset)/MILLISECONDS_PER_SECOND/SECONDS_PER_MINUTE; + + final String signal = offset == 0 ? "Z" : (offset > 0 ? "+" : "-"); + + long hours = 0; + long minutes = 0; + + if (timeInMinutes > MINUTES_PER_HOUR) { + + hours = timeInMinutes / MINUTES_PER_HOUR; + minutes = timeInMinutes % MINUTES_PER_HOUR; + + } else { + minutes = timeInMinutes; + } + + timeZone = format("%1$s%2$02d'%3$02d'", signal, hours, minutes); + } + + return timeZone; + } + +} diff --git a/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java b/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java index 08e7b1e6..b8c02af5 100644 --- a/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java +++ b/src/main/java/org/jrimum/bopepo/pdf/PdfDocInfo.java @@ -1,410 +1,410 @@ -/* - * Copyright 2011 JRimum Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by - * applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS - * OF ANY KIND, either express or implied. See the License for the specific - * language governing permissions and limitations under the License. - * - * Created at: 19/09/2011 - 15:43:26 - * - * ================================================================================ - * - * Direitos autorais 2011 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 19/09/2011 - 15:43:26 - * - */ -package org.jrimum.bopepo.pdf; - -import com.itextpdf.text.pdf.PdfDate; -import static org.jrimum.utilix.Objects.checkNotNull; -import static org.jrimum.utilix.Objects.isNotNull; - -import java.util.Calendar; -import java.util.HashMap; -import java.util.Map; - -import org.jrimum.utilix.Exceptions; -import org.jrimum.utilix.Objects; - -/** - * Pricipais informações de um documento PDF: Título, Autor, Assunto, - * Palavras-chave, Aplicativo criador, Data de criação e Data de - * modificação - * . - * - * @author Gilmar P.S.L. - * - */ -public class PdfDocInfo { - - /* - * Mesmas chaves de pesquisa usadas pelo itext. - */ - /** - * Key = Título do documento. - */ - private static final String DOC_TITLE = "Title"; - /** - * Key = Autor do documento. - */ - private static final String DOC_AUTHOR = "Author"; - /** - * Key = Assunto do documento. - */ - private static final String DOC_SUBJECT = "Subject"; - /** - * Key = Palavras-chave do documento. - */ - private static final String DOC_KEYWORDS = "Keywords"; - /** - * Key = Ferramenta/Software usada para do documento. - */ - private static final String DOC_CREATOR = "Creator"; - /** - * Key = Data de criação do documento. - */ - private static final String DOC_CREATION_DATE = "CreationDate"; - /** - * Key = Data de modificação do documento. - */ - private static final String DOC_MODIFACTION_DATE = "ModDate"; - - /** - * Key = Ferramenta/Software que de fato produziu o documento. - */ - private static final String DOC_PRODUCER = "Producer"; - - /** - * Map com informações sobre o documento: Title, Author, Subject, etc. - */ - private final Map- * 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+ * 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- * Agrupa as formas de "visão" de um boleto. - *
- * - *- * Exemplo de formas de visualização: - *
- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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- * 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
- * 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:
- *
- * 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:
- *
- * 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:
- *
- * 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:
- *
- * 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:
- *
- * 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:
- *
- * 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- * "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+ * Agrupa as formas de "visão" de um boleto. + *
+ * + *+ * Exemplo de formas de visualização: + *
+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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+ * 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: + *
+ * 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: + *
+ * 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: + *
+ * 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: + *
+ * 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: + *
+ * 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: + *
+ * 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+ * "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- * Agrupa as formas de visualização de um boleto. - *
- * - *- * EXEMPLO de formas de visualização: - *
- * Engine responsável pela visualização em formato PDF. - */ - private ViewerPDF viewerPDF; - - /** - * @param guia - * @throws DocumentException - * @throws IOException - */ - public GuiaViewer(Guia guia) throws RuntimeException { - initViewerPDF(null, null, guia); - } - - /** - * @param guia - * @param templatePathName - * @throws RuntimeException - */ - public GuiaViewer(Guia guia, String templatePathName) throws RuntimeException { - initViewerPDF(templatePathName, null, guia); - } - - /** - * @param guia - * @param template - * @throws RuntimeException - */ - public GuiaViewer(Guia guia, File template) throws RuntimeException { - initViewerPDF(null, template, guia); - } - - /** - *
- * Para uso interno do componente
- */ - protected GuiaViewer() { - this.viewerPDF = new ViewerPDF(); - } - - /** - *- * Agrupo vários guias em um único pdf. - *
- * - * @param pathName Caminho no qual será gerado o pdf - * @param guias Guias a serem agrupadas - * @return Arquivo pdf - * @throws RuntimeException - * - * @since 0.2 - */ - public static File groupInOnePDF(String pathName, List- * Gera vários arquivos pdf, cada qual com a sua guia. - *
- * - * @param path Caminho no qual será gerados os arquivos - * @param extensao TODO - * @param guias Guias a partir dos quais serão gerados os arquivos - * @return Vários arquivos pdf - * @throws RuntimeException - * - * @since 0.2 - */ - public static List- * Define o template que será utilizado para construir o guia. - *
- * - * @param template - * - * @since 0.2 - */ - public GuiaViewer setTemplate(File template) { - - if (isNotNull(template)) { - this.viewerPDF.setTemplate(template); - - } else { - throw new NullPointerException("Arquivo de template inválido: valor [null]"); - } - - return this; - } - - /** - *- * @see GuiaViewer#setTemplate(File) - *
- * - * @param pathName - * - * @since 0.2 - */ - public GuiaViewer setTemplate(String pathName) { - - if (isNotBlank(pathName)) { - viewerPDF.setTemplate(pathName); - - } else { - throw new IllegalArgumentException("Caminho do template inválido: valor [" + pathName + "]"); - } - - return this; - } - - /** - *- * Caso algum template tenha sido utilizado, este método define que após sua - * execução o guia será consturído com o template padrão. - *
- * - * @since 0.2 - */ - public GuiaViewer removeTemplate() { - - final String PADRAO = null; - - if (isNotNull(viewerPDF)) { - viewerPDF.setTemplate(PADRAO); - } - - return this; - } - - /** - *- * Retorna o guia em um arquivo pdf. - *
- * - * @param pathName Caminho onde será criado o arquivo pdf - * @return File - * @throws IllegalArgumentException - * - * @since 0.2 - */ - public File getPdfAsFile(String pathName) { - - if (log.isDebugEnabled()) { - log.debug("Documento instance: " + viewerPDF); - } - - return viewerPDF.getFile(pathName); - } - - /** - *- * Retorna o guia em uma stream. - *
- * - * @return ByteArrayOutputStream - * - * @since 0.1 - */ - public ByteArrayOutputStream getPdfAsStream() { - - if (log.isDebugEnabled()) { - log.debug("documento instance : " + viewerPDF); - } - - return viewerPDF.getStream(); - - } - - /** - *- * Retorna o guia em um array de bytes. - *
- * - * @return byte[] - * - * @since 0.1 - */ - public byte[] getPdfAsByteArray() { - - if (log.isDebugEnabled()) { - log.debug("documento instance : " + viewerPDF); - } - - return viewerPDF.getBytes(); - } - - /** - * @return the guia - * - * @since 0.2 - */ - public Guia getGuia() { - return viewerPDF.getGuia(); - } - - /** - * @param guia the guia to set - * - * @since 0.2 - */ - public GuiaViewer setGuia(Guia guia) { - - if (isNotNull(guia)) { - updateViewerPDF(guia); - } - - return this; - } - - private static boolean validatePathName(String pathName) { - - boolean ok = false; - - if (isNotNull(pathName)) { - - if (StringUtils.isNotBlank(pathName)) { - ok = true; - } else { - throw new IllegalArgumentException("Path(Diretório) destinado a geração do(s) arquivo(s) não contém informação!"); - } - } - - return ok; - } - - private static boolean validateFile(File file, String name) { - - boolean ok = false; - - if (isNotNull(file)) { - ok = true; - } else { - throw new NullPointerException("File(Arquivo) destinado a geração do(s) documento(s) [" + name + "] nulo!"); - } - - return ok; - } - - private static boolean validateGuiasList(List- * Atualiza o objeto GuiaViewer mantendo as "invariantes". - *
- * - * @param guia - * - * @since - */ - private void updateViewerPDF(Guia guia) { - - if (isNotNull(this.viewerPDF)) { - this.viewerPDF = new ViewerPDF(guia, this.viewerPDF.getTemplate()); - - } else { - this.viewerPDF = new ViewerPDF(guia); - } - } -} +/* + * Copyright 2008 JRimum Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * Created at: 08/05/2008 - 00:10:01 + * + * ================================================================================ + * + * Direitos autorais 2008 JRimum Project + * + * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode + * usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma + * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que + * haja exigência legal ou acordo por escrito, a distribuição de software sob esta + * LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam + * expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões + * e limitações sob esta LICENÇA. + * + * Criado em: 08/05/2008 - 00:10:01 + * + */ +package org.jrimum.bopepo.view; + +import com.itextpdf.text.DocumentException; +import org.jrimum.bopepo.Guia; +import static org.apache.commons.lang3.StringUtils.isNotBlank; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + +import static org.jrimum.utilix.Objects.isNotNull; + +/** + * + *+ * Agrupa as formas de visualização de um boleto. + *
+ * + *+ * EXEMPLO de formas de visualização: + *
+ * Engine responsável pela visualização em formato PDF. + */ + private ViewerPDF viewerPDF; + + /** + * @param guia + * @throws RuntimeException + */ + public GuiaViewer(Guia guia) throws RuntimeException { + initViewerPDF(null, null, guia); + } + + /** + * @param guia + * @param templatePathName + * @throws RuntimeException + */ + public GuiaViewer(Guia guia, String templatePathName) throws RuntimeException { + initViewerPDF(templatePathName, null, guia); + } + + /** + * @param guia + * @param template + * @throws RuntimeException + */ + public GuiaViewer(Guia guia, File template) throws RuntimeException { + initViewerPDF(null, template, guia); + } + + /** + *
+ * Para uso interno do componente
+ */ + protected GuiaViewer() { + this.viewerPDF = new ViewerPDF(); + } + + /** + *+ * Agrupo vários guias em um único pdf. + *
+ * + * @param pathName Caminho no qual será gerado o pdf + * @param guias Guias a serem agrupadas + * @return Arquivo pdf + * @throws RuntimeException + * + * @since 0.2 + */ + public static File groupInOnePDF(String pathName, List+ * Gera vários arquivos pdf, cada qual com a sua guia. + *
+ * + * @param path Caminho no qual será gerados os arquivos + * @param extensao TODO + * @param guias Guias a partir dos quais serão gerados os arquivos + * @return Vários arquivos pdf + * @throws RuntimeException + * + * @since 0.2 + */ + public static List+ * Define o template que será utilizado para construir o guia. + *
+ * + * @param template + * + * @since 0.2 + */ + public GuiaViewer setTemplate(File template) { + + if (isNotNull(template)) { + this.viewerPDF.setTemplate(template); + + } else { + throw new NullPointerException("Arquivo de template inválido: valor [null]"); + } + + return this; + } + + /** + *+ * @see GuiaViewer#setTemplate(File) + *
+ * + * @param pathName + * + * @since 0.2 + */ + public GuiaViewer setTemplate(String pathName) { + + if (isNotBlank(pathName)) { + viewerPDF.setTemplate(pathName); + + } else { + throw new IllegalArgumentException("Caminho do template inválido: valor [" + pathName + "]"); + } + + return this; + } + + /** + *+ * Caso algum template tenha sido utilizado, este método define que após sua + * execução o guia será consturído com o template padrão. + *
+ * + * @since 0.2 + */ + public GuiaViewer removeTemplate() { + + final String PADRAO = null; + + if (isNotNull(viewerPDF)) { + viewerPDF.setTemplate(PADRAO); + } + + return this; + } + + /** + *+ * Retorna o guia em um arquivo pdf. + *
+ * + * @param pathName Caminho onde será criado o arquivo pdf + * @return File + * @throws IllegalArgumentException + * + * @since 0.2 + */ + public File getPdfAsFile(String pathName) { + + if (log.isDebugEnabled()) { + log.debug("Documento instance: " + viewerPDF); + } + + return viewerPDF.getFile(pathName); + } + + /** + *+ * Retorna o guia em uma stream. + *
+ * + * @return ByteArrayOutputStream + * + * @since 0.1 + */ + public ByteArrayOutputStream getPdfAsStream() { + + if (log.isDebugEnabled()) { + log.debug("documento instance : " + viewerPDF); + } + + return viewerPDF.getStream(); + + } + + /** + *+ * Retorna o guia em um array de bytes. + *
+ * + * @return byte[] + * + * @since 0.1 + */ + public byte[] getPdfAsByteArray() { + + if (log.isDebugEnabled()) { + log.debug("documento instance : " + viewerPDF); + } + + return viewerPDF.getBytes(); + } + + /** + * @return the guia + * + * @since 0.2 + */ + public Guia getGuia() { + return viewerPDF.getGuia(); + } + + /** + * @param guia the guia to set + * + * @since 0.2 + */ + public GuiaViewer setGuia(Guia guia) { + + if (isNotNull(guia)) { + updateViewerPDF(guia); + } + + return this; + } + + private static boolean validatePathName(String pathName) { + + boolean ok = false; + + if (isNotNull(pathName)) { + + if (StringUtils.isNotBlank(pathName)) { + ok = true; + } else { + throw new IllegalArgumentException("Path(Diretório) destinado a geração do(s) arquivo(s) não contém informação!"); + } + } + + return ok; + } + + private static boolean validateFile(File file, String name) { + + boolean ok = false; + + if (isNotNull(file)) { + ok = true; + } else { + throw new NullPointerException("File(Arquivo) destinado a geração do(s) documento(s) [" + name + "] nulo!"); + } + + return ok; + } + + private static boolean validateGuiasList(List+ * Atualiza o objeto GuiaViewer mantendo as "invariantes". + *
+ * + * @param guia + * + * @since + */ + private void updateViewerPDF(Guia guia) { + + if (isNotNull(this.viewerPDF)) { + this.viewerPDF = new ViewerPDF(guia, this.viewerPDF.getTemplate()); + + } else { + this.viewerPDF = new ViewerPDF(guia); + } + } +} diff --git a/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java b/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java index e6e6f8a4..9b18b9d3 100644 --- a/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java +++ b/src/main/java/org/jrimum/bopepo/view/PdfViewerMultiProcessor.java @@ -1,264 +1,264 @@ -/* - * Copyright 2011 JRimum Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by - * applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS - * OF ANY KIND, either express or implied. See the License for the specific - * language governing permissions and limitations under the License. - * - * Created at: 19/03/2011 - 21:56:10 - * - * ================================================================================ - * - * Direitos autorais 2011 JRimum Project - * - * Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar - * esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma - * cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que - * haja exigência legal ou acordo por escrito, a distribuição de software sob - * esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER - * TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a - * reger permissões e limitações sob esta LICENÇA. - * - * Criado em: 19/03/2011 - 21:56:10 - * - */ - -package org.jrimum.bopepo.view; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map.Entry; - -import org.jrimum.bopepo.Boleto; -import org.jrimum.bopepo.pdf.Files; -import org.jrimum.bopepo.pdf.PDFs; -import org.jrimum.utilix.Exceptions; - -/** - *- * Classe utilizada para preencher o PDF de boletos em lote. - *
- * - * @author Gilmar P.S.L. - * - * @since 0.2 - * - * @version 0.2 - */ -class PdfViewerMultiProcessor { - - /** - * Agrupa os boletos da lista em um único arquivo PDF. - * - * - * @param boletos - * Lista com os boletos a serem agrupados - * @param boletoViewer - * Visualizador contendo o template para geração - * - * @return Arquivo PDF em array de bytes gerado com os boletos da lista - * - * @since 0.2 - */ - protected static byte[] groupInOnePDF(List
- * Exemplo, uma lista com 3 boletos: {@code onePerPDF(boletos, file,
- * "BoletoPrefixo", "exSufixo");}
- *
- * Arquivos gerados:
- *
+ * 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