ghinfe 0.6.0 → 0.6.2

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 (110) hide show
  1. package/.env.example +24 -15
  2. package/LICENSE +21 -21
  3. package/README.md +491 -413
  4. package/docs/developer-guide.html +421 -421
  5. package/docs/openapi.yaml +428 -428
  6. package/examples/dce-homologacao.js +141 -0
  7. package/examples/emitir-nfce.js +51 -51
  8. package/examples/emitir-nfe.js +83 -83
  9. package/examples/emitir-nfse.js +46 -46
  10. package/examples/endpoints-sefaz.js +14 -14
  11. package/examples/eventos-nfe.js +49 -49
  12. package/examples/gerar-chave.js +25 -25
  13. package/examples/gerar-dace.js +59 -0
  14. package/examples/gerar-danfe.js +75 -75
  15. package/examples/gerar-dce.js +58 -0
  16. package/examples/layouts-nfse.js +51 -51
  17. package/examples/mock-sefaz.js +52 -52
  18. package/examples/nfse-eventos.js +57 -57
  19. package/examples/reforma-ibscbs.js +27 -27
  20. package/examples/reforma-nfe-xml.js +52 -52
  21. package/examples/status-sefaz.js +12 -12
  22. package/examples/validar-xsd.js +48 -48
  23. package/package.json +59 -68
  24. package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/consSitDCeTiposBasico_v1.00.xsd +123 -0
  25. package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/consSitDCe_v1.00.xsd +10 -0
  26. package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/consStatServDCeTiposBasico_v1.00.xsd +110 -0
  27. package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/consStatServDCe_v1.00.xsd +10 -0
  28. package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/dceTiposBasico_v1.00.xsd +1388 -0
  29. package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/retConsSitDCe_v1.00.xsd +10 -0
  30. package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/retConsStatServDCe_v1.00.xsd +10 -0
  31. package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/tiposGeralDCe_v1.00.xsd +712 -0
  32. package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/xmldsig-core-schema_v1.01.xsd +98 -0
  33. package/schemas/dce/PL_DCe_100a_NT2024.001/dceTiposBasico_v1.00.xsd +1410 -0
  34. package/schemas/dce/PL_DCe_100a_NT2024.001/dce_v1.00.xsd +10 -0
  35. package/schemas/dce/PL_DCe_100a_NT2024.001/evento/evCancDCe_v1.00.xsd +36 -0
  36. package/schemas/dce/PL_DCe_100a_NT2024.001/evento/eventoDCeTiposBasico_v1.00.xsd +283 -0
  37. package/schemas/dce/PL_DCe_100a_NT2024.001/evento/eventoDCe_v1.00.xsd +9 -0
  38. package/schemas/dce/PL_DCe_100a_NT2024.001/evento/procEventoDCe_v1.00.xsd +10 -0
  39. package/schemas/dce/PL_DCe_100a_NT2024.001/evento/retEventoDCe_v1.00.xsd +9 -0
  40. package/schemas/dce/PL_DCe_100a_NT2024.001/evento/tiposGeralDCe_v1.00.xsd +712 -0
  41. package/schemas/dce/PL_DCe_100a_NT2024.001/evento/xmldsig-core-schema_v1.01.xsd +98 -0
  42. package/schemas/dce/PL_DCe_100a_NT2024.001/procDCe_v1.00.xsd +37 -0
  43. package/schemas/dce/PL_DCe_100a_NT2024.001/retDCe_v1.00.xsd +9 -0
  44. package/schemas/dce/PL_DCe_100a_NT2024.001/tiposGeralDCe_v1.00.xsd +712 -0
  45. package/schemas/dce/PL_DCe_100a_NT2024.001/xmldsig-core-schema_v1.01.xsd +98 -0
  46. package/schemas/nfe/PL_009_V4/enviNFe_v3.10.xsd +8 -8
  47. package/schemas/nfe/PL_009_V4/xmldsig-core-schema_v1.01.xsd +97 -97
  48. package/scripts/download-schemas.js +39 -39
  49. package/scripts/test-xsd.js +34 -34
  50. package/src/api/server.js +316 -316
  51. package/src/constants/sefaz.js +69 -69
  52. package/src/danfe/DanfeService.js +205 -205
  53. package/src/danfe/xml-extract.js +69 -69
  54. package/src/dce/builders/DCeEventoXmlBuilder.js +86 -0
  55. package/src/dce/builders/DCeXmlBuilder.js +345 -0
  56. package/src/dce/constants/dce.js +87 -0
  57. package/src/dce/dace/DaceService.js +356 -0
  58. package/src/dce/dace/dace-extract.js +114 -0
  59. package/src/dce/services/DCeService.js +263 -0
  60. package/src/dce/services/DCeSoapService.js +235 -0
  61. package/src/dce/services/DCeXmlService.js +67 -0
  62. package/src/dce/types/DCeDocument.js +106 -0
  63. package/src/dce/utils/qrcode.utils.js +59 -0
  64. package/src/errors/GhinfeError.js +13 -13
  65. package/src/errors/SefazError.js +25 -25
  66. package/src/errors/XsdValidationError.js +15 -15
  67. package/src/index.js +84 -60
  68. package/src/nfce/builders/NFCeXmlBuilder.js +178 -178
  69. package/src/nfce/constants/qrcode.js +26 -26
  70. package/src/nfce/services/NFCeService.js +188 -188
  71. package/src/nfce/services/NFCeXmlService.js +38 -38
  72. package/src/nfce/types/NFCeDocument.js +42 -42
  73. package/src/nfce/utils/qrcode.utils.js +92 -92
  74. package/src/nfe/builders/NFeEventoXmlBuilder.js +110 -110
  75. package/src/nfe/builders/NFeXmlBuilder.js +215 -215
  76. package/src/nfe/mocks/sefaz-responses.js +195 -195
  77. package/src/nfe/services/NFeEventoService.js +95 -95
  78. package/src/nfe/services/NFeService.js +196 -196
  79. package/src/nfe/services/NFeSignService.js +127 -111
  80. package/src/nfe/services/NFeSoapService.js +437 -437
  81. package/src/nfe/services/NFeXmlService.js +41 -41
  82. package/src/nfe/services/NFeXsdService.js +56 -56
  83. package/src/nfe/types/NFeDocument.js +92 -92
  84. package/src/nfe/types/NFeEvento.js +44 -44
  85. package/src/nfse/NFSeMunicipioResolver.js +42 -42
  86. package/src/nfse/builders/NFSeEventoXmlBuilder.js +92 -92
  87. package/src/nfse/builders/NFSeXmlBuilder.js +16 -16
  88. package/src/nfse/constants/municipios.js +82 -82
  89. package/src/nfse/layouts/adapters.js +202 -202
  90. package/src/nfse/mocks/nfse-responses.js +142 -142
  91. package/src/nfse/services/NFSeService.js +191 -191
  92. package/src/nfse/services/NFSeSoapService.js +232 -232
  93. package/src/nfse/services/NFSeXmlService.js +12 -12
  94. package/src/nfse/types/NFSeDocument.js +54 -54
  95. package/src/queue/NFCeQueue.js +63 -63
  96. package/src/queue/NFSeQueue.js +59 -59
  97. package/src/queue/NFeQueue.js +76 -76
  98. package/src/reforma/ibscbs.js +175 -175
  99. package/src/sefaz/SefazEndpointResolver.js +95 -95
  100. package/src/sefaz/ca/icp-brasil-raiz-v10.pem +38 -0
  101. package/src/sefaz/endpoints.registry.js +205 -205
  102. package/src/sefaz/httpsAgent.js +33 -0
  103. package/src/shared/fiscal.helpers.js +53 -53
  104. package/src/utils/certificate.utils.js +69 -47
  105. package/src/utils/chave.utils.js +205 -117
  106. package/src/utils/code128.utils.js +67 -0
  107. package/src/utils/date.utils.js +26 -26
  108. package/src/utils/xml.utils.js +44 -44
  109. package/src/validation/XsdValidator.js +133 -114
  110. package/src/validation/schemas.js +18 -14
