UNPKG

boleto-utils-ts

Version:

Biblioteca com funções úteis para a validação de todos os tipos de boleto

523 lines (522 loc) 20.6 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/boleto-utils.ts var boleto_utils_exports = {}; __export(boleto_utils_exports, { TipoBoleto: () => TipoBoleto, TipoCodigo: () => TipoCodigo, calculaDVCodBarras: () => calculaDVCodBarras, calculaMod10: () => calculaMod10, calculaMod11: () => calculaMod11, codBarras2LinhaDigitavel: () => codBarras2LinhaDigitavel, digitosVerificadores: () => digitosVerificadores, geraCodBarras: () => geraCodBarras, identificarData: () => identificarData, identificarDataComNovoFator2025: () => identificarDataComNovoFator2025, identificarReferencia: () => identificarReferencia, identificarTipoBoleto: () => identificarTipoBoleto, identificarTipoCodigo: () => identificarTipoCodigo, identificarValor: () => identificarValor, identificarValorCodBarrasArrecadacao: () => identificarValorCodBarrasArrecadacao, linhaDigitavel2CodBarras: () => linhaDigitavel2CodBarras, obtemFatorData: () => obtemFatorData, validarBoleto: () => validarBoleto, validarCodigoComDV: () => validarCodigoComDV }); module.exports = __toCommonJS(boleto_utils_exports); var moment = __toESM(require("moment-timezone")); var TipoCodigo = /* @__PURE__ */ ((TipoCodigo2) => { TipoCodigo2["CODIGO_DE_BARRAS"] = "CODIGO_DE_BARRAS"; TipoCodigo2["LINHA_DIGITAVEL"] = "LINHA_DIGITAVEL"; TipoCodigo2["TAMANHO_INCORRETO"] = "TAMANHO_INCORRETO"; return TipoCodigo2; })(TipoCodigo || {}); var identificarTipoCodigo = (codigo) => { if (typeof codigo !== "string") throw new TypeError("Insira uma string v\xE1lida!"); codigo = codigo.replace(/[^0-9]/g, ""); if (codigo.length == 44) { return "CODIGO_DE_BARRAS" /* CODIGO_DE_BARRAS */; } else if (codigo.length == 46 || codigo.length == 47 || codigo.length == 48) { return "LINHA_DIGITAVEL" /* LINHA_DIGITAVEL */; } else { return "TAMANHO_INCORRETO" /* TAMANHO_INCORRETO */; } }; var TipoBoleto = /* @__PURE__ */ ((TipoBoleto2) => { TipoBoleto2["BANCO"] = "BANCO"; TipoBoleto2["ARRECADACAO_PREFEITURA"] = "ARRECADACAO_PREFEITURA"; TipoBoleto2["ARRECADACAO_ORGAOS_GOVERNAMENTAIS"] = "ARRECADACAO_ORGAOS_GOVERNAMENTAIS"; TipoBoleto2["ARRECADACAO_TAXAS_DE_TRANSITO"] = "ARRECADACAO_TAXAS_DE_TRANSITO"; TipoBoleto2["CONVENIO_SANEAMENTO"] = "CONVENIO_SANEAMENTO"; TipoBoleto2["CONVENIO_ENERGIA_ELETRICA_E_GAS"] = "CONVENIO_ENERGIA_ELETRICA_E_GAS"; TipoBoleto2["CONVENIO_TELECOMUNICACOES"] = "CONVENIO_TELECOMUNICACOES"; TipoBoleto2["OUTROS"] = "OUTROS"; TipoBoleto2["CARTAO_DE_CREDITO"] = "CARTAO_DE_CREDITO"; return TipoBoleto2; })(TipoBoleto || {}); var identificarTipoBoleto = (codigo) => { codigo = codigo.replace(/[^0-9]/g, ""); if (typeof codigo !== "string") { throw new TypeError("Insira uma string v\xE1lida!"); } if (codigo.substr(-14) == "00000000000000" || codigo.substr(5, 14) == "00000000000000") { return "CARTAO_DE_CREDITO" /* CARTAO_DE_CREDITO */; } else if (codigo.substr(0, 1) == "8") { if (codigo.substr(1, 1) == "1") { return "ARRECADACAO_PREFEITURA" /* ARRECADACAO_PREFEITURA */; } else if (codigo.substr(1, 1) == "2") { return "CONVENIO_SANEAMENTO" /* CONVENIO_SANEAMENTO */; } else if (codigo.substr(1, 1) == "3") { return "CONVENIO_ENERGIA_ELETRICA_E_GAS" /* CONVENIO_ENERGIA_ELETRICA_E_GAS */; } else if (codigo.substr(1, 1) == "4") { return "CONVENIO_TELECOMUNICACOES" /* CONVENIO_TELECOMUNICACOES */; } else if (codigo.substr(1, 1) == "5") { return "ARRECADACAO_ORGAOS_GOVERNAMENTAIS" /* ARRECADACAO_ORGAOS_GOVERNAMENTAIS */; } else if (codigo.substr(1, 1) == "6" || codigo.substr(1, 1) == "9") { return "OUTROS" /* OUTROS */; } else if (codigo.substr(1, 1) == "7") { return "ARRECADACAO_TAXAS_DE_TRANSITO" /* ARRECADACAO_TAXAS_DE_TRANSITO */; } } else { return "BANCO" /* BANCO */; } }; var identificarReferencia = (codigo) => { codigo = codigo.replace(/[^0-9]/g, ""); const referencia = codigo.substr(2, 1); if (typeof codigo !== "string") throw new TypeError("Insira uma string v\xE1lida!"); switch (referencia) { case "6": return { mod: 10, efetivo: true }; break; case "7": return { mod: 10, efetivo: false }; break; case "8": return { mod: 11, efetivo: true }; break; case "9": return { mod: 11, efetivo: false }; break; default: throw new TypeError("Referecia n\xE3o encontrada!"); break; } }; var obtemFatorData = ({ codigo, tipoCodigo }) => { const codigoLimpo = codigo.replace(/[^0-9]/g, ""); const tipoBoleto = identificarTipoBoleto(codigoLimpo); let fatorData = ""; if (tipoCodigo === "CODIGO_DE_BARRAS" /* CODIGO_DE_BARRAS */) { if (tipoBoleto == "BANCO" /* BANCO */ || tipoBoleto == "CARTAO_DE_CREDITO" /* CARTAO_DE_CREDITO */) { fatorData = codigoLimpo.substr(5, 4); } else { fatorData = "0"; } } else if (tipoCodigo === "LINHA_DIGITAVEL" /* LINHA_DIGITAVEL */) { if (tipoBoleto == "BANCO" /* BANCO */ || tipoBoleto == "CARTAO_DE_CREDITO" /* CARTAO_DE_CREDITO */) { fatorData = codigoLimpo.substr(33, 4); } else { fatorData = "0"; } } return fatorData; }; var identificarData = (codigo, tipoCodigo) => { const fatorData = obtemFatorData({ codigo, tipoCodigo }); const dataBoleto = moment.tz("1997-10-07 20:54:59.000Z", "UTC"); dataBoleto.add(Number(fatorData), "days"); return dataBoleto.toDate(); }; var identificarDataComNovoFator2025 = (codigo, tipoCodigo) => { const fatorData = obtemFatorData({ codigo, tipoCodigo }); const dataBoleto = moment.tz("2025-02-22 20:54:59.000Z", "UTC"); dataBoleto.add(Number(fatorData) - 1e3, "days"); return dataBoleto.toDate(); }; var identificarValorCodBarrasArrecadacao = (codigo, tipoCodigo) => { codigo = codigo.replace(/[^0-9]/g, ""); const isValorEfetivo = identificarReferencia(codigo).efetivo; let valorBoleto = ""; let valorFinal; if (isValorEfetivo) { if (tipoCodigo == "LINHA_DIGITAVEL") { valorBoleto = codigo.substr(4, 14); const valorBoletoArr = codigo.split(""); valorBoletoArr.splice(11, 1); valorBoleto = valorBoletoArr.join(""); valorBoleto = valorBoleto.substr(4, 11); } else if (tipoCodigo == "CODIGO_DE_BARRAS") { valorBoleto = codigo.substr(4, 11); } valorFinal = valorBoleto.substr(0, 9) + "." + valorBoleto.substr(9, 2); let char = valorFinal.substr(1, 1); while (char === "0") { valorFinal = substringReplace(valorFinal, "", 0, 1); char = valorFinal.substr(1, 1); } } else { valorFinal = 0; } return valorFinal; }; var identificarValor = (codigo, tipoCodigo) => { const tipoBoleto = identificarTipoBoleto(codigo); let valorBoleto = ""; let valorFinal = ""; if (tipoCodigo == "CODIGO_DE_BARRAS" /* CODIGO_DE_BARRAS */) { if (tipoBoleto == "BANCO" /* BANCO */ || tipoBoleto == "CARTAO_DE_CREDITO" /* CARTAO_DE_CREDITO */) { valorBoleto = codigo.substr(9, 10); valorFinal = valorBoleto.substr(0, 8) + "." + valorBoleto.substr(8, 2); let char = valorFinal.substr(1, 1); while (char === "0") { valorFinal = substringReplace(valorFinal, "", 0, 1); char = valorFinal.substr(1, 1); } } else { valorFinal = identificarValorCodBarrasArrecadacao( codigo, "CODIGO_DE_BARRAS" /* CODIGO_DE_BARRAS */ ).toString(); } } else if (tipoCodigo == "LINHA_DIGITAVEL" /* LINHA_DIGITAVEL */) { if (tipoBoleto == "BANCO" /* BANCO */ || tipoBoleto == "CARTAO_DE_CREDITO" /* CARTAO_DE_CREDITO */) { valorBoleto = codigo.substr(37); valorFinal = valorBoleto.substr(0, 8) + "." + valorBoleto.substr(8, 2); let char = valorFinal.substr(1, 1); while (char === "0") { valorFinal = substringReplace(valorFinal, "", 0, 1); char = valorFinal.substr(1, 1); } } else { valorFinal = identificarValorCodBarrasArrecadacao( codigo, "LINHA_DIGITAVEL" /* LINHA_DIGITAVEL */ ).toString(); } } return parseFloat(valorFinal); }; var digitosVerificadores = (codigo, mod) => { codigo = codigo.replace(/[^0-9]/g, ""); switch (mod) { case 10: return (codigo + calculaMod10(codigo)).toString(); break; case 11: return (codigo + calculaMod11(codigo)).toString(); break; default: break; } }; var codBarras2LinhaDigitavel = (codigo, formatada) => { codigo = codigo.replace(/[^0-9]/g, ""); const tipoBoleto = identificarTipoBoleto(codigo); let resultado = ""; if (tipoBoleto == "BANCO" /* BANCO */ || tipoBoleto == "CARTAO_DE_CREDITO" /* CARTAO_DE_CREDITO */) { const novaLinha = codigo.substr(0, 4) + codigo.substr(19, 25) + codigo.substr(4, 1) + codigo.substr(5, 14); const bloco1 = novaLinha.substr(0, 9) + calculaMod10(novaLinha.substr(0, 9)); const bloco2 = novaLinha.substr(9, 10) + calculaMod10(novaLinha.substr(9, 10)); const bloco3 = novaLinha.substr(19, 10) + calculaMod10(novaLinha.substr(19, 10)); const bloco4 = novaLinha.substr(29); resultado = (bloco1 + bloco2 + bloco3 + bloco4).toString(); if (formatada) { resultado = resultado.slice(0, 5) + "." + resultado.slice(5, 10) + " " + resultado.slice(10, 15) + "." + resultado.slice(15, 21) + " " + resultado.slice(21, 26) + "." + resultado.slice(26, 32) + " " + resultado.slice(32, 33) + " " + resultado.slice(33); } } else { const identificacaoValorRealOuReferencia = identificarReferencia(codigo); let bloco1 = ""; let bloco2 = ""; let bloco3 = ""; let bloco4 = ""; if (identificacaoValorRealOuReferencia.mod == 10) { bloco1 = codigo.substr(0, 11) + calculaMod10(codigo.substr(0, 11)); bloco2 = codigo.substr(11, 11) + calculaMod10(codigo.substr(11, 11)); bloco3 = codigo.substr(22, 11) + calculaMod10(codigo.substr(22, 11)); bloco4 = codigo.substr(33, 11) + calculaMod10(codigo.substr(33, 11)); } else if (identificacaoValorRealOuReferencia.mod == 11) { bloco1 = codigo.substr(0, 11) + calculaMod11(codigo.substr(0, 11)); bloco2 = codigo.substr(11, 11) + calculaMod11(codigo.substr(11, 11)); bloco3 = codigo.substr(22, 11) + calculaMod11(codigo.substr(22, 11)); bloco4 = codigo.substr(33, 11) + calculaMod11(codigo.substr(33, 11)); } resultado = bloco1 + bloco2 + bloco3 + bloco4; } return resultado; }; var linhaDigitavel2CodBarras = (codigo) => { codigo = codigo.replace(/[^0-9]/g, ""); const tipoBoleto = identificarTipoBoleto(codigo); let resultado = ""; if (tipoBoleto == "BANCO" /* BANCO */ || tipoBoleto == "CARTAO_DE_CREDITO" /* CARTAO_DE_CREDITO */) { resultado = codigo.substr(0, 4) + codigo.substr(32, 1) + codigo.substr(33, 14) + codigo.substr(4, 5) + codigo.substr(10, 10) + codigo.substr(21, 10); } else { const codArr = codigo.split(""); codArr.splice(11, 1); codArr.splice(22, 1); codArr.splice(33, 1); codArr.splice(44, 1); codigo = codArr.join(""); resultado = codigo; } return resultado; }; var calculaDVCodBarras = (codigo, posicaoCodigo, mod) => { codigo = codigo.replace(/[^0-9]/g, ""); const codArr = codigo.split(""); codArr.splice(posicaoCodigo, 1); codigo = codArr.join(""); if (mod === 10) { return calculaMod10(codigo); } else if (mod === 11) { return calculaMod11(codigo); } }; var validarCodigoComDV = (codigo, tipoCodigo) => { codigo = codigo.replace(/[^0-9]/g, ""); let tipoBoleto; let resultado; if (tipoCodigo === "LINHA_DIGITAVEL" /* LINHA_DIGITAVEL */) { tipoBoleto = identificarTipoBoleto(codigo); if (tipoBoleto == "BANCO" /* BANCO */ || tipoBoleto == "CARTAO_DE_CREDITO" /* CARTAO_DE_CREDITO */) { const bloco1 = codigo.substr(0, 9) + calculaMod10(codigo.substr(0, 9)); const bloco2 = codigo.substr(10, 10) + calculaMod10(codigo.substr(10, 10)); const bloco3 = codigo.substr(21, 10) + calculaMod10(codigo.substr(21, 10)); const bloco4 = codigo.substr(32, 1); const bloco5 = codigo.substr(33); resultado = (bloco1 + bloco2 + bloco3 + bloco4 + bloco5).toString(); } else { const identificacaoValorRealOuReferencia = identificarReferencia(codigo); let bloco1 = ""; let bloco2 = ""; let bloco3 = ""; let bloco4 = ""; if (identificacaoValorRealOuReferencia.mod == 10) { bloco1 = codigo.substr(0, 11) + calculaMod10(codigo.substr(0, 11)); bloco2 = codigo.substr(12, 11) + calculaMod10(codigo.substr(12, 11)); bloco3 = codigo.substr(24, 11) + calculaMod10(codigo.substr(24, 11)); bloco4 = codigo.substr(36, 11) + calculaMod10(codigo.substr(36, 11)); } else if (identificacaoValorRealOuReferencia.mod == 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)); let valid = calculaMod11(bloco1) == dv1 && calculaMod11(bloco2) == dv2 && calculaMod11(bloco3) == dv3 && calculaMod11(bloco4) == dv4; return valid; } resultado = bloco1 + bloco2 + bloco3 + bloco4; } } else if (tipoCodigo === "CODIGO_DE_BARRAS" /* CODIGO_DE_BARRAS */) { tipoBoleto = identificarTipoBoleto(codigo); if (tipoBoleto == "BANCO" /* BANCO */ || tipoBoleto == "CARTAO_DE_CREDITO" /* CARTAO_DE_CREDITO */) { const DV = calculaDVCodBarras(codigo, 4, 11); resultado = codigo.substr(0, 4) + DV + codigo.substr(5); } else { const identificacaoValorRealOuReferencia = identificarReferencia(codigo); resultado = codigo.split(""); resultado.splice(3, 1); resultado = resultado.join(""); const DV = calculaDVCodBarras( codigo, 3, identificacaoValorRealOuReferencia.mod ); resultado = resultado.substr(0, 3) + DV + resultado.substr(3); } } return codigo === resultado; }; var geraCodBarras = (codigo) => { codigo = codigo.replace(/[^0-9]/g, ""); const tipoBoleto = identificarTipoBoleto(codigo); let novoCodigo; novoCodigo = linhaDigitavel2CodBarras(codigo); novoCodigo = novoCodigo.split(""); novoCodigo.splice(4, 1); novoCodigo = novoCodigo.join(""); let dv = calculaMod11(novoCodigo); novoCodigo = novoCodigo.substr(0, 4) + dv + novoCodigo.substr(4); return novoCodigo; }; var validarBoleto = (codigo) => { let tipoCodigo = identificarTipoCodigo(codigo); let retorno = {}; codigo = codigo.replace(/[^0-9]/g, ""); if (codigo.length == 36) { codigo = codigo + "00000000000"; } else if (codigo.length == 46) { codigo = codigo + "0"; } if (codigo.length != 44 && codigo.length != 46 && codigo.length != 47 && codigo.length != 48) { retorno.sucesso = false; retorno.codigoInput = codigo; retorno.mensagem = "O c\xF3digo inserido possui " + codigo.length + " d\xEDgitos. Por favor insira uma numera\xE7\xE3o v\xE1lida. C\xF3digos de barras SEMPRE devem ter 44 caracteres num\xE9ricos. Linhas digit\xE1veis podem possuir 46 (boletos de cart\xE3o de cr\xE9dito), 47 (boletos banc\xE1rios/cobran\xE7a) ou 48 (contas conv\xEAnio/arrecada\xE7\xE3o) caracteres num\xE9ricos. Qualquer caractere n\xE3o num\xE9rico ser\xE1 desconsiderado."; } else if (codigo.substr(0, 1) == "8" && codigo.length !== 44 && codigo.length !== 48) { retorno.sucesso = false; retorno.codigoInput = codigo; retorno.mensagem = "Este tipo de boleto deve possuir um c\xF3digo de barras 44 caracteres num\xE9ricos. Ou linha digit\xE1vel de 48 caracteres num\xE9ricos."; } else if (!validarCodigoComDV(codigo, tipoCodigo)) { retorno.sucesso = false; retorno.codigoInput = codigo; retorno.mensagem = "A valida\xE7\xE3o do d\xEDgito verificador falhou. Tem certeza que inseriu a numera\xE7\xE3o correta?"; } else { retorno.sucesso = true; retorno.codigoInput = codigo; retorno.mensagem = "Boleto v\xE1lido"; switch (tipoCodigo) { case "LINHA_DIGITAVEL": retorno.tipoCodigoInput = "LINHA_DIGITAVEL"; retorno.tipoBoleto = identificarTipoBoleto(codigo); retorno.codigoBarras = linhaDigitavel2CodBarras(codigo); retorno.linhaDigitavel = codigo; retorno.vencimento = identificarData( codigo, "LINHA_DIGITAVEL" /* LINHA_DIGITAVEL */ ); retorno.vencimentoComNovoFator2025 = identificarDataComNovoFator2025( codigo, "LINHA_DIGITAVEL" /* LINHA_DIGITAVEL */ ); retorno.valor = identificarValor(codigo, "LINHA_DIGITAVEL" /* LINHA_DIGITAVEL */); break; case "CODIGO_DE_BARRAS": retorno.tipoCodigoInput = "CODIGO_DE_BARRAS"; retorno.tipoBoleto = identificarTipoBoleto(codigo); retorno.codigoBarras = codigo; retorno.linhaDigitavel = codBarras2LinhaDigitavel(codigo, false); retorno.vencimento = identificarData( codigo, "CODIGO_DE_BARRAS" /* CODIGO_DE_BARRAS */ ); retorno.vencimentoComNovoFator2025 = identificarDataComNovoFator2025( codigo, "CODIGO_DE_BARRAS" /* CODIGO_DE_BARRAS */ ); retorno.valor = identificarValor(codigo, "CODIGO_DE_BARRAS" /* CODIGO_DE_BARRAS */); break; default: break; } } return retorno; }; var calculaMod10 = (numero) => { numero = numero.replace(/\D/g, ""); var i; var mult = 2; var soma = 0; var s = ""; for (i = numero.length - 1; i >= 0; i--) { s = mult * parseInt(numero.charAt(i)) + s; if (--mult < 1) { mult = 2; } } for (i = 0; i < s.length; i++) { soma = soma + parseInt(s.charAt(i)); } soma = soma % 10; if (soma != 0) { soma = 10 - soma; } return soma; }; var calculaMod11 = (x) => { let sequencia = [4, 3, 2, 9, 8, 7, 6, 5]; let digit = 0; let j = 0; let DAC = 0; 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 == 0 || DAC == 1) return 0; if (DAC == 10) return 1; return 11 - DAC; }; function substringReplace(str, repl, inicio, tamanho) { if (inicio < 0) { inicio = inicio + str.length; } tamanho = tamanho !== void 0 ? tamanho : str.length; if (tamanho < 0) { tamanho = tamanho + str.length - inicio; } return [ str.slice(0, inicio), repl.substr(0, tamanho), repl.slice(tamanho), str.slice(inicio + tamanho) ].join(""); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { TipoBoleto, TipoCodigo, calculaDVCodBarras, calculaMod10, calculaMod11, codBarras2LinhaDigitavel, digitosVerificadores, geraCodBarras, identificarData, identificarDataComNovoFator2025, identificarReferencia, identificarTipoBoleto, identificarTipoCodigo, identificarValor, identificarValorCodBarrasArrecadacao, linhaDigitavel2CodBarras, obtemFatorData, validarBoleto, validarCodigoComDV }); //# sourceMappingURL=boleto-utils.js.map