node-sped-nfe 1.0.5 → 1.0.7

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 (37) hide show
  1. package/LICENSE.md +188 -0
  2. package/dist/utils/eventos.d.ts +2 -1
  3. package/dist/utils/eventos.js +794 -105
  4. package/dist/utils/extras.d.ts +2 -0
  5. package/dist/utils/extras.js +58 -0
  6. package/dist/utils/make.d.ts +1 -1
  7. package/dist/utils/make.js +36 -12
  8. package/dist/utils/tools.d.ts +4 -2
  9. package/dist/utils/tools.js +77 -10
  10. package/docs/xml.md +81 -81
  11. package/exemplos/consulta.js +19 -0
  12. package/exemplos/nfe.js +4 -3
  13. package/exemplos/status.js +2 -1
  14. package/package.json +5 -2
  15. package/src/utils/eventos.ts +800 -106
  16. package/src/utils/extras.ts +59 -0
  17. package/src/utils/make.ts +63 -19
  18. package/src/utils/tools.ts +88 -11
  19. package/src/utils/schemas/consReciNFe_v4.00.xsd +0 -9
  20. package/src/utils/schemas/consSitNFe_v4.00.xsd +0 -9
  21. package/src/utils/schemas/consStatServ_v4.00.xsd +0 -9
  22. package/src/utils/schemas/enviNFe_v4.00.xsd +0 -9
  23. package/src/utils/schemas/inutNFe_v4.00.xsd +0 -9
  24. package/src/utils/schemas/leiauteConsSitNFe_v4.00.xsd +0 -502
  25. package/src/utils/schemas/leiauteConsStatServ_v4.00.xsd +0 -98
  26. package/src/utils/schemas/leiauteInutNFe_v4.00.xsd +0 -193
  27. package/src/utils/schemas/leiauteNFe_v4.00.xsd +0 -7412
  28. package/src/utils/schemas/nfe_v4.00.xsd +0 -9
  29. package/src/utils/schemas/procInutNFe_v4.00.xsd +0 -9
  30. package/src/utils/schemas/procNFe_v4.00.xsd +0 -9
  31. package/src/utils/schemas/retConsReciNFe_v4.00.xsd +0 -9
  32. package/src/utils/schemas/retConsSitNFe_v4.00.xsd +0 -9
  33. package/src/utils/schemas/retConsStatServ_v4.00.xsd +0 -9
  34. package/src/utils/schemas/retEnviNFe_v4.00.xsd +0 -9
  35. package/src/utils/schemas/retInutNFe_v4.00.xsd +0 -9
  36. package/src/utils/schemas/tiposBasico_v4.00.xsd +0 -598
  37. package/src/utils/schemas/xmldsig-core-schema_v1.01.xsd +0 -98
@@ -0,0 +1,59 @@
1
+ const cUF2UF: any = {
2
+ "11": "RO",
3
+ "12": "AC",
4
+ "13": "AM",
5
+ "14": "RR",
6
+ "15": "PA",
7
+ "16": "AP",
8
+ "17": "TO",
9
+ "21": "MA",
10
+ "22": "PI",
11
+ "23": "CE",
12
+ "24": "RN",
13
+ "25": "PB",
14
+ "26": "PE",
15
+ "27": "AL",
16
+ "28": "SE",
17
+ "29": "BA",
18
+ "31": "MG",
19
+ "32": "ES",
20
+ "33": "RJ",
21
+ "35": "SP",
22
+ "41": "PR",
23
+ "42": "SC",
24
+ "43": "RS",
25
+ "50": "MS",
26
+ "51": "MT",
27
+ "52": "GO",
28
+ "53": "DF"
29
+ },
30
+ UF2cUF: any = {
31
+ "RO": "11",
32
+ "AC": "12",
33
+ "AM": "13",
34
+ "RR": "14",
35
+ "PA": "15",
36
+ "AP": "16",
37
+ "TO": "17",
38
+ "MA": "21",
39
+ "PI": "22",
40
+ "CE": "23",
41
+ "RN": "24",
42
+ "PB": "25",
43
+ "PE": "26",
44
+ "AL": "27",
45
+ "SE": "28",
46
+ "BA": "29",
47
+ "MG": "31",
48
+ "ES": "32",
49
+ "RJ": "33",
50
+ "SP": "35",
51
+ "PR": "41",
52
+ "SC": "42",
53
+ "RS": "43",
54
+ "MS": "50",
55
+ "MT": "51",
56
+ "GO": "52",
57
+ "DF": "53"
58
+ };
59
+ export { cUF2UF, UF2cUF }
package/src/utils/make.ts CHANGED
@@ -1,6 +1,7 @@
1
1
 
