@mrmgomes/boleto-utils
Advanced tools
Comparing version 1.1.0 to 1.2.0
{ | ||
"name": "@mrmgomes/boleto-utils", | ||
"version": "1.1.0", | ||
"version": "1.2.0", | ||
"description": "Biblioteca com funções úteis para a validação de todos os tipos de boleto", | ||
"main": "./src/boleto-utils.js", | ||
"scripts": { | ||
"test": "mocha" | ||
}, | ||
"repository": { | ||
@@ -28,3 +31,10 @@ "type": "git", | ||
}, | ||
"homepage": "https://github.com/mrmgomes/boleto-utils#readme" | ||
"homepage": "https://github.com/mrmgomes/boleto-utils#readme", | ||
"devDependencies": { | ||
"chai": "^4.2.0", | ||
"mocha": "^8.0.1" | ||
}, | ||
"dependencies": { | ||
"moment-timezone": "^0.5.31" | ||
} | ||
} |
@@ -0,1 +1,2 @@ | ||
![tests](https://github.com/edniemeyer/boleto-utils/workflows/tests/badge.svg) | ||
# boleto-utils | ||
@@ -40,7 +41,7 @@ Biblioteca com funções úteis para a validação de todos os tipos de boleto | ||
### 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'); | ||
``` | ||
@@ -62,3 +63,3 @@ Retorno #1: | ||
```javascript | ||
validarBoleto('34196790600001000002220000005566385101214000'); | ||
validarBoleto('34196790600001000002220000005566385101214000', 'CODIGO_DE_BARRAS'); | ||
``` | ||
@@ -65,0 +66,0 @@ Retorno #2: |
@@ -14,6 +14,6 @@ /** | ||
exports.identificarTipoCodigo = (codigo) => { | ||
if (typeof codigo !== 'string') throw new TypeError('Insira uma string válida!'); | ||
codigo = codigo.replace(/[^0-9]/g, ''); | ||
if (typeof codigo !== 'string') throw new TypeError('Insira uma string válida!'); | ||
if (codigo.length == 44) { | ||
@@ -45,2 +45,3 @@ return 'CODIGO_DE_BARRAS' | ||
* @return {string} OUTROS | ||
* @return {string} CARTAO_DE_CREDITO | ||
*/ | ||
@@ -52,3 +53,5 @@ exports.identificarTipoBoleto = (codigo) => { | ||
if (codigo.substr(0, 1) == '8') { | ||
if (codigo.substr(-14) == '00000000000000' || codigo.substr(5, 14) == '00000000000000') { | ||
return 'CARTAO_DE_CREDITO'; | ||
} else if (codigo.substr(0, 1) == '8') { | ||
if (codigo.substr(1, 1) == '1') { | ||
@@ -97,3 +100,3 @@ return 'ARRECADACAO_PREFEITURA'; | ||
mod: 10, | ||
efetivo: true | ||
efetivo: true | ||
}; | ||
@@ -104,3 +107,3 @@ break; | ||
mod: 10, | ||
efetivo: false | ||
efetivo: false | ||
}; | ||
@@ -111,3 +114,3 @@ break; | ||
mod: 11, | ||
efetivo: true | ||
efetivo: true | ||
}; | ||
@@ -118,3 +121,3 @@ break; | ||
mod: 11, | ||
efetivo: false | ||
efetivo: false | ||
}; | ||
@@ -140,2 +143,3 @@ break; | ||
exports.identificarData = (codigo, tipoCodigo) => { | ||
var moment = require('moment-timezone'); | ||
codigo = codigo.replace(/[^0-9]/g, ''); | ||
@@ -145,11 +149,6 @@ const tipoBoleto = this.identificarTipoBoleto(codigo); | ||
let fatorData = ''; | ||
let dataBoleto = new Date(); | ||
let dataBoleto = moment.tz("1997-10-07 20:54:59.000Z", "UTC"); | ||
dataBoleto.setFullYear(1997); | ||
dataBoleto.setMonth(9); | ||
dataBoleto.setDate(7); | ||
dataBoleto.setHours(23, 54, 59); | ||
if (tipoCodigo === 'CODIGO_DE_BARRAS') { | ||
if (tipoBoleto == 'BANCO') { | ||
if (tipoBoleto == 'BANCO' || tipoBoleto == 'CARTAO_DE_CREDITO') { | ||
fatorData = codigo.substr(5, 4) | ||
@@ -160,3 +159,3 @@ } else { | ||
} else if (tipoCodigo === 'LINHA_DIGITAVEL') { | ||
if (tipoBoleto == 'BANCO') { | ||
if (tipoBoleto == 'BANCO' || tipoBoleto == 'CARTAO_DE_CREDITO') { | ||
fatorData = codigo.substr(33, 4) | ||
@@ -168,6 +167,5 @@ } else { | ||
dataBoleto.setDate(dataBoleto.getDate() + Number(fatorData)); | ||
dataBoleto.setTime(dataBoleto.getTime() + dataBoleto.getTimezoneOffset() - (3) * 60 * 60 * 1000); | ||
dataBoleto.add(Number(fatorData), 'days'); | ||
return dataBoleto; | ||
return dataBoleto.toDate(); | ||
} | ||
@@ -240,3 +238,3 @@ | ||
if (tipoCodigo == 'CODIGO_DE_BARRAS') { | ||
if (tipoBoleto == 'BANCO') { | ||
if (tipoBoleto == 'BANCO' || tipoBoleto == 'CARTAO_DE_CREDITO') { | ||
valorBoleto = codigo.substr(9, 10); | ||
@@ -255,3 +253,3 @@ valorFinal = valorBoleto.substr(0, 8) + '.' + valorBoleto.substr(8, 2); | ||
} else if (tipoCodigo == 'LINHA_DIGITAVEL') { | ||
if (tipoBoleto == 'BANCO') { | ||
if (tipoBoleto == 'BANCO' || tipoBoleto == 'CARTAO_DE_CREDITO') { | ||
valorBoleto = codigo.substr(37); | ||
@@ -317,3 +315,3 @@ valorFinal = valorBoleto.substr(0, 8) + '.' + valorBoleto.substr(8, 2); | ||
if (tipoBoleto == 'BANCO') { | ||
if (tipoBoleto == 'BANCO' || tipoBoleto == 'CARTAO_DE_CREDITO') { | ||
const novaLinha = codigo.substr(0, 4) + codigo.substr(19, 25) + codigo.substr(4, 1) + codigo.substr(5, 14); | ||
@@ -389,3 +387,3 @@ | ||
if (tipoBoleto == 'BANCO') { | ||
if (tipoBoleto == 'BANCO' || tipoBoleto == 'CARTAO_DE_CREDITO') { | ||
resultado = codigo.substr(0, 4) + | ||
@@ -450,5 +448,4 @@ codigo.substr(32, 1) + | ||
*/ | ||
exports.validarCodigoComDV = (codigo) => { | ||
exports.validarCodigoComDV = (codigo, tipoCodigo) => { | ||
codigo = codigo.replace(/[^0-9]/g, ''); | ||
let tipoCodigo = this.identificarTipoCodigo(codigo); | ||
let tipoBoleto; | ||
@@ -461,3 +458,3 @@ | ||
if (tipoBoleto == 'BANCO') { | ||
if (tipoBoleto == 'BANCO' || tipoBoleto == 'CARTAO_DE_CREDITO') { | ||
const bloco1 = codigo.substr(0, 9) + this.calculaMod10(codigo.substr(0, 9)); | ||
@@ -483,6 +480,26 @@ const bloco2 = codigo.substr(10, 10) + this.calculaMod10(codigo.substr(10, 10)); | ||
} else if (identificacaoValorRealOuReferencia.mod == 11) { | ||
bloco1 = codigo.substr(0, 11) + this.calculaMod11(codigo.substr(0, 11)); | ||
bloco2 = codigo.substr(12, 11) + this.calculaMod11(codigo.substr(12, 11)); | ||
bloco3 = codigo.substr(24, 11) + this.calculaMod11(codigo.substr(24, 11)); | ||
bloco4 = codigo.substr(36, 11) + this.calculaMod11(codigo.substr(36, 11)); | ||
bloco1 = codigo.substr(0, 11); | ||
bloco2 = codigo.substr(12, 11); | ||
bloco3 = codigo.substr(24, 11); | ||
bloco4 = codigo.substr(36, 11); | ||
let dv1 = parseInt(codigo.substr(11, 1)); | ||
let dv2 = parseInt(codigo.substr(23, 1)); | ||
let dv3 = parseInt(codigo.substr(35, 1)); | ||
let dv4 = parseInt(codigo.substr(47, 1)); | ||
//console.log(dv1) | ||
//console.log(this.calculaMod11(bloco1)) | ||
//console.log(dv2) | ||
//console.log(this.calculaMod11(bloco2)) | ||
//console.log(dv3) | ||
//console.log(this.calculaMod11(bloco3)) | ||
//console.log(dv4) | ||
//console.log(this.calculaMod11(bloco4)) | ||
let valid = (this.calculaMod11(bloco1) == dv1 && | ||
this.calculaMod11(bloco2) == dv2 && | ||
this.calculaMod11(bloco3) == dv3 && | ||
this.calculaMod11(bloco4) == dv4) | ||
return valid; | ||
} | ||
@@ -493,5 +510,5 @@ | ||
} else if (tipoCodigo === 'CODIGO_DE_BARRAS') { | ||
tipoBoleto = this.identificarTipoBoleto(codigo, 'CODIGO_DE_BARRAS'); | ||
tipoBoleto = this.identificarTipoBoleto(codigo); | ||
if (tipoBoleto == 'BANCO') { | ||
if (tipoBoleto == 'BANCO' || tipoBoleto == 'CARTAO_DE_CREDITO') { | ||
const DV = this.calculaDVCodBarras(codigo, 4, 11); | ||
@@ -507,3 +524,2 @@ resultado = codigo.substr(0, 4) + DV + codigo.substr(5); | ||
const DV = this.calculaDVCodBarras(codigo, 3, identificacaoValorRealOuReferencia.mod); | ||
resultado = resultado.substr(0, 3) + DV + resultado.substr(3); | ||
@@ -630,5 +646,8 @@ | ||
exports.validarBoleto = (codigo) => { | ||
let tipoCodigo = this.identificarTipoCodigo(codigo); | ||
let retorno = {}; | ||
codigo = codigo.replace(/[^0-9]/g, ''); | ||
/** | ||
@@ -652,3 +671,3 @@ * Boletos de cartão de crédito geralmente possuem 46 dígitos. É necessário adicionar mais um zero no final, para formar 47 caracteres | ||
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; | ||
@@ -661,3 +680,2 @@ retorno.codigoInput = codigo; | ||
retorno.mensagem = 'Boleto válido'; | ||
let tipoCodigo = this.identificarTipoCodigo(codigo); | ||
@@ -728,34 +746,31 @@ switch (tipoCodigo) { | ||
* | ||
* @param {string} numero Numeração | ||
* @param {string} x Numeração | ||
* | ||
* ------------- | ||
* | ||
* @return {string} soma | ||
* @return {string} digito | ||
*/ | ||
exports.calculaMod11 = (numero) => { | ||
numero = numero.replace(/\D/g, ''); | ||
exports.calculaMod11 = (x) => { | ||
let sequencia = [4, 3, 2, 9, 8, 7, 6, 5]; | ||
let digit = 0; | ||
let j = 0; | ||
let DAC = 0; | ||
let soma = 0; | ||
let peso = 2; | ||
const base = 9; | ||
const contador = numero.length - 1; | ||
for (let i = contador; i >= 0; i--) { | ||
soma = soma + (parseInt(numero.substring(i, i + 1)) * peso); | ||
if (peso < base) { | ||
peso++; | ||
} else { | ||
peso = 2; | ||
} | ||
//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)); | ||
} | ||
let digito = 11 - (soma % 11); | ||
if (digito > 9) { | ||
digito = 0; | ||
} | ||
// Se for igual a 0, 10 ou 11, o dígito será 1 | ||
if (digito === 0 || digito === 10 || digito === 11) { | ||
digito = 1; | ||
} | ||
DAC = digit % 11; | ||
return digito; | ||
if (DAC == 0 || DAC == 1) | ||
return 0; | ||
if (DAC == 10) | ||
return 1; | ||
return (11 - DAC); | ||
} | ||
@@ -762,0 +777,0 @@ |
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
49726
7
888
0
147
1
2
+ Addedmoment-timezone@^0.5.31
+ Addedmoment@2.30.1(transitive)
+ Addedmoment-timezone@0.5.45(transitive)