org.jrimum.bopepo.campolivre.CLCaixaEconomicaFederalSICOBNossoNumero10 Maven / Gradle / Ivy
Show all versions of bpp-cobranca Show documentation
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:
* Cobrança Simples - Nosso número inicia com 3. Ex: Carteira 11
* Cobrança Rápida - Nosso número inicia com 9. Ex: Carteira 12
* Cobrança Sem Registro - Nosso número inicia com 80, 81 ou 82. Ex: Carteira 14.
*
*
*
*
*
* 30-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
*
*
*
*
* @author Gilmar P.S.L.
* @author Misael Barreto
* @see Manuais SICOB - Caixa
* @see Especificação código barras com nosso número de 11 posições
* @see Leiaute de Arquivo Eletrônico Padrão CNAB 240 - Cobrança Bancária CAIXA - SICOB
*
* @since 0.2
*
* @version 0.2
*/
class CLCaixaEconomicaFederalSICOBNossoNumero10 extends AbstractCLCaixaEconomicaFederal {
/**
*
*/
private static final long serialVersionUID = 5585190685525441426L;
/**
*
*/
private static final Integer FIELDS_LENGTH = 4;
/**
*
* Dado um título, cria um campo livre para o padrão do Banco Caixa Econômica
* Federal que tenha o serviço SINCO.
*
*
* @param titulo - Título com as informações para geração do campo livre
*/
CLCaixaEconomicaFederalSICOBNossoNumero10(Titulo titulo) {
super(FIELDS_LENGTH);
Objects.checkNotNull(titulo.getParametrosBancarios(), "Parâmetros bancários necessários [titulo.getParametrosBancarios()==null]!");
checkPadraoNossoNumero(titulo.getNossoNumero());
// TODO: Testar checkPadraoNossoNumeroPorCodigoDaCarteira;
/*
Integer codigoDaCarteira = titulo.getContaBancaria().getCarteira().getCodigo();
if (Objects.isNotNull(codigoDaCarteira)) {
checkPadraoNossoNumeroPorCodigoDaCarteira(titulo.getNossoNumero(), codigoDaCarteira);
}
*/
this.add(new FixedField(titulo.getNossoNumero(), 10));
this.add(new FixedField(titulo.getContaBancaria().getAgencia().getCodigo(), 4, Fillers.ZERO_LEFT));
if(titulo.getParametrosBancarios().contemComNome(CODIGO_OPERACAO)){
Integer cnpv = titulo.getParametrosBancarios().getValor(CODIGO_OPERACAO);
Objects.checkNotNull(titulo.getParametrosBancarios(), "Parâmetro bancário código operação inválido [CodigoOperacao==null]!");
this.add(new FixedField(cnpv, 3, Fillers.ZERO_LEFT));
this.add(new FixedField(titulo.getContaBancaria().getNumeroDaConta().getCodigoDaConta(), 8, Fillers.ZERO_LEFT));
}else{
throw new CampoLivreException("Parâmetro bancário código operação (\"CodigoOperacao\") não encontrado!");
}
}
/**
*
* Verifica se o nosso número do título começa com 3 (identificador da
* Carteira Simples), 9 (identificador da Carteira Rápida) ou 80, 81 ou 82
* (que são identificadores da Carteira Sem Registro); Caso contrário gera
* uma {@code IllegalArgumentException}.
*
*
*
* Padrões aceitos de 10 dígitos:
*
* - 3NNNNNNNNN (a ser validado com os colegas da Neogrid)
* - 9NNNNNNNNN
* - 80NNNNNNNN
* - 81NNNNNNNN
* - 82NNNNNNNN
*
*
*
* @param nn
* - Nosso Número
*/
private void checkPadraoNossoNumero(String nn){
if(!nn.startsWith("3") && !nn.startsWith("9") && !nn.startsWith("80") && !nn.startsWith("81") && !nn.startsWith("82")){
Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB o nosso número [%s] deve começar com 3 que é o identificador da \"carteira siples\" [3NNNNNNNNN] ou 9 que é o identificador da \"carteira rápida\" [9NNNNNNNNN] ou 80, 81 e 82 para \"carteira sem registro\" [82NNNNNNNN]!", nn));
}
}
/**
*
* Verifica se o nosso número informado tem o padrão esperado de acordo com
* o código da carteira informada.
*
*
* Obs: Como não há uma garantia documental de que todo nosso número que
* começa com "3" pertencerá somente a carteira 11, então o mais
* coerente é não amarrar o início do nosso número a determinada carteira,
* mas sim o contrário, ou seja, amarrar que toda carteira 11 tem de ter o
* nosso número iniciando com 3". O mesmo raciocíno serve para as outras
* carteiras.
*
*
* @param nossoNumero
* - Nosso Número
* @param codigoDaCarteira
* - Código da carteira
*/
private void checkPadraoNossoNumeroPorCodigoDaCarteira(String nossoNumero, Integer codigoDaCarteira){
switch (codigoDaCarteira) {
case 11:
if(!nossoNumero.startsWith("3")){
Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 11 (cobrança simples), o nosso número [%s] deve começar com 3!", nossoNumero));
}
break;
case 12:
if(!nossoNumero.startsWith("9")){
Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 12 (cobrança rápida), o nosso número [%s] deve começar com 9!", nossoNumero));
}
break;
case 14:
if(!nossoNumero.startsWith("80") && !nossoNumero.startsWith("81") && !nossoNumero.startsWith("82")){
Exceptions.throwIllegalArgumentException(format("Para a cobrança SICOB, carteira 14 (cobrança sem registro), o nosso número [%s] deve começar com 80, 81 ou 82!", nossoNumero));
}
break;
}
}
@Override
protected void addFields(Titulo titulo) {
// TODO IMPLEMENTAR
Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!");
}
@Override
protected void checkValues(Titulo titulo) {
// TODO IMPLEMENTAR
Exceptions.throwUnsupportedOperationException("AINDA NÃO IMPLEMENTADO!");
}
}