UNPKG

@plasoft/boletos

Version:
1 lines 181 kB
{"version":3,"sources":["../src/utils/pafLeft.ts","../src/utils/copy.ts","../src/utils/getFatorVencimento.ts","../src/banks/ailos/gerarDadosBoleto.ts","../src/banks/ailos/gerarPDF.ts","../src/utils/maskFormat.ts","../src/utils/compileHbs.ts","../src/utils/getPathTemplates.ts","../src/services/api.ts","../src/utils/zip.ts","../src/banks/ailos/gerarRemessa.ts","../src/lib/Arquivo.ts","../src/utils/removerAcentos.ts","../src/banks/ailos/gerarRetorno.ts","../src/banks/ailos/index.ts","../src/types/Boletos.ts","../src/banks/bradesco/gerarDadosBoleto.ts","../src/banks/bradesco/gerarPDF.ts","../src/banks/bradesco/gerarRemessa.ts","../src/banks/bradesco/gerarRetorno.ts","../src/banks/bradesco/index.ts","../src/banks/sicredi/gerarDadosBoleto.ts","../src/banks/sicredi/gerarPDF.ts","../src/banks/sicredi/gerarRemessa.ts","../src/banks/sicredi/gerarRetorno.ts","../src/banks/sicredi/index.ts","../src/banks/sicoob/gerarDadosBoleto.ts","../src/banks/sicoob/gerarRemessa.ts","../src/banks/sicoob/gerarPDF.ts","../src/banks/sicoob/gerarRetorno.ts","../src/banks/sicoob/index.ts","../src/banks/banco-brasil/gerarDadosBoleto.ts","../src/banks/banco-brasil/gerarPDF.ts","../src/banks/banco-brasil/gerarRemessa.ts","../src/banks/banco-brasil/gerarRetorno.ts","../src/banks/banco-brasil/index.ts","../src/gerar.ts","../src/banks/itau/gerarPDF.ts","../src/banks/itau/index.ts","../src/pdf.ts","../src/remessa.ts","../src/retorno.ts","../src/config/index.ts","../src/index.ts"],"sourcesContent":["export function padLeft(numero: number | string, tamanho: number) {\r\n numero = String(numero);\r\n if (numero.length < tamanho) {\r\n numero = `0${numero}`;\r\n return padLeft(numero, tamanho);\r\n }\r\n return numero;\r\n}\r\n","export function copy(\r\n texto: string | number,\r\n startPosition: number,\r\n endPosition?: number,\r\n) {\r\n let retorno = '';\r\n\r\n if (typeof texto === 'number') texto = String(texto);\r\n if (!endPosition) endPosition = texto.length;\r\n\r\n for (let i = 0; i < texto.length; i++) {\r\n const index = i + 1;\r\n\r\n if (index >= startPosition && index <= endPosition) {\r\n const letra = texto[i];\r\n retorno += letra;\r\n }\r\n }\r\n\r\n return retorno;\r\n}\r\n","import { differenceInDays } from \"date-fns\";\r\n\r\nexport function getFatorVencimento(vencimento: string | Date) {\r\n vencimento = new Date(vencimento);\r\n if (vencimento >= new Date(2025, 1, 22)) {\r\n return differenceInDays(new Date(vencimento), new Date(2022, 4, 29)).toString();\r\n } else {\r\n return differenceInDays(new Date(vencimento), new Date(1997, 9, 7)).toString();\r\n }\r\n}\r\n","import { IGerarBoletoAilos } from './types';\r\nimport { padLeft } from '@/utils/pafLeft';\r\nimport { copy } from '@/utils/copy';\r\nimport { getFatorVencimento } from '@/utils/getFatorVencimento';\r\n\r\nexport function gerarDadosBoleto({ dados }: IGerarBoletoAilos) {\r\n try {\r\n const { bancario, parcela } = dados;\r\n\r\n parcela.valor = Number(parcela.valor);\r\n\r\n const fatorVencimento = getFatorVencimento(parcela.vencimento);\r\n const valor = getValor(parcela.valor);\r\n const convenio = padLeft(bancario.convenio, 6);\r\n const numeroDocumento = padLeft(`${parcela.id_boleto}`, 9);\r\n const nossoNumero = padLeft(bancario.numero + bancario.numero_dv, 8) + numeroDocumento;\r\n\r\n const campoLivre = convenio + nossoNumero + padLeft(bancario.carteira, 2);\r\n const digitoGeral = getDigitoGeral(`0859${fatorVencimento}${valor}${campoLivre}`);\r\n const codigoBarra = `0859${digitoGeral}${fatorVencimento}${valor}${campoLivre}`;\r\n\r\n const campo1 = copy(codigoBarra, 1, 3) + copy(codigoBarra, 4, 4) + copy(codigoBarra, 20, 24);\r\n const campo2 = copy(codigoBarra, 25, 34);\r\n const campo3 = copy(codigoBarra, 35, 44);\r\n const campo4 = copy(codigoBarra, 5, 5);\r\n const campo5 = copy(codigoBarra, 6, 9) + copy(codigoBarra, 10, 19);\r\n\r\n const digito1 = getDigito(campo1);\r\n const digito2 = getDigito(campo2);\r\n const digito3 = getDigito(campo3);\r\n /* const digito4 = getDigito(campo4); Aviso: No solution está errado, mas da certo, esse digito 4 não usa*/\r\n\r\n const linhaDigitavel = campo1 + digito1 + campo2 + digito2 + campo3 + digito3 + campo4 /*+ digito4*/ + campo5;\r\n\r\n const dadosBoleto = {\r\n linhaDigitavel,\r\n fatorVencimento,\r\n valor,\r\n convenio,\r\n nossoNumero,\r\n campoLivre,\r\n digitoGeral,\r\n codigoBarra,\r\n numeroDocumento\r\n };\r\n\r\n return dadosBoleto;\r\n } catch (error) {\r\n console.log('Falha ao gerar dados do boleto', error);\r\n return null;\r\n }\r\n}\r\n\r\nfunction getValor(valor: number) {\r\n const valorFormatado = valor.toFixed(2).replace(/\\D/g, '');\r\n return padLeft(valorFormatado, 10);\r\n}\r\n\r\nfunction getDigitoGeral(texto: string) {\r\n let i = 43;\r\n let j = 1;\r\n let soma = 0;\r\n let digito = 0;\r\n\r\n while (i >= 1) {\r\n j++;\r\n\r\n if (j === 10) j = 2;\r\n\r\n const valor = Number(copy(texto, i, i));\r\n soma += j * valor;\r\n\r\n i--;\r\n }\r\n\r\n const restoDivisao = soma % 11;\r\n digito = 11 - restoDivisao;\r\n\r\n if (digito === 0 || digito === 1 || digito > 9) digito = 1;\r\n\r\n return String(digito);\r\n}\r\n\r\nfunction getDigito(texto: string) {\r\n let i = texto.length;\r\n let j = 1;\r\n let total = 0;\r\n let soma = 0;\r\n let digito = 0;\r\n\r\n while (i >= 1) {\r\n j = j === 1 ? 2 : 1;\r\n\r\n let valor = Number(copy(texto, i, i));\r\n total = valor * j;\r\n\r\n if (total >= 10) {\r\n valor = Number(copy(total, 1, 1)) + Number(copy(total, 2, 2));\r\n } else {\r\n valor = total;\r\n }\r\n\r\n soma += valor;\r\n i--;\r\n }\r\n\r\n const uni = Number(copy(soma, String(soma).length, String(soma).length));\r\n digito = 10 - uni;\r\n if (digito === 10) digito = 0;\r\n return String(digito);\r\n}\r\n","import { PDFOptions } from 'puppeteer-core';\nimport BwipJs from 'bwip-js';\nimport { IGerarPDFAilos } from './types';\nimport maskFormat from '@/utils/maskFormat';\nimport { compileHbs } from '@/utils/compileHbs';\nimport { getPathTemplates } from '@/utils/getPathTemplates';\nimport { api } from '@/services/api';\nimport { decompress } from '@/utils/zip';\n\nexport async function gerarPDF({ dados }: IGerarPDFAilos) {\n try {\n const { generatePDF, dadosPDF } = dados;\n\n if (!dadosPDF.pagador.cnpj) {\n throw new Error('CPF/CNPJ do pagador não informado!');\n }\n\n const codigoBarra = await BwipJs.toBuffer({\n bcid: 'interleaved2of5',\n text: dadosPDF.boleto.codigoBarra,\n height: 20,\n });\n\n dadosPDF.beneficiario.dadosBancario.agencia =\n dadosPDF.beneficiario.dadosBancario.agencia.padStart(4, '0');\n dadosPDF.beneficiario.dadosBancario.conta =\n dadosPDF.beneficiario.dadosBancario.conta.padStart(7, '0');\n\n dadosPDF.boleto.linhaDigitavel = maskFormat.codigoBarra(dadosPDF.boleto.linhaDigitavel);\n dadosPDF.boleto.codigoBarraImage = codigoBarra.toString('base64');\n dadosPDF.beneficiario.cnpj = maskFormat.retornaCpfCnpjFormatado(\n dadosPDF.beneficiario.cnpj,\n );\n dadosPDF.beneficiario.endereco.cep = maskFormat.retornaCEPFormatado(\n dadosPDF.beneficiario.endereco.cep,\n );\n dadosPDF.pagador.endereco.cep = maskFormat.retornaCEPFormatado(\n dadosPDF.pagador.endereco.cep,\n );\n dadosPDF.pagador.cnpj = maskFormat.retornaCpfCnpjFormatado(dadosPDF.pagador.cnpj);\n\n dadosPDF.boleto.valorAcrescimo = maskFormat.numberToReal(\n dadosPDF.boleto.valorAcrescimo,\n );\n dadosPDF.boleto.valorCobrado = maskFormat.numberToReal(\n dadosPDF.boleto.valorCobrado,\n );\n dadosPDF.boleto.valorDescontoAbatimento = maskFormat.numberToReal(\n dadosPDF.boleto.valorDescontoAbatimento,\n );\n const valorDocumento = Number(dadosPDF.boleto.valorDocumento);\n dadosPDF.boleto.valorDocumento = maskFormat.numberToReal(\n dadosPDF.boleto.valorDocumento,\n );\n dadosPDF.boleto.valorMulta = maskFormat.numberToReal(dadosPDF.boleto.valorMulta);\n dadosPDF.boleto.valorOutrasDeducoes = maskFormat.numberToReal(\n dadosPDF.boleto.valorOutrasDeducoes,\n );\n\n if (dadosPDF.boleto.quantidade) {\n dadosPDF.boleto.quantidade = maskFormat.numberToReal(dadosPDF.boleto.quantidade);\n }\n\n const jurosMes = dadosPDF.beneficiario.dadosBancario.juros;\n const jurosDia = (jurosMes / 100 / 30) * valorDocumento;\n if (jurosDia > 0) {\n dadosPDF.boleto.instrucao1 = `COBRAR JUROS DE R$${maskFormat.numberToReal(jurosDia)} AO DIA, APÓS O VENCIMENTO`;\n }\n\n const descontoVencimento = dadosPDF.beneficiario.dadosBancario.desconto || 0;\n if (descontoVencimento > 0) {\n dadosPDF.boleto.instrucao2 = `ATÉ O VENCIMENTO, CONCEDER DESCONTO DE ${descontoVencimento}%`;\n }\n\n const multaAtraso = dadosPDF.beneficiario.dadosBancario.multa || 0;\n if (multaAtraso > 0) {\n dadosPDF.boleto.instrucao3 = `MULTA DE ${multaAtraso}%`;\n }\n\n const protestoDias = dadosPDF.beneficiario.dadosBancario.protesto || 0;\n if (protestoDias > 0) {\n dadosPDF.boleto.instrucao4 = `PROTESTAR APÓS ${protestoDias} DIAS CORRIDOS DO VENCIMENTO`;\n }\n\n dadosPDF.boleto.valor = maskFormat.numberToReal(dadosPDF.boleto.valor);\n const content = compileHbs(getPathTemplates('ailos-boleto.hbs'), dadosPDF);\n\n const config: PDFOptions = {\n displayHeaderFooter: false,\n path: './boleto.pdf',\n format: 'a4',\n printBackground: true,\n };\n\n let pdfBase64: string | null = null;\n\n if (generatePDF) {\n pdfBase64 = await generatePDF(content, config);\n } else {\n if (!api.defaults.baseURL) {\n throw new Error('BaseURL api not found');\n }\n\n const response = await api.post('/', { content, config });\n const buffer = Buffer.from(response.data.pdf);\n pdfBase64 = await decompress(buffer);\n }\n\n return {\n erro: false,\n dados: pdfBase64,\n };\n } catch (error) {\n console.log(error);\n if (error instanceof Error) {\n return {\n erro: true,\n dados: error.message,\n }\n }\n return {\n erro: true,\n dados: 'Falha ao gerar impressão do boleto',\n };\n }\n}\n","import StringMask from 'string-mask';\r\n\r\nexport function retornaCpfCnpjFormatado(cpfCnpj: string) {\r\n if (cpfCnpj?.length <= 11) {\r\n const formatter = new StringMask('000.000.000-00');\r\n return formatter.apply(cpfCnpj);\r\n }\r\n\r\n const formatter = new StringMask('00.000.000/0000-00');\r\n return formatter.apply(cpfCnpj);\r\n}\r\n\r\nexport function retornaCEPFormatado(cep: string) {\r\n const formatter = new StringMask('00000-000');\r\n return formatter.apply(cep);\r\n}\r\n\r\n\r\nexport function numberToReal(numero: any) {\r\n numero = typeof numero === 'string' ? parseFloat(numero) : numero;\r\n numero = numero.toFixed(2).split('.');\r\n numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.');\r\n return numero.join(',');\r\n}\r\n\r\nexport function codigoBarra(codigo: string) {\r\n const formatter = new StringMask('00000.00000 00000.000000 00000.000000 0 000000000000000');\r\n return formatter.apply(codigo);\r\n}\r\n\r\nexport default {\r\n numberToReal,\r\n retornaCEPFormatado,\r\n retornaCpfCnpjFormatado,\r\n codigoBarra,\r\n};\r\n","import hbs from 'handlebars';\r\nimport fs from 'fs';\r\n\r\nexport function compileHbs(templatePath: string, data?: any) {\r\n const html = fs.readFileSync(templatePath, 'utf-8');\r\n const content = hbs.compile(html)(data);\r\n\r\n return content;\r\n}\r\n","import path from 'path';\r\n\r\nexport function getPathTemplates(template: string) {\r\n if (process.env.NODE_ENV === 'dev') {\r\n return path.resolve(process.cwd(), 'views', template);\r\n }\r\n\r\n return path.resolve(__dirname, template);\r\n}\r\n","import 'dotenv/config';\nimport axios from \"axios\";\n\nexport const api = axios.create({\n baseURL: process.env.API_URL || 'https://23136fv876.execute-api.sa-east-1.amazonaws.com/dev/create-report',\n});\n","import * as zlib from 'zlib';\r\n\r\nfunction compress(input: string): Promise<{ erro: boolean; dados: Buffer }> {\r\n return new Promise((resolve, reject) => {\r\n zlib.gzip(input, (error, result) => {\r\n if (error) {\r\n return reject(error);\r\n }\r\n resolve({\r\n erro: false,\r\n dados: result,\r\n });\r\n });\r\n });\r\n}\r\n\r\nfunction decompress(input: Buffer): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n zlib.gunzip(input, (error, result) => {\r\n if (error) {\r\n return reject(error);\r\n }\r\n resolve(result.toString());\r\n });\r\n });\r\n}\r\n\r\nexport { compress, decompress };\r\n","import { addDays, format } from 'date-fns';\nimport { IGerarRemessaAilos } from './types';\nimport { Arquivo } from '@/lib/Arquivo';\nimport { removerAcentos } from '@/utils/removerAcentos';\n\nexport function gerarRemessa({ dados }: IGerarRemessaAilos) {\n try {\n const { dadosBancario, beneficiario, boletos } = dados.remessa;\n\n const arquivo = new Arquivo();\n const dataAtual = new Date();\n const data = format(dataAtual, 'ddMMyyyy');\n const hora = format(dataAtual, 'HHmmss');\n\n const convenio = dadosBancario.convenio.padStart(7, '0');\n const numero =\n dadosBancario.conta.padStart(7, '0') + dadosBancario.contaDigito;\n\n const remessa = `REM${convenio}-${numero}-${data}.REM`;\n\n // Header do arquivo\n arquivo.add('085');\n arquivo.add('0000');\n arquivo.add('0');\n arquivo.add(' ');\n arquivo.add('2');\n arquivo.add(beneficiario.cnpj);\n arquivo.add(dadosBancario.convenio.padEnd(20, ' '));\n arquivo.add(dadosBancario.agencia.padStart(5, '0'));\n arquivo.add(dadosBancario.agenciaDigito);\n arquivo.add(dadosBancario.conta.padStart(12, '0'));\n arquivo.add(dadosBancario.contaDigito);\n arquivo.add(' ');\n arquivo.add(removerAcentos(beneficiario.nome).substring(0, 30).padEnd(30, ' '));\n arquivo.add('AILOS'.padEnd(30, ' '));\n arquivo.add(' ');\n arquivo.add('1');\n arquivo.add(data);\n arquivo.add(hora);\n arquivo.add(dadosBancario.numeroRemessa.padStart(6, '0'));\n arquivo.add('087');\n arquivo.add('00000');\n arquivo.add(' '.padEnd(20, ' '));\n arquivo.add(' '.padEnd(20, ' '));\n arquivo.add(' '.padEnd(29, ' '));\n\n arquivo.addLine();\n\n // Header do lote\n arquivo.add('085');\n arquivo.add('0001');\n arquivo.add('1');\n arquivo.add('R');\n arquivo.add('01');\n arquivo.add(' ');\n arquivo.add('045');\n arquivo.add(' ');\n arquivo.add('2');\n arquivo.add(beneficiario.cnpj.padStart(15, '0'));\n arquivo.add(dadosBancario.convenio.padEnd(20, ' '));\n arquivo.add(dadosBancario.agencia.padStart(5, '0'));\n arquivo.add(dadosBancario.agenciaDigito);\n arquivo.add(dadosBancario.conta.padStart(12, '0'));\n arquivo.add(dadosBancario.contaDigito);\n arquivo.add(' ');\n arquivo.add(removerAcentos(beneficiario.nome).substring(0, 30).padEnd(30, ' '));\n arquivo.add(' '.padEnd(40, ' '));\n arquivo.add(' '.padEnd(40, ' '));\n arquivo.add(dadosBancario.numeroRemessa.padStart(8, '0'));\n arquivo.add(data);\n arquivo.add('00000000');\n arquivo.add(' '.padEnd(33, ' '));\n\n arquivo.addLine();\n\n let sequencia = 0;\n let quantidadeRegistro = 0;\n let total = 0;\n\n // Registro Detalhe – Segmento P\n for (const boleto of boletos) {\n const { pagador } = boleto;\n const vencimento = format(new Date(boleto.vencimento), 'ddMMyyyy');\n total += Number(boleto.valor);\n\n // Cálculos de juros\n const codigoJuro = dadosBancario.jurosMes > 0 ? '2' : '3';\n const juros =\n dadosBancario.jurosMes > 0\n ? dadosBancario.jurosMes.toFixed(2)\n : '000000000000000';\n\n // Cálculos de desconto\n const jurosVencimento = format(\n addDays(new Date(boleto.vencimento), 1),\n 'ddMMyyyy',\n );\n const codigoDesconto = dadosBancario.descontoPagamento > 0 ? '2' : '0';\n const desconto =\n dadosBancario.descontoPagamento > 0\n ? dadosBancario.descontoPagamento.toFixed(2)\n : '000000000000000';\n\n const protesto = dadosBancario.diasProtesto > 0 ? '1' : '3';\n let diasProtesto = '00';\n\n if (protesto === '1') {\n diasProtesto = dadosBancario.diasProtesto.toString().padStart(2, '0');\n }\n\n arquivo.add('085');\n arquivo.add('0001');\n arquivo.add('3');\n arquivo.add((++sequencia).toString().padStart(5, '0'));\n arquivo.add('P');\n arquivo.add(' ');\n arquivo.add('01');\n arquivo.add(dadosBancario.agencia.padStart(5, '0'));\n arquivo.add(dadosBancario.agenciaDigito);\n arquivo.add(dadosBancario.conta.padStart(12, '0'));\n arquivo.add(dadosBancario.contaDigito);\n arquivo.add(' ');\n arquivo.add(boleto.nossoNumero.padEnd(20, ' '));\n arquivo.add('1');\n arquivo.add('1');\n arquivo.add('1');\n arquivo.add('2');\n arquivo.add('2');\n arquivo.add(`${boleto.numeroDocumento}/${boleto.parcela}`.padEnd(15, ' '));\n arquivo.add(vencimento);\n arquivo.add(\n Number(boleto.valor).toFixed(2).replace('.', '').padStart(15, '0'),\n );\n arquivo.add(dadosBancario.agencia.padStart(5, '0'));\n arquivo.add(dadosBancario.agenciaDigito);\n arquivo.add('02'); // especie\n arquivo.add(boleto.aceite); // aceite\n arquivo.add(data);\n arquivo.add(codigoJuro);\n arquivo.add(jurosVencimento);\n arquivo.add(juros.replace('.', '').padStart(15, '0'));\n arquivo.add(codigoDesconto);\n arquivo.add(vencimento);\n arquivo.add(desconto.replace('.', '').padStart(15, '0'));\n arquivo.add('000000000000000');\n arquivo.add('000000000000000');\n arquivo.add(boleto.identificacaoTitulo.padEnd(25, ' ')); // Identificação de título, usar depois\n arquivo.add(protesto);\n arquivo.add(diasProtesto);\n arquivo.add('2');\n arquivo.add(' ');\n arquivo.add('09');\n arquivo.add('0000000000');\n arquivo.add(' ');\n\n arquivo.addLine();\n\n // Registro Detalhe – Segmento Q\n let tipoInscricao = '1';\n\n if (pagador.pessoa === 'F') {\n tipoInscricao = '1';\n } else {\n tipoInscricao = '2';\n }\n\n pagador.endereco.logradouro = `${\n removerAcentos(pagador.endereco.logradouro)\n .substring(0, 32)\n .padEnd(32, ' ')}${pagador.endereco.numero.padEnd(8, ' ')}`;\n\n arquivo.add('085');\n arquivo.add('0001');\n arquivo.add('3');\n arquivo.add((++sequencia).toString().padStart(5, '0'));\n arquivo.add('Q');\n arquivo.add(' ');\n arquivo.add('01');\n arquivo.add(tipoInscricao);\n arquivo.add(pagador.cpfCnpj.padStart(15, '0'));\n arquivo.add(removerAcentos(pagador.nome).substring(0, 40).padEnd(40, ' '));\n arquivo.add(removerAcentos(pagador.endereco.logradouro).substring(0, 40).padEnd(40, ' '));\n arquivo.add(removerAcentos(pagador.endereco.bairro).substring(0, 15).padEnd(15, ' '));\n arquivo.add(pagador.endereco.cep.substring(0, 5).padStart(5, '0'));\n arquivo.add(pagador.endereco.cep.substring(5, 7).padStart(3, '0'));\n arquivo.add(removerAcentos(pagador.endereco.municipio).substring(0, 15).padEnd(15, ' '));\n arquivo.add(removerAcentos(pagador.endereco.uf).padEnd(2, ' '));\n arquivo.add('0');\n arquivo.add('000000000000000');\n arquivo.add(' '.padEnd(40, ' '));\n arquivo.add('000');\n arquivo.add(' '.padEnd(20, ' '));\n arquivo.add(' '.padEnd(8, ' '));\n\n arquivo.addLine();\n\n dadosBancario.multaAtraso = Number(dadosBancario.multaAtraso || 0);\n if (dadosBancario.multaAtraso > 0) {\n const multa = dadosBancario.multaAtraso.toFixed(2);\n\n // Registro Detalhe – Segmento R\n arquivo.add('085');\n arquivo.add('0001');\n arquivo.add('3');\n arquivo.add((++sequencia).toString().padStart(5, '0'));\n arquivo.add('R');\n arquivo.add(' ');\n arquivo.add('01');\n arquivo.add('0');\n arquivo.add('00000000');\n arquivo.add('000000000000000');\n arquivo.add('0');\n arquivo.add('00000000');\n arquivo.add('000000000000000');\n arquivo.add('2');\n arquivo.add(vencimento);\n arquivo.add(multa.replace('.', '').padStart(15, '0'));\n arquivo.add(' '.padEnd(10, ' '));\n arquivo.add(' '.padEnd(40, ' '));\n arquivo.add(' '.padEnd(40, ' '));\n arquivo.add(' '.padEnd(20, ' '));\n arquivo.add('00000000');\n arquivo.add('000');\n arquivo.add('00000');\n arquivo.add(' ');\n arquivo.add('000000000000');\n arquivo.add(' ');\n arquivo.add(' ');\n arquivo.add('0');\n arquivo.add('000000000');\n\n arquivo.addLine();\n }\n quantidadeRegistro++;\n }\n\n // Registro trailer do lote\n arquivo.add('085');\n arquivo.add('0001');\n arquivo.add('5');\n arquivo.add(' '.padEnd(9, ' '));\n arquivo.add((sequencia + 3).toString().padStart(6, '0'));\n arquivo.add(quantidadeRegistro.toString().padStart(6, '0'));\n arquivo.add(total.toFixed(2).replace('.', '').padStart(17, '0'));\n arquivo.add('0'.padStart(6, '0'));\n arquivo.add('0'.padStart(17, '0'));\n arquivo.add('0'.padStart(6, '0'));\n arquivo.add('0'.padStart(17, '0'));\n arquivo.add('0'.padStart(6, '0'));\n arquivo.add('0'.padStart(17, '0'));\n arquivo.add(' '.padStart(8, ' '));\n arquivo.add(' '.padStart(117, ' '));\n\n arquivo.addLine();\n\n // Registro Trailer de Arquivo\n arquivo.add('085');\n arquivo.add('9999');\n arquivo.add('9');\n arquivo.add(' '.padEnd(9, ' '));\n arquivo.add('000001');\n arquivo.add((sequencia + 4).toString().padStart(6, '0'));\n arquivo.add('000000');\n arquivo.add(' '.padEnd(205, ' '));\n\n return {\n download: remessa,\n arquivo: arquivo.getArquivo(),\n };\n } catch (error) {\n console.log(error);\n return null;\n }\n}\n","export class Arquivo {\r\n arquivo = '';\r\n\r\n constructor() {\r\n this.arquivo = '';\r\n }\r\n\r\n add(texto: string) {\r\n this.arquivo += texto;\r\n }\r\n\r\n addLine() {\r\n this.arquivo += '\\n';\r\n }\r\n\r\n getArquivo() {\r\n return this.arquivo;\r\n }\r\n}\r\n","export function removerAcentos(texto: string) {\r\n return texto.normalize(\"NFD\").replace(/[\\u0300-\\u036f.]/g, \"\");\r\n}\r\n","import { IGerarRetornoAilos, IDocumentoRetornoAilos } from './types';\r\n\r\nexport function gerarRetorno({ dados }: IGerarRetornoAilos){\r\n try {\r\n const { arquivo } = dados;\r\n const documentos: IDocumentoRetornoAilos[] = [];\r\n\r\n let index = 0;\r\n\r\n for (const item of arquivo) {\r\n let linha = item;\r\n\r\n const banco = linha.substring(0, 3);\r\n const codigoRetorno = linha.substring(15, 17);\r\n\r\n if (\r\n (banco === '001' || banco === '085') &&\r\n (codigoRetorno === '06' || codigoRetorno === '17')\r\n ) {\r\n let segmento = linha.substring(13, 14);\r\n\r\n if (segmento === 'T') {\r\n const linhaDoc = linha.substring(105, 130).trimEnd();\r\n\r\n let tipoDocumento: string = 'INDEFINIDO';\r\n let idDocumento: string = linhaDoc;\r\n\r\n if (linhaDoc.includes('-')) {\r\n const [tipoDoc, idDoc] = linhaDoc.split('-');\r\n tipoDocumento = tipoDoc;\r\n idDocumento = idDoc;\r\n }\r\n\r\n const especie = tipoDocumento.length ? tipoDocumento : 'INDEFINIDO';\r\n\r\n linha = arquivo[index + 1];\r\n segmento = linha.substring(13, 14);\r\n\r\n if (segmento === 'U') {\r\n const valorAbatimentoString = linha.substring(47, 62);\r\n const valorAbatimento = Number(valorAbatimentoString) / 100;\r\n\r\n const valorDescontoString = linha.substring(32, 47);\r\n const valorDesconto = Number(valorDescontoString) / 100;\r\n\r\n const valorPagoString = linha.substring(77, 92);\r\n const valorPago = Number(valorPagoString) / 100;\r\n\r\n const valorJurosString = linha.substring(17, 32);\r\n const valorJuros = Number(valorJurosString) / 100;\r\n\r\n const valorMulta = 0;\r\n const descontos = valorAbatimento + valorDesconto;\r\n const valorTotal = valorPago - valorJuros + descontos;\r\n\r\n const documento = {\r\n id_documento: idDocumento,\r\n especie,\r\n valor: valorPago,\r\n valor_multa: valorMulta,\r\n valor_juros: valorJuros,\r\n valor_desconto: valorDesconto,\r\n valor_total: valorTotal,\r\n };\r\n\r\n documentos.push(documento);\r\n }\r\n }\r\n }\r\n\r\n index++;\r\n }\r\n\r\n return documentos;\r\n } catch (error) {\r\n console.log(error);\r\n return null;\r\n }\r\n}\r\n","import { gerarDadosBoleto } from './gerarDadosBoleto';\r\nimport { gerarPDF } from './gerarPDF';\r\nimport { gerarRemessa } from './gerarRemessa';\r\nimport { gerarRetorno } from './gerarRetorno';\r\n\r\nexport const ailos = {\r\n gerarDadosBoleto,\r\n gerarPDF,\r\n gerarRemessa,\r\n gerarRetorno,\r\n};\r\n","import { IGerarBoletoAilos, IGerarPDFAilos, IGerarRemessaAilos, IGerarRetornoAilos } from \"@/banks/ailos/types\";\r\nimport { IGerarBoletoBradesco, IGerarPDFBradesco, IGerarRemessaBradesco, IGerarRetornoBradesco } from \"@/banks/bradesco/types\";\r\nimport { IGerarBoletoSicredi, IGerarPDFSicredi, IGerarRemessaSicredi, IGerarRetornoSicredi } from \"@/banks/sicredi/types\";\r\nimport { IGerarBoletoSicoob, IGerarPDFSicoob, IGerarRemessaSicoob, IGerarRetornoSicoob } from \"@/banks/sicoob/types\";\r\nimport { IGerarBoletoBancoBrasil, IGerarPDFBancoBrasil, IGerarRemessaBancoBrasil, IGerarRetornoBancoBrasil } from \"@/banks/banco-brasil/types\";\r\nimport { IGerarPDFItau } from \"@/banks/itau/types\";\r\n\r\nexport type IGerarBoleto =\r\n IGerarBoletoAilos |\r\n IGerarBoletoBradesco |\r\n IGerarBoletoSicredi |\r\n IGerarBoletoSicoob |\r\n IGerarBoletoBancoBrasil;\r\n\r\nexport type IGerarPDF =\r\n IGerarPDFAilos |\r\n IGerarPDFBradesco |\r\n IGerarPDFSicredi |\r\n IGerarPDFSicoob |\r\n IGerarPDFBancoBrasil |\r\n IGerarPDFItau;\r\n\r\nexport type IGerarRemessa =\r\n IGerarRemessaAilos |\r\n IGerarRemessaBradesco |\r\n IGerarRemessaSicredi |\r\n IGerarRemessaSicoob |\r\n IGerarRemessaBancoBrasil;\r\n\r\nexport type IGerarRetorno =\r\n IGerarRetornoAilos |\r\n IGerarRetornoBradesco |\r\n IGerarRetornoSicredi |\r\n IGerarRetornoSicoob |\r\n IGerarRetornoBancoBrasil;\r\n\r\nexport enum Banco {\r\n AILOS = '085',\r\n BRADESCO = '005',\r\n SICREDI = '748',\r\n SICOOB = '756',\r\n BANCO_BRASIL = '001',\r\n ITAU = '341',\r\n}\r\n","import { IGerarBoletoBradesco } from './types';\r\nimport { padLeft } from '@/utils/pafLeft';\r\nimport { copy } from '@/utils/copy';\r\nimport { getFatorVencimento } from '@/utils/getFatorVencimento';\r\n\r\nexport function gerarDadosBoleto({ dados }: IGerarBoletoBradesco) {\r\n try {\r\n const { bancario, parcela } = dados;\r\n\r\n parcela.valor = Number(parcela.valor);\r\n\r\n const fatorVencimento = getFatorVencimento(parcela.vencimento);\r\n const valor = getValor(parcela.valor);\r\n const convenio = padLeft(bancario.convenio, 6);\r\n const numeroDocumento = padLeft(`${parcela.id_boleto}`, 9);\r\n const nossoNumero =\r\n padLeft(bancario.numero + bancario.numero_dv, 8) + numeroDocumento;\r\n\r\n const campoLivre = convenio + nossoNumero + padLeft(bancario.carteira, 2);\r\n const digitoGeral = getDigitoGeral(`0859${fatorVencimento}${valor}${campoLivre}`);\r\n const codigoBarra = `0859${digitoGeral}${fatorVencimento}${valor}${campoLivre}`;\r\n\r\n const campo1 = copy(codigoBarra, 1, 3) + copy(codigoBarra, 4, 4) + copy(codigoBarra, 20, 24);\r\n const campo2 = copy(codigoBarra, 25, 34);\r\n const campo3 = copy(codigoBarra, 35, 44);\r\n const campo4 = copy(codigoBarra, 5, 5);\r\n const campo5 = copy(codigoBarra, 6, 9) + copy(codigoBarra, 10, 19);\r\n\r\n const digito1 = getDigito(campo1);\r\n const digito2 = getDigito(campo2);\r\n const digito3 = getDigito(campo3);\r\n const digito4 = getDigito(campo4);\r\n const linhaDigitavel = campo1 + digito1 + campo2 + digito2 + campo3 + digito3 + campo4 + digito4 + campo5;\r\n\r\n const dadosBoleto = {\r\n linhaDigitavel,\r\n fatorVencimento,\r\n valor,\r\n convenio,\r\n nossoNumero,\r\n campoLivre,\r\n digitoGeral,\r\n codigoBarra,\r\n numeroDocumento,\r\n };\r\n\r\n return dadosBoleto;\r\n } catch (error) {\r\n console.log('Falha ao gerar dados do boleto', error);\r\n return null;\r\n }\r\n}\r\n\r\nfunction getValor(valor: number) {\r\n const valorFormatado = valor.toFixed(2).replace(/\\D/g, '');\r\n return padLeft(valorFormatado, 10);\r\n}\r\n\r\nfunction getDigitoGeral(texto: string) {\r\n let i = 43;\r\n let j = 1;\r\n let soma = 0;\r\n let digito = 0;\r\n\r\n while (i >= 1) {\r\n j++;\r\n\r\n if (j === 10) j = 2;\r\n\r\n const valor = Number(copy(texto, i, i));\r\n soma += j * valor;\r\n\r\n i--;\r\n }\r\n\r\n const restoDivisao = soma % 11;\r\n digito = 11 - restoDivisao;\r\n\r\n if (digito === 0 || digito === 1 || digito > 9) digito = 1;\r\n\r\n return String(digito);\r\n}\r\n\r\nfunction getDigito(texto: string) {\r\n let i = texto.length;\r\n let j = 1;\r\n let total = 0;\r\n let soma = 0;\r\n let digito = 0;\r\n\r\n while (i >= 1) {\r\n j = j === 1 ? 2 : 1;\r\n\r\n let valor = Number(copy(texto, i, i));\r\n total = valor * j;\r\n\r\n if (total >= 10) {\r\n valor = Number(copy(total, 1, 1)) + Number(copy(total, 2, 2));\r\n } else {\r\n valor = total;\r\n }\r\n\r\n soma += valor;\r\n i--;\r\n }\r\n\r\n const uni = Number(copy(soma, String(soma).length, String(soma).length));\r\n digito = 10 - uni;\r\n if (digito === 10) digito = 0;\r\n return String(digito);\r\n}\r\n","import { PDFOptions } from 'puppeteer-core';\r\nimport BwipJs from 'bwip-js';\r\nimport { IGerarPDFBradesco } from './types';\r\nimport maskFormat from '@/utils/maskFormat';\r\nimport { compileHbs } from '@/utils/compileHbs';\r\nimport { getPathTemplates } from '@/utils/getPathTemplates';\r\nimport { api } from '@/services/api';\r\nimport { decompress } from '@/utils/zip';\r\n\r\nexport async function gerarPDF({ dados }: IGerarPDFBradesco) {\r\n try {\r\n const { dadosPDF, generatePDF } = dados;\r\n\r\n const codigoBarra = await BwipJs.toBuffer({\r\n bcid: 'interleaved2of5',\r\n text: dadosPDF.boleto.codigoBarra,\r\n height: 20,\r\n });\r\n\r\n dadosPDF.beneficiario.dadosBancarios.agencia =\r\n dadosPDF.beneficiario.dadosBancarios.agencia.padStart(4, '0');\r\n dadosPDF.beneficiario.dadosBancarios.conta =\r\n dadosPDF.beneficiario.dadosBancarios.conta.padStart(7, '0');\r\n\r\n dadosPDF.boleto.codigoBarra = maskFormat.codigoBarra(dadosPDF.boleto.codigoBarra);\r\n dadosPDF.boleto.codigoBarraImage = codigoBarra.toString('base64');\r\n dadosPDF.beneficiario.cnpj = maskFormat.retornaCpfCnpjFormatado(\r\n dadosPDF.beneficiario.cnpj,\r\n );\r\n dadosPDF.beneficiario.endereco.cep = maskFormat.retornaCEPFormatado(\r\n dadosPDF.beneficiario.endereco.cep,\r\n );\r\n dadosPDF.pagador.endereco.cep = maskFormat.retornaCEPFormatado(\r\n dadosPDF.pagador.endereco.cep,\r\n );\r\n\r\n dadosPDF.boleto.valorAcrescimo = maskFormat.numberToReal(\r\n dadosPDF.boleto.valorAcrescimo,\r\n );\r\n dadosPDF.boleto.valorCobrado = maskFormat.numberToReal(\r\n dadosPDF.boleto.valorCobrado,\r\n );\r\n dadosPDF.boleto.valorDescontoAbatimento = maskFormat.numberToReal(\r\n dadosPDF.boleto.valorDescontoAbatimento,\r\n );\r\n dadosPDF.boleto.valorDocumento = maskFormat.numberToReal(\r\n dadosPDF.boleto.valorDocumento,\r\n );\r\n dadosPDF.boleto.valorMulta = maskFormat.numberToReal(dadosPDF.boleto.valorMulta);\r\n dadosPDF.boleto.valorOutrasDeducoes = maskFormat.numberToReal(\r\n dadosPDF.boleto.valorOutrasDeducoes,\r\n );\r\n\r\n if (dadosPDF.boleto.quantidade) {\r\n dadosPDF.boleto.quantidade = maskFormat.numberToReal(dadosPDF.boleto.quantidade);\r\n }\r\n\r\n dadosPDF.boleto.valor = maskFormat.numberToReal(dadosPDF.boleto.valor);\r\n\r\n const content = compileHbs(getPathTemplates('bradesco-boleto.hbs'), dadosPDF);\r\n\r\n const config: PDFOptions = {\r\n displayHeaderFooter: false,\r\n path: './boleto.pdf',\r\n format: 'a4',\r\n printBackground: true,\r\n };\r\n\r\n let pdfBase64: string | null = null;\r\n\r\n if (generatePDF) {\r\n pdfBase64 = await generatePDF(content, config);\r\n } else {\r\n if (!api.defaults.baseURL) {\r\n throw new Error('BaseURL api not found');\r\n }\r\n\r\n const response = await api.post('/', { content, config });\r\n const buffer = Buffer.from(response.data.pdf);\r\n pdfBase64 = await decompress(buffer);\r\n }\r\n\r\n return {\r\n erro: false,\r\n dados: pdfBase64,\r\n };\r\n } catch (error) {\r\n return {\r\n erro: true,\r\n dados: null,\r\n };\r\n }\r\n}\r\n","import { addDays, format } from 'date-fns';\r\nimport { IGerarRemessaBradesco } from './types';\r\nimport { Arquivo } from '@/lib/Arquivo';\r\n\r\nexport async function gerarRemessa({ dados }: IGerarRemessaBradesco) {\r\n try {\r\n const { dadosBancario, beneficiario, boletos } = dados.remessa;\r\n\r\n const arquivo = new Arquivo();\r\n const dataAtual = new Date();\r\n const data = format(dataAtual, 'ddMMyyyy');\r\n const hora = format(dataAtual, 'HHmmss');\r\n\r\n const convenio = dadosBancario.convenio.padStart(7, '0');\r\n const numero =\r\n dadosBancario.conta.padStart(7, '0') + dadosBancario.contaDigito;\r\n\r\n const remessa = `REM${convenio}-${numero}-${data}.REM`;\r\n\r\n // Header do arquivo\r\n arquivo.add('085');\r\n arquivo.add('0000');\r\n arquivo.add('0');\r\n arquivo.add(' ');\r\n arquivo.add('2');\r\n arquivo.add(beneficiario.cnpj);\r\n arquivo.add(dadosBancario.convenio.padEnd(20, ' '));\r\n arquivo.add(dadosBancario.agencia.padStart(5, '0'));\r\n arquivo.add(dadosBancario.agencia);\r\n arquivo.add(dadosBancario.conta.padStart(12, '0'));\r\n arquivo.add(dadosBancario.contaDigito);\r\n arquivo.add(' ');\r\n arquivo.add(beneficiario.nome.substring(0, 30).padEnd(30, ' '));\r\n arquivo.add('AILOS'.padEnd(30, ' '));\r\n arquivo.add(' ');\r\n arquivo.add('1');\r\n arquivo.add(data);\r\n arquivo.add(hora);\r\n arquivo.add(dadosBancario.numeroRemessa.padStart(6, '0'));\r\n arquivo.add('087');\r\n arquivo.add('00000');\r\n arquivo.add(' '.padEnd(20, ' '));\r\n arquivo.add(' '.padEnd(20, ' '));\r\n arquivo.add(' '.padEnd(29, ' '));\r\n\r\n arquivo.addLine();\r\n\r\n // Header do lote\r\n arquivo.add('085');\r\n arquivo.add('0001');\r\n arquivo.add('1');\r\n arquivo.add('R');\r\n arquivo.add('01');\r\n arquivo.add(' ');\r\n arquivo.add('045');\r\n arquivo.add(' ');\r\n arquivo.add('2');\r\n arquivo.add(beneficiario.cnpj.padStart(15, '0'));\r\n arquivo.add(dadosBancario.convenio.padEnd(20, ' '));\r\n arquivo.add(dadosBancario.agencia.padStart(5, '0'));\r\n arquivo.add(dadosBancario.agenciaDigito);\r\n arquivo.add(dadosBancario.conta.padStart(12, '0'));\r\n arquivo.add(dadosBancario.contaDigito);\r\n arquivo.add(' ');\r\n arquivo.add(beneficiario.nome.substring(0, 30).padEnd(30, ' '));\r\n arquivo.add(' '.padEnd(40, ' '));\r\n arquivo.add(' '.padEnd(40, ' '));\r\n arquivo.add(dadosBancario.numeroRemessa.padStart(8, '0'));\r\n arquivo.add(data);\r\n arquivo.add('00000000');\r\n arquivo.add(' '.padEnd(33, ' '));\r\n\r\n arquivo.addLine();\r\n\r\n let sequencia = 1;\r\n let quantidadeRegistro = 1;\r\n let total = 0;\r\n\r\n // Registro Detalhe – Segmento P\r\n for (const boleto of boletos) {\r\n const { pagador } = boleto;\r\n const vencimento = format(new Date(boleto.vencimento), 'ddMMyyyy');\r\n total += Number(boleto.valor);\r\n\r\n // Cálculos de juros\r\n const codigoJuro = dadosBancario.jurosMes > 0 ? '2' : '3';\r\n const juros =\r\n dadosBancario.jurosMes > 0\r\n ? dadosBancario.jurosMes.toFixed(2)\r\n : '000000000000000';\r\n\r\n // Cálculos de desconto\r\n const jurosVencimento = format(\r\n addDays(new Date(boleto.vencimento), 1),\r\n 'ddMMyyyy',\r\n );\r\n const codigoDesconto = dadosBancario.descontoPagamento > 0 ? '2' : '0';\r\n const desconto =\r\n dadosBancario.descontoPagamento > 0\r\n ? dadosBancario.descontoPagamento.toFixed(2)\r\n : '000000000000000';\r\n\r\n const protesto = dadosBancario.diasProtesto > 0 ? '1' : '3';\r\n const diasProtesto =\r\n protesto === '1' ? dadosBancario.diasProtesto.toString() : '00';\r\n\r\n arquivo.add('085');\r\n arquivo.add('0001');\r\n arquivo.add('3');\r\n arquivo.add(sequencia.toString().padStart(5, '0'));\r\n arquivo.add('P');\r\n arquivo.add(' ');\r\n arquivo.add('01');\r\n arquivo.add(dadosBancario.agencia.padStart(5, '0'));\r\n arquivo.add(dadosBancario.agenciaDigito);\r\n arquivo.add(dadosBancario.conta.padStart(12, '0'));\r\n arquivo.add(dadosBancario.contaDigito);\r\n arquivo.add(' ');\r\n arquivo.add(boleto.nossoNumero.padEnd(20, ' '));\r\n arquivo.add('1');\r\n arquivo.add('1');\r\n arquivo.add('1');\r\n arquivo.add('2');\r\n arquivo.add('2');\r\n arquivo.add(`${boleto.numeroDocumento}/${boleto.parcela}`.padEnd(15, ' '));\r\n arquivo.add(vencimento);\r\n arquivo.add(\r\n Number(boleto.valor).toFixed(2).replace('.', '').padStart(15, '0'),\r\n );\r\n arquivo.add(dadosBancario.agencia.padStart(5, '0'));\r\n arquivo.add(dadosBancario.agenciaDigito);\r\n arquivo.add('02'); // Mandar fixo ou criar parâmetro na forma de pagamento\r\n arquivo.add('A');\r\n arquivo.add(data);\r\n arquivo.add(codigoJuro);\r\n arquivo.add(jurosVencimento);\r\n arquivo.add(juros.replace('.', '').padStart(15, '0'));\r\n arquivo.add(codigoDesconto);\r\n arquivo.add(vencimento);\r\n arquivo.add(desconto.replace('.', '').padStart(15, '0'));\r\n arquivo.add('000000000000000');\r\n arquivo.add('000000000000000');\r\n arquivo.add(boleto.identificacaoTitulo.padEnd(25, ' ')); // Identificação de título, usar depois\r\n arquivo.add(protesto);\r\n arquivo.add(diasProtesto.padStart(1, '0'));\r\n arquivo.add('2');\r\n arquivo.add(' ');\r\n arquivo.add('09');\r\n arquivo.add('0000000000');\r\n arquivo.add(' ');\r\n\r\n sequencia++;\r\n\r\n arquivo.addLine();\r\n\r\n // Registro Detalhe – Segmento Q\r\n let tipoInscricao = '1';\r\n\r\n if (pagador.pessoa === 'F') {\r\n tipoInscricao = '1';\r\n } else {\r\n tipoInscricao = '2';\r\n }\r\n\r\n pagador.endereco.logradouro = `${pagador.endereco.logradouro\r\n .substring(0, 32)\r\n .padEnd(32, ' ')}${pagador.endereco.numero.padEnd(8, ' ')}`;\r\n\r\n arquivo.add('085');\r\n arquivo.add('0001');\r\n arquivo.add('3');\r\n arquivo.add(sequencia.toString().padStart(5, '0'));\r\n arquivo.add('Q');\r\n arquivo.add(' ');\r\n arquivo.add('01');\r\n arquivo.add(tipoInscricao);\r\n arquivo.add(pagador.cpfCnpj.padStart(15, '0'));\r\n arquivo.add(pagador.nome.substring(0, 40).padEnd(40, ' '));\r\n arquivo.add(pagador.endereco.logradouro.substring(0, 40).padEnd(40, ' '));\r\n arquivo.add(pagador.endereco.bairro.substring(0, 15).padEnd(15, ' '));\r\n arquivo.add(pagador.endereco.cep.substring(0, 5).padStart(5, '0'));\r\n arquivo.add(pagador.endereco.cep.substring(5, 7).padStart(3, '0'));\r\n arquivo.add(pagador.endereco.municipio.substring(0, 15).padEnd(15, ' '));\r\n arquivo.add(pagador.endereco.uf.padEnd(2, ' '));\r\n arquivo.add('0');\r\n arquivo.add('000000000000000');\r\n arquivo.add(' '.padEnd(40, ' '));\r\n arquivo.add('000');\r\n arquivo.add(' '.padEnd(20, ' '));\r\n arquivo.add(' '.padEnd(8, ' '));\r\n\r\n dadosBancario.multaAtraso = Number(dadosBancario.multaAtraso || 0);\r\n if (dadosBancario.multaAtraso > 0) {\r\n arquivo.addLine();\r\n const multa = dadosBancario.multaAtraso.toFixed(2);\r\n\r\n sequencia++;\r\n\r\n // Registro Detalhe – Segmento R\r\n arquivo.add('085');\r\n arquivo.add('0001');\r\n arquivo.add('3');\r\n arquivo.add(sequencia.toString().padStart(5, '0'));\r\n arquivo.add('R');\r\n arquivo.add(' ');\r\n arquivo.add('01');\r\n arquivo.add('0');\r\n arquivo.add('00000000');\r\n arquivo.add('000000000000000');\r\n arquivo.add('0');\r\n arquivo.add('00000000');\r\n arquivo.add('000000000000000');\r\n arquivo.add('2');\r\n arquivo.add(vencimento);\r\n arquivo.add(multa.replace('.', '').padStart(15, '0'));\r\n arquivo.add(' '.padEnd(10, ' '));\r\n arquivo.add(' '.padEnd(40, ' '));\r\n arquivo.add(' '.padEnd(40, ' '));\r\n arquivo.add(' '.padEnd(20, ' '));\r\n arquivo.add('00000000');\r\n arquivo.add('000');\r\n arquivo.add('00000');\r\n arquivo.add(' ');\r\n arquivo.add('000000000000');\r\n arquivo.add(' ');\r\n arquivo.add(' ');\r\n arquivo.add('0');\r\n arquivo.add('000000000');\r\n }\r\n\r\n arquivo.addLine();\r\n quantidadeRegistro++;\r\n }\r\n\r\n // Registro trailer do lote\r\n arquivo.add('085');\r\n arquivo.add('0001');\r\n arquivo.add('5');\r\n arquivo.add(' '.padEnd(9, ' '));\r\n arquivo.add((sequencia + 3).toString().padStart(6, '0'));\r\n arquivo.add(quantidadeRegistro.toString().padStart(6, '0'));\r\n arquivo.add(total.toFixed(2).replace('.', '').padStart(17, '0'));\r\n arquivo.add('0'.padStart(6, '0'));\r\n arquivo.add('0'.padStart(17, '0'));\r\n arquivo.add('0'.padStart(6, '0'));\r\n arquivo.add('0'.padStart(17, '0'));\r\n arquivo.add('0'.padStart(6, '0'));\r\n arquivo.add('0'.padStart(17, '0'));\r\n arquivo.add(' '.padStart(8, ' '));\r\n arquivo.add(' '.padStart(117, ' '));\r\n\r\n arquivo.addLine();\r\n\r\n // Registro Trailer de Arquivo\r\n arquivo.add('085');\r\n arquivo.add('9999');\r\n arquivo.add('9');\r\n arquivo.add(' '.padEnd(9, ' '));\r\n arquivo.add('000001');\r\n arquivo.add((sequencia + 4).toString().padStart(6, '0'));\r\n arquivo.add('000000');\r\n arquivo.add(' '.padEnd(205, ' '));\r\n\r\n return {\r\n download: remessa,\r\n arquivo: arquivo.getArquivo(),\r\n };\r\n } catch (error) {\r\n console.log(error);\r\n return null;\r\n }\r\n}\r\n","import { IGerarRetornoBradesco, IDocumentoRetornoBradesco } from './types';\r\n\r\nexport function gerarRetorno({ dados }: IGerarRetornoBradesco){\r\n try {\r\n const { arquivo } = dados;\r\n const documentos: IDocumentoRetornoBradesco[] = [];\r\n\r\n let index = 0;\r\n\r\n for (const item of arquivo) {\r\n let linha = item;\r\n\r\n const banco = linha.substring(0, 3);\r\n const codigoRetorno = linha.substring(15, 17);\r\n\r\n if (\r\n (banco === '001' || banco === '085') &&\r\n (codigoRetorno === '06' || codigoRetorno === '17')\r\n ) {\r\n let segmento = linha.substring(13, 14);\r\n\r\n if (segmento === 'T') {\r\n let tipoDocumento: string = '';\r\n let idDocumento: string = '';\r\n\r\n const linhaDoc = linha.substring(105, 130).trimEnd();\r\n\r\n if (linhaDoc.includes('-')) {\r\n [tipoDocumento, idDocumento] = linha.split('-');\r\n } else {\r\n idDocumento = linhaDoc;\r\n }\r\n\r\n const especie = tipoDocumento.length ? tipoDocumento : 'INDEFINIDO';\r\n\r\n linha = arquivo[index + 1];\r\n segmento = linha.substring(13, 14);\r\n\r\n if (segmento === 'U') {\r\n const valorAbatimentoString = linha.substring(47, 62);\r\n const valorAbatimento = Number(valorAbatimentoString) / 100;\r\n\r\n const valorDescontoString = linha.substring(32, 47);\r\n const valorDesconto = Number(valorDescontoString) / 100;\r\n\r\n const valorPagoString = linha.substring(77, 92);\r\n const valorPago = Number(valorPagoString) / 100;\r\n\r\n const valorJurosString = linha.substring(17, 32);\r\n const valorJuros = Number(valorJurosString) / 100;\r\n\r\n const valorMulta = 0;\r\n const descontos = valorAbatimento + valorDesconto;\r\n const valorTotal = valorPago - valorJuros + descontos;\r\n\r\n const documento: IDocumentoRetornoBradesco = {\r\n id_documento: idDocumento,\r\n especie,\r\n valor: valorTotal,\r\n valor_desconto: 0,\r\n valor_juros: 0,\r\n valor_multa: 0,\r\n valor_total: 0,\r\n };\r\n\r\n documentos.push(documento);\r\n }\r\n }\r\n }\r\n\r\n index++;\r\n }\r\n\r\n return documentos;\r\n } catch (error) {\r\n console.log(error);\r\n return null;\r\n }\r\n}\r\n","import { gerarDadosBoleto } from './gerarDadosBoleto';\r\nimport { gerarPDF } from './gerarPDF';\r\nimport { gerarRemessa } from './gerarRemessa';\r\nimport { gerarRetorno } from './gerarRetorno';\r\n\r\nexport const bradesco = {\r\n gerarDadosBoleto,\r\n gerarPDF,\r\n gerarRemessa,\r\n gerarRetorno,\r\n};\r\n","import { getFatorVencimento } from '@/utils/getFatorVencimento';\r\nimport { IGerarBoletoSicredi } from './types';\r\nimport { copy } from '@/utils/copy';\r\n\r\nexport function gerarDadosBoleto({ dados }: IGerarBoletoSicredi) {\r\n try {\r\n const { bancario, parcela } = dados;\r\n\r\n parcela.valor = Number(parcela.valor);\r\n\r\n const fatorVencimento = getFatorVencimento(parcela.vencimento);\r\n const valor = getValor(parcela.valor);\r\n const nossoNumero = getNossoNumero(\r\n parcela.numeroUnico,\r\n bancario.agencia,\r\n bancario.posto,\r\n bancario.codigoCedente\r\n );\r\n\r\n let campoLivre = bancario.tipoCobranca + bancario.tipoCarteira + nossoNumero + bancario.agencia.padStart(4, '0')\r\n + bancario.posto.padStart(2, '0') + bancario.codigoCedente.padStart(5, '0') + 10;\r\n\r\n const digitoCampoLivre = getDigitoCampoLivre(campoLivre);\r\n campoLivre = campoLivre + digitoCampoLivre;\r\n const digitoGeral = getDigitoGeral(`7489${fatorVencimento}${valor}${campoLivre}`);\r\n\r\n const codigoBarra = `7489${digitoGeral}${fatorVencimento}${valor}${campoLivre}`;\r\n\r\n const campo1 = copy(codigoBarra, 1, 3) + copy(codigoBarra, 4, 4) + copy(codigoBarra, 20, 24);\r\n const campo2 = copy(codigoBarra, 25, 34);\r\n const campo3 = copy(codigoBarra, 35, 44);\r\n const campo4 = copy(codigoBarra, 5, 5);\r\n const campo5 = copy(codigoBarra, 6, 9) + copy(codigoBarra, 10, 19);\r\n\r\n const digito1 = getDigito(campo1);\r\n const digito2 = getDigito(campo2);\r\n const digito3 = getDigito(campo3);\r\n // const digito4 = getDigito(campo4);\r\n const linhaDigitavel = campo1 + digito1 + campo2 + digito2 + campo3 + digito3 + campo4 + /*digito4*/ + campo5;\r\n\r\n const dadosBoleto = {\r\n linhaDigitavel,\r\n fatorVencimento,\r\n valor,\r\n nossoNumero,\r\n campoLivre,\r\n digitoGeral,\r\n codigoBarra,\r\n };\r\n\r\n return dadosBoleto;\r\n } catch (error) {\r\n console.log('Falha ao gerar dados do boleto', error);\r\n return null;\r\n }\r\n}\r\n\r\nfunction getNossoNumero(id: string, agencia: string, posto: string, codigoCedente: string) {\r\n let i = 19;\r\n let j = 1;\r\n let soma = 0;\r\n let digito = 0;\r\n\r\n const texto = agencia.padStart(4, '0') + posto.padStart(2, '0') + codigoCedente.padStart(5, '0') + id.padStart(8, '0');\r\n\r\n while (i >= 1) {\r\n j++;\r\n\r\n if (j === 10) j = 2;\r\n\r\n const valor = Number(copy(texto, i, i));\r\n soma += j * valor;\r\n\r\n i--;\r\n }\r\n\r\n const restoDivisao = soma % 11;\r\n digito = 11 - restoDivisao;\r\n\r\n if (restoDivisao === 0 || restoDivisao === 1) digito = 0;\r\n\r\n return id.padStart(8, '0') + digito.toString();\r\n}\r\n\r\nfunction getValor(valor: number) {\r\n const valorFormatado = valor.toFixed(2).replace(/\\D/g, '');\r\n return valorFormatado.padStart(10, '0');\r\n}\r\n\r\nfunction getDigitoCampoLivre(texto: string) {\r\n let i = 24;\r\n let j = 1;\r\n let soma = 0;\r\n let digito = 0;\r\n\r\n while (i >= 1) {\r\n j++;\r\n\r\n if (j === 10) j = 2;\r\n\r\n let valor = Number(copy(texto, i, i));\r\n soma += valor * j;\r\n i--;\r\n }\r\n\r\n const restoDivisao = soma % 11;\r\n\r\n if (restoDivisao