@@ -0,0 +1,141 @@
1
+ /**
2
+ * DC-e em homologação (SEFA-PR) com certificado A1 real.
3
+ *
4
+ * Certificado (um dos dois):
5
+ * DCE_PFX=./cert/certificado.pfx DCE_PFX_SENHA=...
6
+ * DCE_CERT_PEM=./cert/cert.pem DCE_KEY_PEM=./cert/key.pem
7
+ *
8
+ * Titular do certificado: CNPJ e razão social vêm do certificado; endereço via JSON:
9
+ * DCE_EMIT_ENDERECO='{"logradouro":"...","numero":"...","bairro":"...","codigoMunicipio":"...","municipio":"...","uf":"..","cep":"..."}'
10
+ *
11
+ * Modalidade (DCE_TIPO_EMITENTE):
12
+ * proprio (padrão) titular é o usuário emitente — só para não contribuintes do ICMS (senão: rejeição 812)
13
+ * marketplace titular emite em nome de pessoa física (CPF de teste) e é o destinatário
14
+ *
15
+ * Uso:
16
+ * node examples/dce-homologacao.js status
17
+ * node examples/dce-homologacao.js emitir [numero]
18
+ * node examples/dce-homologacao.js consultar <chave>
19
+ * node examples/dce-homologacao.js cancelar <chave> <protocolo> [cpf|cnpj do usuário emitente]
20
+ */
21
+ import 'dotenv/config';
22
+ import fs from 'fs';
23
+ import path from 'path';
24
+ import { fileURLToPath } from 'url';
25
+ import {
26
+ DCeService,
27
+ DCE_TIPO_EMITENTE,
28
+ DCE_MODALIDADE_TRANSPORTE,
29
+ SefazError,
30
+ loadPfxCertificate,
31
+ criarPfxDePem,
32
+ } from '../src/index.js';
33
+
34
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
35
+ const outDir = path.join(__dirname, '../tmp/dce');
36
+
37
+ function carregarCertificado() {
38
+ if (process.env.DCE_PFX) {
39
+ return { pfx: fs.readFileSync(process.env.DCE_PFX), senha: process.env.DCE_PFX_SENHA ?? '' };
40
+ }
41
+ if (process.env.DCE_CERT_PEM && process.env.DCE_KEY_PEM) {
42
+ const senha = 'ghinfe-memoria';
43
+ const pfx = criarPfxDePem(
44
+ fs.readFileSync(process.env.DCE_CERT_PEM, 'utf8'),
45
+ fs.readFileSync(process.env.DCE_KEY_PEM, 'utf8'),
46
+ senha
47
+ );
48
+ return { pfx, senha };
49
+ }
50
+ throw new Error('Defina DCE_PFX/DCE_PFX_SENHA ou DCE_CERT_PEM/DCE_KEY_PEM');
51
+ }
52
+
53
+ /** CN do e-CNPJ ICP-Brasil: "RAZAO SOCIAL:CNPJ" */
54
+ function titularCertificado(certificado) {
55
+ const { certificate } = loadPfxCertificate(certificado.pfx, certificado.senha);
56
+ const cn = certificate.subject.getField('CN')?.value ?? '';
57
+ const [razaoSocial, cnpj] = cn.split(':');
58
+ return { razaoSocial, cnpj };
59
+ }
60
+
61
+ function salvar(nome, conteudo) {
62
+ fs.mkdirSync(outDir, { recursive: true });
63
+ const arquivo = path.join(outDir, nome);
64
+ fs.writeFileSync(arquivo, conteudo);
65
+ return arquivo;
66
+ }
67
+
68
+ const certificado = carregarCertificado();
69
+ const service = new DCeService({ certificado, ambiente: 2 });
70
+ const [comando = 'status', ...args] = process.argv.slice(2);
71
+
72
+ try {
73
+ if (comando === 'status') {
74
+ const status = await service.consultarStatus();
75
+ console.log(status.cStat, '—', status.xMotivo, `(tMed ${status.tMed ?? '-'}s)`);
76
+ } else if (comando === 'emitir') {
77
+ if (!process.env.DCE_EMIT_ENDERECO) throw new Error('Defina DCE_EMIT_ENDERECO (JSON)');
78
+ const endereco = JSON.parse(process.env.DCE_EMIT_ENDERECO);
79
+ const titular = { ...titularCertificado(certificado), endereco };
80
+ const pessoaFisica = {
81
+ cpf: '12345678909',
82
+ razaoSocial: 'PESSOA FISICA TESTE',
83
+ endereco: {
84
+ logradouro: 'Rua XV de Novembro', numero: '100', bairro: 'Centro',
85
+ codigoMunicipio: '4106902', municipio: 'Curitiba', uf: 'PR', cep: '80020310',
86
+ },
87
+ };
88
+ const marketplace = process.env.DCE_TIPO_EMITENTE === 'marketplace';
89
+ const emitente = marketplace ? pessoaFisica : titular;
90
+
91
+ const resultado = await service.emitir({
92
+ ide: {
93
+ uf: emitente.endereco.uf,
94
+ serie: 1,
95
+ numero: Number(args[0] ?? Math.floor(Date.now() / 1000) % 1_000_000_000),
96
+ tipoEmitente: marketplace ? DCE_TIPO_EMITENTE.MARKETPLACE : DCE_TIPO_EMITENTE.EMISSOR_PROPRIO,
97
+ },
98
+ emitente,
99
+ marketplace: marketplace
100
+ ? { cnpj: titular.cnpj, razaoSocial: titular.razaoSocial, site: process.env.DCE_MARKETPLACE_SITE ?? 'www.exemplo.com.br' }
101
+ : undefined,
102
+ destinatario: marketplace ? titular : pessoaFisica,
103
+ itens: [{ descricao: 'ITEM DE TESTE EM HOMOLOGACAO', ncm: '63022100', quantidade: 1, valorUnitario: 10 }],
104
+ transporte: { modalidade: DCE_MODALIDADE_TRANSPORTE.CORREIOS },
105
+ });
106
+
107
+ console.log('Autorizada:', resultado.retorno.cStat, '—', resultado.retorno.xMotivo);
108
+ console.log('Chave:', resultado.chaveAcesso);
109
+ console.log('Protocolo:', resultado.retorno.protocolo);
110
+ console.log('QR Code:', resultado.qrCode);
111
+ console.log('dceProc:', salvar(`${resultado.chaveAcesso}-dceProc.xml`, resultado.retorno.xmlProc));
112
+ } else if (comando === 'consultar') {
113
+ const consulta = await service.consultar(args[0]);
114
+ console.log(consulta.cStat, '—', consulta.xMotivo, consulta.protocolo ? `(protocolo ${consulta.protocolo})` : '');
115
+ console.log('Eventos:', consulta.eventos.length);
116
+ } else if (comando === 'cancelar') {
117
+ const [chaveAcesso, protocolo, documentoEmitente] = args;
118
+ const doc = (documentoEmitente ?? titularCertificado(certificado).cnpj).replace(/\D/g, '');
119
+ const resultado = await service.cancelar({
120
+ chaveAcesso,
121
+ protocolo,
122
+ justificativa: 'Cancelamento de teste em ambiente de homologacao',
123
+ emitente: doc.length === 11 ? { cpf: doc } : { cnpj: doc },
124
+ });
125
+ console.log('Cancelamento:', resultado.retorno.cStat, '—', resultado.retorno.xMotivo);
126
+ console.log('Protocolo:', resultado.retorno.protocolo);
127
+ if (resultado.retorno.xmlProc) {
128
+ console.log('procEventoDCe:', salvar(`${chaveAcesso}-cancelamento.xml`, resultado.retorno.xmlProc));
129
+ }
130
+ } else {
131
+ console.log('Comandos: status | emitir [numero] | consultar <chave> | cancelar <chave> <protocolo> [cpf|cnpj]');
132
+ }
133
+ } catch (error) {
134
+ if (error instanceof SefazError) {
135
+ console.error(`Rejeição ${error.cStat}: ${error.xMotivo}`);
136
+ if (error.details?.xmlRetorno) console.error(error.details.xmlRetorno);
137
+ process.exitCode = 1;
138
+ } else {
139
+ throw error;
140
+ }
141
+ }
@@ -1,51 +1,51 @@
1
- import { NFCeService } from '../src/index.js';
2
-
3
- const documento = {
4
- ambiente: 2,
5
- ide: { uf: 'SP', codigoMunicipio: '3550308', serie: 1, numero: 1, presenca: 1 },
6
- emitente: {
7
- cnpj: '12345678000199',
8
- razaoSocial: 'LOJA EXEMPLO LTDA',
9
- nomeFantasia: 'LOJA EXEMPLO',
10
- ie: '123456789012',
11
- crt: '1',
12
- endereco: {
13
- logradouro: 'Av Paulista', numero: '1000', bairro: 'Bela Vista',
14
- codigoMunicipio: '3550308', municipio: 'Sao Paulo', uf: 'SP', cep: '01310100',
15
- },
16
- },
17
- destinatario: {
18
- cpf: '12345678909',
19
- razaoSocial: 'CONSUMIDOR FINAL',
20
- },
21
- itens: [{
22
- codigo: '001',
23
- descricao: 'PRODUTO TESTE NFC-E',
24
- ncm: '22021000',
25
- cfop: '5102',
26
- unidade: 'UN',
27
- quantidade: 2,
28
- valorUnitario: 5.5,
29
- valorTotal: 11.0,
30
- cst: '00',
31
- aliquotaIcms: 18,
32
- valorIcms: 1.98,
33
- }],
34
- pagamentos: [{ forma: '17', valor: 11.0 }],
35
- csc: { idCSC: '000001', codigo: 'CODIGO-CSC-EXEMPLO-SEFAZ' },
36
- informacoesComplementares: 'NFC-e emitida pela biblioteca GHINFE',
37
- };
38
-
39
- const service = new NFCeService({ mock: true });
40
-
41
- console.log('=== GHINFE — NFC-e Modelo 65 ===\n');
42
-
43
- const doc = service.resolverDocumento(documento);
44
- const xml = service.gerarXml(doc);
45
-
46
- console.log('Chave:', doc.chaveAcesso);
47
- console.log('XML base (sem QR Code):', xml.substring(0, 350) + '...\n');
48
- console.log('Nota: QR Code v3 é adicionado após assinatura via adicionarQrCode() ou gerarXmlAssinado()\n');
49
-
50
- const retorno = await service.enviar(xml, doc.chaveAcesso);
51
- console.log('Retorno mock SEFAZ (XML sem assinatura — apenas demo):', retorno.cStat, '—', retorno.xMotivo);
1
+ import { NFCeService } from '../src/index.js';
2
+
3
+ const documento = {
4
+ ambiente: 2,
5
+ ide: { uf: 'SP', codigoMunicipio: '3550308', serie: 1, numero: 1, presenca: 1 },
6
+ emitente: {
7
+ cnpj: '12345678000199',
8
+ razaoSocial: 'LOJA EXEMPLO LTDA',
9
+ nomeFantasia: 'LOJA EXEMPLO',
10
+ ie: '123456789012',
11
+ crt: '1',
12
+ endereco: {
13
+ logradouro: 'Av Paulista', numero: '1000', bairro: 'Bela Vista',
14
+ codigoMunicipio: '3550308', municipio: 'Sao Paulo', uf: 'SP', cep: '01310100',
15
+ },
16
+ },
17
+ destinatario: {
18
+ cpf: '12345678909',
19
+ razaoSocial: 'CONSUMIDOR FINAL',
20
+ },
21
+ itens: [{
22
+ codigo: '001',
23
+ descricao: 'PRODUTO TESTE NFC-E',
24
+ ncm: '22021000',
25
+ cfop: '5102',
26
+ unidade: 'UN',
27
+ quantidade: 2,
28
+ valorUnitario: 5.5,
29
+ valorTotal: 11.0,
30
+ cst: '00',
31
+ aliquotaIcms: 18,
32
+ valorIcms: 1.98,
33
+ }],
34
+ pagamentos: [{ forma: '17', valor: 11.0 }],
35
+ csc: { idCSC: '000001', codigo: 'CODIGO-CSC-EXEMPLO-SEFAZ' },
36
+ informacoesComplementares: 'NFC-e emitida pela biblioteca GHINFE',
37
+ };
38
+
39
+ const service = new NFCeService({ mock: true });
40
+
41
+ console.log('=== GHINFE — NFC-e Modelo 65 ===\n');
42
+
43
+ const doc = service.resolverDocumento(documento);
44
+ const xml = service.gerarXml(doc);
45
+
46
+ console.log('Chave:', doc.chaveAcesso);
47
+ console.log('XML base (sem QR Code):', xml.substring(0, 350) + '...\n');
48
+ console.log('Nota: QR Code v3 é adicionado após assinatura via adicionarQrCode() ou gerarXmlAssinado()\n');
49
+
50
+ const retorno = await service.enviar(xml, doc.chaveAcesso);
51
+ console.log('Retorno mock SEFAZ (XML sem assinatura — apenas demo):', retorno.cStat, '—', retorno.xMotivo);
@@ -1,83 +1,83 @@
1
- import { NFeService } from '../src/index.js';
2
-
3
- /** Documento de exemplo — homologação SEFAZ. */
4
- const documento = {
5
- chaveAcesso: '35260712345678000199550010000000011000000011',
6
- ambiente: 2,
7
- ide: {
8
- uf: 'SP',
9
- codigoMunicipio: '3550308',
10
- serie: 1,
11
- numero: 1,
12
- naturezaOperacao: 'VENDA',
13
- consumidorFinal: 1,
14
- presenca: 1,
15
- },
16
- emitente: {
17
- cnpj: '12345678000199',
18
- razaoSocial: 'EMPRESA EXEMPLO LTDA',
19
- nomeFantasia: 'EXEMPLO',
20
- ie: '123456789012',
21
- crt: '3',
22
- endereco: {
23
- logradouro: 'Rua Exemplo',
24
- numero: '100',
25
- bairro: 'Centro',
26
- codigoMunicipio: '3550308',
27
- municipio: 'São Paulo',
28
- uf: 'SP',
29
- cep: '01001000',
30
- },
31
- },
32
- destinatario: {
33
- cpf: '12345678909',
34
- razaoSocial: 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL',
35
- indIEDest: 9,
36
- endereco: {
37
- logradouro: 'Rua Cliente',
38
- numero: '200',
39
- bairro: 'Jardim',
40
- codigoMunicipio: '3550308',
41
- municipio: 'São Paulo',
42
- uf: 'SP',
43
- cep: '01020000',
44
- },
45
- },
46
- itens: [
47
- {
48
- codigo: '001',
49
- descricao: 'NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL',
50
- ncm: '84713012',
51
- cfop: '5102',
52
- unidade: 'UN',
53
- quantidade: 1,
54
- valorUnitario: 100.0,
55
- valorTotal: 100.0,
56
- cst: '00',
57
- aliquotaIcms: 18,
58
- valorIcms: 18,
59
- },
60
- ],
61
- frete: { modalidade: 9 },
62
- pagamentos: [{ forma: '01', valor: 100.0 }],
63
- informacoesComplementares: 'Documento gerado pela biblioteca GHINFE',
64
- };
65
-
66
- const service = new NFeService({ mock: true });
67
-
68
- console.log('=== GHINFE — Geração de XML NF-e ===\n');
69
-
70
- const xml = service.gerarXml(documento);
71
- console.log('XML gerado (primeiros 500 chars):\n');
72
- console.log(xml.substring(0, 500) + '...\n');
73
-
74
- console.log('Para assinar com certificado A1:');
75
- console.log(' const xmlAssinado = service.gerarXmlAssinado(documento, { pfx: buffer, senha: "..." });\n');
76
-
77
- console.log('Para emitir completo (mock SEFAZ):');
78
- console.log(' const resultado = await service.emitir(documento, { pfx, senha });\n');
79
-
80
- // Emissão mock sem certificado (apenas envio do XML não assinado para demo)
81
- const retorno = await service.enviar(xml, documento.chaveAcesso);
82
- console.log('Retorno mock SEFAZ:');
83
- console.log(JSON.stringify(retorno, null, 2));
1
+ import { NFeService } from '../src/index.js';
2
+
3
+ /** Documento de exemplo — homologação SEFAZ. */
4
+ const documento = {
5
+ chaveAcesso: '35260712345678000199550010000000011000000011',
6
+ ambiente: 2,
7
+ ide: {
8
+ uf: 'SP',
9
+ codigoMunicipio: '3550308',
10
+ serie: 1,
11
+ numero: 1,
12
+ naturezaOperacao: 'VENDA',
13
+ consumidorFinal: 1,
14
+ presenca: 1,
15
+ },
16
+ emitente: {
17
+ cnpj: '12345678000199',
18
+ razaoSocial: 'EMPRESA EXEMPLO LTDA',
19
+ nomeFantasia: 'EXEMPLO',
20
+ ie: '123456789012',
21
+ crt: '3',
22
+ endereco: {
23
+ logradouro: 'Rua Exemplo',
24
+ numero: '100',
25
+ bairro: 'Centro',
26
+ codigoMunicipio: '3550308',
27
+ municipio: 'São Paulo',
28
+ uf: 'SP',
29
+ cep: '01001000',
30
+ },
31
+ },
32
+ destinatario: {
33
+ cpf: '12345678909',
34
+ razaoSocial: 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL',
35
+ indIEDest: 9,
36
+ endereco: {
37
+ logradouro: 'Rua Cliente',
38
+ numero: '200',
39
+ bairro: 'Jardim',
40
+ codigoMunicipio: '3550308',
41
+ municipio: 'São Paulo',
42
+ uf: 'SP',
43
+ cep: '01020000',
44
+ },
45
+ },
46
+ itens: [
47
+ {
48
+ codigo: '001',
49
+ descricao: 'NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL',
50
+ ncm: '84713012',
51
+ cfop: '5102',
52
+ unidade: 'UN',
53
+ quantidade: 1,
54
+ valorUnitario: 100.0,
55
+ valorTotal: 100.0,
56
+ cst: '00',
57
+ aliquotaIcms: 18,
58
+ valorIcms: 18,
59
+ },
60
+ ],
61
+ frete: { modalidade: 9 },
62
+ pagamentos: [{ forma: '01', valor: 100.0 }],
63
+ informacoesComplementares: 'Documento gerado pela biblioteca GHINFE',
64
+ };
65
+
66
+ const service = new NFeService({ mock: true });
67
+
68
+ console.log('=== GHINFE — Geração de XML NF-e ===\n');
69
+
70
+ const xml = service.gerarXml(documento);
71
+ console.log('XML gerado (primeiros 500 chars):\n');
72
+ console.log(xml.substring(0, 500) + '...\n');
73
+
74
+ console.log('Para assinar com certificado A1:');
75
+ console.log(' const xmlAssinado = service.gerarXmlAssinado(documento, { pfx: buffer, senha: "..." });\n');
76
+
77
+ console.log('Para emitir completo (mock SEFAZ):');
78
+ console.log(' const resultado = await service.emitir(documento, { pfx, senha });\n');
79
+
80
+ // Emissão mock sem certificado (apenas envio do XML não assinado para demo)
81
+ const retorno = await service.enviar(xml, documento.chaveAcesso);
82
+ console.log('Retorno mock SEFAZ:');
83
+ console.log(JSON.stringify(retorno, null, 2));
@@ -1,46 +1,46 @@
1
- import { NFSeService } from '../src/index.js';
2
-
3
- const documento = {
4
- numero: 1,
5
- serie: 'NF',
6
- ambiente: 2,
7
- codigoMunicipio: '3550308',
8
- cnpjPrestador: '12345678000199',
9
- inscricaoMunicipal: '12345678',
10
- optanteSimplesNacional: 1,
11
- servico: {
12
- itemListaServico: '01.01',
13
- discriminacao: 'Desenvolvimento de software conforme contrato 001/2026',
14
- codigoMunicipio: '3550308',
15
- valorServicos: 1500.0,
16
- aliquotaIss: 5.0,
17
- valorIss: 75.0,
18
- issRetido: 2,
19
- },
20
- tomador: {
21
- cnpj: '98765432000100',
22
- razaoSocial: 'CLIENTE EXEMPLO LTDA',
23
- email: 'fiscal@cliente.com.br',
24
- endereco: {
25
- logradouro: 'Rua das Acacias',
26
- numero: '200',
27
- bairro: 'Centro',
28
- codigoMunicipio: '3550308',
29
- uf: 'SP',
30
- cep: '01005000',
31
- },
32
- },
33
- informacoesComplementares: 'NFS-e gerada pela biblioteca GHINFE',
34
- };
35
-
36
- const service = new NFSeService({ mock: true });
37
-
38
- console.log('=== GHINFE — NFS-e ABRASF 2.04 ===\n');
39
-
40
- const xml = service.gerarXml(documento);
41
- console.log('XML RPS (trecho):', xml.substring(0, 400) + '...\n');
42
-
43
- const resultado = await service.emitir(documento);
44
- console.log('Retorno mock:');
45
- console.log(' NFS-e:', resultado.retorno.numeroNfse);
46
- console.log(' Código verificação:', resultado.retorno.codigoVerificacao);
1
+ import { NFSeService } from '../src/index.js';
2
+
3
+ const documento = {
4
+ numero: 1,
5
+ serie: 'NF',
6
+ ambiente: 2,
7
+ codigoMunicipio: '3550308',
8
+ cnpjPrestador: '12345678000199',
9
+ inscricaoMunicipal: '12345678',
10
+ optanteSimplesNacional: 1,
11
+ servico: {
12
+ itemListaServico: '01.01',
13
+ discriminacao: 'Desenvolvimento de software conforme contrato 001/2026',
14
+ codigoMunicipio: '3550308',
15
+ valorServicos: 1500.0,
16
+ aliquotaIss: 5.0,
17
+ valorIss: 75.0,
18
+ issRetido: 2,
19
+ },
20
+ tomador: {
21
+ cnpj: '98765432000100',
22
+ razaoSocial: 'CLIENTE EXEMPLO LTDA',
23
+ email: 'fiscal@cliente.com.br',
24
+ endereco: {
25
+ logradouro: 'Rua das Acacias',
26
+ numero: '200',
27
+ bairro: 'Centro',
28
+ codigoMunicipio: '3550308',
29
+ uf: 'SP',
30
+ cep: '01005000',
31
+ },
32
+ },
33
+ informacoesComplementares: 'NFS-e gerada pela biblioteca GHINFE',
34
+ };
35
+
36
+ const service = new NFSeService({ mock: true });
37
+
38
+ console.log('=== GHINFE — NFS-e ABRASF 2.04 ===\n');
39
+
40
+ const xml = service.gerarXml(documento);
41
+ console.log('XML RPS (trecho):', xml.substring(0, 400) + '...\n');
42
+
43
+ const resultado = await service.emitir(documento);
44
+ console.log('Retorno mock:');
45
+ console.log(' NFS-e:', resultado.retorno.numeroNfse);
46
+ console.log(' Código verificação:', resultado.retorno.codigoVerificacao);
@@ -1,14 +1,14 @@
1
- import { SefazEndpointResolver } from '../src/index.js';
2
-
3
- console.log('=== GHINFE — Endpoints SEFAZ Multi-UF ===\n');
4
-
5
- const ufs = ['SP', 'RJ', 'MG', 'PR', 'RS', 'SC', 'BA', 'GO'];
6
-
7
- for (const uf of ufs) {
8
- const { autorizador, endpoints } = SefazEndpointResolver.obterEndpoints(uf, 2);
9
- console.log(`${uf} → ${autorizador}`);
10
- console.log(` Autorização: ${endpoints.autorizacao?.substring(0, 70)}...`);
11
- console.log(` Evento: ${endpoints.evento?.substring(0, 70)}...\n`);
12
- }
13
-
14
- console.log('Total UFs suportadas:', SefazEndpointResolver.listarUFs().length);
1
+ import { SefazEndpointResolver } from '../src/index.js';
2
+
3
+ console.log('=== GHINFE — Endpoints SEFAZ Multi-UF ===\n');
4
+
5
+ const ufs = ['SP', 'RJ', 'MG', 'PR', 'RS', 'SC', 'BA', 'GO'];
6
+
7
+ for (const uf of ufs) {
8
+ const { autorizador, endpoints } = SefazEndpointResolver.obterEndpoints(uf, 2);
9
+ console.log(`${uf} → ${autorizador}`);
10
+ console.log(` Autorização: ${endpoints.autorizacao?.substring(0, 70)}...`);
11
+ console.log(` Evento: ${endpoints.evento?.substring(0, 70)}...\n`);
12
+ }
13
+
14
+ console.log('Total UFs suportadas:', SefazEndpointResolver.listarUFs().length);
@@ -1,49 +1,49 @@
1
- import { NFeService } from '../src/index.js';
2
- import { NFE_EVENTOS } from '../src/index.js';
3
-
4
- const chaveAcesso = '35260712345678000199550010000000011000000011';
5
-
6
- const service = new NFeService({ mock: true, mockEventoScenario: 'registrado' });
7
-
8
- console.log('=== GHINFE — Cancelamento e CC-e (mock) ===\n');
9
-
10
- // --- Cancelamento ---
11
- const dadosCancelamento = {
12
- chaveAcesso,
13
- cnpj: '12345678000199',
14
- uf: 'SP',
15
- ambiente: 2,
16
- protocolo: '135260000000001',
17
- justificativa: 'Cancelamento por erro de digitacao no pedido do cliente',
18
- };
19
-
20
- const xmlCancelamento = service.gerarXmlCancelamento(dadosCancelamento);
21
- console.log('XML Cancelamento (trecho):', xmlCancelamento.substring(0, 300) + '...\n');
22
-
23
- const retornoCancelamento = await service.enviarEventoMock(
24
- xmlCancelamento,
25
- chaveAcesso,
26
- NFE_EVENTOS.CANCELAMENTO
27
- );
28
- console.log('Retorno cancelamento:', retornoCancelamento.cStat, '—', retornoCancelamento.xMotivo);
29
- console.log('Protocolo evento:', retornoCancelamento.protocolo, '\n');
30
-
31
- // --- Carta de Correção ---
32
- const dadosCce = {
33
- chaveAcesso,
34
- cnpj: '12345678000199',
35
- uf: 'SP',
36
- ambiente: 2,
37
- sequencia: 1,
38
- correcao: 'Correcao do endereco de entrega: Rua Nova, 500, Bairro Centro',
39
- };
40
-
41
- const xmlCce = service.gerarXmlCartaCorrecao(dadosCce);
42
- console.log('XML CC-e (trecho):', xmlCce.substring(0, 300) + '...\n');
43
-
44
- const retornoCce = await service.enviarEventoMock(
45
- xmlCce,
46
- chaveAcesso,
47
- NFE_EVENTOS.CARTA_CORRECAO
48
- );
49
- console.log('Retorno CC-e:', retornoCce.cStat, '—', retornoCce.xMotivo);
1
+ import { NFeService } from '../src/index.js';
2
+ import { NFE_EVENTOS } from '../src/index.js';
3
+
4
+ const chaveAcesso = '35260712345678000199550010000000011000000011';
5
+
6
+ const service = new NFeService({ mock: true, mockEventoScenario: 'registrado' });
7
+
8
+ console.log('=== GHINFE — Cancelamento e CC-e (mock) ===\n');
9
+
10
+ // --- Cancelamento ---
11
+ const dadosCancelamento = {
12
+ chaveAcesso,
13
+ cnpj: '12345678000199',
14
+ uf: 'SP',
15
+ ambiente: 2,
16
+ protocolo: '135260000000001',
17
+ justificativa: 'Cancelamento por erro de digitacao no pedido do cliente',
18
+ };
19
+
20
+ const xmlCancelamento = service.gerarXmlCancelamento(dadosCancelamento);
21
+ console.log('XML Cancelamento (trecho):', xmlCancelamento.substring(0, 300) + '...\n');
22
+
23
+ const retornoCancelamento = await service.enviarEventoMock(
24
+ xmlCancelamento,
25
+ chaveAcesso,
26
+ NFE_EVENTOS.CANCELAMENTO
27
+ );
28
+ console.log('Retorno cancelamento:', retornoCancelamento.cStat, '—', retornoCancelamento.xMotivo);
29
+ console.log('Protocolo evento:', retornoCancelamento.protocolo, '\n');
30
+
31
+ // --- Carta de Correção ---
32
+ const dadosCce = {
33
+ chaveAcesso,
34
+ cnpj: '12345678000199',
35
+ uf: 'SP',
36
+ ambiente: 2,
37
+ sequencia: 1,
38
+ correcao: 'Correcao do endereco de entrega: Rua Nova, 500, Bairro Centro',
39
+ };
40
+
41
+ const xmlCce = service.gerarXmlCartaCorrecao(dadosCce);
42
+ console.log('XML CC-e (trecho):', xmlCce.substring(0, 300) + '...\n');
43
+
44
+ const retornoCce = await service.enviarEventoMock(
45
+ xmlCce,
46
+ chaveAcesso,
47
+ NFE_EVENTOS.CARTA_CORRECAO
48
+ );
49
+ console.log('Retorno CC-e:', retornoCce.cStat, '—', retornoCce.xMotivo);