package com.rjconsultores.ventaboletos.utils; import java.math.BigInteger; import org.apache.commons.lang.StringUtils; import com.rjconsultores.ventaboletos.enuns.BancoLayout; public class NossoNumeroUtils { private static final String ZERO_7 = "0000000"; private static final String ZERO_8 = "00000000"; private static final String ZERO_9 = "000000000"; private static final String ZERO_10 = "0000000000"; private static final String ZERO_11 = "00000000000"; /** * Devolve o nosso numero do Bradesco com o DV calculado (Tamanho 12)... * @param numCarteira * @param nossoNumero * @return */ public static String calcularNossonumeroBradesco(Integer numCarteira, BigInteger nossoNumero){ return StringUtils.right(ZERO_11 + nossoNumero, 11) + dacBradesco(numCarteira, nossoNumero); } /** * Devolve o nosso numero do Itau com o DV calculado (Tamanho 9)... * @param codAgencia * @param numConta * @param numCarteira * @param nossoNumero * @return */ public static String calcularNossoNumeroItau(Integer codAgencia, Integer numConta, Integer numCarteira, BigInteger nossoNumero){ return StringUtils.right(ZERO_8 + nossoNumero, 8) + dacItau(codAgencia, numConta, numCarteira, nossoNumero); } public static String calcularNossoNumeroSantander(BigInteger nossoNumero){ return StringUtils.right(ZERO_7 + nossoNumero, 7)+dacSantander( nossoNumero.toString() ); } public static String calcularNossoNumeroSicoob(Integer numCooperativa, Integer codCliente, BigInteger nossoNumero){ return StringUtils.right(ZERO_7 + nossoNumero, 7)+dacSicoob(numCooperativa, codCliente, nossoNumero.toString() ); } public static String calcularNossoNumeroMercantil(Integer agencia, BigInteger nossoNumero){ return StringUtils.right(ZERO_10 + nossoNumero, 10)+dacMercantil( agencia, nossoNumero ); } public static String calcularNossoNumeroSafra(BigInteger nossoNumero){ return StringUtils.right(ZERO_9 + nossoNumero, 9)+dacSafra( nossoNumero ); } /** * Devolve o nosso numero do BB com o DV calculado (Tamanho 20)... * @param convenioBanco * @param numCarteira * @param nossoNumero * @return */ public static String calcularNossoNumeroBancoBrasil(Long convenioBanco, Integer numCarteira, BigInteger nossoNumero){ int controllConvenioNossoNumero = 0; int controllNossoNumero = 0; boolean dvControll = Boolean.TRUE; if(convenioBanco < 10000){ controllConvenioNossoNumero = 4; controllNossoNumero = 7; }else if(convenioBanco < 1000000){ controllConvenioNossoNumero = 6; controllNossoNumero = 5; }else{ controllConvenioNossoNumero = 7; controllNossoNumero = 10; dvControll = Boolean.FALSE; } String nC = StringUtils.right(ZERO_7 + convenioBanco, controllConvenioNossoNumero); String nN = StringUtils.right(ZERO_10 + nossoNumero, controllNossoNumero); String base = nC + nN; return dvControll ? StringUtils.left(base + dacBB(base, numCarteira), 20) : base; } /** * Calcula do DV para o Bradesco * @param numCarteira * @param nossoNumero * @return */ public static String dacBradesco(Integer numCarteira, BigInteger nossoNumero){ int multiplicadores[] = {2,7,6,5,4,3,2,7,6,5,4,3,2}; int multiplicandos[] = new int[13]; String carteira = StringUtils.right("00" + numCarteira, 2); String nNumero = StringUtils.right(ZERO_11 + nossoNumero, 11); String base = carteira + nNumero; for (int i = 0; i < multiplicandos.length; i++) { String d = base.charAt(i) + ""; multiplicandos[i] = Integer.valueOf(d) * multiplicadores[i]; } int dac = 0; for(Integer v : multiplicandos){ dac += v; } dac = 11 - (dac % 11); return (dac == 11) ? "0" :(dac == 10) ? "P" : dac + ""; } public static String dacSicoob(Integer numCooperativa, Integer codCliente, String nossoNumero){ int multiplicadores[] = {3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7,3}; int multiplicandos[] = new int[21]; String cooperativa = StringUtils.right("0000" + numCooperativa, 4); String cliente = StringUtils.right(ZERO_10 + codCliente, 10); String nNumero = StringUtils.right(ZERO_7 + nossoNumero, 7); String base = cooperativa + cliente + nNumero; for (int i = 0; i < multiplicandos.length; i++) { String d = base.charAt(i) + ""; multiplicandos[i] = Integer.valueOf(d) * multiplicadores[i]; } int dac = 0; for(Integer v : multiplicandos){ dac += v; } dac = dac % 11; if( dac == 0 || dac == 1) return "0"; return (11 - dac) + ""; } public static String dacMercantil(Integer agencia, BigInteger nossoNumero){ int multiplicadores[] = {7,6,5,4,3,2,9,8,7,6,5,4,3,2}; String agenciaformatada = StringUtils.right("0000" + agencia, 4); String nNumero = StringUtils.right(ZERO_11 + nossoNumero, 10); String base = agenciaformatada + nNumero; int soma = 0; for (int i = 0; i < base.length(); i++) { String d = base.charAt(i)+""; soma = Integer.valueOf(d) * multiplicadores[i]; } int mod = soma % 11; if( mod == 0 || mod == 1 ) { return "0"; } return String.valueOf(11 - mod); } public static String dacSafra(BigInteger nossoNumero){ int[] multiplicadores = {2,1,2,1,2,1,2,1,2}; int[] multiplicandos = new int[20]; String base = StringUtils.right(ZERO_9 + nossoNumero, 9); for (int i = 0; i < 9; i++) { String d = base.charAt(i) + ""; multiplicandos[i] = Integer.valueOf(d) * multiplicadores[i]; } int dac = 0; for(Integer v : multiplicandos){ if(v < 10){ dac += v; }else{ dac += 1 + (v - 10); } } dac = 10 - (dac % 10); return dac == 10 ? "0" : dac+""; } /** * Calcula do DV para o Itau * @param codAgencia * @param numConta * @param numCarteira * @param nossoNumero * @return */ public static String dacItau(Integer codAgencia, Integer numConta, Integer numCarteira, BigInteger nossoNumero){ int multiplicadores[] = {1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2}; int multiplicandos[] = new int[20]; String agencia = StringUtils.right("0000" + codAgencia, 4); String conta = StringUtils.right("00000" + numConta, 5); String carteira = StringUtils.right("000" + numCarteira, 3); String nNumero = StringUtils.right(ZERO_8 + nossoNumero, 8); String base = agencia + conta + carteira + nNumero; for (int i = 0; i < multiplicandos.length; i++) { String d = base.charAt(i) + ""; multiplicandos[i] = Integer.valueOf(d) * multiplicadores[i]; } int dac = 0; for(Integer v : multiplicandos){ if(v < 10){ dac += v; }else{ dac += 1 + (v - 10); } } dac = 10 - (dac % 10); return dac == 10 ? "0" : dac+""; } /** * Calcula do DV para o Banco do Brasil * @param nossoNumero * @param numCarteira * @return */ public static String dacBB(String nossoNumero, Integer numCarteira){ int multiplicador = 9; int soma = 0; for (int i = nossoNumero.length() - 1; i >= 0 ; i--) { int current = Integer.parseInt(nossoNumero.charAt(i) + ""); current = current * multiplicador; soma = soma + current; multiplicador--; if(multiplicador == 2){ multiplicador = 9; } } int mod = soma % 11; if(mod == 10){ return "X"; } return mod + ""; } public static String dacSantander(String nossoNumero){ int multiplicador = 2; int soma = 0; for (int i = nossoNumero.length() - 1; i >= 0 ; i--) { int current = Integer.parseInt(nossoNumero.charAt(i) + ""); current = current * multiplicador; soma = soma + current; multiplicador++; if(multiplicador == 2){ multiplicador = 9; } } int mod = soma % 11; if(mod == 10){ return "1"; }else if( mod == 0 || mod == 1 ) { return "0"; } return String.valueOf(11 - mod); } /** * Calcula do DV para o Itau (Numero Documento) * @param codAgencia * @param numConta * @param numCarteira * @param nossoNumero * @return */ public static String dvDocumentoItau(Integer numeroDoc){ int multiplicadores[] = {1,2,1,2,1,2,1,2,1,2}; int multiplicandos[] = new int[10]; String doc = StringUtils.right(ZERO_10 + numeroDoc, 10); String base = doc; for (int i = 0; i < multiplicandos.length; i++) { String d = base.charAt(i) + ""; multiplicandos[i] = Integer.valueOf(d) * multiplicadores[i]; } int dac = 0; for(Integer v : multiplicandos){ if(v < 10){ dac += v; }else{ dac += 1 + (v - 10); } } dac = 10 - (dac % 10); return dac + ""; } public static boolean validaNossoNumero(String nossoNumero, BancoLayout bancoLayout){ if(BancoLayout.BRADESCO_400_Envio.equals(bancoLayout) && nossoNumero.length() == 13 ){ return Boolean.TRUE; } if(BancoLayout.ITAU_400_Envio.equals(bancoLayout) && nossoNumero.length() == 10 ){ return Boolean.TRUE; } if(BancoLayout.MERCANTIL_400_Envio.equals(bancoLayout) && nossoNumero.length() == 12 ){ return Boolean.TRUE; } if(BancoLayout.SANTANDER_400_Envio.equals(bancoLayout) && nossoNumero.length() == 9 ){ return Boolean.TRUE; } if(BancoLayout.SAFRA_400_Envio.equals(bancoLayout) && nossoNumero.length() == 10 ){ return Boolean.TRUE; } if(BancoLayout.BB_240_Envio.equals(bancoLayout) && (nossoNumero.length() == 13 || nossoNumero.length() == 17)){ return Boolean.TRUE; } if(BancoLayout.SICOOB_240_Envio.equals(bancoLayout) && nossoNumero.length() == 9 ){ return Boolean.TRUE; } if(BancoLayout.CAIXA_400_Envio.equals(bancoLayout) && ( nossoNumero.length() == 10 && nossoNumero.startsWith("3"))){ return Boolean.TRUE; } return Boolean.FALSE; } public static void main(String[] args) { System.out.println( calcularNossoNumeroSafra( new BigInteger("422979999") )); System.out.println(dacItau(5435, 34787, 109, new BigInteger("81059"))); //codAgencia, numConta, numCarteira, nossoNumero } }