@plasoft/boletos
Version:
1,376 lines (1,352 loc) • 136 kB
JavaScript
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
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);
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/index.ts
var src_exports = {};
__export(src_exports, {
Banco: () => Banco,
default: () => src_default,
defineConfig: () => defineConfig
});
module.exports = __toCommonJS(src_exports);
// src/utils/compileHbs.ts
var import_handlebars = __toESM(require("handlebars"));
var import_fs = __toESM(require("fs"));
function compileHbs(templatePath, data) {
const html = import_fs.default.readFileSync(templatePath, "utf-8");
const content = import_handlebars.default.compile(html)(data);
return content;
}
// src/utils/getPathTemplates.ts
var import_path = __toESM(require("path"));
function getPathTemplates(template) {
if (process.env.NODE_ENV === "dev") {
return import_path.default.resolve(process.cwd(), "views", template);
}
return import_path.default.resolve(__dirname, template);
}
// src/services/api.ts
var import_config = require("dotenv/config");
var import_axios = __toESM(require("axios"));
var api = import_axios.default.create({
baseURL: process.env.API_URL || "https://23136fv876.execute-api.sa-east-1.amazonaws.com/dev/create-report"
});
// src/utils/zip.ts
var zlib = __toESM(require("zlib"));
function decompress(input) {
return new Promise((resolve, reject) => {
zlib.gunzip(input, (error, result) => {
if (error) {
return reject(error);
}
resolve(result.toString());
});
});
}
// src/banks/sicredi/gerarPDFCarne.ts
var import_bwip_js = __toESM(require("bwip-js"));
// src/utils/maskFormat.ts
var import_string_mask = __toESM(require("string-mask"));
function retornaCpfCnpjFormatado(cpfCnpj) {
if ((cpfCnpj == null ? void 0 : cpfCnpj.length) <= 11) {
const formatter2 = new import_string_mask.default("000.000.000-00");
return formatter2.apply(cpfCnpj);
}
const formatter = new import_string_mask.default("00.000.000/0000-00");
return formatter.apply(cpfCnpj);
}
function retornaCEPFormatado(cep) {
const formatter = new import_string_mask.default("00000-000");
return formatter.apply(cep);
}
function numberToReal(numero) {
numero = typeof numero === "string" ? parseFloat(numero) : numero;
numero = numero.toFixed(2).split(".");
numero[0] = numero[0].split(/(?=(?:...)*$)/).join(".");
return numero.join(",");
}
function codigoBarra(codigo) {
const formatter = new import_string_mask.default("00000.00000 00000.000000 00000.000000 0 000000000000000");
return formatter.apply(codigo.replace(/\D/g, ""));
}
var maskFormat_default = {
numberToReal,
retornaCEPFormatado,
retornaCpfCnpjFormatado,
codigoBarra
};
// src/banks/sicredi/gerarPDFCarne.ts
var import_qrcode = __toESM(require("qrcode"));
function gerarPDFCarne(_0) {
return __async(this, arguments, function* ({ dados }) {
try {
const { generatePDF, dadosPDF } = dados;
const carnes = [];
if (!dadosPDF.pagador.cpfcnpj) {
throw new Error("CPF/CNPJ do pagador na\u0303o informado!");
}
dadosPDF.beneficiario.dadosBancario.agencia = dadosPDF.beneficiario.dadosBancario.agencia.padStart(4, "0");
dadosPDF.beneficiario.cnpj = maskFormat_default.retornaCpfCnpjFormatado(
dadosPDF.beneficiario.cnpj
);
dadosPDF.pagador.endereco.cep = maskFormat_default.retornaCEPFormatado(
dadosPDF.pagador.endereco.cep
);
dadosPDF.pagador.cpfcnpj = maskFormat_default.retornaCpfCnpjFormatado(dadosPDF.pagador.cpfcnpj);
for (const boleto of dados.dadosPDF.boleto) {
const codigoBarra2 = yield import_bwip_js.default.toBuffer({
bcid: "interleaved2of5",
text: boleto.codigoBarra,
height: 20
});
const qrCode = yield import_qrcode.default.toDataURL(boleto.pixCopiaCola, {
errorCorrectionLevel: "H",
type: "image/png",
margin: 1,
scale: 6
});
boleto.qrCodeImage = qrCode;
boleto.linhaDigitavel = maskFormat_default.codigoBarra(boleto.linhaDigitavel);
boleto.codigoBarraImage = codigoBarra2.toString("base64");
boleto.valorAcrescimo = maskFormat_default.numberToReal(
boleto.valorAcrescimo
);
boleto.valorCobrado = maskFormat_default.numberToReal(
boleto.valorCobrado
);
boleto.valorDescontoAbatimento = maskFormat_default.numberToReal(
boleto.valorDescontoAbatimento
);
const valorDocumento = Number(boleto.valorDocumento);
boleto.valorDocumento = maskFormat_default.numberToReal(
boleto.valorDocumento
);
boleto.valorMulta = maskFormat_default.numberToReal(boleto.valorMulta);
boleto.valorOutrasDeducoes = maskFormat_default.numberToReal(
boleto.valorOutrasDeducoes
);
const jurosMes = dadosPDF.beneficiario.dadosBancario.juros;
const jurosDia = jurosMes / 100 / 30 * valorDocumento;
if (jurosDia > 0) {
boleto.instrucao1 = `COBRAR JUROS DE R$${maskFormat_default.numberToReal(jurosDia)} AO DIA, AP\xD3S O VENCIMENTO`;
}
const descontoVencimento = boleto.desconto > 0 ? boleto.desconto : dadosPDF.beneficiario.dadosBancario.desconto > 0 ? dadosPDF.beneficiario.dadosBancario.desconto : 0;
if (descontoVencimento > 0) {
boleto.instrucao2 = `AT\xC9 O VENCIMENTO, CONCEDER DESCONTO DE ${descontoVencimento}%`;
}
const multaAtraso = dadosPDF.beneficiario.dadosBancario.multa || 0;
if (multaAtraso > 0) {
boleto.instrucao3 = `MULTA DE ${multaAtraso}%`;
}
const protestoDias = dadosPDF.beneficiario.dadosBancario.protesto || 0;
if (protestoDias > 0) {
boleto.instrucao4 = `PROTESTAR AP\xD3S ${protestoDias} DIAS CORRIDOS DO VENCIMENTO`;
}
dadosPDF.pagador.isCnpj = dadosPDF.pagador.cpfcnpj.length > 14;
carnes.push({ boleto, pagador: dadosPDF.pagador, beneficiario: dadosPDF.beneficiario });
}
const content = compileHbs(getPathTemplates("sicredi-carne.hbs"), { boletos: carnes });
const config = {
displayHeaderFooter: false,
path: "./boleto.pdf",
format: "a4",
printBackground: true,
preferCSSPageSize: true
};
let pdfBase64 = null;
if (generatePDF) {
pdfBase64 = yield generatePDF(content, config);
} else {
if (!api.defaults.baseURL) {
throw new Error("BaseURL api not found");
}
const response = yield api.post("/", { content, config });
const buffer = Buffer.from(response.data.pdf);
pdfBase64 = yield decompress(buffer);
}
return {
erro: false,
dados: pdfBase64
};
} catch (error) {
console.log(error);
if (error instanceof Error) {
return {
erro: true,
dados: error.message
};
}
return {
erro: true,
dados: "Falha ao gerar impress\xE3o do boleto"
};
}
});
}
// src/utils/getFatorVencimento.ts
var import_date_fns = require("date-fns");
function getFatorVencimento(vencimento) {
vencimento = new Date(vencimento);
if (vencimento >= new Date(2025, 1, 22)) {
return (0, import_date_fns.differenceInDays)(new Date(vencimento), new Date(2022, 4, 29)).toString();
} else {
return (0, import_date_fns.differenceInDays)(new Date(vencimento), new Date(1997, 9, 7)).toString();
}
}
// src/utils/copy.ts
function copy(texto, startPosition, endPosition) {
let retorno2 = "";
if (typeof texto === "number")
texto = String(texto);
if (!endPosition)
endPosition = texto.length;
for (let i = 0; i < texto.length; i++) {
const index = i + 1;
if (index >= startPosition && index <= endPosition) {
const letra = texto[i];
retorno2 += letra;
}
}
return retorno2;
}
// src/banks/sicredi/gerarDadosBoleto.ts
function gerarDadosBoleto({ dados }) {
try {
const { bancario, parcela } = dados;
parcela.valor = Number(parcela.valor);
const fatorVencimento = getFatorVencimento(parcela.vencimento);
const valor = getValor(parcela.valor);
const nossoNumero = getNossoNumero(
parcela.numeroUnico,
bancario.agencia,
bancario.posto,
bancario.codigoCedente
);
let campoLivre = bancario.tipoCobranca + bancario.tipoCarteira + nossoNumero + bancario.agencia.padStart(4, "0") + bancario.posto.padStart(2, "0") + bancario.codigoCedente.padStart(5, "0") + 10;
const digitoCampoLivre = getDigitoCampoLivre(campoLivre);
campoLivre = campoLivre + digitoCampoLivre;
const digitoGeral = getDigitoGeral(`7489${fatorVencimento}${valor}${campoLivre}`);
const codigoBarra2 = `7489${digitoGeral}${fatorVencimento}${valor}${campoLivre}`;
const campo1 = copy(codigoBarra2, 1, 3) + copy(codigoBarra2, 4, 4) + copy(codigoBarra2, 20, 24);
const campo2 = copy(codigoBarra2, 25, 34);
const campo3 = copy(codigoBarra2, 35, 44);
const campo4 = copy(codigoBarra2, 5, 5);
const campo5 = copy(codigoBarra2, 6, 9) + copy(codigoBarra2, 10, 19);
const digito1 = getDigito(campo1);
const digito2 = getDigito(campo2);
const digito3 = getDigito(campo3);
const linhaDigitavel = campo1 + digito1 + campo2 + digito2 + campo3 + digito3 + campo4 + /*digito4*/
+campo5;
const dadosBoleto = {
linhaDigitavel,
fatorVencimento,
valor,
nossoNumero,
campoLivre,
digitoGeral,
codigoBarra: codigoBarra2
};
return dadosBoleto;
} catch (error) {
console.log("Falha ao gerar dados do boleto", error);
return null;
}
}
function getNossoNumero(id, agencia, posto, codigoCedente) {
let i = 19;
let j = 1;
let soma = 0;
let digito = 0;
const texto = agencia.padStart(4, "0") + posto.padStart(2, "0") + codigoCedente.padStart(5, "0") + id.padStart(8, "0");
while (i >= 1) {
j++;
if (j === 10)
j = 2;
const valor = Number(copy(texto, i, i));
soma += j * valor;
i--;
}
const restoDivisao = soma % 11;
digito = 11 - restoDivisao;
if (restoDivisao === 0 || restoDivisao === 1)
digito = 0;
return id.padStart(8, "0") + digito.toString();
}
function getValor(valor) {
const valorFormatado = valor.toFixed(2).replace(/\D/g, "");
return valorFormatado.padStart(10, "0");
}
function getDigitoCampoLivre(texto) {
let i = 24;
let j = 1;
let soma = 0;
let digito = 0;
while (i >= 1) {
j++;
if (j === 10)
j = 2;
let valor = Number(copy(texto, i, i));
soma += valor * j;
i--;
}
const restoDivisao = soma % 11;
if (restoDivisao > 1)
digito = 11 - restoDivisao;
return String(digito);
}
function getDigitoGeral(texto) {
let i = 43;
let j = 1;
let soma = 0;
let digito = 0;
while (i >= 1) {
j++;
if (j === 10)
j = 2;
const valor = Number(copy(texto, i, i));
soma += j * valor;
i--;
}
const restoDivisao = soma % 11;
digito = 11 - restoDivisao;
if (digito <= 1 || digito >= 10)
digito = 1;
return String(digito);
}
function getDigito(texto) {
let i = texto.length;
let j = 1;
let total = 0;
let soma = 0;
let digito = 0;
while (i >= 1) {
j = j === 1 ? 2 : 1;
let valor = Number(copy(texto, i, i));
total = valor * j;
if (total >= 10) {
valor = Number(copy(total, 1, 1)) + Number(copy(total, 2, 2));
} else {
valor = total;
}
soma += valor;
i--;
}
const uni = Number(copy(soma, String(soma).length, String(soma).length));
digito = 10 - uni;
if (digito === 10)
digito = 0;
return String(digito);
}
// src/banks/sicredi/gerarPDF.ts
var import_bwip_js2 = __toESM(require("bwip-js"));
function gerarPDF(_0) {
return __async(this, arguments, function* ({ dados }) {
try {
const { generatePDF, dadosPDF } = dados;
if (!dadosPDF.pagador.cpfcnpj) {
throw new Error("CPF/CNPJ do pagador na\u0303o informado!");
}
const codigoBarra2 = yield import_bwip_js2.default.toBuffer({
bcid: "interleaved2of5",
text: dadosPDF.boleto.codigoBarra,
height: 20
});
dadosPDF.beneficiario.dadosBancario.agencia = dadosPDF.beneficiario.dadosBancario.agencia.padStart(4, "0");
dadosPDF.boleto.linhaDigitavel = maskFormat_default.codigoBarra(dadosPDF.boleto.linhaDigitavel);
dadosPDF.boleto.codigoBarraImage = codigoBarra2.toString("base64");
dadosPDF.beneficiario.cnpj = maskFormat_default.retornaCpfCnpjFormatado(
dadosPDF.beneficiario.cnpj
);
dadosPDF.beneficiario.endereco.cep = maskFormat_default.retornaCEPFormatado(
dadosPDF.beneficiario.endereco.cep
);
dadosPDF.pagador.endereco.cep = maskFormat_default.retornaCEPFormatado(
dadosPDF.pagador.endereco.cep
);
dadosPDF.pagador.cpfcnpj = maskFormat_default.retornaCpfCnpjFormatado(dadosPDF.pagador.cpfcnpj);
dadosPDF.boleto.valorAcrescimo = maskFormat_default.numberToReal(
dadosPDF.boleto.valorAcrescimo
);
dadosPDF.boleto.valorCobrado = maskFormat_default.numberToReal(
dadosPDF.boleto.valorCobrado
);
dadosPDF.boleto.valorDescontoAbatimento = maskFormat_default.numberToReal(
dadosPDF.boleto.valorDescontoAbatimento
);
const valorDocumento = Number(dadosPDF.boleto.valorDocumento);
dadosPDF.boleto.valorDocumento = maskFormat_default.numberToReal(
dadosPDF.boleto.valorDocumento
);
dadosPDF.boleto.valorMulta = maskFormat_default.numberToReal(dadosPDF.boleto.valorMulta);
dadosPDF.boleto.valorOutrasDeducoes = maskFormat_default.numberToReal(
dadosPDF.boleto.valorOutrasDeducoes
);
if (dadosPDF.boleto.quantidade) {
dadosPDF.boleto.quantidade = maskFormat_default.numberToReal(dadosPDF.boleto.quantidade);
}
const jurosMes = dadosPDF.beneficiario.dadosBancario.juros;
const jurosDia = jurosMes / 100 / 30 * valorDocumento;
if (jurosDia > 0) {
dadosPDF.boleto.instrucao1 = `COBRAR JUROS DE R$${maskFormat_default.numberToReal(jurosDia)} AO DIA, AP\xD3S O VENCIMENTO`;
}
const descontoVencimento = dadosPDF.boleto.desconto > 0 ? dadosPDF.boleto.desconto : dadosPDF.beneficiario.dadosBancario.desconto > 0 ? dadosPDF.beneficiario.dadosBancario.desconto : 0;
if (descontoVencimento > 0) {
dadosPDF.boleto.instrucao2 = `AT\xC9 O VENCIMENTO, CONCEDER DESCONTO DE ${descontoVencimento}%`;
}
const multaAtraso = dadosPDF.beneficiario.dadosBancario.multa || 0;
if (multaAtraso > 0) {
dadosPDF.boleto.instrucao3 = `MULTA DE ${multaAtraso}%`;
}
const protestoDias = dadosPDF.beneficiario.dadosBancario.protesto || 0;
if (protestoDias > 0) {
dadosPDF.boleto.instrucao4 = `PROTESTAR AP\xD3S ${protestoDias} DIAS CORRIDOS DO VENCIMENTO`;
}
dadosPDF.boleto.valor = maskFormat_default.numberToReal(dadosPDF.boleto.valor);
dadosPDF.pagador.isCnpj = dadosPDF.pagador.cpfcnpj.length > 14;
const content = compileHbs(getPathTemplates("sicredi-boleto.hbs"), dadosPDF);
const config = {
displayHeaderFooter: false,
path: "./boleto.pdf",
format: "a4",
printBackground: true
};
let pdfBase64 = null;
if (generatePDF) {
pdfBase64 = yield generatePDF(content, config);
} else {
if (!api.defaults.baseURL) {
throw new Error("BaseURL api not found");
}
const response = yield api.post("/", { content, config });
const buffer = Buffer.from(response.data.pdf);
pdfBase64 = yield decompress(buffer);
}
return {
erro: false,
dados: pdfBase64
};
} catch (error) {
console.log(error);
if (error instanceof Error) {
return {
erro: true,
dados: error.message
};
}
return {
erro: true,
dados: "Falha ao gerar impress\xE3o do boleto"
};
}
});
}
// src/lib/Arquivo.ts
var Arquivo = class {
constructor() {
this.arquivo = "";
this.arquivo = "";
}
add(texto) {
this.arquivo += texto;
}
addLine() {
this.arquivo += "\n";
}
getArquivo() {
return this.arquivo;
}
};
// src/utils/removerCaracterEspecial.ts
function removerCaracterEspecial(texto) {
if (!texto)
return "";
let textoFormatado = texto.replace(/[`~!@#$°%^&*()_+=?;'"<>{}[\]\\]/gi, "");
textoFormatado = textoFormatado.replace(/[áàãâä]/g, "a");
textoFormatado = textoFormatado.replace(/[ÁÀÃÂÄ]/g, "A");
textoFormatado = textoFormatado.replace(/[éèêë]/g, "e");
textoFormatado = textoFormatado.replace(/[ÉÈÊË]/g, "E");
textoFormatado = textoFormatado.replace(/[íìîï]/g, "i");
textoFormatado = textoFormatado.replace(/[ÍÌÎÏ]/g, "I");
textoFormatado = textoFormatado.replace(/[óòõôö]/g, "o");
textoFormatado = textoFormatado.replace(/[ÓÒÔÕÖ]/g, "O");
textoFormatado = textoFormatado.replace(/[úùûü]/g, "u");
textoFormatado = textoFormatado.replace(/[ÚÙÛÜ]/g, "U");
textoFormatado = textoFormatado.replace(/ç/g, "c");
textoFormatado = textoFormatado.replace(/Ç/g, "C");
textoFormatado = textoFormatado.replace(/[^a-zA-Z0-9|/,-]/g, " ");
return textoFormatado;
}
// src/banks/sicredi/gerarRemessa.ts
var import_date_fns2 = require("date-fns");
function gerarRemessa({ dados }) {
try {
const { dadosBancario, beneficiario, boletos } = dados.remessa;
const arquivo = new Arquivo();
const data = /* @__PURE__ */ new Date();
let protestar = "00";
let negativar = "0000";
switch (dadosBancario.tipo_protesto) {
case "Nenhum":
protestar = "00";
negativar = "0000";
break;
case "Protestar":
protestar = "06";
negativar = "0000";
break;
case "Negativar":
protestar = "00";
negativar = "06" + String(dadosBancario.diasProtesto).padStart(2, "0");
break;
default:
protestar = "00";
negativar = "0000";
break;
}
arquivo.add("01REMESSA");
arquivo.add("01");
arquivo.add("COBRANCA".padEnd(15, " "));
arquivo.add(dadosBancario.codigo_cedente);
arquivo.add(beneficiario.cnpj);
arquivo.add(" ".padEnd(31, " "));
arquivo.add("748");
arquivo.add("SICREDI".padEnd(15, " "));
arquivo.add((0, import_date_fns2.format)(data, "yyyyMMdd"));
arquivo.add(" ".padEnd(8, " "));
arquivo.add(dadosBancario.numeroRemessa.padStart(7, "0"));
arquivo.add(" ".padEnd(273, " "));
arquivo.add("2.00");
arquivo.add("000001");
arquivo.addLine();
let sequencia = 2;
let total = 0;
for (const boleto of boletos) {
const { pagador } = boleto;
total += Number(boleto.valor);
let tipoInscricao = pagador.pessoa === "F" ? "1" : "2";
let desconto = "0000000000000";
let dataDesconto = "000000";
if (boleto.desconto) {
desconto = boleto.desconto.toFixed(2).replace(".", "").padStart(13, "0");
dataDesconto = (0, import_date_fns2.format)(new Date(boleto.vencimento), "ddMMyy");
}
if (!boleto.desconto && dadosBancario.descontoPagamento) {
desconto = dadosBancario.descontoPagamento.toFixed(2).replace(".", "").padStart(13, "0");
dataDesconto = (0, import_date_fns2.format)(new Date(boleto.vencimento), "ddMMyy");
}
let valorJurosDias = Number(boleto.valor) * Number(dadosBancario.jurosMes) / 100 / 30;
let multaAtraso = String(dadosBancario.multaAtraso * 100);
arquivo.add("1");
arquivo.add("AAA");
arquivo.add(" ".padEnd(12, " "));
arquivo.add("AAA");
arquivo.add(" ".padEnd(28, " "));
arquivo.add(boleto.nossoNumero.padEnd(9, " "));
arquivo.add(" ".padEnd(6, " "));
arquivo.add((0, import_date_fns2.format)(new Date(boleto.emissao), "yyyyMMdd"));
arquivo.add(" ");
arquivo.add("N");
arquivo.add(" ");
arquivo.add("B");
arquivo.add("0000");
arquivo.add(" ".padEnd(4, " "));
arquivo.add("0".padEnd(10, "0"));
arquivo.add(multaAtraso.padStart(4, "0"));
arquivo.add(" ".padEnd(12, " "));
arquivo.add("01");
arquivo.add(boleto.identificacaoTitulo.padEnd(10, " "));
arquivo.add((0, import_date_fns2.format)(new Date(boleto.vencimento), "ddMMyy"));
arquivo.add(Number(boleto.valor).toFixed(2).replace(".", "").padStart(13, "0"));
arquivo.add(" ".padEnd(9, " "));
arquivo.add("A");
arquivo.add(boleto.aceite);
arquivo.add((0, import_date_fns2.format)(new Date(boleto.emissao), "ddMMyy"));
arquivo.add(protestar);
arquivo.add(String(dadosBancario.diasProtesto).padStart(2, "0"));
arquivo.add(Number(valorJurosDias).toFixed(2).replace(".", "").padStart(13, "0"));
arquivo.add(dataDesconto);
arquivo.add(desconto);
arquivo.add(negativar);
arquivo.add("0".padEnd(22, "0"));
arquivo.add(tipoInscricao);
arquivo.add("0");
arquivo.add(pagador.cpfCnpj.padStart(14, "0"));
arquivo.add(removerCaracterEspecial(pagador.nome).substring(0, 40).padEnd(40, " "));
arquivo.add(removerCaracterEspecial(pagador.endereco.logradouro).substring(0, 40).padEnd(40, " "));
arquivo.add("0".padEnd(11, "0"));
arquivo.add(" ");
arquivo.add(pagador.endereco.cep.padEnd(8, " "));
arquivo.add("00000");
arquivo.add(" ".padEnd(55, " "));
arquivo.add(String(sequencia).padStart(6, "0"));
arquivo.addLine();
sequencia++;
}
arquivo.add("91748");
arquivo.add(dadosBancario.codigo_cedente);
arquivo.add(" ".padEnd(384, " "));
arquivo.add(String(sequencia).padStart(6, "0"));
arquivo.addLine();
return {
download: `${dadosBancario.codigo_cedente}${retornaMes(data)}${(0, import_date_fns2.format)(data, "dd")}.crm`,
arquivo: arquivo.getArquivo()
};
} catch (error) {
console.log(error);
return null;
}
}
function retornaMes(data) {
const mes = data.getMonth() + 1;
switch (mes) {
case 10:
return "O";
case 11:
return "N";
case 12:
return "D";
default:
return mes.toString();
}
}
// src/utils/agruparRetorno.ts
var import_date_fns3 = require("date-fns");
function agruparRetorno(documentos) {
return documentos.reduce((acc, documento) => {
const dateObj = new Date(documento.data);
if (isNaN(dateObj.getTime())) {
return acc;
}
const dataKey = (0, import_date_fns3.format)(dateObj, "yyyy-MM-dd");
if (!acc[dataKey]) {
acc[dataKey] = [];
}
acc[dataKey].push(documento);
return acc;
}, {});
}
// src/banks/sicredi/gerarRetorno.ts
var import_date_fns4 = require("date-fns");
function gerarRetorno({ dados }) {
try {
const { arquivo } = dados;
const documentos = [];
for (const linha of arquivo) {
const id_registro = linha.substring(0, 1);
if (id_registro !== "1" /* DETALHE */) {
continue;
}
const ocorrencia = linha.substring(108, 110);
if (ocorrencia !== "06" && ocorrencia !== "15" && ocorrencia !== "17" && ocorrencia !== "03") {
continue;
}
const motivo = linha.substring(213, 223).trim();
const meu_numero = linha.substring(116, 126).trim();
let tipo_documento = "";
let id_documento = "";
if (meu_numero.includes("-")) {
const [tipo, id] = meu_numero.split("-");
tipo_documento = tipo;
id_documento = id;
}
let especie = "INDEFINIDO";
if (tipo_documento.length) {
especie = tipo_documento === "N" ? "NFE" : tipo_documento === "F" ? "FAT" : tipo_documento === "L" ? "FIN" : "INDEFINIDO";
}
let dataCredito;
const dataCreditoString = linha.substring(328, 336);
if (dataCreditoString && dataCreditoString !== "00000000") {
dataCredito = (0, import_date_fns4.parse)(dataCreditoString, "yyyyMMdd", /* @__PURE__ */ new Date());
} else {
const dataOcorrenciaString = linha.substring(110, 116);
dataCredito = (0, import_date_fns4.parse)(dataOcorrenciaString, "ddMMyy", /* @__PURE__ */ new Date());
}
const valor_titulo = Number(linha.substring(152, 165)) / 100;
const abatimento = Number(linha.substring(227, 240)) / 100;
let valor_desconto = Number(linha.substring(240, 253)) / 100;
const valor_pago = Number(linha.substring(253, 266)) / 100;
let valor_juros = Number(linha.substring(266, 279)) / 100;
const valor_multa = Number(linha.substring(279, 292)) / 100;
if (valor_titulo > valor_pago && valor_desconto === 0) {
valor_desconto = valor_titulo - valor_pago;
}
if (valor_titulo < valor_pago && valor_juros === 0) {
valor_juros = valor_pago - valor_titulo;
}
const descontos = abatimento + valor_desconto;
const valor_total = valor_titulo + valor_multa + valor_juros - descontos;
let rejeitado = false;
let motivoRejeicao = "";
if (ocorrencia === "03") {
rejeitado = true;
motivoRejeicao = retornaMotivoRejeicao(motivo);
}
documentos.push({
id_documento,
especie,
valor: valor_pago,
valor_multa,
valor_juros,
valor_desconto,
valor_total,
data: dataCredito,
rejeitado,
motivo: motivoRejeicao
});
}
const documentosAgrupado = agruparRetorno(documentos);
return documentosAgrupado;
} catch (error) {
console.log(error);
return null;
}
}
function retornaMotivoRejeicao(codigo) {
switch (codigo) {
case "01":
return "C\xF3digo do banco inv\xE1lido";
case "02":
return "C\xF3digo do registro detalhe inv\xE1lido";
case "03":
return "C\xF3digo do segmento inv\xE1lido";
case "04":
return "C\xF3digo de movimento n\xE3o permitido para carteira";
case "05":
return "C\xF3digo de movimento inv\xE1lido";
case "06":
return "Tipo/n\xFAmero de inscri\xE7\xE3o do benefici\xE1rio inv\xE1lidos";
case "07":
return "Cooperativa cr\xE9dito/ag\xEAncia/conta/DV inv\xE1lido";
case "08":
return "Nosso n\xFAmero inv\xE1lido";
case "09":
return "Nosso n\xFAmero duplicado";
case "10":
return "Carteira inv\xE1lida";
case "11":
return "Forma de cadastramento do t\xEDtulo inv\xE1lido";
case "12":
return "Tipo de documento inv\xE1lido";
case "13":
return "Identifica\xE7\xE3o da emiss\xE3o do boleto inv\xE1lida";
case "14":
return "Identifica\xE7\xE3o da distribui\xE7\xE3o do boleto inv\xE1lida";
case "15":
return "Caracter\xEDsticas da cobran\xE7a incompat\xEDveis";
case "16":
return "Data de vencimento inv\xE1lida";
case "17":
return "Data de vencimento anterior a data de emiss\xE3o";
case "18":
return "Vencimento fora do prazo de opera\xE7\xE3o";
case "20":
return "Valor do t\xEDtulo inv\xE1lido";
case "21":
return "Esp\xE9cie do t\xEDtulo inv\xE1lida";
case "22":
return "Esp\xE9cie do t\xEDtulo n\xE3o permitida para a carteira";
case "23":
return "Aceite inv\xE1lido";
case "24":
return "Data da emiss\xE3o inv\xE1lida";
case "25":
return "Data da emiss\xE3o posterior a data de entrada";
case "26":
return "C\xF3digo de juros de mora inv\xE1lido";
case "27":
return "Valor/taxa de juros de mora inv\xE1lido";
case "28":
return "C\xF3digo do desconto inv\xE1lido";
case "29":
return "Valor do desconto maior ou igual ao valor do t\xEDtulo";
case "30":
return "Desconto a conceder n\xE3o confere";
case "31":
return "Concess\xE3o de desconto - j\xE1 existe desconto anterior";
case "33":
return "Valor do abatimento inv\xE1lido";
case "34":
return "Valor do abatimento maior ou igual ao valor do t\xEDtulo";
case "35":
return "Valor a conceder n\xE3o confere";
case "36":
return "Concess\xE3o de abatimento - j\xE1 existe abatimento anterior";
case "37":
return "C\xF3digo para protesto inv\xE1lido";
case "38":
return "Prazo para protesto inv\xE1lido";
case "39":
return "Pedido de protesto n\xE3o permitido para o t\xEDtulo";
case "40":
return "T\xEDtulo com ordem de protesto emitida";
case "41":
return "Pedido de cancelamento/susta\xE7\xE3o para t\xEDtulos sem instru\xE7\xE3o de protesto/negativa\xE7\xE3o";
case "44":
return "C\xF3digo da moeda inv\xE1lido";
case "45":
return "Nome do pagador n\xE3o informado";
case "46":
return "Tipo/n\xFAmero de inscri\xE7\xE3o do pagador inv\xE1lidos";
case "47":
return "Endere\xE7o do pagador n\xE3o informado";
case "48":
return "CEP inv\xE1lido";
case "53":
return "Tipo/n\xFAmero de inscri\xE7\xE3o do pagador/avalista inv\xE1lido";
case "54":
return "Pagador/avalista n\xE3o informado";
case "55":
return "Nosso n\xFAmero no banco correspondente n\xE3o informado";
case "56":
return "C\xF3digo do banco correspondente n\xE3o informado";
case "57":
return "C\xF3digo da multa inv\xE1lido";
case "58":
return "Data da multa inv\xE1lida";
case "59":
return "Valor/percentual da multa inv\xE1lido";
case "60":
return "Movimento para t\xEDtulo n\xE3o cadastrado";
case "61":
return "Altera\xE7\xE3o da cooperativa cr\xE9dito/ag\xEAncia cobradora/DV inv\xE1lida";
case "62":
return "Tipo de impress\xE3o inv\xE1lido";
case "63":
return "Entrada para t\xEDtulo j\xE1 cadastrado";
case "64":
return "N\xFAmero da linha inv\xE1lido";
case "79":
return "Data juros de mora inv\xE1lida";
case "80":
return "Data do desconto inv\xE1lida";
case "84":
return "N\xFAmero autoriza\xE7\xE3o inexistente";
case "85":
return "T\xEDtulo com pagamento vinculado";
case "86":
return "Seu n\xFAmero inv\xE1lido";
case "A4":
return "Pagador DDA";
case "CZ":
return "Instru\xE7\xE3o Inv\xE1lida";
case "L6":
return "Tipo de comando de instru\xE7\xE3o inv\xE1lida para benefici\xE1rio pessoa f\xEDsica.";
default:
return "Motivo desconhecido";
}
}
// src/banks/sicredi/index.ts
var sicredi = {
gerarDadosBoleto,
gerarPDF,
gerarRemessa,
gerarRetorno,
gerarPDFCarne
};
// src/types/Boletos.ts
var Banco = /* @__PURE__ */ ((Banco2) => {
Banco2["AILOS"] = "085";
Banco2["BRADESCO"] = "005";
Banco2["SICREDI"] = "748";
Banco2["SICOOB"] = "756";
Banco2["BANCO_BRASIL"] = "001";
Banco2["ITAU"] = "341";
return Banco2;
})(Banco || {});
// src/carne.ts
function carne({ banco, dados }) {
if (banco === "748" /* SICREDI */) {
return sicredi.gerarPDFCarne({ banco, dados });
}
}
// src/utils/pafLeft.ts
function padLeft(numero, tamanho) {
numero = String(numero);
if (numero.length < tamanho) {
numero = `0${numero}`;
return padLeft(numero, tamanho);
}
return numero;
}
// src/banks/ailos/gerarDadosBoleto.ts
function gerarDadosBoleto2({ dados }) {
try {
const { bancario, parcela } = dados;
parcela.valor = Number(parcela.valor);
const fatorVencimento = getFatorVencimento(parcela.vencimento);
const valor = getValor2(parcela.valor);
const convenio = padLeft(bancario.convenio, 6);
const numeroDocumento = padLeft(`${parcela.id_boleto}`, 9);
const nossoNumero = padLeft(bancario.numero + bancario.numero_dv, 8) + numeroDocumento;
const campoLivre = convenio + nossoNumero + padLeft(bancario.carteira, 2);
const digitoGeral = getDigitoGeral2(`0859${fatorVencimento}${valor}${campoLivre}`);
const codigoBarra2 = `0859${digitoGeral}${fatorVencimento}${valor}${campoLivre}`;
const campo1 = copy(codigoBarra2, 1, 3) + copy(codigoBarra2, 4, 4) + copy(codigoBarra2, 20, 24);
const campo2 = copy(codigoBarra2, 25, 34);
const campo3 = copy(codigoBarra2, 35, 44);
const campo4 = copy(codigoBarra2, 5, 5);
const campo5 = copy(codigoBarra2, 6, 9) + copy(codigoBarra2, 10, 19);
const digito1 = getDigito2(campo1);
const digito2 = getDigito2(campo2);
const digito3 = getDigito2(campo3);
const linhaDigitavel = campo1 + digito1 + campo2 + digito2 + campo3 + digito3 + campo4 + campo5;
const dadosBoleto = {
linhaDigitavel,
fatorVencimento,
valor,
convenio,
nossoNumero,
campoLivre,
digitoGeral,
codigoBarra: codigoBarra2,
numeroDocumento
};
return dadosBoleto;
} catch (error) {
console.log("Falha ao gerar dados do boleto", error);
return null;
}
}
function getValor2(valor) {
const valorFormatado = valor.toFixed(2).replace(/\D/g, "");
return padLeft(valorFormatado, 10);
}
function getDigitoGeral2(texto) {
let i = 43;
let j = 1;
let soma = 0;
let digito = 0;
while (i >= 1) {
j++;
if (j === 10)
j = 2;
const valor = Number(copy(texto, i, i));
soma += j * valor;
i--;
}
const restoDivisao = soma % 11;
digito = 11 - restoDivisao;
if (digito === 0 || digito === 1 || digito > 9)
digito = 1;
return String(digito);
}
function getDigito2(texto) {
let i = texto.length;
let j = 1;
let total = 0;
let soma = 0;
let digito = 0;
while (i >= 1) {
j = j === 1 ? 2 : 1;
let valor = Number(copy(texto, i, i));
total = valor * j;
if (total >= 10) {
valor = Number(copy(total, 1, 1)) + Number(copy(total, 2, 2));
} else {
valor = total;
}
soma += valor;
i--;
}
const uni = Number(copy(soma, String(soma).length, String(soma).length));
digito = 10 - uni;
if (digito === 10)
digito = 0;
return String(digito);
}
// src/banks/ailos/gerarPDF.ts
var import_bwip_js3 = __toESM(require("bwip-js"));
function gerarPDF2(_0) {
return __async(this, arguments, function* ({ dados }) {
var _a;
try {
const { generatePDF, dadosPDF } = dados;
if (!dadosPDF.pagador.cpfcnpj) {
throw new Error("CPF/CNPJ do pagador na\u0303o informado!");
}
const codigoBarra2 = yield import_bwip_js3.default.toBuffer({
bcid: "interleaved2of5",
text: dadosPDF.boleto.codigoBarra,
height: 20
});
dadosPDF.beneficiario.dadosBancario.agencia = dadosPDF.beneficiario.dadosBancario.agencia.padStart(4, "0");
dadosPDF.beneficiario.dadosBancario.conta = dadosPDF.beneficiario.dadosBancario.conta.padStart(7, "0");
dadosPDF.boleto.linhaDigitavel = maskFormat_default.codigoBarra(dadosPDF.boleto.linhaDigitavel);
dadosPDF.boleto.codigoBarraImage = codigoBarra2.toString("base64");
dadosPDF.beneficiario.cnpj = maskFormat_default.retornaCpfCnpjFormatado(
dadosPDF.beneficiario.cnpj
);
dadosPDF.beneficiario.endereco.cep = maskFormat_default.retornaCEPFormatado(
dadosPDF.beneficiario.endereco.cep
);
dadosPDF.pagador.endereco.cep = maskFormat_default.retornaCEPFormatado(
dadosPDF.pagador.endereco.cep
);
dadosPDF.pagador.cpfcnpj = maskFormat_default.retornaCpfCnpjFormatado(dadosPDF.pagador.cpfcnpj);
dadosPDF.boleto.valorAcrescimo = maskFormat_default.numberToReal(
dadosPDF.boleto.valorAcrescimo
);
dadosPDF.boleto.valorCobrado = maskFormat_default.numberToReal(
dadosPDF.boleto.valorCobrado
);
dadosPDF.boleto.valorDescontoAbatimento = maskFormat_default.numberToReal(
dadosPDF.boleto.valorDescontoAbatimento
);
const valorDocumento = Number(dadosPDF.boleto.valorDocumento);
dadosPDF.boleto.valorDocumento = maskFormat_default.numberToReal(
dadosPDF.boleto.valorDocumento
);
dadosPDF.boleto.valorMulta = maskFormat_default.numberToReal(dadosPDF.boleto.valorMulta);
dadosPDF.boleto.valorOutrasDeducoes = maskFormat_default.numberToReal(
dadosPDF.boleto.valorOutrasDeducoes
);
if (dadosPDF.boleto.quantidade) {
dadosPDF.boleto.quantidade = maskFormat_default.numberToReal(dadosPDF.boleto.quantidade);
}
const jurosMes = dadosPDF.beneficiario.dadosBancario.juros;
const jurosDia = jurosMes / 100 / 30 * valorDocumento;
if (jurosDia > 0) {
dadosPDF.boleto.instrucao1 = `COBRAR JUROS DE R$${maskFormat_default.numberToReal(jurosDia)} AO DIA, AP\xD3S O VENCIMENTO`;
}
const descontoVencimento = dadosPDF.boleto.desconto > 0 ? dadosPDF.boleto.desconto : dadosPDF.beneficiario.dadosBancario.desconto > 0 ? dadosPDF.beneficiario.dadosBancario.desconto : 0;
if (descontoVencimento > 0) {
dadosPDF.boleto.instrucao2 = `AT\xC9 O VENCIMENTO, CONCEDER DESCONTO DE ${descontoVencimento}%`;
}
const multaAtraso = dadosPDF.beneficiario.dadosBancario.multa || 0;
if (multaAtraso > 0) {
dadosPDF.boleto.instrucao3 = `MULTA DE ${multaAtraso}%`;
}
const protestoDias = dadosPDF.beneficiario.dadosBancario.protesto || 0;
if (protestoDias > 0) {
dadosPDF.boleto.instrucao4 = `PROTESTAR AP\xD3S ${protestoDias} DIAS CORRIDOS DO VENCIMENTO`;
}
dadosPDF.boleto.valor = maskFormat_default.numberToReal(dadosPDF.boleto.valor);
dadosPDF.pagador.isCnpj = dadosPDF.pagador.cpfcnpj.length > 14;
let content = compileHbs(getPathTemplates("ailos-boleto.hbs"), dadosPDF);
if ((_a = dadosPDF.boleto) == null ? void 0 : _a.pix) {
content = compileHbs(getPathTemplates("ailos-boleto-hibrido.hbs"), dadosPDF);
}
const config = {
displayHeaderFooter: false,
path: "./boleto.pdf",
format: "a4",
printBackground: true
};
let pdfBase64 = null;
if (generatePDF) {
pdfBase64 = yield generatePDF(content, config);
} else {
if (!api.defaults.baseURL) {
throw new Error("BaseURL api not found");
}
const response = yield api.post("/", { content, config });
const buffer = Buffer.from(response.data.pdf);
pdfBase64 = yield decompress(buffer);
}
return {
erro: false,
dados: pdfBase64
};
} catch (error) {
console.log(error);
if (error instanceof Error) {
return {
erro: true,
dados: error.message
};
}
return {
erro: true,
dados: "Falha ao gerar impress\xE3o do boleto"
};
}
});
}
// src/banks/ailos/gerarRemessa.ts
var import_date_fns5 = require("date-fns");
function gerarRemessa2({ dados }) {
try {
const { dadosBancario, beneficiario, boletos } = dados.remessa;
const arquivo = new Arquivo();
const dataAtual = /* @__PURE__ */ new Date();
const data = (0, import_date_fns5.format)(dataAtual, "ddMMyyyy");
const hora = (0, import_date_fns5.format)(dataAtual, "HHmmss");
const convenio = dadosBancario.convenio.padStart(7, "0");
const numero = dadosBancario.conta.padStart(7, "0") + dadosBancario.contaDigito;
const remessa2 = `REM${convenio}-${numero}-${data}.REM`;
arquivo.add("085");
arquivo.add("0000");
arquivo.add("0");
arquivo.add(" ");
arquivo.add("2");
arquivo.add(beneficiario.cnpj);
arquivo.add(dadosBancario.convenio.padEnd(20, " "));
arquivo.add(dadosBancario.agencia.padStart(5, "0"));
arquivo.add(dadosBancario.agenciaDigito);
arquivo.add(dadosBancario.conta.padStart(12, "0"));
arquivo.add(dadosBancario.contaDigito);
arquivo.add(" ");
arquivo.add(removerCaracterEspecial(beneficiario.nome).substring(0, 30).padEnd(30, " "));
arquivo.add("AILOS".padEnd(30, " "));
arquivo.add(" ");
arquivo.add("1");
arquivo.add(data);
arquivo.add(hora);
arquivo.add(dadosBancario.numeroRemessa.padStart(6, "0"));
arquivo.add("087");
arquivo.add("00000");
arquivo.add(" ".padEnd(20, " "));
arquivo.add(" ".padEnd(20, " "));
arquivo.add(" ".padEnd(29, " "));
arquivo.addLine();
arquivo.add("085");
arquivo.add("0001");
arquivo.add("1");
arquivo.add("R");
arquivo.add("01");
arquivo.add(" ");
arquivo.add("045");
arquivo.add(" ");
arquivo.add("2");
arquivo.add(beneficiario.cnpj.padStart(15, "0"));
arquivo.add(dadosBancario.convenio.padEnd(20, " "));
arquivo.add(dadosBancario.agencia.padStart(5, "0"));
arquivo.add(dadosBancario.agenciaDigito);
arquivo.add(dadosBancario.conta.padStart(12, "0"));
arquivo.add(dadosBancario.contaDigito);
arquivo.add(" ");
arquivo.add(removerCaracterEspecial(beneficiario.nome).substring(0, 30).padEnd(30, " "));
arquivo.add(" ".padEnd(40, " "));
arquivo.add(" ".padEnd(40, " "));
arquivo.add(dadosBancario.numeroRemessa.padStart(8, "0"));
arquivo.add(data);
arquivo.add("00000000");
arquivo.add(" ".padEnd(33, " "));
arquivo.addLine();
let sequencia = 0;
let quantidadeRegistro = 0;
let total = 0;
for (const boleto of boletos) {
const { pagador } = boleto;
const vencimento = (0, import_date_fns5.format)(new Date(boleto.vencimento), "ddMMyyyy");
total += Number(boleto.valor);
const codigoJuro = dadosBancario.jurosMes > 0 ? "2" : "3";
const juros = dadosBancario.jurosMes > 0 ? dadosBancario.jurosMes.toFixed(2) : "000000000000000";
const jurosVencimento = (0, import_date_fns5.format)(
(0, import_date_fns5.addDays)(new Date(boleto.vencimento), 1),
"ddMMyyyy"
);
const codigoDesconto = dadosBancario.descontoPagamento > 0 ? "2" : "0";
const desconto = boleto.desconto > 0 ? boleto.desconto.toFixed(2) : dadosBancario.descontoPagamento > 0 ? dadosBancario.descontoPagamento.toFixed(2) : "000000000000000";
let diasProtesto = "00";
let protesto = "3";
switch (dadosBancario.tipo_protesto) {
case "Nenhum":
protesto = "3";
diasProtesto = "00";
break;
case "Protestar":
protesto = "1";
diasProtesto = dadosBancario.diasProtesto.toString().padStart(2, "0");
break;
case "Negativar":
protesto = "2";
diasProtesto = dadosBancario.diasProtesto.toString().padStart(2, "0");
break;
default:
protesto = "3";
diasProtesto = "00";
break;
}
arquivo.add("085");
arquivo.add("0001");
arquivo.add("3");
arquivo.add((++sequencia).toString().padStart(5, "0"));
arquivo.add("P");
arquivo.add(" ");
arquivo.add("01");
arquivo.add(dadosBancario.agencia.padStart(5, "0"));
arquivo.add(dadosBancario.agenciaDigito);
arquivo.add(dadosBancario.conta.padStart(12, "0"));
arquivo.add(dadosBancario.contaDigito);
arquivo.add(" ");
arquivo.add(boleto.nossoNumero.padEnd(20, " "));
arquivo.add("1");
arquivo.add("1");
arquivo.add("1");
arquivo.add("2");
arquivo.add("2");
arquivo.add(`${boleto.numeroDocumento}/${boleto.parcela}`.padEnd(15, " "));
arquivo.add(vencimento);
arquivo.add(
Number(boleto.valor).toFixed(2).replace(".", "").padStart(15, "0")
);
arquivo.add(dadosBancario.agencia.padStart(5, "0"));
arquivo.add(dadosBancario.agenciaDigito);
arquivo.add("02");
arquivo.add(boleto.aceite);
arquivo.add(data);
arquivo.add(codigoJuro);
arquivo.add(jurosVencimento);
arquivo.add(juros.replace(".", "").padStart(15, "0"));
arquivo.add(codigoDesconto);
arquivo.add(vencimento);
arquivo.add(desconto.replace(".", "").padStart(15, "0"));
arquivo.add("000000000000000");
arquivo.add("000000000000000");
arquivo.add(boleto.identificacaoTitulo.padEnd(25, " "));
arquivo.add(protesto);
arquivo.add(diasProtesto);
arquivo.add("2");
arquivo.add(" ");
arquivo.add("09");
arquivo.add("0000000000");
arquivo.add(" ");
arquivo.addLine();
let tipoInscricao = "1";
if (pagador.pessoa === "F") {
tipoInscricao = "1";
} else {
tipoInscricao = "2";
}
pagador.endereco.logradouro = `${removerCaracterEspecial(pagador.endereco.logradouro).substring(0, 32).padEnd(32, " ")}${pagador.endereco.numero.padEnd(8, " ")}`;
arquivo.add("085");
arquivo.add("0001");
arquivo.add("3");
arquivo.add((++sequencia).toString().padStart(5, "0"));
arquivo.add("Q");
arquivo.add(" ");
arquivo.add("01");
arquivo.add(tipoInscricao);
arquivo.add(pagador.cpfCnpj.padStart(15, "0"));
arquivo.add(removerCaracterEspecial(pagador.nome).substring(0, 40).padEnd(40, " "));
arquivo.add(removerCaracterEspecial(pagador.endereco.logradouro).substring(0, 40).padEnd(40, " "));
arquivo.add(removerCaracterEspecial(pagador.endereco.bairro).substring(0, 15).padEnd(15, " "));
arquivo.add(pagador.endereco.cep.substring(0, 5).padStart(5, "0"));
arquivo.add(pagador.endereco.cep.substring(5, 7).padStart(3, "0"));
arquivo.add(removerCaracterEspecial(pagador.endereco.municipio).substring(0, 15).padEnd(15, " "));
arquivo.add(removerCaracterEspecial(pagador.endereco.uf).padEnd(2, " "));
arquivo.add("0");
arquivo.add("000000000000000");
arquivo.add(" ".padEnd(40, " "));
arquivo.add("000");
arquivo.add(" ".padEnd(20, " "));
arquivo.add(" ".padEnd(8, " "));
arquivo.addLine();
dadosBancario.multaAtraso = Number(dadosBancario.multaAtraso || 0);
if (dadosBancario.multaAtraso > 0) {
const multa = dadosBancario.multaAtraso.toFixed(2);
arquivo.add("085");
arquivo.add("0001");
arquivo.add("3");
arquivo.add((++sequencia).toString().padStart(5, "0"));
arquivo.add("R");
arquivo.add(" ");
arquivo.add("01");
arquivo.add("0");
arquivo.add("00000000");
arquivo.add("000000000000000");
arquivo.add("0");
arquivo.add("00000000");
arquivo.add("000000000000000");
arquivo.add("2");
arquivo.add(vencimento);
arquivo.add(multa.replace(".", "").padStart(15, "0"));
arquivo.add(" ".padEnd(10, " "));
arquivo.add(" ".padEnd(40, " "));
arquivo.add(" ".padEnd(40, " "));
arquivo.add(" ".padEnd(20, " "));
arquivo.add("00000000");
arquivo.add("000");
arquivo.add("00000");
arquivo.add(" ");
arquivo.add("000000000000");
arquivo.add(" ");
arquivo.add(" ");
arquivo.add("0");
arquivo.add("000000000");
arquivo.addLine();
}
quantidadeRegistro++;
}
arquivo.add("085");
arquivo.add("0001");
arquivo.add("5");
arquivo.add(" ".padEnd(9, " "));
arquivo.add((sequencia + 3).toString().padStart(6, "0"));
arquivo.add(quantidadeRegistro.toString().padStart(6, "0"));
arquivo.add(total.toFixed(2).replace(".", "").padStart(17, "0"));
arquivo.add("0".padStart(6, "0"));
arquivo.add("0".padStart(17, "0"));
arquivo.add("0".padStart(6, "0"));
arquivo.add("0".padStart(17, "0"));
arquivo.add("0".padStart(6, "0"));
arquivo.add("0".padStart(17, "0"));
arquivo.add(" ".padStart(8, " "));
arquivo.add(" ".padStart(117, " "));
arquivo.addLine();
arquivo.add("085");
arquivo.add("9999");
arquivo.