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.
Files changed (47) hide show
  1. package/.editorconfig +11 -0
  2. package/.eslintignore +1 -0
  3. package/.eslintrc +10 -0
  4. package/.idea/encodings.xml +4 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/node-boleto.git_master.iml +8 -0
  7. package/.idea/vcs.xml +7 -0
  8. package/LICENSE +20 -0
  9. package/README.md +92 -0
  10. package/assets/layout.ejs +433 -0
  11. package/banks/banco do brasil/index.js +172 -0
  12. package/banks/bradesco/index.js +154 -0
  13. package/banks/caixa/index.js +66 -0
  14. package/banks/santander/helper.js +3 -0
  15. package/banks/santander/index.js +145 -0
  16. package/examples/bradesco-edi.js +6 -0
  17. package/examples/bradesco-emission.js +35 -0
  18. package/examples/retorno.txt +8 -0
  19. package/examples/santander-edi.js +6 -0
  20. package/examples/santander-emission.js +32 -0
  21. package/index.js +12 -0
  22. package/lib/barcode.js +93 -0
  23. package/lib/boleto.js +105 -0
  24. package/lib/edi-helper.js +13 -0
  25. package/lib/edi-parser.js +7 -0
  26. package/lib/formatters.js +109 -0
  27. package/package.json +30 -0
  28. package/public/images/b.png +0 -0
  29. package/public/images/bb.png +0 -0
  30. package/public/images/bradesco.jpg +0 -0
  31. package/public/images/santander.png +0 -0
  32. package/public/images/w.png +0 -0
  33. package/readme.will.md +11 -0
  34. package/sonar-project.properties +9 -0
  35. package/test/e2e/boleto-output.js +420 -0
  36. package/test/e2e/boleto-render.spec.js +104 -0
  37. package/test/integration/bradesco/boleto.spec.js +216 -0
  38. package/test/integration/bradesco/edi.spec.js +113 -0
  39. package/test/integration/caixa/edi.spec.js +99 -0
  40. package/test/integration/santander/boleto.spec.js +45 -0
  41. package/test/integration/santander/edi.spec.js +73 -0
  42. package/test/mocks/banks.js +13 -0
  43. package/test/mocks/boleto-2018-10-31.js +25 -0
  44. package/test/mocks/boleto-2018-11-09.js +25 -0
  45. package/test/unit/boleto-object.spec.js +134 -0
  46. package/test/unit/boleto-render.spec.js +34 -0
  47. 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,3 @@
1
+ exports.dateFromEdiDate = function (ediDate) {
2
+ return new Date(parseInt(ediDate.substring(4, 8)), parseInt(ediDate.substring(2, 4)) - 1, parseInt(ediDate.substring(0, 2)))
3
+ }
@@ -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,6 @@
1
+ var fs = require('fs')
2
+ var path = require('path')
3
+
4
+ var ediParser = require('../index').EdiParser
5
+
6
+ console.log(ediParser.parse('bradesco', fs.readFileSync(path.join(__dirname, 'retorno_bradesco.txt')).toString()))
@@ -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,6 @@
1
+ var fs = require('fs')
2
+ var path = require('path')
3
+
4
+ var ediParser = require('../index').EdiParser
5
+
6
+ console.log(ediParser.parse('santander', fs.readFileSync(path.join(__dirname, '/retorno.txt')).toString()))
@@ -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)