@sinete/nfe 0.4.0 → 0.6.0
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/README.md +5 -1
- package/dist/build/build.d.ts +8 -6
- package/dist/build/build.d.ts.map +1 -1
- package/dist/build/nfce.d.ts +8 -0
- package/dist/build/nfce.d.ts.map +1 -1
- package/dist/build/rejeicoes.d.ts +48 -0
- package/dist/build/rejeicoes.d.ts.map +1 -1
- package/dist/build/textos.d.ts +1 -2
- package/dist/build/textos.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +202 -189
- package/dist/index.js.map +9 -9
- package/dist/services/client.d.ts +27 -2
- package/dist/services/client.d.ts.map +1 -1
- package/dist/services/outcome.d.ts +1 -1
- package/dist/services/outcome.d.ts.map +1 -1
- package/dist/versao-gerada.d.ts +1 -1
- package/package.json +7 -7
- package/src/build/build.ts +61 -28
- package/src/build/nfce.ts +41 -20
- package/src/build/rejeicoes.ts +182 -0
- package/src/build/textos.ts +6 -148
- package/src/data/cstat.json +2 -1
- package/src/index.ts +2 -0
- package/src/services/client.ts +66 -8
- package/src/services/outcome.ts +1 -0
- package/src/versao-gerada.ts +1 -1
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* enviar; se o envio ficar sem resposta (timeout, conexão caída), nunca gere outro `cNF` nem outro `dhEmi` para o mesmo
|
|
13
13
|
* número. Consulte a chave (`resolverEnvioSemResposta`) e, se ela não constar, reenvie exatamente os mesmos bytes.
|
|
14
14
|
*/
|
|
15
|
-
import type { Ambiente, Assinador, Logger, Relogio, ResultadoSefaz, Uf } from '@sinete/core';
|
|
15
|
+
import type { Ambiente, Assinador, Logger, Recusado, Relogio, ResultadoSefaz, Uf } from '@sinete/core';
|
|
16
16
|
import type { TRetConsCad_infCons_infCad } from '@sinete/schemas/nfe/consulta-cadastro/PL_010d';
|
|
17
17
|
import type { resEvento, resNFe } from '@sinete/schemas/nfe/dist-dfe/PL_NFeDistDFe_104';
|
|
18
18
|
import type { EndpointResolvido, NfeServico, Transporte } from '@sinete/transport';
|
|
@@ -62,6 +62,16 @@ export interface ClienteNfeOpcoes {
|
|
|
62
62
|
readonly endpointNfce?: (servico: NfeServico, uf: Uf) => EndpointResolvido;
|
|
63
63
|
/** Gerador de `idLote` (até 15 dígitos); padrão: os milissegundos do relógio. */
|
|
64
64
|
readonly idLote?: () => string;
|
|
65
|
+
/**
|
|
66
|
+
* O titular emite NF-e sem inscrição estadual, como contribuinte exclusivo do IBS/CBS (NT 2026.007 v1.10). A
|
|
67
|
+
* autorização dessa NF-e é só na SVRS (RV C17-11, rejeição 166), e os eventos de autoria do emitente dela também
|
|
68
|
+
* (RV 1P10-40, rejeição 188), menos na série 890 a 919. Com a NF-e assinada na mão (`autorizar`, `consultar` e
|
|
69
|
+
* `consultarRecibo` com ela) o cliente vê a falta de `emit/IE` sozinho; esta opção é para o que parte só da chave:
|
|
70
|
+
* cancelamento, carta de correção, consulta e recibo sem a nota (o recibo sem a nota vai à SVRS no modelo 55). A série 890 a
|
|
71
|
+
* 919 é exceção só dos eventos. Não vale para a NFC-e, que não admite emitente sem
|
|
72
|
+
* IE (RV C17-42, rejeição 156).
|
|
73
|
+
*/
|
|
74
|
+
readonly contribuinteExclusivoIbsCbs?: boolean;
|
|
65
75
|
}
|
|
66
76
|
/** Opções de toda chamada que vai à rede. */
|
|
67
77
|
export interface EnvioOpcoes {
|
|
@@ -147,7 +157,22 @@ export interface Inutilizacao {
|
|
|
147
157
|
readonly retInutNFe: string;
|
|
148
158
|
readonly procInutNFe: string;
|
|
149
159
|
}
|
|
150
|
-
|
|
160
|
+
/**
|
|
161
|
+
* Protocolo da inutilização que já valia para a mesma faixa, trazido pelo 563 (MOC 7.0 Visão Geral, tabela 5-12,
|
|
162
|
+
* regra I07). Não existe consulta de inutilização na NF-e 4.00: depois de um pedido sem resposta, reenviar a mesma
|
|
163
|
+
* faixa e ler este campo é o único caminho para guardar o `nProt` que valeu. O `procInutNFe` não se monta com ele,
|
|
164
|
+
* porque a resposta 563 não é a homologação.
|
|
165
|
+
*/
|
|
166
|
+
export interface InutilizacaoAnterior {
|
|
167
|
+
readonly nProt: string;
|
|
168
|
+
/** `retInutNFe` do 563 como veio na resposta. */
|
|
169
|
+
readonly retInutNFe: string;
|
|
170
|
+
}
|
|
171
|
+
/** Recusa da inutilização; no 563 com protocolo, `anterior` traz o protocolo da faixa já inutilizada. */
|
|
172
|
+
export interface RecusadoInutilizacao extends Recusado {
|
|
173
|
+
readonly anterior?: InutilizacaoAnterior;
|
|
174
|
+
}
|
|
175
|
+
export type ResultadoInutilizacao = Exclude<ResultadoSefaz<Inutilizacao, never>, Recusado> | RecusadoInutilizacao;
|
|
151
176
|
export interface Cadastro {
|
|
152
177
|
readonly UF: string;
|
|
153
178
|
readonly dhCons: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/services/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAO,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/services/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { Recusado, StatusSefaz } from '@sinete/core';
|
|
6
6
|
/** Classes de `cStat` que a tabela descreve. */
|
|
7
|
-
export type CStatClasse = 'autorizada' | 'denegada' | 'cancelada' | 'loteRecebido' | 'loteProcessado' | 'loteEmProcessamento' | 'loteNaoLocalizado' | 'servicoEmOperacao' | 'inutilizacaoHomologada' | 'eventoRegistrado' | 'loteEventoProcessado' | 'cadastroEncontrado' | 'distribuicaoNenhumDocumento' | 'distribuicaoDocumentos' | 'duplicidade' | 'duplicidadeChaveDiferente' | 'naoConsta' | 'outraNfeNoNumero' | 'consumoIndevido';
|
|
7
|
+
export type CStatClasse = 'autorizada' | 'denegada' | 'cancelada' | 'loteRecebido' | 'loteProcessado' | 'loteEmProcessamento' | 'loteNaoLocalizado' | 'servicoEmOperacao' | 'inutilizacaoHomologada' | 'inutilizacaoJaHomologada' | 'eventoRegistrado' | 'loteEventoProcessado' | 'cadastroEncontrado' | 'distribuicaoNenhumDocumento' | 'distribuicaoDocumentos' | 'duplicidade' | 'duplicidadeChaveDiferente' | 'naoConsta' | 'outraNfeNoNumero' | 'consumoIndevido';
|
|
8
8
|
/** O `cStat` pertence à classe da tabela. */
|
|
9
9
|
export declare function cstatEm(cStat: string, classe: CStatClasse): boolean;
|
|
10
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../../src/services/outcome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAgB,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKxE,gDAAgD;AAChD,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ,UAAU,GACV,WAAW,GACX,cAAc,GACd,gBAAgB,GAChB,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,kBAAkB,GAClB,sBAAsB,GACtB,oBAAoB,GACpB,6BAA6B,GAC7B,wBAAwB,GACxB,aAAa,GACb,2BAA2B,GAC3B,WAAW,GACX,kBAAkB,GAClB,iBAAiB,CAAC;AAKtB,6CAA6C;AAC7C,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAEnE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,CAKvD"}
|
|
1
|
+
{"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../../src/services/outcome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAgB,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKxE,gDAAgD;AAChD,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ,UAAU,GACV,WAAW,GACX,cAAc,GACd,gBAAgB,GAChB,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,0BAA0B,GAC1B,kBAAkB,GAClB,sBAAsB,GACtB,oBAAoB,GACpB,6BAA6B,GAC7B,wBAAwB,GACxB,aAAa,GACb,2BAA2B,GAC3B,WAAW,GACX,kBAAkB,GAClB,iBAAiB,CAAC;AAKtB,6CAA6C;AAC7C,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAEnE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,CAKvD"}
|
package/dist/versao-gerada.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sinete/nfe",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "NF-e modelo 55: modelo de entrada tipado, montagem com totais em decimal exato, validação antes de assinar, autorização, consultas, eventos, inutilização, contingência SVC e Distribuição DF-e",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nfe",
|
|
@@ -45,15 +45,15 @@
|
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@sinete/core": "^0.3.0",
|
|
48
|
-
"@sinete/ibs-cbs": "^0.2.
|
|
48
|
+
"@sinete/ibs-cbs": "^0.2.2",
|
|
49
49
|
"@sinete/ibs-cbs-dados": ">=2026.9.3",
|
|
50
|
-
"@sinete/rejeicoes": "^0.
|
|
51
|
-
"@sinete/schemas": "^0.
|
|
52
|
-
"@sinete/transport": "^0.
|
|
53
|
-
"@sinete/validators": "^0.
|
|
50
|
+
"@sinete/rejeicoes": "^0.4.1",
|
|
51
|
+
"@sinete/schemas": "^0.3.0",
|
|
52
|
+
"@sinete/transport": "^0.3.0",
|
|
53
|
+
"@sinete/validators": "^0.3.0"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@sinete/sefaz-sim": "^0.
|
|
56
|
+
"@sinete/sefaz-sim": "^0.4.0"
|
|
57
57
|
},
|
|
58
58
|
"publishConfig": {
|
|
59
59
|
"access": "public"
|
package/src/build/build.ts
CHANGED
|
@@ -69,7 +69,7 @@ import {
|
|
|
69
69
|
urlsNfce,
|
|
70
70
|
} from './nfce.ts';
|
|
71
71
|
import { camposForaDoPl, escolherPl } from './pl.ts';
|
|
72
|
-
import { cstComIsento, vencimentos } from './rejeicoes.ts';
|
|
72
|
+
import { cfopDeDevolucao, cstComIsento, cstComNaoContribuinte, exclusivoIbsCbs, vencimentos } from './rejeicoes.ts';
|
|
73
73
|
import { conferirTextosDaEntrada, textoXmlValido } from './textos.ts';
|
|
74
74
|
import { buildIcmsUfDest, buildIi, buildIpi, buildIssqn, buildPisCofins, buildPisCofinsSt } from './tributos.ts';
|
|
75
75
|
import type { Familia } from './values.ts';
|
|
@@ -149,8 +149,9 @@ export interface NfeMontada {
|
|
|
149
149
|
readonly tpEmis: string;
|
|
150
150
|
readonly dhEmi: string;
|
|
151
151
|
/**
|
|
152
|
-
*
|
|
153
|
-
* assinatura dos parâmetros, que só o certificado faz
|
|
152
|
+
* NFC-e e NF-e com DANFE Simplificado Tipo 2 (tpImp 6, NT 2026.002): o `infNFeSupl` a acrescentar (`comQrCode`,
|
|
153
|
+
* `assinarNfe`). Na versão 3 em contingência off-line, falta a assinatura dos parâmetros, que só o certificado faz
|
|
154
|
+
* (`assinaturaQrCode`).
|
|
154
155
|
*/
|
|
155
156
|
readonly nfce?: NfceSupl;
|
|
156
157
|
/** Pacote de liberação usado (escolhido pela vigência). */
|
|
@@ -399,7 +400,7 @@ interface ItemMontado {
|
|
|
399
400
|
readonly issqnOpcionais: Record<string, Decimal>;
|
|
400
401
|
}
|
|
401
402
|
|
|
402
|
-
function montarItem(ctx: Ctx, item: Item, n: number, normal: boolean): ItemMontado {
|
|
403
|
+
function montarItem(ctx: Ctx, item: Item, n: number, normal: boolean, semIe: boolean): ItemMontado {
|
|
403
404
|
const path = `itens[${n}]`;
|
|
404
405
|
const p = item.produto;
|
|
405
406
|
const pp = `${path}.produto`;
|
|
@@ -518,7 +519,9 @@ function montarItem(ctx: Ctx, item: Item, n: number, normal: boolean): ItemMonta
|
|
|
518
519
|
const r = buildIcms(ctx, imp.icms, { vOp, vIPI: v.vIPI }, `${ip}.icms`);
|
|
519
520
|
imposto.ICMS = r.grupo;
|
|
520
521
|
icms = r.totais;
|
|
521
|
-
} else if (imp.issqn === undefined && imp.ibsCbs === undefined) {
|
|
522
|
+
} else if (imp.issqn === undefined && imp.ibsCbs === undefined && !semIe) {
|
|
523
|
+
// Na NF-e sem IE do emitente a falta de ICMS e ISSQN é a exceção 2 da RV B25-90 (NT 2026.007); a falta do grupo
|
|
524
|
+
// IBS/CBS sai como a 162, no caminho dele.
|
|
522
525
|
ctx.issues.add(`${ip}.icms`, 'campo_obrigatorio', 'o item precisa de ICMS (ou ISSQN, na NF-e conjugada)');
|
|
523
526
|
}
|
|
524
527
|
if (imp.ii !== undefined) {
|
|
@@ -628,7 +631,10 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
628
631
|
const nfce = mod === '65';
|
|
629
632
|
// Padrões da identificação resolvidos uma vez: o mesmo valor vai para o ide e para a calculadora de IBS/CBS. A NFC-e
|
|
630
633
|
// é presencial e para consumidor final (MOC 7.0 Anexo I, B25a-10 e B25b-20).
|
|
631
|
-
|
|
634
|
+
// NF-e com DANFE Simplificado Tipo 2 (tpImp 6): parte das regras da NFC-e vale para ela (NT 2026.002 v1.11).
|
|
635
|
+
const tipo2 = !nfce && entrada.tpImp === '6';
|
|
636
|
+
// Na NFC-e e na Tipo 2 a operação é presencial ou entrega a domicílio (B25b-20, rejeição 717): o padrão é 1.
|
|
637
|
+
const indPres = entrada.indPres ?? (nfce || tipo2 ? '1' : finNFeIn === '2' || finNFeIn === '3' ? '0' : '9');
|
|
632
638
|
const indFinal = entrada.indFinal ?? (nfce || entrada.destinatario?.indIEDest === '9' ? '1' : '0');
|
|
633
639
|
const ctx = new Ctx(issues, { ...MODES, ...opcoes.arredondamento }, finNFeIn !== '2' && finNFeIn !== '3');
|
|
634
640
|
const pRedutorGov = entrada.gCompraGov && ctx.req(entrada.gCompraGov.pRedutor, 'gCompraGov.pRedutor', D0302A04);
|
|
@@ -748,11 +754,11 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
748
754
|
if (cont.dhCont.getTime() > agora.getTime()) {
|
|
749
755
|
issues.add('contingencia.dhCont', 'contingencia_invalida', 'entrada em contingência posterior à emissão');
|
|
750
756
|
}
|
|
751
|
-
if (!nfce && tpEmis === '9') {
|
|
757
|
+
if (!nfce && tpEmis === '9' && (entrada.tpImp ?? '1') !== '6') {
|
|
752
758
|
issues.add(
|
|
753
759
|
'contingencia.tpEmis',
|
|
754
760
|
'contingencia_invalida',
|
|
755
|
-
'contingência off-line (tpEmis 9) é
|
|
761
|
+
'contingência off-line (tpEmis 9) é da NFC-e e da NF-e com DANFE Simplificado Tipo 2, tpImp 6 (B22-10, rejeição 711)',
|
|
756
762
|
);
|
|
757
763
|
}
|
|
758
764
|
if (nfce && (tpEmis === '6' || tpEmis === '7')) {
|
|
@@ -765,9 +771,11 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
765
771
|
}
|
|
766
772
|
|
|
767
773
|
// Identificação que as regras do modelo conferem antes de montar.
|
|
768
|
-
// Na NFC-e a operação é sempre interna (B11a-10, rejeição 707): o endereço do consumidor não a torna
|
|
774
|
+
// Na NFC-e e na Tipo 2 a operação é sempre interna (B11a-10, rejeição 707): o endereço do consumidor não a torna
|
|
775
|
+
// interestadual.
|
|
769
776
|
const idDest =
|
|
770
|
-
entrada.idDest ??
|
|
777
|
+
entrada.idDest ??
|
|
778
|
+
(nfce || tipo2 ? '1' : destUf === 'EX' ? '3' : destUf !== undefined && destUf !== emitUf ? '2' : '1');
|
|
771
779
|
const tpImp = entrada.tpImp ?? (nfce ? '4' : '1');
|
|
772
780
|
conferirDestinatario(
|
|
773
781
|
entrada,
|
|
@@ -781,10 +789,11 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
781
789
|
},
|
|
782
790
|
issues,
|
|
783
791
|
);
|
|
784
|
-
if (nfce) {
|
|
792
|
+
if (nfce || tipo2) {
|
|
785
793
|
conferirNfce(
|
|
786
794
|
entrada,
|
|
787
795
|
{
|
|
796
|
+
mod: nfce ? '65' : '55',
|
|
788
797
|
tpNF: entrada.tpNF,
|
|
789
798
|
idDest,
|
|
790
799
|
tpImp,
|
|
@@ -797,7 +806,17 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
797
806
|
} else if (tpImp === '4' || tpImp === '5') {
|
|
798
807
|
issues.add('tpImp', 'campo_invalido', 'tpImp 4 e 5 (DANFC-e) são da NFC-e (B21-20, rejeição 710)');
|
|
799
808
|
}
|
|
809
|
+
// QR Code no infNFeSupl: NFC-e e NF-e com DANFE Simplificado Tipo 2 (NT 2026.002 v1.11, ZX02-10), esta só na versão 3
|
|
810
|
+
// (ZX02-220, rejeição 672) e com a URL da NFC-e da UF (ZX02-20, observação 3).
|
|
811
|
+
const comQr = nfce || tpImp === '6';
|
|
800
812
|
const qr: QrCodeNfceOpcoes = opcoes.qrCode ?? { versao: '3' };
|
|
813
|
+
if (!nfce && comQr && qr.versao === '2') {
|
|
814
|
+
issues.montagem(
|
|
815
|
+
'qrCode.versao',
|
|
816
|
+
'qrcode_invalido',
|
|
817
|
+
'a NF-e com DANFE Simplificado Tipo 2 usa só o QR Code versão 3 (ZX02-220, rejeição 672)',
|
|
818
|
+
);
|
|
819
|
+
}
|
|
801
820
|
if (nfce && qr.versao === '2') {
|
|
802
821
|
// O CSC e o idCSC são opções do montador, não da nota: as ocorrências são da montagem (ADR 0011).
|
|
803
822
|
if (!/^\d{1,6}$/.test(qr.idCSC) || Number(qr.idCSC) === 0) {
|
|
@@ -844,11 +863,12 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
844
863
|
if (entrada.itens.length === 0 || entrada.itens.length > 990) {
|
|
845
864
|
issues.add('itens', 'itens_limite', 'a NF-e tem de 1 a 990 itens');
|
|
846
865
|
}
|
|
847
|
-
const
|
|
848
|
-
|
|
849
|
-
//
|
|
866
|
+
const semIe = !nfce && entrada.emitente.IE === undefined;
|
|
867
|
+
const itens = entrada.itens.map((it, n) => montarItem(ctx, it, n, finNFeIn === '1', semIe));
|
|
868
|
+
// Na NFC-e e na Tipo 2 (NT 2026.002) em homologação, a descrição do primeiro item é a literal da RV I04-10, como o
|
|
869
|
+
// nome do destinatário da E04-20: o builder a põe, e a descrição informada fica fora do XML de teste.
|
|
850
870
|
const primeiro = itens[0];
|
|
851
|
-
if (nfce && opcoes.ambiente === 'homologacao' && primeiro !== undefined) {
|
|
871
|
+
if ((nfce || tipo2) && opcoes.ambiente === 'homologacao' && primeiro !== undefined) {
|
|
852
872
|
(primeiro.det.prod as unknown as Record<string, unknown>).xProd = XPROD_HOMOLOGACAO_NFCE;
|
|
853
873
|
}
|
|
854
874
|
|
|
@@ -972,11 +992,16 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
972
992
|
});
|
|
973
993
|
// Texto e tamanho dos campos de texto pelo tipo do PL, com o caminho da entrada (ADR 0011); o campo que outra
|
|
974
994
|
// conferência já recusou fica só com a ocorrência dela.
|
|
975
|
-
// Em homologação, o nome do destinatário e, na NFC-e, a descrição do primeiro item são as literais da E04-20
|
|
976
|
-
// o texto informado não vai ao XML.
|
|
995
|
+
// Em homologação, o nome do destinatário e, na NFC-e e na Tipo 2, a descrição do primeiro item são as literais da E04-20
|
|
996
|
+
// e da I04-10: o texto informado não vai ao XML.
|
|
977
997
|
const substituidos =
|
|
978
|
-
opcoes.ambiente === 'homologacao'
|
|
998
|
+
opcoes.ambiente === 'homologacao'
|
|
999
|
+
? ['destinatario.xNome', ...(nfce || tipo2 ? ['itens[0].produto.xProd'] : [])]
|
|
1000
|
+
: [];
|
|
979
1001
|
conferirTextosDaEntrada(entrada, pl.infNFe as ComplexType, issues, new Set(substituidos));
|
|
1002
|
+
// Nota sem IE do emitente (NT 2026.007, ADR 0012): conferida antes de parar nas ocorrências dos itens, para todas as
|
|
1003
|
+
// violações voltarem juntas.
|
|
1004
|
+
exclusivoIbsCbs(entrada, { nfce, dhEmi, instantes: [agora, fatoGerador] }, issues);
|
|
980
1005
|
if (!issues.empty) return { ok: false, ocorrencias: issues.classificadas };
|
|
981
1006
|
|
|
982
1007
|
// Totais (grupo W)
|
|
@@ -1272,6 +1297,7 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
1272
1297
|
pagamentoNfce(pag, vNF, issues);
|
|
1273
1298
|
}
|
|
1274
1299
|
// W16-40 (rejeição 750): acima do limite, a NFC-e identifica o destinatário por CNPJ, CPF ou idEstrangeiro.
|
|
1300
|
+
// Na Tipo 2 a W16-40 não tem o que conferir: a NF-e sempre identifica o destinatário (E01-10, rejeição 719).
|
|
1275
1301
|
if (nfce && vNF.gt(Decimal.of(NFCE_LIMITE_SEM_DESTINATARIO)) && dest === undefined) {
|
|
1276
1302
|
issues.add(
|
|
1277
1303
|
'destinatario',
|
|
@@ -1341,6 +1367,10 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
1341
1367
|
|
|
1342
1368
|
// Regras da SEFAZ que só dependem do documento (ADR 0012).
|
|
1343
1369
|
cstComIsento(entrada, idDest, issues);
|
|
1370
|
+
if (!nfce) {
|
|
1371
|
+
cfopDeDevolucao(entrada, issues);
|
|
1372
|
+
cstComNaoContribuinte(entrada, { idDest, uf: emitUf }, issues);
|
|
1373
|
+
}
|
|
1344
1374
|
vencimentos(entrada, { dhEmi, instante: agora }, issues);
|
|
1345
1375
|
|
|
1346
1376
|
camposForaDoPl(pl.infNFe, inf, 'infNFe', pl.vigencia.pl, issues);
|
|
@@ -1375,8 +1405,9 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
1375
1405
|
};
|
|
1376
1406
|
}
|
|
1377
1407
|
let supl: NfceSupl | undefined;
|
|
1378
|
-
if (
|
|
1379
|
-
// infNFeSupl (grupo ZX, NT 2025.001 item 04): endereços da UF no dia da emissão, pelo horário
|
|
1408
|
+
if (comQr) {
|
|
1409
|
+
// infNFeSupl (grupo ZX, NT 2025.001 item 04 e NT 2026.002): endereços da NFC-e da UF no dia da emissão, pelo horário
|
|
1410
|
+
// de Brasília, também na NF-e Tipo 2.
|
|
1380
1411
|
const tabela = urlsNfce(emitUf, opcoes.ambiente, diaBrasilia(agora));
|
|
1381
1412
|
const urlQr = opcoes.urlQrCode ?? tabela.qrCode;
|
|
1382
1413
|
const urlChave = opcoes.urlChave ?? tabela.urlChave;
|
|
@@ -1456,25 +1487,26 @@ const escapeXml = (s: string): string => s.replace(/&/g, '&').replace(/</g,
|
|
|
1456
1487
|
/**
|
|
1457
1488
|
* Assinatura dos parâmetros do QR Code da NFC-e em contingência off-line com a versão 3 (RSA-SHA1 em Base64, com o
|
|
1458
1489
|
* certificado que assina a nota; Manual do DANFE NFC-e 6.0, 4.4.2). `undefined` quando o QR Code não leva assinatura
|
|
1459
|
-
* (NF-e, emissão normal, versão 2).
|
|
1490
|
+
* (NF-e sem QR Code, emissão normal, versão 2). Vale também para a NF-e com DANFE Simplificado Tipo 2 em contingência
|
|
1491
|
+
* off-line (NT 2026.002).
|
|
1460
1492
|
*/
|
|
1461
1493
|
export async function assinaturaQrCode(nota: NfeMontada, assinador: Assinador): Promise<string | undefined> {
|
|
1462
1494
|
return nota.nfce?.assinar === true ? assinarParametros(nota.nfce.parametros, assinador) : undefined;
|
|
1463
1495
|
}
|
|
1464
1496
|
|
|
1465
1497
|
/**
|
|
1466
|
-
* A NFC-e montada com o `infNFeSupl` (QR Code e `urlChave`) inserido por splice antes do fechamento de `NFe`, pronta
|
|
1498
|
+
* A NFC-e, ou a NF-e com DANFE Simplificado Tipo 2 (tpImp 6, NT 2026.002), montada com o `infNFeSupl` (QR Code e `urlChave`) inserido por splice antes do fechamento de `NFe`, pronta
|
|
1467
1499
|
* para a assinatura. Na versão 3 em contingência off-line, informe a `assinatura` (`assinaturaQrCode`); nos demais
|
|
1468
1500
|
* casos ela não existe (ZX02-330, rejeição 445; ZX02-334, rejeição 474). Para assinar em três fases (A3, HSM), passe
|
|
1469
|
-
* este texto ao `prepararAssinatura` do `@sinete/core/xml` com o `id` da nota. Na NF-e
|
|
1470
|
-
* veio: ela não tem `infNFeSupl
|
|
1501
|
+
* este texto ao `prepararAssinatura` do `@sinete/core/xml` com o `id` da nota. Na NF-e com outro tpImp, devolve o XML como
|
|
1502
|
+
* veio: ela não tem `infNFeSupl`.
|
|
1471
1503
|
*/
|
|
1472
1504
|
export function comQrCode(nota: NfeMontada, assinatura?: string): string {
|
|
1473
1505
|
const xml = inserirSupl(nota, assinatura);
|
|
1474
1506
|
// Com a assinatura verdadeira, o qrCode pode passar do tamanho que a montagem conferiu (chave maior que 2048 bits).
|
|
1475
1507
|
if (assinatura !== undefined) {
|
|
1476
1508
|
const issues = conferirSupl(xml);
|
|
1477
|
-
if (issues.length > 0) throw new ErroDeValidacao('o QR Code
|
|
1509
|
+
if (issues.length > 0) throw new ErroDeValidacao('o QR Code não passou no schema', issues);
|
|
1478
1510
|
}
|
|
1479
1511
|
return xml;
|
|
1480
1512
|
}
|
|
@@ -1482,19 +1514,20 @@ export function comQrCode(nota: NfeMontada, assinatura?: string): string {
|
|
|
1482
1514
|
function inserirSupl(built: NfeMontada, assinatura: string | undefined): string {
|
|
1483
1515
|
const s = built.nfce;
|
|
1484
1516
|
if (s === undefined) {
|
|
1485
|
-
if (assinatura !== undefined)
|
|
1517
|
+
if (assinatura !== undefined)
|
|
1518
|
+
throw new ErroDeConfiguracao('esta NF-e não tem QR Code: só a NF-e com DANFE Simplificado Tipo 2 (tpImp 6) leva');
|
|
1486
1519
|
return built.xml;
|
|
1487
1520
|
}
|
|
1488
1521
|
if (s.assinar && assinatura === undefined) {
|
|
1489
1522
|
throw new ErroDeConfiguracao(
|
|
1490
|
-
'
|
|
1523
|
+
'contingência off-line com QR Code versão 3 precisa da assinatura (ZX02-334, rejeição 474)',
|
|
1491
1524
|
);
|
|
1492
1525
|
}
|
|
1493
1526
|
if (!s.assinar && assinatura !== undefined) {
|
|
1494
1527
|
throw new ErroDeConfiguracao('este QR Code não leva assinatura (ZX02-330, rejeição 445)');
|
|
1495
1528
|
}
|
|
1496
1529
|
const fim = '</NFe>';
|
|
1497
|
-
if (!built.xml.endsWith(fim)) throw new ErroDeConfiguracao('
|
|
1530
|
+
if (!built.xml.endsWith(fim)) throw new ErroDeConfiguracao('nota montada fora da forma esperada');
|
|
1498
1531
|
const qrCode = `${s.base}${s.parametros}${assinatura === undefined ? '' : `|${assinatura}`}`;
|
|
1499
1532
|
const supl = `<infNFeSupl><qrCode>${escapeXml(qrCode)}</qrCode><urlChave>${escapeXml(s.urlChave)}</urlChave></infNFeSupl>`;
|
|
1500
1533
|
return built.xml.slice(0, -fim.length) + supl + fim;
|
package/src/build/nfce.ts
CHANGED
|
@@ -180,6 +180,8 @@ const TPAG_VEDADOS: Readonly<Record<string, string>> = {
|
|
|
180
180
|
|
|
181
181
|
/** Identificação já resolvida pelo montador (com os padrões aplicados). */
|
|
182
182
|
export interface IdeNfce {
|
|
183
|
+
/** 65 é a NFC-e; 55, a NF-e com DANFE Simplificado Tipo 2 (tpImp 6), que a NT 2026.002 põe sob parte destas regras. */
|
|
184
|
+
readonly mod: '55' | '65';
|
|
183
185
|
readonly tpNF: string;
|
|
184
186
|
readonly idDest: string;
|
|
185
187
|
readonly tpImp: string;
|
|
@@ -191,21 +193,29 @@ export interface IdeNfce {
|
|
|
191
193
|
/**
|
|
192
194
|
* Regras da NFC-e sobre a entrada (origem `entrada`, ADR 0011), todas de aplicação obrigatória. Grupos que a NFC-e
|
|
193
195
|
* não tem saem como `grupo_vedado` no caminho da entrada.
|
|
196
|
+
*
|
|
197
|
+
* A NT 2026.002 v1.11 (homologação em 01/07/2026, produção em 03/08/2026) estende parte delas à NF-e com DANFE
|
|
198
|
+
* Simplificado Tipo 2 (`mod` 55, `tpImp` 6): as que a NT escreve "Se NFC-e ou NF-e com DANFE Simplificado Tipo 2". As
|
|
199
|
+
* que ela não cita (data de previsão de entrega, tpImp 4 e 5, cMunFGIBS, compra governamental, o destinatário fora da
|
|
200
|
+
* E01-20, ISSQN, transportador, pagamento e exportação) seguem só da NFC-e (`soNfce`). A G01-10 (local de entrega,
|
|
201
|
+
* 670) fica de fora: a NT a marca como implementação futura.
|
|
194
202
|
*/
|
|
195
203
|
export function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): void {
|
|
196
|
-
const
|
|
197
|
-
const
|
|
204
|
+
const soNfce = ide.mod === '65';
|
|
205
|
+
const doc = soNfce ? 'NFC-e' : 'NF-e com DANFE Simplificado Tipo 2';
|
|
206
|
+
const vedado = (path: string, msg: string): void => issues.add(path, 'grupo_vedado', `${doc} ${msg}`);
|
|
207
|
+
const invalido = (path: string, msg: string): void => issues.add(path, 'campo_invalido', `${doc} ${msg}`);
|
|
198
208
|
|
|
199
209
|
// B. Identificação
|
|
200
210
|
if (input.dhSaiEnt !== undefined) vedado('dhSaiEnt', 'sem data de entrada ou saída (B10-10, rejeição 705)');
|
|
201
|
-
if (input.dPrevEntrega !== undefined) {
|
|
211
|
+
if (soNfce && input.dPrevEntrega !== undefined) {
|
|
202
212
|
vedado('dPrevEntrega', 'sem data de previsão de entrega (NT 2025.002, B10a-10, rejeição 1153)');
|
|
203
213
|
}
|
|
204
214
|
if (ide.tpNF !== '1') invalido('tpNF', 'só de saída, tpNF 1 (B11-10, rejeição 706)');
|
|
205
215
|
if (ide.idDest !== '1') {
|
|
206
216
|
invalido('idDest', 'só em operação interna, idDest 1 (B11a-10, rejeição 707)');
|
|
207
217
|
}
|
|
208
|
-
if (ide.tpImp !== '4' && ide.tpImp !== '5') {
|
|
218
|
+
if (soNfce && ide.tpImp !== '4' && ide.tpImp !== '5') {
|
|
209
219
|
invalido('tpImp', 'com DANFC-e: tpImp 4 (impresso) ou 5 (mensagem eletrônica) (B21-10, rejeição 709)');
|
|
210
220
|
}
|
|
211
221
|
if (ide.finNFe !== '1') invalido('finNFe', 'só com finalidade normal, finNFe 1 (B25-20, rejeição 715)');
|
|
@@ -213,13 +223,13 @@ export function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): voi
|
|
|
213
223
|
if (!['1', '4', '5'].includes(ide.indPres)) {
|
|
214
224
|
invalido('indPres', 'só presencial: indPres 1, 4 (entrega a domicílio) ou 5 (NT 2025.002, B25b-20, rejeição 717)');
|
|
215
225
|
}
|
|
216
|
-
if (input.cMunFGIBS !== undefined && ide.indPres !== '5') {
|
|
226
|
+
if (soNfce && input.cMunFGIBS !== undefined && ide.indPres !== '5') {
|
|
217
227
|
invalido(
|
|
218
228
|
'cMunFGIBS',
|
|
219
229
|
'com cMunFGIBS só em operação presencial fora do estabelecimento, indPres 5 (NT 2025.002, B25b-60, rejeição 1000)',
|
|
220
230
|
);
|
|
221
231
|
}
|
|
222
|
-
if (input.cMunFGIBS === undefined && ide.indPres === '5') {
|
|
232
|
+
if (soNfce && input.cMunFGIBS === undefined && ide.indPres === '5') {
|
|
223
233
|
issues.add(
|
|
224
234
|
'cMunFGIBS',
|
|
225
235
|
'campo_obrigatorio',
|
|
@@ -229,7 +239,7 @@ export function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): voi
|
|
|
229
239
|
if (input.referenciadas !== undefined && input.referenciadas.length > 0) {
|
|
230
240
|
vedado('referenciadas', 'não referencia documento fiscal (BA01-10, rejeição 708)');
|
|
231
241
|
}
|
|
232
|
-
if (input.gCompraGov !== undefined)
|
|
242
|
+
if (soNfce && input.gCompraGov !== undefined)
|
|
233
243
|
vedado('gCompraGov', 'sem compra governamental (NT 2025.002, BB01-10, rejeição 1006)');
|
|
234
244
|
|
|
235
245
|
// C. Emitente
|
|
@@ -242,17 +252,19 @@ export function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): voi
|
|
|
242
252
|
issues.add(
|
|
243
253
|
'destinatario',
|
|
244
254
|
'campo_obrigatorio',
|
|
245
|
-
|
|
255
|
+
`${doc} com entrega a domicílio identifica o destinatário (E01-20, rejeição 787)`,
|
|
246
256
|
);
|
|
247
257
|
}
|
|
248
|
-
|
|
258
|
+
// F01-10 (669): sem local de retirada.
|
|
259
|
+
if (input.retirada !== undefined) vedado('retirada', 'sem local de retirada (F01-10, rejeição 669)');
|
|
260
|
+
if (soNfce && ide.indPres === '4' && d !== undefined && d.endereco === undefined) {
|
|
249
261
|
issues.add(
|
|
250
262
|
'destinatario.endereco',
|
|
251
263
|
'campo_obrigatorio',
|
|
252
264
|
'NFC-e com entrega a domicílio informa o endereço do destinatário (E05-20, rejeição 788)',
|
|
253
265
|
);
|
|
254
266
|
}
|
|
255
|
-
if (d !== undefined) {
|
|
267
|
+
if (soNfce && d !== undefined) {
|
|
256
268
|
if (d.CNPJ !== undefined && input.emitente.CNPJ !== undefined && digitos(d.CNPJ) === digitos(input.emitente.CNPJ)) {
|
|
257
269
|
invalido('destinatario.CNPJ', 'com destinatário igual ao emitente (E02-20, rejeição 220)');
|
|
258
270
|
}
|
|
@@ -271,7 +283,10 @@ export function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): voi
|
|
|
271
283
|
if (esp.arma !== undefined) vedado(`${p}.produto.especifico.arma`, 'sem armamento (L01-10, rejeição 738)');
|
|
272
284
|
if (esp.nRECOPI !== undefined)
|
|
273
285
|
vedado(`${p}.produto.especifico.nRECOPI`, 'sem papel imune RECOPI (LB01-10, rejeição 348)');
|
|
274
|
-
if (it.produto.
|
|
286
|
+
if (it.produto.indTot === '0') {
|
|
287
|
+
invalido(`${p}.produto.indTot`, 'sem item fora do total, indTot 1 (I17b-10, rejeição 774)');
|
|
288
|
+
}
|
|
289
|
+
if (soNfce && it.produto.tpCredPresIBSZFM !== undefined) {
|
|
275
290
|
vedado(
|
|
276
291
|
`${p}.produto.tpCredPresIBSZFM`,
|
|
277
292
|
'sem classificação para subapuração do IBS na ZFM (NT 2025.002, I05k-10, rejeição 1165)',
|
|
@@ -279,14 +294,14 @@ export function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): voi
|
|
|
279
294
|
}
|
|
280
295
|
const cfop = it.produto.CFOP.replace(/\D/g, '');
|
|
281
296
|
const imp = it.impostos;
|
|
282
|
-
if (cfop === CFOP_ISSQN && imp.issqn === undefined) {
|
|
297
|
+
if (soNfce && cfop === CFOP_ISSQN && imp.issqn === undefined) {
|
|
283
298
|
issues.add(
|
|
284
299
|
`${p}.impostos.issqn`,
|
|
285
300
|
'combinacao_invalida',
|
|
286
301
|
'NFC-e com CFOP 5.933 tem o grupo do ISSQN (I08-160, rejeição 374)',
|
|
287
302
|
);
|
|
288
303
|
}
|
|
289
|
-
if (cfop !== CFOP_ISSQN && imp.issqn !== undefined) {
|
|
304
|
+
if (soNfce && cfop !== CFOP_ISSQN && imp.issqn !== undefined) {
|
|
290
305
|
issues.add(
|
|
291
306
|
`${p}.produto.CFOP`,
|
|
292
307
|
'combinacao_invalida',
|
|
@@ -314,10 +329,10 @@ export function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): voi
|
|
|
314
329
|
if (tr !== undefined && tr.modFrete !== '9' && !entrega) {
|
|
315
330
|
invalido('transporte.modFrete', 'sem frete fora da entrega a domicílio: modFrete 9 (X02-10, rejeição 753)');
|
|
316
331
|
}
|
|
317
|
-
if (tr?.transportador !== undefined && !entrega) {
|
|
332
|
+
if (soNfce && tr?.transportador !== undefined && !entrega) {
|
|
318
333
|
vedado('transporte.transportador', 'só tem transportador na entrega a domicílio (X03-10, rejeição 754)');
|
|
319
334
|
}
|
|
320
|
-
if (entrega && tr?.transportador === undefined) {
|
|
335
|
+
if (soNfce && entrega && tr?.transportador === undefined) {
|
|
321
336
|
issues.add(
|
|
322
337
|
'transporte.transportador',
|
|
323
338
|
'campo_obrigatorio',
|
|
@@ -331,6 +346,17 @@ export function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): voi
|
|
|
331
346
|
|
|
332
347
|
// Y e YA. Cobrança e pagamento
|
|
333
348
|
if (input.cobranca !== undefined) vedado('cobranca', 'sem fatura nem duplicata (Y01-10, rejeição 760)');
|
|
349
|
+
// O pagamento é só da NFC-e: a NT 2026.002 não estende as regras do grupo YA à Tipo 2.
|
|
350
|
+
if (soNfce) conferirPagamentoNfce(input, issues);
|
|
351
|
+
|
|
352
|
+
// Z. Grupos que a NFC-e não tem
|
|
353
|
+
if (soNfce && input.exporta !== undefined) vedado('exporta', 'sem comércio exterior (ZA01-30, rejeição 814)');
|
|
354
|
+
if (input.compra !== undefined) vedado('compra', 'sem dados de compra (ZB01-10, rejeição 762)');
|
|
355
|
+
if (input.cana !== undefined) vedado('cana', 'sem aquisição de cana (ZC01-10, rejeição 763)');
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/** Pagamento informado na NFC-e: obrigatório, sem os meios vedados e com o grupo do cartão quando pede. */
|
|
359
|
+
function conferirPagamentoNfce(input: DadosNfe, issues: Issues): void {
|
|
334
360
|
if (input.pagamento === undefined || input.pagamento.detPag.length === 0) {
|
|
335
361
|
issues.add(
|
|
336
362
|
'pagamento',
|
|
@@ -351,11 +377,6 @@ export function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): voi
|
|
|
351
377
|
}
|
|
352
378
|
});
|
|
353
379
|
}
|
|
354
|
-
|
|
355
|
-
// Z. Grupos que a NFC-e não tem
|
|
356
|
-
if (input.exporta !== undefined) vedado('exporta', 'sem comércio exterior (ZA01-30, rejeição 814)');
|
|
357
|
-
if (input.compra !== undefined) vedado('compra', 'sem dados de compra (ZB01-10, rejeição 762)');
|
|
358
|
-
if (input.cana !== undefined) vedado('cana', 'sem aquisição de cana (ZC01-10, rejeição 763)');
|
|
359
380
|
}
|
|
360
381
|
|
|
361
382
|
/** O `pag` montado, na forma que as regras de pagamento leem e completam. */
|