qqlib-node-boleto 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +11 -0
- package/.eslintignore +1 -0
- package/.eslintrc +10 -0
- package/.idea/encodings.xml +4 -0
- package/.idea/modules.xml +8 -0
- package/.idea/node-boleto.git_master.iml +8 -0
- package/.idea/vcs.xml +7 -0
- package/LICENSE +20 -0
- package/README.md +92 -0
- package/assets/layout.ejs +433 -0
- package/banks/banco do brasil/index.js +172 -0
- package/banks/bradesco/index.js +154 -0
- package/banks/caixa/index.js +66 -0
- package/banks/santander/helper.js +3 -0
- package/banks/santander/index.js +145 -0
- package/examples/bradesco-edi.js +6 -0
- package/examples/bradesco-emission.js +35 -0
- package/examples/retorno.txt +8 -0
- package/examples/santander-edi.js +6 -0
- package/examples/santander-emission.js +32 -0
- package/index.js +12 -0
- package/lib/barcode.js +93 -0
- package/lib/boleto.js +105 -0
- package/lib/edi-helper.js +13 -0
- package/lib/edi-parser.js +7 -0
- package/lib/formatters.js +109 -0
- package/package.json +30 -0
- package/public/images/b.png +0 -0
- package/public/images/bb.png +0 -0
- package/public/images/bradesco.jpg +0 -0
- package/public/images/santander.png +0 -0
- package/public/images/w.png +0 -0
- package/readme.will.md +11 -0
- package/sonar-project.properties +9 -0
- package/test/e2e/boleto-output.js +420 -0
- package/test/e2e/boleto-render.spec.js +104 -0
- package/test/integration/bradesco/boleto.spec.js +216 -0
- package/test/integration/bradesco/edi.spec.js +113 -0
- package/test/integration/caixa/edi.spec.js +99 -0
- package/test/integration/santander/boleto.spec.js +45 -0
- package/test/integration/santander/edi.spec.js +73 -0
- package/test/mocks/banks.js +13 -0
- package/test/mocks/boleto-2018-10-31.js +25 -0
- package/test/mocks/boleto-2018-11-09.js +25 -0
- package/test/unit/boleto-object.spec.js +134 -0
- package/test/unit/boleto-render.spec.js +34 -0
- package/test/unit/formatters.spec.js +62 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
const moment = require('moment')
|
|
2
|
+
var formatters = require('../../lib/formatters')
|
|
3
|
+
var ediHelper = require('../../lib/edi-helper')
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
// 1. Chamar os módulos
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
|
|
10
|
+
// Função auxiliar para converter imagem em base64
|
|
11
|
+
const getBase64Image = function (relativePath) {
|
|
12
|
+
const absolutePath = path.resolve(__dirname, relativePath);
|
|
13
|
+
const image = fs.readFileSync(absolutePath);
|
|
14
|
+
return `data:image/png;base64,${image.toString('base64')}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// No seu método de renderização:
|
|
18
|
+
const logoBase64 = getBase64Image('../../public/images/bb.png');
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
exports.options = {
|
|
22
|
+
logoURL: logoBase64,
|
|
23
|
+
// logoURL: '../../public/images/bb.png',
|
|
24
|
+
// logoURL: 'https://assets.pagar.me/boleto/images/bb.png',
|
|
25
|
+
codigo: '1112'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
exports.dvBarra = function (barra) {
|
|
29
|
+
var resto2 = formatters.mod11(barra, 9, 1)
|
|
30
|
+
return (resto2 == 0 || resto2 == 1 || resto2 == 10) ? 1 : 11 - resto2
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
exports.barcodeData = function (boleto) {
|
|
34
|
+
var codigoBanco = this.options.codigo
|
|
35
|
+
var numMoeda = '9'
|
|
36
|
+
|
|
37
|
+
var fatorVencimento = formatters.fatorVencimento(moment(boleto['data_vencimento']).utc().format())
|
|
38
|
+
|
|
39
|
+
var agencia = formatters.addTrailingZeros(boleto['agencia'], 4)
|
|
40
|
+
|
|
41
|
+
var valor = formatters.addTrailingZeros(boleto['valor'], 10)
|
|
42
|
+
var carteira = boleto['carteira']
|
|
43
|
+
var codigoCedente = formatters.addTrailingZeros(boleto['codigo_cedente'], 7)
|
|
44
|
+
|
|
45
|
+
var nossoNumero = carteira + formatters.addTrailingZeros(boleto['nosso_numero'], 11)
|
|
46
|
+
|
|
47
|
+
var barra = codigoBanco + numMoeda + fatorVencimento + valor + agencia + nossoNumero + codigoCedente + '0'
|
|
48
|
+
|
|
49
|
+
var dvBarra = this.dvBarra(barra)
|
|
50
|
+
var lineData = barra.substring(0, 4) + dvBarra + barra.substring(4, barra.length)
|
|
51
|
+
|
|
52
|
+
return lineData
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
exports.linhaDigitavel = function (barcodeData) {
|
|
56
|
+
// 01-03 -> Código do banco sem o digito
|
|
57
|
+
// 04-04 -> Código da Moeda (9-Real)
|
|
58
|
+
// 05-05 -> Dígito verificador do código de barras
|
|
59
|
+
// 06-09 -> Fator de vencimento
|
|
60
|
+
// 10-19 -> Valor Nominal do Título
|
|
61
|
+
// 20-44 -> Campo Livre (Abaixo)
|
|
62
|
+
// 20-23 -> Código da Agencia (sem dígito)
|
|
63
|
+
// 24-05 -> Número da Carteira
|
|
64
|
+
// 26-36 -> Nosso Número (sem dígito)
|
|
65
|
+
// 37-43 -> Conta do Cedente (sem dígito)
|
|
66
|
+
// 44-44 -> Zero (Fixo)
|
|
67
|
+
|
|
68
|
+
var campos = []
|
|
69
|
+
|
|
70
|
+
// 1. Campo - composto pelo código do banco, código da moéda, as cinco primeiras posições
|
|
71
|
+
// do campo livre e DV (modulo10) deste campo
|
|
72
|
+
var campo = barcodeData.substring(0, 3) + barcodeData.substring(3, 4) + barcodeData.substring(19, 20) + barcodeData.substring(20, 24)
|
|
73
|
+
campo = campo + formatters.mod10(campo)
|
|
74
|
+
campo = campo.substring(0, 5) + '.' + campo.substring(5, campo.length)
|
|
75
|
+
campos.push(campo)
|
|
76
|
+
|
|
77
|
+
// 2. Campo - composto pelas posiçoes 6 a 15 do campo livre
|
|
78
|
+
// e livre e DV (modulo10) deste campo
|
|
79
|
+
campo = barcodeData.substring(24, 34)
|
|
80
|
+
campo = campo + formatters.mod10(campo)
|
|
81
|
+
campo = campo.substring(0, 5) + '.' + campo.substring(5, campo.length)
|
|
82
|
+
campos.push(campo)
|
|
83
|
+
|
|
84
|
+
// 3. Campo composto pelas posicoes 16 a 25 do campo livre
|
|
85
|
+
// e livre e DV (modulo10) deste campo
|
|
86
|
+
campo = barcodeData.substring(34, 44)
|
|
87
|
+
campo = campo + formatters.mod10(campo)
|
|
88
|
+
campo = campo.substring(0, 5) + '.' + campo.substring(5, campo.length)
|
|
89
|
+
campos.push(campo)
|
|
90
|
+
|
|
91
|
+
// 4. Campo - digito verificador do codigo de barras
|
|
92
|
+
campo = barcodeData.substring(4, 5)
|
|
93
|
+
campos.push(campo)
|
|
94
|
+
|
|
95
|
+
// 5. Campo composto pelo fator vencimento e valor nominal do documento, sem
|
|
96
|
+
// indicacao de zeros a esquerda e sem edicao (sem ponto e virgula). Quando se
|
|
97
|
+
// tratar de valor zerado, a representacao deve ser 000 (tres zeros).
|
|
98
|
+
campo = barcodeData.substring(5, 9) + barcodeData.substring(9, 19)
|
|
99
|
+
campos.push(campo)
|
|
100
|
+
|
|
101
|
+
return campos.join(' ')
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
exports.parseEDIFile = function (fileContent) {
|
|
105
|
+
try {
|
|
106
|
+
var lines = fileContent.split('\n')
|
|
107
|
+
var parsedFile = {
|
|
108
|
+
boletos: []
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
for (var i = 0; i < lines.length; i++) {
|
|
112
|
+
var line = lines[i]
|
|
113
|
+
var registro = line.substring(0, 1)
|
|
114
|
+
|
|
115
|
+
if (registro == '0') {
|
|
116
|
+
parsedFile['razao_social'] = line.substring(46, 76)
|
|
117
|
+
parsedFile['data_arquivo'] = ediHelper.dateFromEdiDate(line.substring(94, 100))
|
|
118
|
+
} else if (registro == '1') {
|
|
119
|
+
var boleto = {}
|
|
120
|
+
|
|
121
|
+
parsedFile['cnpj'] = formatters.removeTrailingZeros(line.substring(3, 17))
|
|
122
|
+
parsedFile['carteira'] = formatters.removeTrailingZeros(line.substring(22, 24))
|
|
123
|
+
parsedFile['agencia_cedente'] = formatters.removeTrailingZeros(line.substring(24, 29))
|
|
124
|
+
parsedFile['conta_cedente'] = formatters.removeTrailingZeros(line.substring(29, 37))
|
|
125
|
+
|
|
126
|
+
boleto['codigo_ocorrencia'] = line.substring(108, 110)
|
|
127
|
+
|
|
128
|
+
var ocorrenciasStr = line.substring(318, 328)
|
|
129
|
+
var motivosOcorrencia = []
|
|
130
|
+
var isPaid = (parseInt(boleto['valor_pago']) >= parseInt(boleto['valor']) || boleto['codigo_ocorrencia'] == '06')
|
|
131
|
+
|
|
132
|
+
for (var j = 0; j < ocorrenciasStr.length; j += 2) {
|
|
133
|
+
var ocorrencia = ocorrenciasStr.substr(j, 2)
|
|
134
|
+
motivosOcorrencia.push(ocorrencia)
|
|
135
|
+
|
|
136
|
+
if (ocorrencia != '00') {
|
|
137
|
+
isPaid = false
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
boleto['motivos_ocorrencia'] = motivosOcorrencia
|
|
142
|
+
boleto['data_ocorrencia'] = ediHelper.dateFromEdiDate(line.substring(110, 116))
|
|
143
|
+
boleto['data_credito'] = ediHelper.dateFromEdiDate(line.substring(295, 301))
|
|
144
|
+
boleto['vencimento'] = ediHelper.dateFromEdiDate(line.substring(110, 116))
|
|
145
|
+
boleto['valor'] = formatters.removeTrailingZeros(line.substring(152, 165))
|
|
146
|
+
boleto['banco_recebedor'] = formatters.removeTrailingZeros(line.substring(165, 168))
|
|
147
|
+
boleto['agencia_recebedora'] = formatters.removeTrailingZeros(line.substring(168, 173))
|
|
148
|
+
boleto['paid'] = isPaid
|
|
149
|
+
boleto['edi_line_number'] = i
|
|
150
|
+
boleto['edi_line_checksum'] = ediHelper.calculateLineChecksum(line)
|
|
151
|
+
boleto['edi_line_fingerprint'] = boleto['edi_line_number'] + ':' + boleto['edi_line_checksum']
|
|
152
|
+
boleto['nosso_numero'] = formatters.removeTrailingZeros(line.substring(70, 81))
|
|
153
|
+
|
|
154
|
+
boleto['juros_operacao_em_atraso'] = formatters.removeTrailingZeros(line.substring(201, 214))
|
|
155
|
+
boleto['iof_devido'] = formatters.removeTrailingZeros(line.substring(214, 227))
|
|
156
|
+
boleto['abatimento_concedido'] = formatters.removeTrailingZeros(line.substring(227, 240))
|
|
157
|
+
boleto['desconto_concedido'] = formatters.removeTrailingZeros(line.substring(240, 253))
|
|
158
|
+
boleto['valor_pago'] = formatters.removeTrailingZeros(line.substring(253, 266))
|
|
159
|
+
boleto['juros_mora'] = formatters.removeTrailingZeros(line.substring(266, 279))
|
|
160
|
+
boleto['outros_creditos'] = formatters.removeTrailingZeros(line.substring(279, 292))
|
|
161
|
+
boleto['raw_line'] = line
|
|
162
|
+
|
|
163
|
+
parsedFile.boletos.push(boleto)
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return parsedFile
|
|
168
|
+
} catch (e) {
|
|
169
|
+
console.log(e)
|
|
170
|
+
return null
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
const moment = require('moment')
|
|
2
|
+
var formatters = require('../../lib/formatters')
|
|
3
|
+
var ediHelper = require('../../lib/edi-helper')
|
|
4
|
+
|
|
5
|
+
exports.options = {
|
|
6
|
+
logoURL: 'https://assets.pagar.me/boleto/images/bradesco.jpg',
|
|
7
|
+
codigo: '237'
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
exports.dvBarra = function (barra) {
|
|
11
|
+
var resto2 = formatters.mod11(barra, 9, 1)
|
|
12
|
+
return (resto2 == 0 || resto2 == 1 || resto2 == 10) ? 1 : 11 - resto2
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
exports.barcodeData = function (boleto) {
|
|
16
|
+
var codigoBanco = this.options.codigo
|
|
17
|
+
var numMoeda = '9'
|
|
18
|
+
|
|
19
|
+
var fatorVencimento = formatters.fatorVencimento(moment(boleto['data_vencimento']).utc().format())
|
|
20
|
+
|
|
21
|
+
var agencia = formatters.addTrailingZeros(boleto['agencia'], 4)
|
|
22
|
+
|
|
23
|
+
var valor = formatters.addTrailingZeros(boleto['valor'], 10)
|
|
24
|
+
var carteira = boleto['carteira']
|
|
25
|
+
var codigoCedente = formatters.addTrailingZeros(boleto['codigo_cedente'], 7)
|
|
26
|
+
|
|
27
|
+
var nossoNumero = carteira + formatters.addTrailingZeros(boleto['nosso_numero'], 11)
|
|
28
|
+
|
|
29
|
+
var barra = codigoBanco + numMoeda + fatorVencimento + valor + agencia + nossoNumero + codigoCedente + '0'
|
|
30
|
+
|
|
31
|
+
var dvBarra = this.dvBarra(barra)
|
|
32
|
+
var lineData = barra.substring(0, 4) + dvBarra + barra.substring(4, barra.length)
|
|
33
|
+
|
|
34
|
+
return lineData
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
exports.linhaDigitavel = function (barcodeData) {
|
|
38
|
+
// 01-03 -> Código do banco sem o digito
|
|
39
|
+
// 04-04 -> Código da Moeda (9-Real)
|
|
40
|
+
// 05-05 -> Dígito verificador do código de barras
|
|
41
|
+
// 06-09 -> Fator de vencimento
|
|
42
|
+
// 10-19 -> Valor Nominal do Título
|
|
43
|
+
// 20-44 -> Campo Livre (Abaixo)
|
|
44
|
+
// 20-23 -> Código da Agencia (sem dígito)
|
|
45
|
+
// 24-05 -> Número da Carteira
|
|
46
|
+
// 26-36 -> Nosso Número (sem dígito)
|
|
47
|
+
// 37-43 -> Conta do Cedente (sem dígito)
|
|
48
|
+
// 44-44 -> Zero (Fixo)
|
|
49
|
+
|
|
50
|
+
var campos = []
|
|
51
|
+
|
|
52
|
+
// 1. Campo - composto pelo código do banco, código da moéda, as cinco primeiras posições
|
|
53
|
+
// do campo livre e DV (modulo10) deste campo
|
|
54
|
+
var campo = barcodeData.substring(0, 3) + barcodeData.substring(3, 4) + barcodeData.substring(19, 20) + barcodeData.substring(20, 24)
|
|
55
|
+
campo = campo + formatters.mod10(campo)
|
|
56
|
+
campo = campo.substring(0, 5) + '.' + campo.substring(5, campo.length)
|
|
57
|
+
campos.push(campo)
|
|
58
|
+
|
|
59
|
+
// 2. Campo - composto pelas posiçoes 6 a 15 do campo livre
|
|
60
|
+
// e livre e DV (modulo10) deste campo
|
|
61
|
+
campo = barcodeData.substring(24, 34)
|
|
62
|
+
campo = campo + formatters.mod10(campo)
|
|
63
|
+
campo = campo.substring(0, 5) + '.' + campo.substring(5, campo.length)
|
|
64
|
+
campos.push(campo)
|
|
65
|
+
|
|
66
|
+
// 3. Campo composto pelas posicoes 16 a 25 do campo livre
|
|
67
|
+
// e livre e DV (modulo10) deste campo
|
|
68
|
+
campo = barcodeData.substring(34, 44)
|
|
69
|
+
campo = campo + formatters.mod10(campo)
|
|
70
|
+
campo = campo.substring(0, 5) + '.' + campo.substring(5, campo.length)
|
|
71
|
+
campos.push(campo)
|
|
72
|
+
|
|
73
|
+
// 4. Campo - digito verificador do codigo de barras
|
|
74
|
+
campo = barcodeData.substring(4, 5)
|
|
75
|
+
campos.push(campo)
|
|
76
|
+
|
|
77
|
+
// 5. Campo composto pelo fator vencimento e valor nominal do documento, sem
|
|
78
|
+
// indicacao de zeros a esquerda e sem edicao (sem ponto e virgula). Quando se
|
|
79
|
+
// tratar de valor zerado, a representacao deve ser 000 (tres zeros).
|
|
80
|
+
campo = barcodeData.substring(5, 9) + barcodeData.substring(9, 19)
|
|
81
|
+
campos.push(campo)
|
|
82
|
+
|
|
83
|
+
return campos.join(' ')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
exports.parseEDIFile = function (fileContent) {
|
|
87
|
+
try {
|
|
88
|
+
var lines = fileContent.split('\n')
|
|
89
|
+
var parsedFile = {
|
|
90
|
+
boletos: []
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
for (var i = 0; i < lines.length; i++) {
|
|
94
|
+
var line = lines[i]
|
|
95
|
+
var registro = line.substring(0, 1)
|
|
96
|
+
|
|
97
|
+
if (registro == '0') {
|
|
98
|
+
parsedFile['razao_social'] = line.substring(46, 76)
|
|
99
|
+
parsedFile['data_arquivo'] = ediHelper.dateFromEdiDate(line.substring(94, 100))
|
|
100
|
+
} else if (registro == '1') {
|
|
101
|
+
var boleto = {}
|
|
102
|
+
|
|
103
|
+
parsedFile['cnpj'] = formatters.removeTrailingZeros(line.substring(3, 17))
|
|
104
|
+
parsedFile['carteira'] = formatters.removeTrailingZeros(line.substring(22, 24))
|
|
105
|
+
parsedFile['agencia_cedente'] = formatters.removeTrailingZeros(line.substring(24, 29))
|
|
106
|
+
parsedFile['conta_cedente'] = formatters.removeTrailingZeros(line.substring(29, 37))
|
|
107
|
+
|
|
108
|
+
boleto['codigo_ocorrencia'] = line.substring(108, 110)
|
|
109
|
+
|
|
110
|
+
var ocorrenciasStr = line.substring(318, 328)
|
|
111
|
+
var motivosOcorrencia = []
|
|
112
|
+
var isPaid = (parseInt(boleto['valor_pago']) >= parseInt(boleto['valor']) || boleto['codigo_ocorrencia'] == '06')
|
|
113
|
+
|
|
114
|
+
for (var j = 0; j < ocorrenciasStr.length; j += 2) {
|
|
115
|
+
var ocorrencia = ocorrenciasStr.substr(j, 2)
|
|
116
|
+
motivosOcorrencia.push(ocorrencia)
|
|
117
|
+
|
|
118
|
+
if (ocorrencia != '00') {
|
|
119
|
+
isPaid = false
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
boleto['motivos_ocorrencia'] = motivosOcorrencia
|
|
124
|
+
boleto['data_ocorrencia'] = ediHelper.dateFromEdiDate(line.substring(110, 116))
|
|
125
|
+
boleto['data_credito'] = ediHelper.dateFromEdiDate(line.substring(295, 301))
|
|
126
|
+
boleto['vencimento'] = ediHelper.dateFromEdiDate(line.substring(110, 116))
|
|
127
|
+
boleto['valor'] = formatters.removeTrailingZeros(line.substring(152, 165))
|
|
128
|
+
boleto['banco_recebedor'] = formatters.removeTrailingZeros(line.substring(165, 168))
|
|
129
|
+
boleto['agencia_recebedora'] = formatters.removeTrailingZeros(line.substring(168, 173))
|
|
130
|
+
boleto['paid'] = isPaid
|
|
131
|
+
boleto['edi_line_number'] = i
|
|
132
|
+
boleto['edi_line_checksum'] = ediHelper.calculateLineChecksum(line)
|
|
133
|
+
boleto['edi_line_fingerprint'] = boleto['edi_line_number'] + ':' + boleto['edi_line_checksum']
|
|
134
|
+
boleto['nosso_numero'] = formatters.removeTrailingZeros(line.substring(70, 81))
|
|
135
|
+
|
|
136
|
+
boleto['juros_operacao_em_atraso'] = formatters.removeTrailingZeros(line.substring(201, 214))
|
|
137
|
+
boleto['iof_devido'] = formatters.removeTrailingZeros(line.substring(214, 227))
|
|
138
|
+
boleto['abatimento_concedido'] = formatters.removeTrailingZeros(line.substring(227, 240))
|
|
139
|
+
boleto['desconto_concedido'] = formatters.removeTrailingZeros(line.substring(240, 253))
|
|
140
|
+
boleto['valor_pago'] = formatters.removeTrailingZeros(line.substring(253, 266))
|
|
141
|
+
boleto['juros_mora'] = formatters.removeTrailingZeros(line.substring(266, 279))
|
|
142
|
+
boleto['outros_creditos'] = formatters.removeTrailingZeros(line.substring(279, 292))
|
|
143
|
+
boleto['raw_line'] = line
|
|
144
|
+
|
|
145
|
+
parsedFile.boletos.push(boleto)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return parsedFile
|
|
150
|
+
} catch (e) {
|
|
151
|
+
console.log(e)
|
|
152
|
+
return null
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const formatters = require('../../lib/formatters')
|
|
2
|
+
const ediHelper = require('../../lib/edi-helper')
|
|
3
|
+
|
|
4
|
+
exports.parseEDIFile = function (fileContent) {
|
|
5
|
+
try {
|
|
6
|
+
const lines = fileContent.split('\n')
|
|
7
|
+
const parsedFile = {
|
|
8
|
+
boletos: []
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
for (let i = 0; i < lines.length; i++) {
|
|
12
|
+
const line = lines[i]
|
|
13
|
+
const registro = line.substring(0, 1)
|
|
14
|
+
const inscricao = line.substring(1, 3)
|
|
15
|
+
|
|
16
|
+
if (registro === '0') {
|
|
17
|
+
parsedFile['razao_social'] = line.substring(46, 76)
|
|
18
|
+
parsedFile['data_arquivo'] = ediHelper.dateFromEdiDate(line.substring(94, 100))
|
|
19
|
+
} else if (registro === '1' && inscricao === '01' || inscricao === '02') {
|
|
20
|
+
const boleto = {}
|
|
21
|
+
|
|
22
|
+
parsedFile['cnpj'] = formatters.removeTrailingZeros(line.substring(3, 17))
|
|
23
|
+
parsedFile['carteira'] = formatters.removeTrailingZeros(line.substring(106, 108))
|
|
24
|
+
parsedFile['agencia_cedente'] = formatters.removeTrailingZeros(line.substring(17, 21))
|
|
25
|
+
parsedFile['conta_cedente'] = formatters.removeTrailingZeros(line.substring(21, 27))
|
|
26
|
+
|
|
27
|
+
boleto['codigo_ocorrencia'] = line.substring(108, 110)
|
|
28
|
+
|
|
29
|
+
const motivosOcorrencia = line.substring(79, 82).trim()
|
|
30
|
+
|
|
31
|
+
let isPaid = (parseInt(boleto['valor_pago']) >= parseInt(boleto['valor']) || boleto['codigo_ocorrencia'] === '21')
|
|
32
|
+
|
|
33
|
+
if (motivosOcorrencia !== '') {
|
|
34
|
+
isPaid = false
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
boleto['motivos_ocorrencia'] = motivosOcorrencia
|
|
38
|
+
boleto['data_ocorrencia'] = ediHelper.dateFromEdiDate(line.substring(110, 116))
|
|
39
|
+
boleto['data_credito'] = ediHelper.dateFromEdiDate(line.substring(293, 299))
|
|
40
|
+
boleto['vencimento'] = ediHelper.dateFromEdiDate(line.substring(146, 152))
|
|
41
|
+
boleto['valor'] = formatters.removeTrailingZeros(line.substring(152, 165))
|
|
42
|
+
boleto['banco_recebedor'] = formatters.removeTrailingZeros(line.substring(165, 168))
|
|
43
|
+
boleto['agencia_recebedora'] = formatters.removeTrailingZeros(line.substring(168, 173))
|
|
44
|
+
boleto['paid'] = isPaid
|
|
45
|
+
boleto['edi_line_number'] = i
|
|
46
|
+
boleto['edi_line_checksum'] = ediHelper.calculateLineChecksum(line)
|
|
47
|
+
boleto['edi_line_fingerprint'] = boleto['edi_line_number'] + ':' + boleto['edi_line_checksum']
|
|
48
|
+
boleto['nosso_numero'] = formatters.removeTrailingZeros(line.substring(58, 73))
|
|
49
|
+
boleto['iof_devido'] = formatters.removeTrailingZeros(line.substring(214, 227))
|
|
50
|
+
boleto['abatimento_concedido'] = formatters.removeTrailingZeros(line.substring(227, 240))
|
|
51
|
+
boleto['desconto_concedido'] = formatters.removeTrailingZeros(line.substring(240, 253))
|
|
52
|
+
boleto['valor_pago'] = formatters.removeTrailingZeros(line.substring(253, 266))
|
|
53
|
+
boleto['juros_mora'] = formatters.removeTrailingZeros(line.substring(266, 279))
|
|
54
|
+
boleto['outros_creditos'] = formatters.removeTrailingZeros(line.substring(279, 292))
|
|
55
|
+
boleto['raw_line'] = line
|
|
56
|
+
|
|
57
|
+
parsedFile.boletos.push(boleto)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return parsedFile
|
|
62
|
+
} catch (e) {
|
|
63
|
+
console.log(e)
|
|
64
|
+
return null
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
const moment = require('moment')
|
|
2
|
+
var formatters = require('../../lib/formatters')
|
|
3
|
+
var ediHelper = require('../../lib/edi-helper')
|
|
4
|
+
var helper = require('./helper')
|
|
5
|
+
|
|
6
|
+
exports.options = {
|
|
7
|
+
logoURL: 'https://assets.pagar.me/boleto/images/santander.png',
|
|
8
|
+
codigo: '033'
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
exports.dvBarra = function (barra) {
|
|
12
|
+
var resto2 = formatters.mod11(barra, 9, 1)
|
|
13
|
+
return (resto2 == 0 || resto2 == 1 || resto2 == 10) ? 1 : 11 - resto2
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.barcodeData = function (boleto) {
|
|
17
|
+
var codigoBanco = this.options.codigo
|
|
18
|
+
var numMoeda = '9'
|
|
19
|
+
var fixo = '9' // Numero fixo para a posição 05-05
|
|
20
|
+
var ios = '0' // IOS - somente para Seguradoras (Se 7% informar 7, limitado 9%) - demais clientes usar 0
|
|
21
|
+
|
|
22
|
+
var fatorVencimento = formatters.fatorVencimento(moment(boleto['data_vencimento']).utc().format())
|
|
23
|
+
|
|
24
|
+
var valor = formatters.addTrailingZeros(boleto['valor'], 10)
|
|
25
|
+
var carteira = boleto['carteira']
|
|
26
|
+
var codigoCedente = formatters.addTrailingZeros(boleto['codigo_cedente'], 7)
|
|
27
|
+
|
|
28
|
+
var nossoNumero = formatters.addTrailingZeros(boleto['nosso_numero'], 12) + formatters.mod11(boleto['nosso_numero'])
|
|
29
|
+
|
|
30
|
+
var barra = codigoBanco + numMoeda + fatorVencimento + valor + fixo + codigoCedente + nossoNumero + ios + carteira
|
|
31
|
+
|
|
32
|
+
var dvBarra = this.dvBarra(barra)
|
|
33
|
+
var lineData = barra.substring(0, 4) + dvBarra + barra.substring(4, barra.length)
|
|
34
|
+
|
|
35
|
+
return lineData
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
exports.linhaDigitavel = function (barcodeData) {
|
|
39
|
+
// Posição Conteúdo
|
|
40
|
+
// 1 a 3 Número do banco
|
|
41
|
+
// 4 Código da Moeda - 9 para Real ou 8 - outras moedas
|
|
42
|
+
// 5 Fixo "9'
|
|
43
|
+
// 6 a 9 PSK - codigo cliente (4 primeiros digitos)
|
|
44
|
+
// 10 a 12 Restante do PSK (3 digitos)
|
|
45
|
+
// 13 a 19 7 primeiros digitos do Nosso Numero
|
|
46
|
+
// 20 a 25 Restante do Nosso numero (8 digitos) - total 13 (incluindo digito verificador)
|
|
47
|
+
// 26 a 26 IOS
|
|
48
|
+
// 27 a 29 Tipo Modalidade Carteira
|
|
49
|
+
// 30 a 30 Dígito verificador do código de barras
|
|
50
|
+
// 31 a 34 Fator de vencimento (qtdade de dias desde 07/10/1997 até a data de vencimento)
|
|
51
|
+
// 35 a 44 Valor do título
|
|
52
|
+
|
|
53
|
+
var campos = []
|
|
54
|
+
|
|
55
|
+
// 1. Primeiro Grupo - composto pelo código do banco, código da moéda, Valor Fixo "9"
|
|
56
|
+
// e 4 primeiros digitos do PSK (codigo do cliente) e DV (modulo10) deste campo
|
|
57
|
+
var campo = barcodeData.substring(0, 3) + barcodeData.substring(3, 4) + barcodeData.substring(19, 20) + barcodeData.substring(20, 24)
|
|
58
|
+
campo = campo + formatters.mod10(campo)
|
|
59
|
+
campo = campo.substring(0, 5) + '.' + campo.substring(5, campo.length)
|
|
60
|
+
campos.push(campo)
|
|
61
|
+
|
|
62
|
+
// 2. Segundo Grupo - composto pelas 3 últimas posiçoes do PSK e 7 primeiros dígitos do Nosso Número
|
|
63
|
+
// e DV (modulo10) deste campo
|
|
64
|
+
campo = barcodeData.substring(24, 34)
|
|
65
|
+
campo = campo + formatters.mod10(campo)
|
|
66
|
+
campo = campo.substring(0, 5) + '.' + campo.substring(5, campo.length)
|
|
67
|
+
campos.push(campo)
|
|
68
|
+
|
|
69
|
+
// 3. Terceiro Grupo - Composto por : Restante do Nosso Numero (6 digitos), IOS, Modalidade da Carteira
|
|
70
|
+
// e DV (modulo10) deste campo
|
|
71
|
+
campo = barcodeData.substring(34, 44)
|
|
72
|
+
campo = campo + formatters.mod10(campo)
|
|
73
|
+
campo = campo.substring(0, 5) + '.' + campo.substring(5, campo.length)
|
|
74
|
+
campos.push(campo)
|
|
75
|
+
|
|
76
|
+
// 4. Campo - digito verificador do codigo de barras
|
|
77
|
+
campo = barcodeData.substring(4, 5)
|
|
78
|
+
campos.push(campo)
|
|
79
|
+
|
|
80
|
+
// 5. Campo composto pelo fator vencimento e valor nominal do documento, sem
|
|
81
|
+
// indicacao de zeros a esquerda e sem edicao (sem ponto e virgula). Quando se
|
|
82
|
+
// tratar de valor zerado, a representacao deve ser 0000000000 (dez zeros).
|
|
83
|
+
campo = barcodeData.substring(5, 9) + barcodeData.substring(9, 19)
|
|
84
|
+
campos.push(campo)
|
|
85
|
+
|
|
86
|
+
return campos.join(' ')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
exports.parseEDIFile = function (fileContent) {
|
|
90
|
+
try {
|
|
91
|
+
var lines = fileContent.split('\n')
|
|
92
|
+
var parsedFile = {
|
|
93
|
+
boletos: {}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
var currentNossoNumero = null
|
|
97
|
+
|
|
98
|
+
for (var i = 0; i < lines.length; i++) {
|
|
99
|
+
var line = lines[i]
|
|
100
|
+
var registro = line.substring(7, 8)
|
|
101
|
+
|
|
102
|
+
if (registro == '0') {
|
|
103
|
+
parsedFile['cnpj'] = line.substring(17, 32)
|
|
104
|
+
parsedFile['razao_social'] = line.substring(72, 102)
|
|
105
|
+
parsedFile['agencia_cedente'] = line.substring(32, 36)
|
|
106
|
+
parsedFile['conta_cedente'] = line.substring(37, 47)
|
|
107
|
+
parsedFile['data_arquivo'] = helper.dateFromEdiDate(line.substring(143, 152))
|
|
108
|
+
} else if (registro == '3') {
|
|
109
|
+
var segmento = line.substring(13, 14)
|
|
110
|
+
|
|
111
|
+
if (segmento == 'T') {
|
|
112
|
+
var boleto = {}
|
|
113
|
+
|
|
114
|
+
boleto['codigo_ocorrencia'] = line.substring(15, 17)
|
|
115
|
+
boleto['vencimento'] = formatters.dateFromEdiDate(line.substring(69, 77))
|
|
116
|
+
boleto['valor'] = formatters.removeTrailingZeros(line.substring(77, 92))
|
|
117
|
+
boleto['tarifa'] = formatters.removeTrailingZeros(line.substring(193, 208))
|
|
118
|
+
boleto['banco_recebedor'] = formatters.removeTrailingZeros(line.substring(92, 95))
|
|
119
|
+
boleto['agencia_recebedora'] = formatters.removeTrailingZeros(line.substring(95, 100))
|
|
120
|
+
|
|
121
|
+
currentNossoNumero = formatters.removeTrailingZeros(line.substring(40, 52))
|
|
122
|
+
parsedFile.boletos[currentNossoNumero] = boleto
|
|
123
|
+
} else if (segmento == 'U') {
|
|
124
|
+
parsedFile.boletos[currentNossoNumero]['valor_pago'] = formatters.removeTrailingZeros(line.substring(77, 92))
|
|
125
|
+
|
|
126
|
+
var paid = parsedFile.boletos[currentNossoNumero]['valor_pago'] >= parsedFile.boletos[currentNossoNumero]['valor']
|
|
127
|
+
paid = paid && parsedFile.boletos[currentNossoNumero]['codigo_ocorrencia'] == '17'
|
|
128
|
+
|
|
129
|
+
boleto = parsedFile.boletos[currentNossoNumero]
|
|
130
|
+
|
|
131
|
+
boleto['pago'] = paid
|
|
132
|
+
boleto['edi_line_number'] = i
|
|
133
|
+
boleto['edi_line_checksum'] = ediHelper.calculateLineChecksum(line)
|
|
134
|
+
boleto['edi_line_fingerprint'] = boleto['edi_line_number'] + ':' + boleto['edi_line_checksum']
|
|
135
|
+
|
|
136
|
+
currentNossoNumero = null
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return parsedFile
|
|
142
|
+
} catch (e) {
|
|
143
|
+
return null
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var express = require('express')
|
|
2
|
+
var path = require('path')
|
|
3
|
+
|
|
4
|
+
var app = express()
|
|
5
|
+
|
|
6
|
+
var Boleto = require('../index').Boleto
|
|
7
|
+
|
|
8
|
+
var boleto = new Boleto({
|
|
9
|
+
'banco': 'bradesco',
|
|
10
|
+
'data_emissao': new Date(),
|
|
11
|
+
'data_vencimento': new Date(new Date().getTime() + 5 * 24 * 3600 * 1000),
|
|
12
|
+
'valor': 1500,
|
|
13
|
+
'nosso_numero': '6',
|
|
14
|
+
'numero_documento': '1',
|
|
15
|
+
'cedente': 'Pagar.me Pagamentos S/A',
|
|
16
|
+
'cedente_cnpj': '18727053000174',
|
|
17
|
+
'agencia': '1229',
|
|
18
|
+
'codigo_cedente': '469',
|
|
19
|
+
'carteira': '25',
|
|
20
|
+
'pagador': 'Nome do pagador\nCPF: 000.000.000-00',
|
|
21
|
+
'local_de_pagamento': 'PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO.',
|
|
22
|
+
'instrucoes': 'Sr. Caixa, aceitar o pagamento e não cobrar juros após o vencimento.'
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
// console.log(boleto['linha_digitavel']);
|
|
26
|
+
|
|
27
|
+
app.use(express.static(path.join(__dirname, '/../')))
|
|
28
|
+
|
|
29
|
+
app.get('/', function (req, res) {
|
|
30
|
+
boleto.renderHTML(function (html) {
|
|
31
|
+
return res.send(html)
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
app.listen(3003)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
03300000 2018727053000174397800130035168 006404154 PAGAR.ME PAGAMENTOS S/A BANCO SANTANDER (BRASIL) S/A 206032014 000003040
|
|
2
|
+
03376751T01 040 2018727053000174006404154 397800130035168 PAGAR.ME PAGAMENTOS S/A 0000000306032014
|
|
3
|
+
0337675300001T 17397800130035168 00000000002211 0603201400000000000030034103830 002000000000000000 01300351680000000000003000400000000
|
|
4
|
+
0337675300002U 170000000000000000000000000000000000000000000000000000000000000000000000003000000000000003000000000000000000000000000000000603201407032014000000000000000000000000000 000
|
|
5
|
+
0337675300003T 17397800130035168 00000000002301 0603201400000000000035034103830 002000000000000000 01300351680000000000003000400000000
|
|
6
|
+
0337675300004U 170000000000000000000000000000000000000000000250000000000000000000000000003250000000000003250000000000000000000000000000000603201407032014000000000000000000000000000 000
|
|
7
|
+
03376755 0000040000010000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000001
|
|
8
|
+
03376759 000001000008
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var express = require('express')
|
|
2
|
+
var path = require('path')
|
|
3
|
+
|
|
4
|
+
var app = express()
|
|
5
|
+
|
|
6
|
+
var Boleto = require('../index').Boleto
|
|
7
|
+
|
|
8
|
+
var boleto = new Boleto({
|
|
9
|
+
'banco': 'santander',
|
|
10
|
+
'data_emissao': new Date(),
|
|
11
|
+
'data_vencimento': new Date(new Date().getTime() + 5 * 24 * 3600 * 1000),
|
|
12
|
+
'valor': 1500,
|
|
13
|
+
'nosso_numero': '1234567',
|
|
14
|
+
'numero_documento': '123123',
|
|
15
|
+
'cedente': 'Pagar.me Pagamentos S/A',
|
|
16
|
+
'cedente_cnpj': '18727053000174',
|
|
17
|
+
'agencia': '3978',
|
|
18
|
+
'codigo_cedente': '6404154', // PSK (código da carteira)
|
|
19
|
+
'carteira': '102'
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
console.log(boleto['linha_digitavel'])
|
|
23
|
+
|
|
24
|
+
app.use(express.static(path.join(__dirname, '/../')))
|
|
25
|
+
|
|
26
|
+
app.get('/', function (req, res) {
|
|
27
|
+
boleto.renderHTML(function (html) {
|
|
28
|
+
return res.send(html)
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
app.listen(3003)
|
package/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
var fs = require('fs')
|
|
2
|
+
var path = require('path')
|
|
3
|
+
|
|
4
|
+
// Load banks
|
|
5
|
+
var banks = {}
|
|
6
|
+
var banksFolders = fs.readdirSync(path.join(__dirname, '/banks/'))
|
|
7
|
+
for (var i = 0; i < banksFolders.length; i++) {
|
|
8
|
+
banks[banksFolders[i]] = require(path.join(__dirname, '/banks/' + banksFolders[i] + '/index.js'))
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
exports.Boleto = require('./lib/boleto')(banks)
|
|
12
|
+
exports.EdiParser = require('./lib/edi-parser')(banks)
|