2
2
  import { XMLParser, XMLBuilder, XMLValidator } from "fast-xml-parser";
3
- import { qrCodeUrls } from "./eventos.js"
3
+ import { urlEventos } from "./eventos.js"
4
+ import { cUF2UF } from "./extras.js"
4
5
 
5
6
  //Classe da nota fiscal
6
7
  class Make {
@@ -62,23 +63,38 @@ class Make {
62
63
  }
63
64
 
64
65
  tagRefNFe(obj: any) {
65
- throw "Não implementado!";
66
+ if (typeof this.#NFe.infNFe.ide.NFref == "undefined") {
67
+ this.#NFe.infNFe.ide.NFref = new Array();
68
+ }
69
+ this.#NFe.infNFe.ide.NFref.push({ refNFe: obj });
66
70
  }
67
71
 
68
72
  tagRefNF(obj: any) {
69
- throw "Não implementado!";
73
+ if (typeof this.#NFe.infNFe.ide.NFref == "undefined") {
74
+ this.#NFe.infNFe.ide.NFref = new Array();
75
+ }
76
+ this.#NFe.infNFe.ide.NFref.push({ refNF: obj });
70
77
  }
71
78
 
72
79
  tagRefNFP(obj: any) {
73
- throw "Não implementado!";
80
+ if (typeof this.#NFe.infNFe.ide.NFref == "undefined") {
81
+ this.#NFe.infNFe.ide.NFref = new Array();
82
+ }
83
+ this.#NFe.infNFe.ide.NFref.push({ refNFP: obj });
74
84
  }
75
85
 
76
86
  tagRefCTe(obj: any) {
77
- throw "Não implementado!";
87
+ if (typeof this.#NFe.infNFe.ide.NFref == "undefined") {
88
+ this.#NFe.infNFe.ide.NFref = new Array();
89
+ }
90
+ this.#NFe.infNFe.ide.NFref.push({ refCTe: obj });
78
91
  }
79
92
 
80
93
  tagRefECF(obj: any) {
81
- throw "Não implementado!";
94
+ if (typeof this.#NFe.infNFe.ide.NFref == "undefined") {
95
+ this.#NFe.infNFe.ide.NFref = new Array();
96
+ }
97
+ this.#NFe.infNFe.ide.NFref.push({ refECF: obj });
82
98
  }
83
99
 
84
100
  tagEmit(obj: any) {
@@ -118,18 +134,24 @@ class Make {
118
134
  }
119
135
 
120
136
  tagRetirada(obj: any) {
121
- throw "não implementado!";
137
+ this.#NFe.infNFe.retirada = {};
138
+ Object.keys(obj).forEach(key => {
139
+ this.#NFe.infNFe.retirada[key] = obj[key];
140
+ });
122
141
  }
123
142
 
124
143
  tagAutXML(obj: any) {
125
- throw "não implementado!";
144
+ if (typeof this.#NFe.infNFe.autXML == "undefined") {
145
+ this.#NFe.infNFe.autXML = new Array();
146
+ }
147
+ this.#NFe.infNFe.autXML.push(obj);
126
148
  }
127
149
 
128
150
  //tagprod
129
151
  tagProd(obj: any) {
130
152
  //Abrir tag de imposto
131
153
  for (let cont = 0; cont < obj.length; cont++) {
132
-
154
+
133
155
  if (obj[cont]['@nItem'] === undefined) {
134
156
  obj[cont] = { '@nItem': cont + 1, prod: obj[cont], imposto: {} };
135
157
  } else {
@@ -138,7 +160,7 @@ class Make {
138
160
  }
139
161
 
140
162
  //Primeiro item + NFCe + Homologação
141
- if(cont==0 && this.#NFe.infNFe.ide.mod == 65 && this.#NFe.infNFe.ide.tpAmb == 2 ) obj[cont].prod.xProd = "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL";
163
+ if (cont == 0 && this.#NFe.infNFe.ide.mod == 65 && this.#NFe.infNFe.ide.tpAmb == 2) obj[cont].prod.xProd = "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL";
142
164
 
143
165
  obj[cont].prod.qCom = (obj[cont].prod.qCom * 1).toFixed(4)
144
166
  obj[cont].prod.vUnCom = (obj[cont].prod.vUnCom * 1).toFixed(10)
@@ -158,8 +180,10 @@ class Make {
158
180
  throw "não implementado!";
159
181
  }
160
182
 
161
- taginfAdProd(obj: any) {
162
- throw "não implementado!";
183
+ taginfAdProd(index: any, obj: any) {
184
+ Object.keys(obj).forEach(key => {
185
+ this.#NFe.infNFe.det[index][key] = obj[key];
186
+ });
163
187
  }
164
188
 
165
189
  tagCEST(obj: any) {
@@ -170,8 +194,26 @@ class Make {
170
194
  throw "não implementado!";
171
195
  }
172
196
 
173
- tagAdi(obj: any) {
174
- throw "não implementado!";
197
+ tagDI(index: any, obj: any) {
198
+ if (this.#NFe.infNFe.det[index].DI === undefined) this.#NFe.infNFe.det[index].DI = {};
199
+ Object.keys(obj).forEach(key => {
200
+ this.#NFe.infNFe.det[index].DI[key] = obj[key];
201
+ });
202
+
203
+ //Adicionar ao imposto global
204
+ this.#calICMSTot(obj);
205
+ }
206
+
207
+ tagAdi(index: any, obj: any) {
208
+ if (this.#NFe.infNFe.det[index].DI === undefined) this.#NFe.infNFe.det[index].DI = {};
209
+ if (this.#NFe.infNFe.det[index].DI.adi === undefined) this.#NFe.infNFe.det[index].DI.adi = {};
210
+
211
+ Object.keys(obj).forEach(key => {
212
+ this.#NFe.infNFe.det[index].DI.adi[key] = obj[key];
213
+ });
214
+
215
+ //Adicionar ao imposto global
216
+ this.#calICMSTot(obj);
175
217
  }
176
218
 
177
219
  tagDetExport(obj: any) {
@@ -593,9 +635,8 @@ class Make {
593
635
  throw "Ainda não configurado!";
594
636
  }
595
637
 
596
-
638
+ //Sistema gera a chave da nota fiscal
597
639
  #gerarChaveNFe() {
598
-
599
640
  const chaveSemDV =
600
641
  this.#NFe.infNFe.ide.cUF.padStart(2, '0') + // Código da UF (2 dígitos)
601
642
  this.#NFe.infNFe.ide.dhEmi.substring(2, 4) + this.#NFe.infNFe.ide.dhEmi.substring(5, 7) + // Ano e Mês da emissão (AAMM, 4 dígitos)
@@ -640,9 +681,11 @@ class Make {
640
681
 
641
682
  //Adicionar QrCode
642
683
  if (this.#NFe.infNFe.ide.mod == 65) {
684
+ //Como ja temos cUF, vamos usar o extras.cUF2UF
685
+ let tempUF = urlEventos(cUF2UF[this.#NFe.infNFe.ide.cUF], this.#NFe.infNFe['@versao']);
643
686
  this.#NFe.infNFeSupl = {
644
- qrCode: qrCodeUrls[this.#NFe.infNFe.ide.tpAmb==1 ? 'producao' : 'homologacao'][`${this.#NFe.infNFe.ide.cUF}`].urlQRCode,
645
- urlChave: qrCodeUrls[this.#NFe.infNFe.ide.tpAmb==1 ? 'producao' : 'homologacao'][`${this.#NFe.infNFe.ide.cUF}`].urlChave
687
+ qrCode: tempUF.mod65[this.#NFe.infNFe.ide.tpAmb == 1 ? 'producao' : 'homologacao'].NFeConsultaQR, //Este não e o valor final, vamos utilizar apenas para carregar os dados que vão ser utlizados no make
688
+ urlChave: tempUF.mod65[this.#NFe.infNFe.ide.tpAmb == 1 ? 'producao' : 'homologacao'].urlChave
646
689
  }
647
690
  }
648
691
 
@@ -652,7 +695,8 @@ class Make {
652
695
  });
653
696
  return tempBuild.build({ NFe: this.#NFe });
654
697
  }
655
-
698
+
699
+ //Obtem os dados de importo e soma no total, utlizado sempre que for setado algum imposto.
656
700
  #calICMSTot(obj: any) {
657
701
  Object.keys(obj).map(key => {
658
702
  if (this.#ICMSTot[key] !== undefined) {
@@ -3,7 +3,7 @@ import https from "https";
3
3
  import { spawnSync, SpawnSyncReturns } from "child_process"
4
4
  import tmp from "tmp"
5
5
  import crypto from "crypto";
6
- import { urlServicos } from "./eventos.js"
6
+ import { urlEventos } from "./eventos.js"
7
7
  import fs from "fs"
8
8
  import path from 'path';
9
9
  import { fileURLToPath } from 'url';
@@ -38,13 +38,14 @@ class Tools {
38
38
  #config: {
39
39
  mod: string;
40
40
  xmllint: string;
41
- cUF: string;
41
+ UF: string;
42
42
  tpAmb: number;
43
43
  CSC: string;
44
44
  CSCid: string;
45
+ versao: string;
45
46
  };
46
47
 
47
- constructor(config = { mod: "", xmllint: 'xmllint', cUF: '51', tpAmb: 2, CSC: "", CSCid: "" }, certificado = { pfx: "", senha: "" }) {
48
+ constructor(config = { mod: "", xmllint: 'xmllint', UF: '', tpAmb: 2, CSC: "", CSCid: "", versao: "4.00" }, certificado = { pfx: "", senha: "" }) {
48
49
  //Configurar certificado
49
50
  this.#config = config;
50
51
  this.#cert = certificado;
@@ -89,7 +90,8 @@ class Tools {
89
90
  }
90
91
  let xmlLote = await this.json2xml(jsonXmlLote);
91
92
  try {
92
- const req = https.request(urlServicos[`${this.#config.cUF}`][`mod_${this.#config.mod}`].NFeAutorizacao[(this.#config.tpAmb == 1 ? "producao" : "homologacao")], {
93
+ let tempUF = urlEventos(this.#config.UF, this.#config.versao);
94
+ const req = https.request(tempUF[`mod${this.#config.mod}`][(this.#config.tpAmb == 1 ? "producao" : "homologacao")].NFeAutorizacao, {
93
95
  ...{
94
96
  method: 'POST',
95
97
  headers: {
@@ -181,7 +183,7 @@ class Tools {
181
183
  }
182
184
 
183
185
  this.json2xml(xml).then(async res => {
184
- this.#xmlValido(res, 'nfe_v4.00');
186
+ this.#xmlValido(res, `nfe_v${this.#config.versao}`);
185
187
  resvol(res);
186
188
  }).catch(err => {
187
189
  reject(err)
@@ -189,7 +191,8 @@ class Tools {
189
191
  })
190
192
  }
191
193
 
192
- #gerarQRCodeNFCe(NFe: any, versaoQRCode: string = "2", idCSC: string, CSC: string) {
194
+ //Gerar QRCode da NFCe
195
+ #gerarQRCodeNFCe(NFe: any, versaoQRCode: string = "2", idCSC: string, CSC: string): string {
193
196
  let s = '|',
194
197
  concat,
195
198
  hash;
@@ -215,26 +218,99 @@ class Tools {
215
218
  })
216
219
  }
217
220
 
218
- async getCertificado() {
221
+ //Obter certificado
222
+ async getCertificado(): Promise<object> {
219
223
  return new Promise(async (resvol, reject) => {
220
224
  this.#certTools().then(resvol).catch(reject)
221
225
  })
222
226
  }
223
227
 
228
+ //Consulta NFe
229
+ consultarNFe(chNFe: string): Promise<string> {
230
+ return new Promise(async (resolve, reject) => {
231
+ if (!chNFe || chNFe.length !== 44) {
232
+ return reject("consultarNFe(chNFe) -> chave inválida!");
233
+ }
234
+
235
+ if (typeof this.#config.UF === "undefined") throw "consultarNFe({...UF}) -> não definido!";
236
+ if (typeof this.#config.tpAmb === "undefined") throw "consultarNFe({...tpAmb}) -> não definido!";
237
+ if (typeof this.#config.mod === "undefined") throw "consultarNFe({...mod}) -> não definido!";
238
+
239
+ let consSitNFe = {
240
+ "@xmlns": "http://www.portalfiscal.inf.br/nfe",
241
+ "@versao": "4.00",
242
+ "tpAmb": this.#config.tpAmb,
243
+ "xServ": "CONSULTAR",
244
+ "chNFe": chNFe
245
+ };
246
+
247
+ let xmlObj = {
248
+ "soap:Envelope": {
249
+ "@xmlns:soap": "http://www.w3.org/2003/05/soap-envelope",
250
+ "@xmlns:nfe": "http://www.portalfiscal.inf.br/nfe/wsdl/NFeConsultaProtocolo4",
251
+ "soap:Body": {
252
+ "nfe:nfeDadosMsg": {
253
+ "consSitNFe": consSitNFe
254
+ }
255
+ }
256
+ }
257
+ };
258
+
259
+ try {
260
+ const builder = new XMLBuilder({
261
+ ignoreAttributes: false,
262
+ attributeNamePrefix: "@"
263
+ });
264
+
265
+ // Validação do XML interno (opcional)
266
+ this.#xmlValido(builder.build({ consSitNFe }), `consSitNFe_v${this.#config.versao}`);
267
+
268
+ const xml = builder.build(xmlObj);
269
+
270
+ let tempUF = urlEventos(this.#config.UF, this.#config.versao);
271
+
272
+ const url = tempUF[`mod${this.#config.mod}`][(this.#config.tpAmb == 1 ? "producao" : "homologacao")].NFeConsultaProtocolo;
273
+
274
+ const req = https.request(url, {
275
+ method: 'POST',
276
+ headers: {
277
+ 'Content-Type': 'application/soap+xml; charset=utf-8',
278
+ 'Content-Length': xml.length,
279
+ },
280
+ rejectUnauthorized: false,
281
+ ...await this.#certTools()
282
+ }, (res) => {
283
+ let data = '';
284
+ res.on('data', (chunk) => data += chunk);
285
+ res.on('end', () => resolve(data));
286
+ });
287
+
288
+ req.on('error', (err) => reject(err));
289
+
290
+ req.write(xml);
291
+ req.end();
292
+ } catch (err) {
293
+ reject(err);
294
+ }
295
+ });
296
+ }
297
+
224
298
  //Consulta status sefaz
225
299
  async sefazStatus(): Promise<string> {
226
300
  return new Promise(async (resvol, reject) => {
227
301
 
228
- if (typeof this.#config.cUF == "undefined") throw "sefazStatus({...cUF}) -> não definido!";
302
+ if (typeof this.#config.UF == "undefined") throw "sefazStatus({...UF}) -> não definido!";
229
303
  if (typeof this.#config.tpAmb == "undefined") throw "sefazStatus({...tpAmb}) -> não definido!";
230
304
  if (typeof this.#config.mod == "undefined") throw "sefazStatus({...mod}) -> não definido!";
231
305
 
306
+ let tempUF = urlEventos(this.#config.UF, this.#config.versao);
307
+
232
308
  //Separado para validar o corpo da consulta
233
309
  let consStatServ = {
234
310
  "@versao": "4.00",
235
311
  "@xmlns": "http://www.portalfiscal.inf.br/nfe",
236
312
  "tpAmb": this.#config.tpAmb,
237
- "cUF": this.#config.cUF,
313
+ "cUF": tempUF.cUF,
238
314
  "xServ": "STATUS"
239
315
  }
240
316
 
@@ -257,9 +333,10 @@ class Tools {
257
333
  });
258
334
 
259
335
  //Validação
260
- this.#xmlValido(tempBuild.build({ consStatServ }), 'consStatServ_v4.00');
336
+ this.#xmlValido(tempBuild.build({ consStatServ }), `consStatServ_v${this.#config.versao}`);
337
+ let tempUF = urlEventos(this.#config.UF, this.#config.versao);
261
338
  let xml = tempBuild.build(xmlObj);
262
- const req = https.request(urlServicos[`${this.#config.cUF}`][`mod_${this.#config.mod}`].NFeStatusServico[(this.#config.tpAmb == 1 ? "producao" : "homologacao")], {
339
+ const req = https.request(tempUF[`mod${this.#config.mod}`][(this.#config.tpAmb == 1 ? "producao" : "homologacao")].NFeStatusServico, {
263
340
  ...{
264
341
  method: 'POST',
265
342
  headers: {
@@ -1,9 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <xs:schema xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified">
3
- <xs:include schemaLocation="leiauteNFe_v4.00.xsd"/>
4
- <xs:element name="consReciNFe" type="TConsReciNFe">
5
- <xs:annotation>
6
- <xs:documentation>Schema XML de validação do Pedido de Consulta do Recido do Lote de Notas Fiscais Eletrônicas</xs:documentation>
7
- </xs:annotation>
8
- </xs:element>
9
- </xs:schema>
@@ -1,9 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.portalfiscal.inf.br/nfe" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified">
3
- <xs:include schemaLocation="leiauteConsSitNFe_v4.00.xsd"/>
4
- <xs:element name="consSitNFe" type="TConsSitNFe">
5
- <xs:annotation>
6
- <xs:documentation>Schema de validação XML dp Pedido de Consulta da Situação Atual da Nota Fiscal Eletrônica</xs:documentation>
7
- </xs:annotation>
8
- </xs:element>
9
- </xs:schema>
@@ -1,9 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <xs:schema xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified">
3
- <xs:include schemaLocation="leiauteConsStatServ_v4.00.xsd"/>
4
- <xs:element name="consStatServ" type="TConsStatServ">
5
- <xs:annotation>
6
- <xs:documentation>Schema XML de validação do Pedido de Consulta do Status do Serviço</xs:documentation>
7
- </xs:annotation>
8
- </xs:element>
9
- </xs:schema>
@@ -1,9 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified">
3
- <xs:include schemaLocation="leiauteNFe_v4.00.xsd"/>
4
- <xs:element name="enviNFe" type="TEnviNFe">
5
- <xs:annotation>
6
- <xs:documentation>Schema XML de validação do Pedido de Concessão de Autorização da Nota Fiscal Eletrônica</xs:documentation>
7
- </xs:annotation>
8
- </xs:element>
9
- </xs:schema>
@@ -1,9 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified">
3
- <xs:include schemaLocation="leiauteInutNFe_v4.00.xsd"/>
4
- <xs:element name="inutNFe" type="TInutNFe">
5
- <xs:annotation>
6
- <xs:documentation>Schema XML de validação do Pedido de Inutilização de Numeração da Nota Fiscal Eletrônica</xs:documentation>
7
- </xs:annotation>
8
- </xs:element>
9
- </xs:schema>