Skip to content

Commit

Permalink
Merge pull request #1 from edniemeyer/master
Browse files Browse the repository at this point in the history
Bug fix and adding argument tipoCodigo to validarBoleto method
  • Loading branch information
rmusmanno authored Apr 1, 2020
2 parents faf373c + b85e2f9 commit 5e22351
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 46 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ Função | Definição

---------------------------------------------------------
### 3. Exemplos de uso
A princípio, a função `validarBoleto(codigo: string)` é a única que poderia ser utilizada para validar e trazer informações de um código de barras/linha digitável, portanto mostrarei apenas este exemplo. As demais funções estão documentadas acima e são autoexplicativas.
A princípio, a função `validarBoleto(codigo: string, tipoCodigo: string)` é a única que poderia ser utilizada para validar e trazer informações de um código de barras/linha digitável, portanto mostrarei apenas este exemplo. As demais funções estão documentadas acima e são autoexplicativas.

Exemplo #1:
```javascript
validarBoleto('23790448095616862379336011058009740430000124020');
validarBoleto('23790448095616862379336011058009740430000124020', 'LINHA_DIGITAVEL');
```
Retorno #1:
```json
Expand All @@ -58,7 +58,7 @@ Retorno #1:
```
Exemplo #2:
```javascript
validarBoleto('34196790600001000002220000005566385101214000');
validarBoleto('34196790600001000002220000005566385101214000', 'CODIGO_DE_BARRAS);
```
Retorno #2:
```json
Expand Down
127 changes: 84 additions & 43 deletions src/boleto-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,25 +91,25 @@ exports.identificarReferencia = (codigo) => {
case '6':
return {
mod: 10,
efetivo: true
efetivo: true
};
break;
case '7':
return {
mod: 10,
efetivo: false
efetivo: false
};
break;
case '8':
return {
mod: 11,
efetivo: true
efetivo: true
};
break;
case '9':
return {
mod: 11,
efetivo: false
efetivo: false
};
break;
default:
Expand Down Expand Up @@ -417,7 +417,7 @@ exports.calculaDVCodBarras = (codigo, posicaoCodigo, mod) => {
if (mod === 10) {
return this.calculaMod10(codigo);
} else if (mod === 11) {
return this.calculaMod11SemMultiplicacao10(codigo);
return this.calculaMod11(codigo);
}
}

Expand All @@ -432,9 +432,8 @@ exports.calculaDVCodBarras = (codigo, posicaoCodigo, mod) => {
*
* @return {boolean} true = boleto válido / false = boleto inválido
*/
exports.validarCodigoComDV = (codigo) => {
exports.validarCodigoComDV = (codigo, tipoCodigo) => {
codigo = codigo.replace(/[^0-9]/g, '');
let tipoCodigo = this.identificarTipoCodigo(codigo);
let tipoBoleto;

let resultado;
Expand Down Expand Up @@ -472,11 +471,11 @@ exports.validarCodigoComDV = (codigo) => {
dv2 = parseInt(codigo.substr(23, 1));
dv3 = parseInt(codigo.substr(35, 1));
dv4 = parseInt(codigo.substr(47, 1));

valid = (this.calculaMod11(bloco1) == dv1 &&
this.calculaMod11(bloco2) == dv2 &&
this.calculaMod11(bloco3) == dv3 &&
this.calculaMod11(bloco4) == dv4)
this.calculaMod11(bloco2) == dv2 &&
this.calculaMod11(bloco3) == dv3 &&
this.calculaMod11(bloco4) == dv4)

return valid;
}
Expand All @@ -497,7 +496,6 @@ exports.validarCodigoComDV = (codigo) => {
resultado = resultado.join('');

const DV = this.calculaDVCodBarras(codigo, 3, identificacaoValorRealOuReferencia.mod);

resultado = resultado.substr(0, 3) + DV + resultado.substr(3);

}
Expand Down Expand Up @@ -622,6 +620,8 @@ exports.validarBoleto = (codigo) => {
let retorno = {};
codigo = codigo.replace(/[^0-9]/g, '');

let tipoCodigo = this.identificarTipoCodigo(codigo);

/**
* Boletos de cartão de crédito geralmente possuem 46 dígitos. É necessário adicionar mais um zero no final, para formar 47 caracteres
* Alguns boletos de cartão de crédito do Itaú possuem 36 dígitos. É necessário acrescentar 11 zeros no final.
Expand All @@ -640,15 +640,14 @@ exports.validarBoleto = (codigo) => {
retorno.sucesso = false;
retorno.codigoInput = codigo;
retorno.mensagem = 'Este tipo de boleto deve possuir um código de barras 44 caracteres numéricos. Ou linha digitável de 48 caracteres numéricos.';
} else if (!this.validarCodigoComDV(codigo)) {
} else if (!this.validarCodigoComDV(codigo, tipoCodigo)) {
retorno.sucesso = false;
retorno.codigoInput = codigo;
retorno.mensagem = 'A validação do dígito verificador falhou. Tem certeza que inseriu a numeração correta?';
} else {
retorno.sucesso = true;
retorno.codigoInput = codigo;
retorno.mensagem = 'Boleto válido';
let tipoCodigo = this.identificarTipoCodigo(codigo);

switch (tipoCodigo) {
case 'LINHA_DIGITAVEL':
Expand Down Expand Up @@ -718,57 +717,99 @@ exports.calculaMod10 = (numero) => {
*
* -------------
*
* @return {string} soma
* @return {string} digito
*/
exports.calculaMod11 = (numero) => {
// from: http://www.cjdinfo.com.br/publicacao-calculo-digito-verificador
numero = numero.replace(/\D/g, '');
// exports.calculaMod11 = (numero) => {
// // from: http://www.cjdinfo.com.br/publicacao-calculo-digito-verificador
// numero = numero.replace(/\D/g, '');

let sequencia = [4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
let soma = 0;
let resto = 0;
// let sequencia = [4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
// let soma = 0;
// let resto = 0;

for (let i = 0; i < 11; i++) {
let valor = parseInt(numero.substr(i, 1));
soma += valor * sequencia[i];
}
// for (let i = 0; i < 11; i++) {
// let valor = parseInt(numero.substr(i, 1));
// soma += valor * sequencia[i];
// }

soma *= 10;
// soma *= 10;

resto = soma % 11;
let digito = resto;
if (resto == 10) digito = 0;
// resto = soma % 11;
// let digito = resto;
// if (resto == 10) digito = 0;

return digito;
}
// return digito;
// }

/**
* Calcula o dígito verificador de uma numeração a partir do módulo 11
*
* -------------
*
* @param {string} numero Numeração
* @param {string} x Numeração
*
* -------------
*
* @return {string} soma
* @return {string} digito
*/
exports.calculaMod11SemMultiplicacao10 = (numero) => {
let sequencia = [2, 3, 4, 5, 6, 7, 8, 9];
exports.calculaMod11 = (x) => {
let sequencia = [4, 3, 2, 9, 8, 7, 6, 5];
let digit = 0;
let j = 0;
for (var i = x.length - 1; i >= 0; i--) {
if (i != 4) {
let mult = sequencia[j];
j++;
j %= sequencia.length;
digit += mult * parseInt(x.charAt(i));
}
let DAC = 0

//ITAU https://download.itau.com.br/bankline/layout_cobranca_400bytes_cnab_itau.pdf
for (var i = 0; i < x.length; i++) {
let mult = sequencia[j];
j++;
j %= sequencia.length;
digit += mult * parseInt(x.charAt(i));
}

return digit % 11;
DAC = 11 - (digit % 11);

if (DAC == 0 || DAC == 1 || DAC == 10 || DAC == 11)
return 1;
else
return DAC;
}

// /**
// * Calcula o dígito verificador de uma numeração a partir do módulo 11
// *
// * -------------
// *
// * @param {string} x Numeração
// *
// * -------------
// *
// * @return {string} digito
// */
// exports.calculaMod11Concessionaria = (x) => {
// let sequencia = [4, 3, 2, 9, 8, 7, 6, 5];
// let digit = 0;
// let j = 0;
// let DAC = 0;

// //FEBRABAN https://cmsportal.febraban.org.br/Arquivos/documentos/PDF/Layout%20-%20C%C3%B3digo%20de%20Barras%20-%20Vers%C3%A3o%205%20-%2001_08_2016.pdf
// for (var i = 0; i < x.length; i++) {
// let mult = sequencia[j];
// j++;
// j %= sequencia.length;
// digit += mult * parseInt(x.charAt(i));
// }

// DAC = digit % 11;

// if (DAC == 1)
// DAC = 0;
// if (DAC == 10)
// DAC = 1;

// return DAC;

// }

/**
* Função auxiliar para remover os zeros à esquerda dos valores detectados no código inserido
*
Expand Down

0 comments on commit 5e22351

Please sign in to comment.