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
package/examples/gerar-chave.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
gerarChaveAcesso,
|
|
3
|
-
validarChaveAcesso,
|
|
4
|
-
parseChaveAcesso,
|
|
5
|
-
calcularDigitoVerificador,
|
|
6
|
-
} from '../src/utils/chave.utils.js';
|
|
7
|
-
|
|
8
|
-
console.log('=== GHINFE — Chave de Acesso ===\n');
|
|
9
|
-
|
|
10
|
-
const chave = gerarChaveAcesso({
|
|
11
|
-
uf: 'SP',
|
|
12
|
-
cnpj: '12345678000199',
|
|
13
|
-
modelo: '55',
|
|
14
|
-
serie: 1,
|
|
15
|
-
numero: 42,
|
|
16
|
-
tipoEmissao: 1,
|
|
17
|
-
codigoNumerico: '12345678',
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
console.log('Chave gerada:', chave);
|
|
21
|
-
console.log('DV válido:', validarChaveAcesso(chave));
|
|
22
|
-
console.log('Parse:', parseChaveAcesso(chave));
|
|
23
|
-
|
|
24
|
-
const chave43 = chave.substring(0, 43);
|
|
25
|
-
console.log('DV calculado:', calcularDigitoVerificador(chave43));
|
|
1
|
+
import {
|
|
2
|
+
gerarChaveAcesso,
|
|
3
|
+
validarChaveAcesso,
|
|
4
|
+
parseChaveAcesso,
|
|
5
|
+
calcularDigitoVerificador,
|
|
6
|
+
} from '../src/utils/chave.utils.js';
|
|
7
|
+
|
|
8
|
+
console.log('=== GHINFE — Chave de Acesso ===\n');
|
|
9
|
+
|
|
10
|
+
const chave = gerarChaveAcesso({
|
|
11
|
+
uf: 'SP',
|
|
12
|
+
cnpj: '12345678000199',
|
|
13
|
+
modelo: '55',
|
|
14
|
+
serie: 1,
|
|
15
|
+
numero: 42,
|
|
16
|
+
tipoEmissao: 1,
|
|
17
|
+
codigoNumerico: '12345678',
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
console.log('Chave gerada:', chave);
|
|
21
|
+
console.log('DV válido:', validarChaveAcesso(chave));
|
|
22
|
+
console.log('Parse:', parseChaveAcesso(chave));
|
|
23
|
+
|
|
24
|
+
const chave43 = chave.substring(0, 43);
|
|
25
|
+
console.log('DV calculado:', calcularDigitoVerificador(chave43));
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gera a DACE (completa e resumida) em HTML.
|
|
3
|
+
*
|
|
4
|
+
* node examples/gerar-dace.js # DC-e de demonstração (protocolo fictício)
|
|
5
|
+
* node examples/gerar-dace.js caminho/dceProc.xml # DC-e autorizada
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import { DCeService, DaceService, DCE_TIPO_EMITENTE, DCE_MODALIDADE_TRANSPORTE } from '../src/index.js';
|
|
11
|
+
|
|
12
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const outDir = path.join(__dirname, '../tmp');
|
|
14
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
15
|
+
|
|
16
|
+
const arquivo = process.argv[2];
|
|
17
|
+
let xml;
|
|
18
|
+
let opcoes = {};
|
|
19
|
+
|
|
20
|
+
if (arquivo) {
|
|
21
|
+
xml = fs.readFileSync(arquivo, 'utf8');
|
|
22
|
+
} else {
|
|
23
|
+
const endereco = {
|
|
24
|
+
logradouro: 'Rua das Flores', numero: '100', complemento: 'Casa 2', bairro: 'Centro',
|
|
25
|
+
codigoMunicipio: '3550308', municipio: 'Sao Paulo', uf: 'SP', cep: '01001000',
|
|
26
|
+
};
|
|
27
|
+
xml = new DCeService().gerarXml({
|
|
28
|
+
ambiente: 2,
|
|
29
|
+
ide: { uf: 'SP', serie: 1, numero: 123456, tipoEmitente: DCE_TIPO_EMITENTE.MARKETPLACE },
|
|
30
|
+
emitente: { cpf: '12345678909', razaoSocial: 'JOAO DA SILVA', endereco },
|
|
31
|
+
marketplace: { cnpj: '12345678000199', razaoSocial: 'MARKETPLACE EXEMPLO LTDA', site: 'www.exemplo.com.br' },
|
|
32
|
+
destinatario: {
|
|
33
|
+
cnpj: '98765432000198',
|
|
34
|
+
razaoSocial: 'LOJA DESTINO LTDA',
|
|
35
|
+
endereco: { ...endereco, logradouro: 'Av Brasil', numero: '2000', complemento: undefined, codigoMunicipio: '4106902', municipio: 'Curitiba', uf: 'PR', cep: '80000000' },
|
|
36
|
+
},
|
|
37
|
+
itens: Array.from({ length: 18 }, (_, i) => ({
|
|
38
|
+
descricao: `ITEM DE DEMONSTRACAO ${i + 1}`,
|
|
39
|
+
ncm: '63022100',
|
|
40
|
+
quantidade: i + 1,
|
|
41
|
+
valorUnitario: 12.5,
|
|
42
|
+
informacoesAdicionais: i === 0 ? 'Devolucao - pedido 4521' : undefined,
|
|
43
|
+
})),
|
|
44
|
+
transporte: { modalidade: DCE_MODALIDADE_TRANSPORTE.CORREIOS },
|
|
45
|
+
informacoesAdicionais: { complementares: 'Devolucao de mercadoria adquirida via marketplace' },
|
|
46
|
+
});
|
|
47
|
+
opcoes = { protocolo: '1352600000000001' };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const dace = new DaceService();
|
|
51
|
+
const completa = await dace.gerar(xml, opcoes);
|
|
52
|
+
const resumida = await dace.gerar(xml, { ...opcoes, modelo: 'resumida' });
|
|
53
|
+
|
|
54
|
+
fs.writeFileSync(path.join(outDir, 'dace-completa.html'), completa.html);
|
|
55
|
+
fs.writeFileSync(path.join(outDir, 'dace-resumida.html'), resumida.html);
|
|
56
|
+
|
|
57
|
+
console.log(`DACE completa (${completa.folhas} folha(s)): tmp/dace-completa.html`);
|
|
58
|
+
console.log('DACE resumida: tmp/dace-resumida.html');
|
|
59
|
+
console.log('Abra no navegador e imprima / "Salvar como PDF".');
|
package/examples/gerar-danfe.js
CHANGED
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import { NFeService, NFCeService, DanfeService } from '../src/index.js';
|
|
5
|
-
|
|
6
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const outDir = path.join(__dirname, '../tmp');
|
|
8
|
-
fs.mkdirSync(outDir, { recursive: true });
|
|
9
|
-
|
|
10
|
-
const danfe = new DanfeService();
|
|
11
|
-
|
|
12
|
-
const nfeDoc = {
|
|
13
|
-
ambiente: 2,
|
|
14
|
-
ide: { uf: 'SP', codigoMunicipio: '3550308', serie: 1, numero: 50 },
|
|
15
|
-
emitente: {
|
|
16
|
-
cnpj: '12345678000199',
|
|
17
|
-
razaoSocial: 'EMPRESA EXEMPLO LTDA',
|
|
18
|
-
ie: '123456789012',
|
|
19
|
-
crt: '3',
|
|
20
|
-
endereco: {
|
|
21
|
-
logradouro: 'Rua Exemplo', numero: '100', bairro: 'Centro',
|
|
22
|
-
codigoMunicipio: '3550308', municipio: 'Sao Paulo', uf: 'SP', cep: '01001000',
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
destinatario: {
|
|
26
|
-
cpf: '12345678909',
|
|
27
|
-
razaoSocial: 'CONSUMIDOR FINAL',
|
|
28
|
-
indIEDest: 9,
|
|
29
|
-
endereco: {
|
|
30
|
-
logradouro: 'Rua B', numero: '2', bairro: 'Centro',
|
|
31
|
-
codigoMunicipio: '3550308', municipio: 'Sao Paulo', uf: 'SP', cep: '01001000',
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
itens: [{
|
|
35
|
-
codigo: '001', descricao: 'PRODUTO DANFE', ncm: '84713012', cfop: '5102',
|
|
36
|
-
unidade: 'UN', quantidade: 2, valorUnitario: 50, valorTotal: 100,
|
|
37
|
-
}],
|
|
38
|
-
frete: { modalidade: 9 },
|
|
39
|
-
pagamentos: [{ forma: '01', valor: 100 }],
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const nfeService = new NFeService({ mock: true });
|
|
43
|
-
const nfeResolved = nfeService.resolverDocumento(nfeDoc);
|
|
44
|
-
const xmlNfe = nfeService.gerarXml(nfeResolved);
|
|
45
|
-
const { html: htmlDanfe } = await danfe.gerarDanfe(xmlNfe, { protocolo: '135260000000001' });
|
|
46
|
-
const danfePath = path.join(outDir, 'danfe.html');
|
|
47
|
-
fs.writeFileSync(danfePath, htmlDanfe);
|
|
48
|
-
|
|
49
|
-
const nfceDoc = {
|
|
50
|
-
ambiente: 2,
|
|
51
|
-
ide: { uf: 'SP', codigoMunicipio: '3550308', serie: 1, numero: 7 },
|
|
52
|
-
emitente: nfeDoc.emitente,
|
|
53
|
-
destinatario: { cpf: '12345678909', razaoSocial: 'CONSUMIDOR' },
|
|
54
|
-
itens: [{
|
|
55
|
-
codigo: '001', descricao: 'PRODUTO NFC-E', ncm: '22021000', cfop: '5102',
|
|
56
|
-
unidade: 'UN', quantidade: 1, valorUnitario: 15, valorTotal: 15,
|
|
57
|
-
}],
|
|
58
|
-
pagamentos: [{ forma: '01', valor: 15 }],
|
|
59
|
-
csc: { idCSC: '000001', codigo: 'CSC-EXEMPLO' },
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const nfceService = new NFCeService({ mock: true });
|
|
63
|
-
const nfceResolved = nfceService.resolverDocumento(nfceDoc);
|
|
64
|
-
const xmlNfce = nfceService.gerarXml(nfceResolved);
|
|
65
|
-
const { html: htmlDanfce } = await danfe.gerarDanfce(xmlNfce, {
|
|
66
|
-
protocolo: '135260000000099',
|
|
67
|
-
qrCodeUrl: 'https://www.homologacao.nfce.fazenda.sp.gov.br/consulta?p=EXEMPLO',
|
|
68
|
-
});
|
|
69
|
-
const danfcePath = path.join(outDir, 'danfce.html');
|
|
70
|
-
fs.writeFileSync(danfcePath, htmlDanfce);
|
|
71
|
-
|
|
72
|
-
console.log('=== GHINFE — DANFE / DANFCE ===\n');
|
|
73
|
-
console.log('DANFE →', danfePath);
|
|
74
|
-
console.log('DANFCE →', danfcePath);
|
|
75
|
-
console.log('\nAbra os HTML no navegador e use Imprimir / Salvar PDF.');
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { NFeService, NFCeService, DanfeService } from '../src/index.js';
|
|
5
|
+
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const outDir = path.join(__dirname, '../tmp');
|
|
8
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
9
|
+
|
|
10
|
+
const danfe = new DanfeService();
|
|
11
|
+
|
|
12
|
+
const nfeDoc = {
|
|
13
|
+
ambiente: 2,
|
|
14
|
+
ide: { uf: 'SP', codigoMunicipio: '3550308', serie: 1, numero: 50 },
|
|
15
|
+
emitente: {
|
|
16
|
+
cnpj: '12345678000199',
|
|
17
|
+
razaoSocial: 'EMPRESA EXEMPLO LTDA',
|
|
18
|
+
ie: '123456789012',
|
|
19
|
+
crt: '3',
|
|
20
|
+
endereco: {
|
|
21
|
+
logradouro: 'Rua Exemplo', numero: '100', bairro: 'Centro',
|
|
22
|
+
codigoMunicipio: '3550308', municipio: 'Sao Paulo', uf: 'SP', cep: '01001000',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
destinatario: {
|
|
26
|
+
cpf: '12345678909',
|
|
27
|
+
razaoSocial: 'CONSUMIDOR FINAL',
|
|
28
|
+
indIEDest: 9,
|
|
29
|
+
endereco: {
|
|
30
|
+
logradouro: 'Rua B', numero: '2', bairro: 'Centro',
|
|
31
|
+
codigoMunicipio: '3550308', municipio: 'Sao Paulo', uf: 'SP', cep: '01001000',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
itens: [{
|
|
35
|
+
codigo: '001', descricao: 'PRODUTO DANFE', ncm: '84713012', cfop: '5102',
|
|
36
|
+
unidade: 'UN', quantidade: 2, valorUnitario: 50, valorTotal: 100,
|
|
37
|
+
}],
|
|
38
|
+
frete: { modalidade: 9 },
|
|
39
|
+
pagamentos: [{ forma: '01', valor: 100 }],
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const nfeService = new NFeService({ mock: true });
|
|
43
|
+
const nfeResolved = nfeService.resolverDocumento(nfeDoc);
|
|
44
|
+
const xmlNfe = nfeService.gerarXml(nfeResolved);
|
|
45
|
+
const { html: htmlDanfe } = await danfe.gerarDanfe(xmlNfe, { protocolo: '135260000000001' });
|
|
46
|
+
const danfePath = path.join(outDir, 'danfe.html');
|
|
47
|
+
fs.writeFileSync(danfePath, htmlDanfe);
|
|
48
|
+
|
|
49
|
+
const nfceDoc = {
|
|
50
|
+
ambiente: 2,
|
|
51
|
+
ide: { uf: 'SP', codigoMunicipio: '3550308', serie: 1, numero: 7 },
|
|
52
|
+
emitente: nfeDoc.emitente,
|
|
53
|
+
destinatario: { cpf: '12345678909', razaoSocial: 'CONSUMIDOR' },
|
|
54
|
+
itens: [{
|
|
55
|
+
codigo: '001', descricao: 'PRODUTO NFC-E', ncm: '22021000', cfop: '5102',
|
|
56
|
+
unidade: 'UN', quantidade: 1, valorUnitario: 15, valorTotal: 15,
|
|
57
|
+
}],
|
|
58
|
+
pagamentos: [{ forma: '01', valor: 15 }],
|
|
59
|
+
csc: { idCSC: '000001', codigo: 'CSC-EXEMPLO' },
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const nfceService = new NFCeService({ mock: true });
|
|
63
|
+
const nfceResolved = nfceService.resolverDocumento(nfceDoc);
|
|
64
|
+
const xmlNfce = nfceService.gerarXml(nfceResolved);
|
|
65
|
+
const { html: htmlDanfce } = await danfe.gerarDanfce(xmlNfce, {
|
|
66
|
+
protocolo: '135260000000099',
|
|
67
|
+
qrCodeUrl: 'https://www.homologacao.nfce.fazenda.sp.gov.br/consulta?p=EXEMPLO',
|
|
68
|
+
});
|
|
69
|
+
const danfcePath = path.join(outDir, 'danfce.html');
|
|
70
|
+
fs.writeFileSync(danfcePath, htmlDanfce);
|
|
71
|
+
|
|
72
|
+
console.log('=== GHINFE — DANFE / DANFCE ===\n');
|
|
73
|
+
console.log('DANFE →', danfePath);
|
|
74
|
+
console.log('DANFCE →', danfcePath);
|
|
75
|
+
console.log('\nAbra os HTML no navegador e use Imprimir / Salvar PDF.');
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { DCeService, DCE_TIPO_EMITENTE, DCE_MODALIDADE_TRANSPORTE, parseChaveAcessoDCe } from '../src/index.js';
|
|
2
|
+
|
|
3
|
+
const documento = {
|
|
4
|
+
ambiente: 2,
|
|
5
|
+
ide: {
|
|
6
|
+
uf: 'SP',
|
|
7
|
+
serie: 1,
|
|
8
|
+
numero: 42,
|
|
9
|
+
tipoEmitente: DCE_TIPO_EMITENTE.MARKETPLACE,
|
|
10
|
+
},
|
|
11
|
+
emitente: {
|
|
12
|
+
cpf: '12345678909',
|
|
13
|
+
razaoSocial: 'JOAO DA SILVA',
|
|
14
|
+
endereco: {
|
|
15
|
+
logradouro: 'Rua das Flores', numero: '100', bairro: 'Centro',
|
|
16
|
+
codigoMunicipio: '3550308', municipio: 'Sao Paulo', uf: 'SP', cep: '01001000',
|
|
17
|
+
telefone: '11999998888',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
marketplace: {
|
|
21
|
+
cnpj: '12345678000199',
|
|
22
|
+
razaoSocial: 'MARKETPLACE EXEMPLO LTDA',
|
|
23
|
+
site: 'www.marketplace-exemplo.com.br',
|
|
24
|
+
},
|
|
25
|
+
destinatario: {
|
|
26
|
+
cpf: '98765432100',
|
|
27
|
+
razaoSocial: 'MARIA SOUZA',
|
|
28
|
+
endereco: {
|
|
29
|
+
logradouro: 'Av Brasil', numero: '2000', complemento: 'Apto 12', bairro: 'Jardim America',
|
|
30
|
+
codigoMunicipio: '4106902', municipio: 'Curitiba', uf: 'PR', cep: '80000000',
|
|
31
|
+
email: 'maria@example.com',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
itens: [
|
|
35
|
+
{ descricao: 'LIVRO USADO', ncm: '49019900', quantidade: 2, valorUnitario: 35.5 },
|
|
36
|
+
{ descricao: 'CAMISETA', ncm: '61', quantidade: 1, valorUnitario: 49.9, informacoesAdicionais: 'Tamanho M' },
|
|
37
|
+
],
|
|
38
|
+
transporte: { modalidade: DCE_MODALIDADE_TRANSPORTE.CORREIOS },
|
|
39
|
+
informacoesAdicionais: {
|
|
40
|
+
complementares: 'Venda entre pessoas fisicas via marketplace',
|
|
41
|
+
obsMarketplace: [{ campo: 'Pedido', texto: 'MP-2026-000042' }],
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const service = new DCeService();
|
|
46
|
+
|
|
47
|
+
console.log('=== GHINFE — DC-e Modelo 99 ===\n');
|
|
48
|
+
|
|
49
|
+
const doc = service.resolverDocumento(documento);
|
|
50
|
+
console.log('Chave:', doc.chaveAcesso);
|
|
51
|
+
console.log('Campos da chave:', parseChaveAcessoDCe(doc.chaveAcesso), '\n');
|
|
52
|
+
|
|
53
|
+
const xml = service.gerarXml(doc, { validarXsd: true });
|
|
54
|
+
console.log('XSD: válido (dce_v1.00.xsd, assinatura validada com stub)');
|
|
55
|
+
console.log('QR Code:', service.gerarQrCode(doc), '\n');
|
|
56
|
+
console.log(xml.substring(0, 600) + '...\n');
|
|
57
|
+
|
|
58
|
+
console.log('Para assinar: service.gerarXmlAssinado(documento, { pfx, senha })');
|
package/examples/layouts-nfse.js
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import { NFSeService, NFSE_LAYOUTS, NFSeMunicipioResolver } from '../src/index.js';
|
|
2
|
-
|
|
3
|
-
const documento = {
|
|
4
|
-
numero: 10,
|
|
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: 'Consultoria em software',
|
|
14
|
-
codigoMunicipio: '3550308',
|
|
15
|
-
valorServicos: 500,
|
|
16
|
-
aliquotaIss: 5,
|
|
17
|
-
valorIss: 25,
|
|
18
|
-
},
|
|
19
|
-
tomador: {
|
|
20
|
-
cnpj: '98765432000100',
|
|
21
|
-
razaoSocial: 'CLIENTE EXEMPLO LTDA',
|
|
22
|
-
endereco: {
|
|
23
|
-
logradouro: 'Rua A',
|
|
24
|
-
numero: '10',
|
|
25
|
-
bairro: 'Centro',
|
|
26
|
-
codigoMunicipio: '3550308',
|
|
27
|
-
uf: 'SP',
|
|
28
|
-
cep: '01001000',
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
console.log('=== GHINFE — Layouts NFS-e municipais ===\n');
|
|
34
|
-
|
|
35
|
-
for (const layout of Object.values(NFSE_LAYOUTS)) {
|
|
36
|
-
const service = new NFSeService({ mock: true, layout });
|
|
37
|
-
const xml = service.gerarXml(documento, layout);
|
|
38
|
-
const root = xml.match(/<([A-Za-z]+)[\s>]/)?.[1];
|
|
39
|
-
console.log(`${layout.padEnd(8)} → raiz <${root}> (${xml.length} bytes)`);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
console.log('\nMunicípios pré-cadastrados:');
|
|
43
|
-
for (const ibge of NFSeMunicipioResolver.listarMunicipios()) {
|
|
44
|
-
if (ibge === 'mock') continue;
|
|
45
|
-
const info = NFSeMunicipioResolver.resolver(ibge, 2);
|
|
46
|
-
console.log(` ${ibge} ${info.nome} [${info.layout}]`);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
console.log('\nEmissão mock (ABRASF):');
|
|
50
|
-
const resultado = await new NFSeService({ mock: true }).emitir(documento);
|
|
51
|
-
console.log(` NFS-e ${resultado.retorno.numeroNfse} — verificação ${resultado.retorno.codigoVerificacao}`);
|
|
1
|
+
import { NFSeService, NFSE_LAYOUTS, NFSeMunicipioResolver } from '../src/index.js';
|
|
2
|
+
|
|
3
|
+
const documento = {
|
|
4
|
+
numero: 10,
|
|
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: 'Consultoria em software',
|
|
14
|
+
codigoMunicipio: '3550308',
|
|
15
|
+
valorServicos: 500,
|
|
16
|
+
aliquotaIss: 5,
|
|
17
|
+
valorIss: 25,
|
|
18
|
+
},
|
|
19
|
+
tomador: {
|
|
20
|
+
cnpj: '98765432000100',
|
|
21
|
+
razaoSocial: 'CLIENTE EXEMPLO LTDA',
|
|
22
|
+
endereco: {
|
|
23
|
+
logradouro: 'Rua A',
|
|
24
|
+
numero: '10',
|
|
25
|
+
bairro: 'Centro',
|
|
26
|
+
codigoMunicipio: '3550308',
|
|
27
|
+
uf: 'SP',
|
|
28
|
+
cep: '01001000',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
console.log('=== GHINFE — Layouts NFS-e municipais ===\n');
|
|
34
|
+
|
|
35
|
+
for (const layout of Object.values(NFSE_LAYOUTS)) {
|
|
36
|
+
const service = new NFSeService({ mock: true, layout });
|
|
37
|
+
const xml = service.gerarXml(documento, layout);
|
|
38
|
+
const root = xml.match(/<([A-Za-z]+)[\s>]/)?.[1];
|
|
39
|
+
console.log(`${layout.padEnd(8)} → raiz <${root}> (${xml.length} bytes)`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
console.log('\nMunicípios pré-cadastrados:');
|
|
43
|
+
for (const ibge of NFSeMunicipioResolver.listarMunicipios()) {
|
|
44
|
+
if (ibge === 'mock') continue;
|
|
45
|
+
const info = NFSeMunicipioResolver.resolver(ibge, 2);
|
|
46
|
+
console.log(` ${ibge} ${info.nome} [${info.layout}]`);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
console.log('\nEmissão mock (ABRASF):');
|
|
50
|
+
const resultado = await new NFSeService({ mock: true }).emitir(documento);
|
|
51
|
+
console.log(` NFS-e ${resultado.retorno.numeroNfse} — verificação ${resultado.retorno.codigoVerificacao}`);
|
package/examples/mock-sefaz.js
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { NFeService } from '../src/index.js';
|
|
2
|
-
import { SefazError } from '../src/errors/SefazError.js';
|
|
3
|
-
|
|
4
|
-
const documentoBase = {
|
|
5
|
-
chaveAcesso: '35260712345678000199550010000000021000000021',
|
|
6
|
-
ambiente: 2,
|
|
7
|
-
ide: { uf: 'SP', codigoMunicipio: '3550308', serie: 1, numero: 2 },
|
|
8
|
-
emitente: {
|
|
9
|
-
cnpj: '12345678000199',
|
|
10
|
-
razaoSocial: 'EMPRESA EXEMPLO LTDA',
|
|
11
|
-
ie: '123456789012',
|
|
12
|
-
crt: '3',
|
|
13
|
-
endereco: {
|
|
14
|
-
logradouro: 'Rua Exemplo', numero: '1', bairro: 'Centro',
|
|
15
|
-
codigoMunicipio: '3550308', municipio: 'São Paulo', uf: 'SP', cep: '01001000',
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
destinatario: {
|
|
19
|
-
cpf: '12345678909',
|
|
20
|
-
razaoSocial: 'CONSUMIDOR FINAL',
|
|
21
|
-
indIEDest: 9,
|
|
22
|
-
endereco: {
|
|
23
|
-
logradouro: 'Rua B', numero: '2', bairro: 'Centro',
|
|
24
|
-
codigoMunicipio: '3550308', municipio: 'São Paulo', uf: 'SP', cep: '01001000',
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
itens: [{
|
|
28
|
-
codigo: '001', descricao: 'PRODUTO TESTE', ncm: '84713012', cfop: '5102',
|
|
29
|
-
unidade: 'UN', quantidade: 1, valorUnitario: 50, valorTotal: 50,
|
|
30
|
-
}],
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const cenarios = ['autorizado', 'duplicidade', 'schema', 'certificado', 'paralisado'];
|
|
34
|
-
|
|
35
|
-
console.log('=== GHINFE — Mock SEFAZ — Cenários de retorno ===\n');
|
|
36
|
-
|
|
37
|
-
for (const cenario of cenarios) {
|
|
38
|
-
const service = new NFeService({ mock: true, mockScenario: cenario });
|
|
39
|
-
const xml = service.gerarXml(documentoBase);
|
|
40
|
-
|
|
41
|
-
try {
|
|
42
|
-
const retorno = await service.enviar(xml, documentoBase.chaveAcesso);
|
|
43
|
-
console.log(`[${cenario}] cStat=${retorno.cStat} — ${retorno.xMotivo}`);
|
|
44
|
-
if (retorno.protocolo) console.log(` Protocolo: ${retorno.protocolo}`);
|
|
45
|
-
} catch (error) {
|
|
46
|
-
if (error instanceof SefazError) {
|
|
47
|
-
console.log(`[${cenario}] REJEIÇÃO cStat=${error.cStat} — ${error.xMotivo}`);
|
|
48
|
-
} else {
|
|
49
|
-
throw error;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
1
|
+
import { NFeService } from '../src/index.js';
|
|
2
|
+
import { SefazError } from '../src/errors/SefazError.js';
|
|
3
|
+
|
|
4
|
+
const documentoBase = {
|
|
5
|
+
chaveAcesso: '35260712345678000199550010000000021000000021',
|
|
6
|
+
ambiente: 2,
|
|
7
|
+
ide: { uf: 'SP', codigoMunicipio: '3550308', serie: 1, numero: 2 },
|
|
8
|
+
emitente: {
|
|
9
|
+
cnpj: '12345678000199',
|
|
10
|
+
razaoSocial: 'EMPRESA EXEMPLO LTDA',
|
|
11
|
+
ie: '123456789012',
|
|
12
|
+
crt: '3',
|
|
13
|
+
endereco: {
|
|
14
|
+
logradouro: 'Rua Exemplo', numero: '1', bairro: 'Centro',
|
|
15
|
+
codigoMunicipio: '3550308', municipio: 'São Paulo', uf: 'SP', cep: '01001000',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
destinatario: {
|
|
19
|
+
cpf: '12345678909',
|
|
20
|
+
razaoSocial: 'CONSUMIDOR FINAL',
|
|
21
|
+
indIEDest: 9,
|
|
22
|
+
endereco: {
|
|
23
|
+
logradouro: 'Rua B', numero: '2', bairro: 'Centro',
|
|
24
|
+
codigoMunicipio: '3550308', municipio: 'São Paulo', uf: 'SP', cep: '01001000',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
itens: [{
|
|
28
|
+
codigo: '001', descricao: 'PRODUTO TESTE', ncm: '84713012', cfop: '5102',
|
|
29
|
+
unidade: 'UN', quantidade: 1, valorUnitario: 50, valorTotal: 50,
|
|
30
|
+
}],
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const cenarios = ['autorizado', 'duplicidade', 'schema', 'certificado', 'paralisado'];
|
|
34
|
+
|
|
35
|
+
console.log('=== GHINFE — Mock SEFAZ — Cenários de retorno ===\n');
|
|
36
|
+
|
|
37
|
+
for (const cenario of cenarios) {
|
|
38
|
+
const service = new NFeService({ mock: true, mockScenario: cenario });
|
|
39
|
+
const xml = service.gerarXml(documentoBase);
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
const retorno = await service.enviar(xml, documentoBase.chaveAcesso);
|
|
43
|
+
console.log(`[${cenario}] cStat=${retorno.cStat} — ${retorno.xMotivo}`);
|
|
44
|
+
if (retorno.protocolo) console.log(` Protocolo: ${retorno.protocolo}`);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
if (error instanceof SefazError) {
|
|
47
|
+
console.log(`[${cenario}] REJEIÇÃO cStat=${error.cStat} — ${error.xMotivo}`);
|
|
48
|
+
} else {
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
package/examples/nfse-eventos.js
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import { NFSeService } from '../src/index.js';
|
|
2
|
-
|
|
3
|
-
const basePrestador = {
|
|
4
|
-
cnpjPrestador: '12345678000199',
|
|
5
|
-
inscricaoMunicipal: '12345678',
|
|
6
|
-
codigoMunicipio: '3550308',
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
const documento = {
|
|
10
|
-
numero: 20,
|
|
11
|
-
serie: 'NF',
|
|
12
|
-
ambiente: 2,
|
|
13
|
-
...basePrestador,
|
|
14
|
-
optanteSimplesNacional: 1,
|
|
15
|
-
servico: {
|
|
16
|
-
itemListaServico: '01.01',
|
|
17
|
-
discriminacao: 'Servico de consultoria',
|
|
18
|
-
codigoMunicipio: '3550308',
|
|
19
|
-
valorServicos: 800,
|
|
20
|
-
aliquotaIss: 5,
|
|
21
|
-
valorIss: 40,
|
|
22
|
-
},
|
|
23
|
-
tomador: {
|
|
24
|
-
cnpj: '98765432000100',
|
|
25
|
-
razaoSocial: 'CLIENTE LTDA',
|
|
26
|
-
endereco: {
|
|
27
|
-
logradouro: 'Rua X', numero: '1', bairro: 'Centro',
|
|
28
|
-
codigoMunicipio: '3550308', uf: 'SP', cep: '01001000',
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const service = new NFSeService({ mock: true });
|
|
34
|
-
|
|
35
|
-
console.log('=== GHINFE — Cancelamento e Substituição NFS-e ===\n');
|
|
36
|
-
|
|
37
|
-
const emitido = await service.emitir(documento);
|
|
38
|
-
console.log('Emitida:', emitido.retorno.numeroNfse, emitido.retorno.codigoVerificacao);
|
|
39
|
-
|
|
40
|
-
const cancelado = await service.cancelar({
|
|
41
|
-
...basePrestador,
|
|
42
|
-
numeroNfse: emitido.retorno.numeroNfse,
|
|
43
|
-
});
|
|
44
|
-
console.log('Cancelamento:', cancelado.retorno.cancelado, '— NFS-e', cancelado.retorno.numeroNfse);
|
|
45
|
-
|
|
46
|
-
const substituto = { ...documento, numero: 21, servico: { ...documento.servico, valorServicos: 900, valorIss: 45 } };
|
|
47
|
-
const subst = await service.substituir({
|
|
48
|
-
...basePrestador,
|
|
49
|
-
numeroNfseSubstituida: emitido.retorno.numeroNfse,
|
|
50
|
-
documentoSubstituto: substituto,
|
|
51
|
-
});
|
|
52
|
-
console.log(
|
|
53
|
-
'Substituição: nova',
|
|
54
|
-
subst.retorno.numeroNfse,
|
|
55
|
-
'substituiu',
|
|
56
|
-
subst.retorno.numeroNfseSubstituida
|
|
57
|
-
);
|
|
1
|
+
import { NFSeService } from '../src/index.js';
|
|
2
|
+
|
|
3
|
+
const basePrestador = {
|
|
4
|
+
cnpjPrestador: '12345678000199',
|
|
5
|
+
inscricaoMunicipal: '12345678',
|
|
6
|
+
codigoMunicipio: '3550308',
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const documento = {
|
|
10
|
+
numero: 20,
|
|
11
|
+
serie: 'NF',
|
|
12
|
+
ambiente: 2,
|
|
13
|
+
...basePrestador,
|
|
14
|
+
optanteSimplesNacional: 1,
|
|
15
|
+
servico: {
|
|
16
|
+
itemListaServico: '01.01',
|
|
17
|
+
discriminacao: 'Servico de consultoria',
|
|
18
|
+
codigoMunicipio: '3550308',
|
|
19
|
+
valorServicos: 800,
|
|
20
|
+
aliquotaIss: 5,
|
|
21
|
+
valorIss: 40,
|
|
22
|
+
},
|
|
23
|
+
tomador: {
|
|
24
|
+
cnpj: '98765432000100',
|
|
25
|
+
razaoSocial: 'CLIENTE LTDA',
|
|
26
|
+
endereco: {
|
|
27
|
+
logradouro: 'Rua X', numero: '1', bairro: 'Centro',
|
|
28
|
+
codigoMunicipio: '3550308', uf: 'SP', cep: '01001000',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const service = new NFSeService({ mock: true });
|
|
34
|
+
|
|
35
|
+
console.log('=== GHINFE — Cancelamento e Substituição NFS-e ===\n');
|
|
36
|
+
|
|
37
|
+
const emitido = await service.emitir(documento);
|
|
38
|
+
console.log('Emitida:', emitido.retorno.numeroNfse, emitido.retorno.codigoVerificacao);
|
|
39
|
+
|
|
40
|
+
const cancelado = await service.cancelar({
|
|
41
|
+
...basePrestador,
|
|
42
|
+
numeroNfse: emitido.retorno.numeroNfse,
|
|
43
|
+
});
|
|
44
|
+
console.log('Cancelamento:', cancelado.retorno.cancelado, '— NFS-e', cancelado.retorno.numeroNfse);
|
|
45
|
+
|
|
46
|
+
const substituto = { ...documento, numero: 21, servico: { ...documento.servico, valorServicos: 900, valorIss: 45 } };
|
|
47
|
+
const subst = await service.substituir({
|
|
48
|
+
...basePrestador,
|
|
49
|
+
numeroNfseSubstituida: emitido.retorno.numeroNfse,
|
|
50
|
+
documentoSubstituto: substituto,
|
|
51
|
+
});
|
|
52
|
+
console.log(
|
|
53
|
+
'Substituição: nova',
|
|
54
|
+
subst.retorno.numeroNfse,
|
|
55
|
+
'substituiu',
|
|
56
|
+
subst.retorno.numeroNfseSubstituida
|
|
57
|
+
);
|