org.jrimum.bopepo.CodigoDeBarras Maven / Gradle / Ivy
Show all versions of bpp-cobranca Show documentation
/*
* Copyright 2008 JRimum Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
* applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
* OF ANY KIND, either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*
* Created at: 30/03/2008 - 18:04:23
*
* ================================================================================
*
* Direitos autorais 2008 JRimum Project
*
* Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode usar
* esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma
* cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que
* haja exigência legal ou acordo por escrito, a distribuição de software sob
* esta LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER
* TIPO, sejam expressas ou tácitas. Veja a LICENÇA para a redação específica a
* reger permissões e limitações sob esta LICENÇA.
*
* Criado em: 30/03/2008 - 18:04:23
*
*/
package org.jrimum.bopepo;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.jrimum.bopepo.campolivre.CampoLivre;
import org.jrimum.domkee.banco.ContaBancaria;
import org.jrimum.domkee.banco.Titulo;
import org.jrimum.texgit.BlockOfFields;
import org.jrimum.texgit.Fillers;
import org.jrimum.texgit.FixedField;
import org.jrimum.utilix.Objects;
import org.jrimum.utilix.DecimalFormat;
import org.jrimum.vallia.BoletoCodigoDeBarrasDV;
/**
*
* É um número único para cada Boleto composto dos seguintes campos:
*
*
*
*
*
* Posição
* Tamanho
* Picture
* Conteúdo
*
*
*
*
* 01-03
* 3
* 9(3)
* Identificação do banco
*
*
* 04-04
* 1
* 9
* Código moeda (9-Real)
*
*
* 05-05
* 1
* 9
* Dígito verificador do
* composição de barras (DV)
*
*
* 06-09
* 4
* 9(4)
* Posições 06 a 09 – fator de
* vencimento
*
*
* 10-19
* 10
* 9(08)v99
* Posições 10 a 19 – valor
* nominal do título
*
*
* 20-44
* 25
* 9(25)
* FixedField livre – utilizado de
* acordo com a especificação interna do banco emissor
*
*
*
*
*
* @author Gilmar P.S.L
* @author Misael Barreto
* @author Rômulo Augusto
* @author Nordeste Fomento
* Mercantil
*
* @since 0.2
*
* @version 0.2
*/
public class CodigoDeBarras extends BlockOfFields {
/**
*
*/
private static final long serialVersionUID = 748913164143978133L;
private static Logger log = Logger.getLogger(CodigoDeBarras.class);
/**
*
*/
private static final Integer FIELDS_LENGTH = 6;
/**
*
*/
private static final Integer STRING_LENGTH = 44;
/**
* Código do Banco.
*/
private FixedField codigoDoBanco;
/**
* Código da moeda usada no boleto.
*/
private FixedField codigoDaMoeda;
/**
* Mecanismo de autenticação usado no composição de barras.
*
* @see org.jrimum.vallia.BoletoCodigoDeBarrasDV
*/
private FixedField digitoVerificadorGeral;
/**
* Representa a quantidade de dias decorridos da data base à data de
* vencimento do título.
*
* @see FatorDeVencimento#toFator(Date)
*/
private FixedField fatorDeVencimento;
/**
* Valor do título.
*/
private FixedField valorNominalDoTitulo;
/**
* @see org.jrimum.bopepo.campolivre.CampoLivre
*/
private FixedField campoLivre;
/**
*
* Cria um Código de Barras a partir do título e campo livre passados.
*
*
* @param titulo
* @param campoLivre
*
* @see CampoLivre
*/
CodigoDeBarras(Titulo titulo, CampoLivre campoLivre) {
super();
setLength(STRING_LENGTH);
setSize(FIELDS_LENGTH);
if (log.isTraceEnabled()) {
log.trace("Instanciando o CodigoDeBarras");
}
if (log.isDebugEnabled()) {
log.debug("titulo instance : " + titulo);
log.debug("campoLivre instance : " + campoLivre);
}
codigoDoBanco = new FixedField("0", 3, Fillers.ZERO_LEFT);
codigoDaMoeda = new FixedField(0, 1, Fillers.ZERO_LEFT);
digitoVerificadorGeral = new FixedField(0, 1, Fillers.ZERO_LEFT);
fatorDeVencimento = new FixedField(0, 4, Fillers.ZERO_LEFT);
valorNominalDoTitulo = new FixedField(new BigDecimal(0), 10, DecimalFormat.NUMBER_DD_BR.copy(), Fillers.ZERO_LEFT);
this.campoLivre = new FixedField(StringUtils.EMPTY, 25);
add(codigoDoBanco);
add(codigoDaMoeda);
add(digitoVerificadorGeral);
add(fatorDeVencimento);
add(valorNominalDoTitulo);
add(this.campoLivre);
ContaBancaria contaBancaria = titulo.getContaBancaria();
this.codigoDoBanco.setValue(contaBancaria.getBanco().getCodigoDeCompensacaoBACEN().getCodigoFormatado());
this.codigoDaMoeda.setValue(titulo.getTipoDeMoeda().getCodigo());
this.calculateAndSetFatorDeVencimento(titulo.getDataDoVencimento());
this.valorNominalDoTitulo.setValue(titulo.getValor());
this.campoLivre.setValue(campoLivre.write());
this.calculateAndSetDigitoVerificadorGeral();
if (log.isDebugEnabled() || log.isTraceEnabled()) {
log.debug("codigoDeBarra instanciado : " + this);
}
}
private void calculateAndSetDigitoVerificadorGeral() {
if (log.isTraceEnabled()) {
log.trace("Calculando Digito Verificador Geral");
}
// Instanciando o objeto irá calcular o dígito verificador do boleto.
BoletoCodigoDeBarrasDV calculadorDV = new BoletoCodigoDeBarrasDV();
// Preparando o conjunto de informações que será a base para o cálculo
// do dígito verificador, conforme normas da FEBRABAN.
StringBuilder toCalculateDV = new StringBuilder(codigoDoBanco.write())
.append(codigoDaMoeda.write())
.append(fatorDeVencimento.write())
.append(valorNominalDoTitulo.write())
.append(campoLivre.write());
// Realizando o cálculo dígito verificador e em seguida armazenando
// a informação no campo "digitoVerificadorGeral".
digitoVerificadorGeral.setValue(
calculadorDV.calcule(toCalculateDV.toString())
);
if (log.isDebugEnabled()) {
log.debug("Digito Verificador Geral calculado : "
+ digitoVerificadorGeral.getValue());
}
}
/**
*
* Representa a quantidade de dias decorridos da data base à data de
* vencimento do título.
*
*
* É o resultado da subtração entre a data do vencimento do título e a DATA
* BASE, fixada em 07.10.1997 (03.07.2000 retrocedidos 1000 dias do in�cio
* do processo).
*
*
* Os bloquetos de cobrança emitidos a partir de primeiro de setembro de
* 2000 devem conter essas características, para que quando forem capturados
* pela rede bancária, os sistemas façam a operação inversa, ou seja,
* adicionar à data base o fator de vencimento capturado, obtendo, dessa
* forma, a data do vencimento do bloqueto.
*
*
* @param vencimento
*/
private void calculateAndSetFatorDeVencimento(Date vencimento) {
fatorDeVencimento.setValue(
FatorDeVencimento.toFator(vencimento));
}
/**
* @return the codigoDoBanco
*/
FixedField getCodigoDoBanco() {
return codigoDoBanco;
}
/**
* @param codigoDoBanco the codigoDoBanco to set
*/
void setCodigoDoBanco(FixedField codigoDoBanco) {
this.codigoDoBanco = codigoDoBanco;
}
/**
* @return the codigoDaMoeda
*/
FixedField getCodigoDaMoeda() {
return codigoDaMoeda;
}
/**
* @param codigoDaMoeda the codigoDaMoeda to set
*/
void setCodigoDaMoeda(FixedField codigoDaMoeda) {
this.codigoDaMoeda = codigoDaMoeda;
}
/**
* @return the digitoVerificadorGeral
*/
FixedField getDigitoVerificadorGeral() {
return digitoVerificadorGeral;
}
/**
* @param digitoVerificadorGeral the digitoVerificadorGeral to set
*/
void setDigitoVerificadorGeral(FixedField digitoVerificadorGeral) {
this.digitoVerificadorGeral = digitoVerificadorGeral;
}
/**
* @return the fatorDeVencimento
*/
FixedField getFatorDeVencimento() {
return fatorDeVencimento;
}
/**
* @param fatorDeVencimento the fatorDeVencimento to set
*/
void setFatorDeVencimento(FixedField fatorDeVencimento) {
this.fatorDeVencimento = fatorDeVencimento;
}
/**
* @return the valorNominalDoTitulo
*/
FixedField getValorNominalDoTitulo() {
return valorNominalDoTitulo;
}
/**
* @param valorNominalDoTitulo the valorNominalDoTitulo to set
*/
void setValorNominalDoTitulo(FixedField valorNominalDoTitulo) {
this.valorNominalDoTitulo = valorNominalDoTitulo;
}
/**
* @return the campoLivre
*/
FixedField getCampoLivre() {
return campoLivre;
}
/**
* @param campoLivre the campoLivre to set
*/
void setCampoLivre(FixedField campoLivre) {
this.campoLivre = campoLivre;
}
@Override
public String toString() {
return Objects.toString(this);
}
}