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.
- package/.env.example +24 -15
- package/LICENSE +21 -21
- package/README.md +491 -413
- package/docs/developer-guide.html +421 -421
- package/docs/openapi.yaml +428 -428
- package/examples/dce-homologacao.js +141 -0
- package/examples/emitir-nfce.js +51 -51
- package/examples/emitir-nfe.js +83 -83
- package/examples/emitir-nfse.js +46 -46
- package/examples/endpoints-sefaz.js +14 -14
- package/examples/eventos-nfe.js +49 -49
- package/examples/gerar-chave.js +25 -25
- package/examples/gerar-dace.js +59 -0
- package/examples/gerar-danfe.js +75 -75
- package/examples/gerar-dce.js +58 -0
- package/examples/layouts-nfse.js +51 -51
- package/examples/mock-sefaz.js +52 -52
- package/examples/nfse-eventos.js +57 -57
- package/examples/reforma-ibscbs.js +27 -27
- package/examples/reforma-nfe-xml.js +52 -52
- package/examples/status-sefaz.js +12 -12
- package/examples/validar-xsd.js +48 -48
- package/package.json +59 -68
- package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/consSitDCeTiposBasico_v1.00.xsd +123 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/consSitDCe_v1.00.xsd +10 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/consStatServDCeTiposBasico_v1.00.xsd +110 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/consStatServDCe_v1.00.xsd +10 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/dceTiposBasico_v1.00.xsd +1388 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/retConsSitDCe_v1.00.xsd +10 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/retConsStatServDCe_v1.00.xsd +10 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/tiposGeralDCe_v1.00.xsd +712 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/consulta/xmldsig-core-schema_v1.01.xsd +98 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/dceTiposBasico_v1.00.xsd +1410 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/dce_v1.00.xsd +10 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/evento/evCancDCe_v1.00.xsd +36 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/evento/eventoDCeTiposBasico_v1.00.xsd +283 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/evento/eventoDCe_v1.00.xsd +9 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/evento/procEventoDCe_v1.00.xsd +10 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/evento/retEventoDCe_v1.00.xsd +9 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/evento/tiposGeralDCe_v1.00.xsd +712 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/evento/xmldsig-core-schema_v1.01.xsd +98 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/procDCe_v1.00.xsd +37 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/retDCe_v1.00.xsd +9 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/tiposGeralDCe_v1.00.xsd +712 -0
- package/schemas/dce/PL_DCe_100a_NT2024.001/xmldsig-core-schema_v1.01.xsd +98 -0
- package/schemas/nfe/PL_009_V4/enviNFe_v3.10.xsd +8 -8
- package/schemas/nfe/PL_009_V4/xmldsig-core-schema_v1.01.xsd +97 -97
- package/scripts/download-schemas.js +39 -39
- package/scripts/test-xsd.js +34 -34
- package/src/api/server.js +316 -316
- package/src/constants/sefaz.js +69 -69
- package/src/danfe/DanfeService.js +205 -205
- package/src/danfe/xml-extract.js +69 -69
- package/src/dce/builders/DCeEventoXmlBuilder.js +86 -0
- package/src/dce/builders/DCeXmlBuilder.js +345 -0
- package/src/dce/constants/dce.js +87 -0
- package/src/dce/dace/DaceService.js +356 -0
- package/src/dce/dace/dace-extract.js +114 -0
- package/src/dce/services/DCeService.js +263 -0
- package/src/dce/services/DCeSoapService.js +235 -0
- package/src/dce/services/DCeXmlService.js +67 -0
- package/src/dce/types/DCeDocument.js +106 -0
- package/src/dce/utils/qrcode.utils.js +59 -0
- package/src/errors/GhinfeError.js +13 -13
- package/src/errors/SefazError.js +25 -25
- package/src/errors/XsdValidationError.js +15 -15
- package/src/index.js +84 -60
- package/src/nfce/builders/NFCeXmlBuilder.js +178 -178
- package/src/nfce/constants/qrcode.js +26 -26
- package/src/nfce/services/NFCeService.js +188 -188
- package/src/nfce/services/NFCeXmlService.js +38 -38
- package/src/nfce/types/NFCeDocument.js +42 -42
- package/src/nfce/utils/qrcode.utils.js +92 -92
- package/src/nfe/builders/NFeEventoXmlBuilder.js +110 -110
- package/src/nfe/builders/NFeXmlBuilder.js +215 -215
- package/src/nfe/mocks/sefaz-responses.js +195 -195
- package/src/nfe/services/NFeEventoService.js +95 -95
- package/src/nfe/services/NFeService.js +196 -196
- package/src/nfe/services/NFeSignService.js +127 -111
- package/src/nfe/services/NFeSoapService.js +437 -437
- package/src/nfe/services/NFeXmlService.js +41 -41
- package/src/nfe/services/NFeXsdService.js +56 -56
- package/src/nfe/types/NFeDocument.js +92 -92
- package/src/nfe/types/NFeEvento.js +44 -44
- package/src/nfse/NFSeMunicipioResolver.js +42 -42
- package/src/nfse/builders/NFSeEventoXmlBuilder.js +92 -92
- package/src/nfse/builders/NFSeXmlBuilder.js +16 -16
- package/src/nfse/constants/municipios.js +82 -82
- package/src/nfse/layouts/adapters.js +202 -202
- package/src/nfse/mocks/nfse-responses.js +142 -142
- package/src/nfse/services/NFSeService.js +191 -191
- package/src/nfse/services/NFSeSoapService.js +232 -232
- package/src/nfse/services/NFSeXmlService.js +12 -12
- package/src/nfse/types/NFSeDocument.js +54 -54
- package/src/queue/NFCeQueue.js +63 -63
- package/src/queue/NFSeQueue.js +59 -59
- package/src/queue/NFeQueue.js +76 -76
- package/src/reforma/ibscbs.js +175 -175
- package/src/sefaz/SefazEndpointResolver.js +95 -95
- package/src/sefaz/ca/icp-brasil-raiz-v10.pem +38 -0
- package/src/sefaz/endpoints.registry.js +205 -205
- package/src/sefaz/httpsAgent.js +33 -0
- package/src/shared/fiscal.helpers.js +53 -53
- package/src/utils/certificate.utils.js +69 -47
- package/src/utils/chave.utils.js +205 -117
- package/src/utils/code128.utils.js +67 -0
- package/src/utils/date.utils.js +26 -26
- package/src/utils/xml.utils.js +44 -44
- package/src/validation/XsdValidator.js +133 -114
- 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
|
+
}
|
package/examples/emitir-nfce.js
CHANGED
|
@@ -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);
|
package/examples/emitir-nfe.js
CHANGED
|
@@ -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));
|
package/examples/emitir-nfse.js
CHANGED
|
@@ -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);
|
package/examples/eventos-nfe.js
CHANGED
|
@@ -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);
|