package br.com.caelum.stella.boleto.bancos.gerador;
import br.com.caelum.stella.DigitoPara;
import static br.com.caelum.stella.boleto.utils.StellaStringUtils.leftPadWithZeros;
public class GeradorDeDigitoSantander extends GeradorDeDigitoPadrao {
private static final long serialVersionUID = 1L;
@Override
public int geraDigitoBloco1(String bloco) {
return calculaDVBloco(bloco);
}
@Override
public int geraDigitoBloco2(String bloco) {
return calculaDVBloco(bloco);
}
@Override
public int geraDigitoBloco3(String bloco) {
return calculaDVBloco(bloco);
}
public int calculaDVBloco(String bloco) {
int soma = 0;
for (int i = bloco.length() - 1, multiplicador = 2; i >= 0; i--, multiplicador--) {
if (multiplicador == 0) {
multiplicador = 2;
}
int parcial = Integer.parseInt(String.valueOf(bloco.charAt(i))) * multiplicador;
if (parcial > 9) {
parcial = parcial - 9;
}
soma += parcial;
}
int resto = soma % 10;
if (resto == 0) {
return 0;
} else {
return 10 - resto;
}
}
public String calculaDVNossoNumero(String nossoNumero) {
if (nossoNumero == null || nossoNumero.length() > 12) {
throw new IllegalArgumentException("Nosso Número inválido: " + nossoNumero);
}
DigitoPara digitoPara = new DigitoPara(leftPadWithZeros(nossoNumero, 12));
int digito = Integer.parseInt(digitoPara.comMultiplicadoresDeAte(2,9)
.mod(11)
.trocandoPorSeEncontrar("0", 1)
.trocandoPorSeEncontrar("1", 10)
.calcula());
if (digito > 1) {
digito = 11-digito;
}
return String.valueOf(digito);
}
}