org.jrimum.bopepo.campolivre.AbstractCLBanrisul Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bpp-cobranca Show documentation
Show all versions of bpp-cobranca Show documentation
This is a fork and merge from JRimum ( http://www.jrimum.org ),
- Bopepo: https://github.com/jrimum/bopepo
- Texgit: https://github.com/jrimum/texgit
- Valia: https://github.com/jrimum/vallia
- Utilix: https://github.com/jrimum/utilix
- Domkee: https://github.com/jrimum/domkee
For Brazillian Boleto Payment Method. So much thanks for original authors:
Gilmar P. S. L, Misael Barreto and Rômulo Augusto.
The newest version!
/*
* Copyright 2008 JRimum Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* Created at: 02/08/2008 - 12:06:09
*
* ================================================================================
*
* Direitos autorais 2008 JRimum Project
*
* Licenciado sob a Licença Apache, Versão 2.0 ("LICENÇA"); você não pode
* usar esse arquivo exceto em conformidade com a esta LICENÇA. Você pode obter uma
* cópia desta LICENÇA em http://www.apache.org/licenses/LICENSE-2.0 A menos que
* haja exigência legal ou acordo por escrito, a distribuição de software sob esta
* LICENÇA se dará “COMO ESTÁ”, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam
* expressas ou tácitas. Veja a LICENÇA para a redação específica a reger permissões
* e limitações sob esta LICENÇA.
*
* Criado em: 02/08/2008 - 12:06:09
*
*/
package org.jrimum.bopepo.campolivre;
import org.apache.commons.lang3.StringUtils;
import org.jrimum.domkee.banco.Titulo;
import org.jrimum.vallia.Modulo;
import org.jrimum.texgit.IFixedField;
/**
*
* Interface comum para todos os campos livres do Banco Banrisul que venham a
* existir.
*
*
* @author Gilmar P.S.L.
* @author Misael Barreto
* @author Rômulo Augusto
* @author Samuel Valério Valerio
*
* @since 0.2
*
* @version 0.2
*/
abstract class AbstractCLBanrisul extends AbstractCampoLivre {
/**
*
*/
private static final long serialVersionUID = -259398499475894938L;
/**
* Cria um campo livre com um determinado número de campos
*
* @see AbstractCampoLivre
*
* @param fieldsLength - Número de campos
*/
protected AbstractCLBanrisul(Integer fieldsLength) {
super(fieldsLength);
}
protected static CampoLivre create(Titulo titulo) throws NotSupportedCampoLivreException {
checkCarteiraNotNull(titulo);
checkRegistroDaCarteiraNotNull(titulo);
switch (titulo.getContaBancaria().getCarteira().getTipoCobranca()) {
case COM_REGISTRO:
return new CLBanrisulCobrancaRegistrada(titulo);
case SEM_REGISTRO:
return new CLBanrisulCobrancaNaoRegistrada(titulo);
default:
throw new NotSupportedCampoLivreException("Campo livre diponível apenas para carteiras com ou sem cobrança.");
}
}
/**
*
* Calcula o duplo dígito referente às posições 20 a 42 (módulos 10 e 11).
*
*
*
* @param seisPrimeirosCamposConcatenados
* @return duplo dígito
*
* @since 0.2
*/
protected String calculaDuploDigito(String seisPrimeirosCamposConcatenados) {
// calcula soma do módulo 10 a partir dos seis primeiros campos concatenados
final int somaMod10 = Modulo.calculeSomaSequencialMod10(seisPrimeirosCamposConcatenados, 1, 2);
// calcula resto do módulo 10 a partir do resultado da soma
final byte restoMod10 = calculeRestoMod10(somaMod10);
// calcula primeiro DV a partir do resto módulo 10
byte primeiroDV = calculePrimeiroDV(restoMod10);
// calcula soma do módulo 10 a partir dos seis primeiros campos concatenados
// incluindo o primeiro dígito
int somaMod11 = Modulo.calculeSomaSequencialMod11(seisPrimeirosCamposConcatenados + primeiroDV, 2, 7);
// calcula o resto do módulo 11 a partir do resultado da soma
byte restoMod11 = calculeRestoMod11(somaMod11);
// se o resto do módulo 11 for 1 então o primeiro dígito é inválido
// deve ser feito o recálculo até que o resto não seja 1
while (restoMod11 == 1) {
// encontra um valor válido para o primeiro DV
primeiroDV = encontreValorValidoParaPrimeiroDV(primeiroDV);
// calcula a soma do módulo 11 agora com um valor
// válido para o DV
somaMod11 = Modulo.calculeSomaSequencialMod11(seisPrimeirosCamposConcatenados + primeiroDV, 2, 7);
// calcula o resto do módulo 11 a partir do resultado da soma
restoMod11 = calculeRestoMod11(somaMod11);
}
// calcula o segundo DV a partir do resto módulo 11
final byte segundoDV = calculeSegundoDV(restoMod11);
// concatena o primeiro DV com o segundo DV para
// formar o duplo dígito
return String.valueOf(primeiroDV) + String.valueOf(segundoDV);
}
/**
*
* Calcula o segundo dígito verificador.
*
*
* @param restoMod11
* @return segundo dígito
*
* @since 0.2
*/
private byte calculeSegundoDV(byte restoMod11) {
final byte segundoDV;
if (restoMod11 == 0)
segundoDV = restoMod11;
else
segundoDV = (byte) (11 - restoMod11);
return segundoDV;
}
/**
*
* Calcula o primeiro dígito verificador.
*
*
* @param restoMod10
* @return primeiro dígito verificador
*
* @since 0.2
*/
private byte calculePrimeiroDV(byte restoMod10) {
final byte primeiroDV;
if (restoMod10 == 0)
primeiroDV = 0;
else
primeiroDV = (byte) (10 - restoMod10);
return primeiroDV;
}
/**
*
* Calcula o resto da soma módulo 10.
*
*
* @param somaMod10
* @return Resto do modúlo 10
*
* @since 0.2
*/
private byte calculeRestoMod10(int somaMod10) {
final byte restoMod10;
if (somaMod10 < 10)
restoMod10 = (byte) somaMod10;
else
restoMod10 = (byte) (somaMod10 % 10);
return restoMod10;
}
/**
*
* Encontra um valor válido para o primeiro dígito.
*
*
* @param primeiroDV
* @return valor válido para o primeiro dígito
*
* @since 0.2
*/
private byte encontreValorValidoParaPrimeiroDV(byte primeiroDV) {
final byte novoValorDoPrimeiroDV;
if (primeiroDV == 9)
novoValorDoPrimeiroDV = 0;
else
novoValorDoPrimeiroDV = (byte) (primeiroDV + 1);
return novoValorDoPrimeiroDV;
}
/**
*
* Calcula o resto do módulo 11.
*
*
* @param somaMod11
* @return restro do módulo 11
*
* @since 0.2
*/
private byte calculeRestoMod11(int somaMod11) {
final byte restoMod11;
if (somaMod11 < 11)
restoMod11 = (byte) somaMod11;
else
restoMod11 = (byte) (somaMod11 % 11);
return restoMod11;
}
protected String concateneOsCamposExistentesAteOMomento() {
final StringBuilder camposExistentesAteOMomentoConcatenados = new StringBuilder(StringUtils.EMPTY);
for (IFixedField> field : this) {
camposExistentesAteOMomentoConcatenados.append(field.write());
}
return camposExistentesAteOMomentoConcatenados.toString();
}
}