@sinete/nfe 0.4.0 → 0.5.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/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 +163 -163
- package/dist/index.js.map +8 -8
- 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 +42 -18
- 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.5.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.0",
|
|
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.3.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) {
|
|
@@ -748,11 +751,11 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
748
751
|
if (cont.dhCont.getTime() > agora.getTime()) {
|
|
749
752
|
issues.add('contingencia.dhCont', 'contingencia_invalida', 'entrada em contingência posterior à emissão');
|
|
750
753
|
}
|
|
751
|
-
if (!nfce && tpEmis === '9') {
|
|
754
|
+
if (!nfce && tpEmis === '9' && (entrada.tpImp ?? '1') !== '6') {
|
|
752
755
|
issues.add(
|
|
753
756
|
'contingencia.tpEmis',
|
|
754
757
|
'contingencia_invalida',
|
|
755
|
-
'contingência off-line (tpEmis 9) é
|
|
758
|
+
'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
759
|
);
|
|
757
760
|
}
|
|
758
761
|
if (nfce && (tpEmis === '6' || tpEmis === '7')) {
|
|
@@ -797,7 +800,17 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
797
800
|
} else if (tpImp === '4' || tpImp === '5') {
|
|
798
801
|
issues.add('tpImp', 'campo_invalido', 'tpImp 4 e 5 (DANFC-e) são da NFC-e (B21-20, rejeição 710)');
|
|
799
802
|
}
|
|
803
|
+
// 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
|
|
804
|
+
// (ZX02-220, rejeição 672) e com a URL da NFC-e da UF (ZX02-20, observação 3).
|
|
805
|
+
const comQr = nfce || tpImp === '6';
|
|
800
806
|
const qr: QrCodeNfceOpcoes = opcoes.qrCode ?? { versao: '3' };
|
|
807
|
+
if (!nfce && comQr && qr.versao === '2') {
|
|
808
|
+
issues.montagem(
|
|
809
|
+
'qrCode.versao',
|
|
810
|
+
'qrcode_invalido',
|
|
811
|
+
'a NF-e com DANFE Simplificado Tipo 2 usa só o QR Code versão 3 (ZX02-220, rejeição 672)',
|
|
812
|
+
);
|
|
813
|
+
}
|
|
801
814
|
if (nfce && qr.versao === '2') {
|
|
802
815
|
// 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
816
|
if (!/^\d{1,6}$/.test(qr.idCSC) || Number(qr.idCSC) === 0) {
|
|
@@ -844,7 +857,8 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
844
857
|
if (entrada.itens.length === 0 || entrada.itens.length > 990) {
|
|
845
858
|
issues.add('itens', 'itens_limite', 'a NF-e tem de 1 a 990 itens');
|
|
846
859
|
}
|
|
847
|
-
const
|
|
860
|
+
const semIe = !nfce && entrada.emitente.IE === undefined;
|
|
861
|
+
const itens = entrada.itens.map((it, n) => montarItem(ctx, it, n, finNFeIn === '1', semIe));
|
|
848
862
|
// Na NFC-e em homologação, a descrição do primeiro item é a literal da RV I04-10, como o nome do destinatário da
|
|
849
863
|
// E04-20: o builder a põe, e a descrição informada fica fora do XML de teste.
|
|
850
864
|
const primeiro = itens[0];
|
|
@@ -977,6 +991,9 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
977
991
|
const substituidos =
|
|
978
992
|
opcoes.ambiente === 'homologacao' ? ['destinatario.xNome', ...(nfce ? ['itens[0].produto.xProd'] : [])] : [];
|
|
979
993
|
conferirTextosDaEntrada(entrada, pl.infNFe as ComplexType, issues, new Set(substituidos));
|
|
994
|
+
// Nota sem IE do emitente (NT 2026.007, ADR 0012): conferida antes de parar nas ocorrências dos itens, para todas as
|
|
995
|
+
// violações voltarem juntas.
|
|
996
|
+
exclusivoIbsCbs(entrada, { nfce, dhEmi, instantes: [agora, fatoGerador] }, issues);
|
|
980
997
|
if (!issues.empty) return { ok: false, ocorrencias: issues.classificadas };
|
|
981
998
|
|
|
982
999
|
// Totais (grupo W)
|
|
@@ -1341,6 +1358,10 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
1341
1358
|
|
|
1342
1359
|
// Regras da SEFAZ que só dependem do documento (ADR 0012).
|
|
1343
1360
|
cstComIsento(entrada, idDest, issues);
|
|
1361
|
+
if (!nfce) {
|
|
1362
|
+
cfopDeDevolucao(entrada, issues);
|
|
1363
|
+
cstComNaoContribuinte(entrada, { idDest, uf: emitUf }, issues);
|
|
1364
|
+
}
|
|
1344
1365
|
vencimentos(entrada, { dhEmi, instante: agora }, issues);
|
|
1345
1366
|
|
|
1346
1367
|
camposForaDoPl(pl.infNFe, inf, 'infNFe', pl.vigencia.pl, issues);
|
|
@@ -1375,8 +1396,9 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
1375
1396
|
};
|
|
1376
1397
|
}
|
|
1377
1398
|
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
|
|
1399
|
+
if (comQr) {
|
|
1400
|
+
// 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
|
|
1401
|
+
// de Brasília, também na NF-e Tipo 2.
|
|
1380
1402
|
const tabela = urlsNfce(emitUf, opcoes.ambiente, diaBrasilia(agora));
|
|
1381
1403
|
const urlQr = opcoes.urlQrCode ?? tabela.qrCode;
|
|
1382
1404
|
const urlChave = opcoes.urlChave ?? tabela.urlChave;
|
|
@@ -1456,25 +1478,26 @@ const escapeXml = (s: string): string => s.replace(/&/g, '&').replace(/</g,
|
|
|
1456
1478
|
/**
|
|
1457
1479
|
* 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
1480
|
* 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).
|
|
1481
|
+
* (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
|
|
1482
|
+
* off-line (NT 2026.002).
|
|
1460
1483
|
*/
|
|
1461
1484
|
export async function assinaturaQrCode(nota: NfeMontada, assinador: Assinador): Promise<string | undefined> {
|
|
1462
1485
|
return nota.nfce?.assinar === true ? assinarParametros(nota.nfce.parametros, assinador) : undefined;
|
|
1463
1486
|
}
|
|
1464
1487
|
|
|
1465
1488
|
/**
|
|
1466
|
-
* A NFC-e montada com o `infNFeSupl` (QR Code e `urlChave`) inserido por splice antes do fechamento de `NFe`, pronta
|
|
1489
|
+
* 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
1490
|
* para a assinatura. Na versão 3 em contingência off-line, informe a `assinatura` (`assinaturaQrCode`); nos demais
|
|
1468
1491
|
* 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
|
|
1492
|
+
* este texto ao `prepararAssinatura` do `@sinete/core/xml` com o `id` da nota. Na NF-e com outro tpImp, devolve o XML como
|
|
1493
|
+
* veio: ela não tem `infNFeSupl`.
|
|
1471
1494
|
*/
|
|
1472
1495
|
export function comQrCode(nota: NfeMontada, assinatura?: string): string {
|
|
1473
1496
|
const xml = inserirSupl(nota, assinatura);
|
|
1474
1497
|
// Com a assinatura verdadeira, o qrCode pode passar do tamanho que a montagem conferiu (chave maior que 2048 bits).
|
|
1475
1498
|
if (assinatura !== undefined) {
|
|
1476
1499
|
const issues = conferirSupl(xml);
|
|
1477
|
-
if (issues.length > 0) throw new ErroDeValidacao('o QR Code
|
|
1500
|
+
if (issues.length > 0) throw new ErroDeValidacao('o QR Code não passou no schema', issues);
|
|
1478
1501
|
}
|
|
1479
1502
|
return xml;
|
|
1480
1503
|
}
|
|
@@ -1482,19 +1505,20 @@ export function comQrCode(nota: NfeMontada, assinatura?: string): string {
|
|
|
1482
1505
|
function inserirSupl(built: NfeMontada, assinatura: string | undefined): string {
|
|
1483
1506
|
const s = built.nfce;
|
|
1484
1507
|
if (s === undefined) {
|
|
1485
|
-
if (assinatura !== undefined)
|
|
1508
|
+
if (assinatura !== undefined)
|
|
1509
|
+
throw new ErroDeConfiguracao('esta NF-e não tem QR Code: só a NF-e com DANFE Simplificado Tipo 2 (tpImp 6) leva');
|
|
1486
1510
|
return built.xml;
|
|
1487
1511
|
}
|
|
1488
1512
|
if (s.assinar && assinatura === undefined) {
|
|
1489
1513
|
throw new ErroDeConfiguracao(
|
|
1490
|
-
'
|
|
1514
|
+
'contingência off-line com QR Code versão 3 precisa da assinatura (ZX02-334, rejeição 474)',
|
|
1491
1515
|
);
|
|
1492
1516
|
}
|
|
1493
1517
|
if (!s.assinar && assinatura !== undefined) {
|
|
1494
1518
|
throw new ErroDeConfiguracao('este QR Code não leva assinatura (ZX02-330, rejeição 445)');
|
|
1495
1519
|
}
|
|
1496
1520
|
const fim = '</NFe>';
|
|
1497
|
-
if (!built.xml.endsWith(fim)) throw new ErroDeConfiguracao('
|
|
1521
|
+
if (!built.xml.endsWith(fim)) throw new ErroDeConfiguracao('nota montada fora da forma esperada');
|
|
1498
1522
|
const qrCode = `${s.base}${s.parametros}${assinatura === undefined ? '' : `|${assinatura}`}`;
|
|
1499
1523
|
const supl = `<infNFeSupl><qrCode>${escapeXml(qrCode)}</qrCode><urlChave>${escapeXml(s.urlChave)}</urlChave></infNFeSupl>`;
|
|
1500
1524
|
return built.xml.slice(0, -fim.length) + supl + fim;
|
package/src/build/rejeicoes.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import type { Ocorrencia } from '@sinete/core';
|
|
11
|
+
import { indicadoresCfop } from '@sinete/validators';
|
|
11
12
|
import type { Issues } from '../issues.ts';
|
|
12
13
|
import type { DadosNfe } from '../model.ts';
|
|
13
14
|
import type { Instante } from '../time.ts';
|
|
@@ -140,3 +141,184 @@ export function conferirEmitenteDoCertificado(
|
|
|
140
141
|
}
|
|
141
142
|
return [];
|
|
142
143
|
}
|
|
144
|
+
|
|
145
|
+
/** A RV C17-42 (NFC-e sem IE) "não se aplica a partir de 2033". */
|
|
146
|
+
const NFCE_SEM_IE_ATE = '2033-01-01';
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Contribuinte exclusivo do IBS/CBS: a nota sem `emitente.IE` (NT 2026.007 v1.10). Sai daqui o que a NT decide só com o
|
|
150
|
+
* documento:
|
|
151
|
+
*
|
|
152
|
+
* - NFC-e sem IE, rejeição 156 (RV C17-42), até o fim de 2032; a data é a da emissão e a do fato gerador, e a conferência
|
|
153
|
+
* só recusa quando todas as leituras (local, Brasília e UTC) caem antes de 2033;
|
|
154
|
+
* - NF-e sem IE e sem CNPJ do emitente (emitente CPF), 157 (C17-43);
|
|
155
|
+
* - NF-e sem IE com a IE do substituto tributário, 158 (C18-50);
|
|
156
|
+
* - item com ICMS ou ICMS interestadual (`icmsUfDest`) na NF-e sem IE, 161 (N01-10), menos na devolução (finNFe 4) e na
|
|
157
|
+
* nota de crédito de retorno por recusa ou não localização (tpNFCredito 03), as duas exceções da regra;
|
|
158
|
+
* - item sem `impostos.ibsCbs` (nem o grupo pronto nem a classificação para a calculadora) na NF-e sem IE, 162
|
|
159
|
+
* (UB12-11). O item classificado cujo cálculo falhou já tem a ocorrência da calculadora, de montagem.
|
|
160
|
+
*
|
|
161
|
+
* Ficam para a SEFAZ as regras da mesma NT que dependem de tabela ou cadastro: a 159 (tabela de CFOP do Portal), a 163 e
|
|
162
|
+
* a 164 (CCC), as de local de retirada e entrega (CCC) e as da LCC-RFB (178 a 187). A 166 e a 188 são do roteamento.
|
|
163
|
+
*/
|
|
164
|
+
export function exclusivoIbsCbs(
|
|
165
|
+
input: DadosNfe,
|
|
166
|
+
contexto: { readonly nfce: boolean; readonly dhEmi: string; readonly instantes: readonly Instante[] },
|
|
167
|
+
issues: Issues,
|
|
168
|
+
): void {
|
|
169
|
+
const e = input.emitente;
|
|
170
|
+
if (e.IE !== undefined) return;
|
|
171
|
+
if (contexto.nfce) {
|
|
172
|
+
const datas = [
|
|
173
|
+
contexto.dhEmi.slice(0, 10),
|
|
174
|
+
...contexto.instantes.flatMap((i) => [dataNoFuso(i, OFFSET_BRASILIA), dataNoFuso(i, 0)]),
|
|
175
|
+
];
|
|
176
|
+
if (datas.every((d) => d < NFCE_SEM_IE_ATE)) {
|
|
177
|
+
issues.add(
|
|
178
|
+
'emitente.IE',
|
|
179
|
+
'campo_obrigatorio',
|
|
180
|
+
'a NFC-e exige a IE do emitente: contribuinte exclusivo do IBS/CBS, sem IE, emite só NF-e (C17-42, rejeição 156)',
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (e.CNPJ === undefined) {
|
|
186
|
+
issues.add(
|
|
187
|
+
'emitente.CNPJ',
|
|
188
|
+
'campo_obrigatorio',
|
|
189
|
+
'NF-e sem IE do emitente (contribuinte exclusivo do IBS/CBS) exige o CNPJ do emitente (C17-43, rejeição 157)',
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
if (e.IEST !== undefined) {
|
|
193
|
+
issues.add(
|
|
194
|
+
'emitente.IEST',
|
|
195
|
+
'combinacao_invalida',
|
|
196
|
+
'NF-e sem IE do emitente (contribuinte exclusivo do IBS/CBS) não leva a IE do substituto tributário (C18-50, rejeição 158)',
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
const icmsLiberado = (input.finNFe ?? '1') === '4' || input.tpNFCredito === '03';
|
|
200
|
+
input.itens.forEach((it, n) => {
|
|
201
|
+
if (!icmsLiberado) {
|
|
202
|
+
for (const [campo, grupo] of [
|
|
203
|
+
['icms', it.impostos.icms],
|
|
204
|
+
['icmsUfDest', it.impostos.icmsUfDest],
|
|
205
|
+
] as const) {
|
|
206
|
+
if (grupo === undefined) continue;
|
|
207
|
+
issues.add(
|
|
208
|
+
`itens[${n}].impostos.${campo}`,
|
|
209
|
+
'grupo_vedado',
|
|
210
|
+
'NF-e sem IE do emitente (contribuinte exclusivo do IBS/CBS) não leva ICMS no item (N01-10, rejeição 161)',
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (it.impostos.ibsCbs === undefined) {
|
|
215
|
+
issues.add(
|
|
216
|
+
`itens[${n}].impostos.ibsCbs`,
|
|
217
|
+
'campo_obrigatorio',
|
|
218
|
+
'NF-e sem IE do emitente (contribuinte exclusivo do IBS/CBS) exige o grupo IBS/CBS em todo item (UB12-11, rejeição 162)',
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** Nota de crédito que aceita CFOP de devolução (NT 2025.002 v1.52, RV I08-144, exceção): 03, 04 e 06. */
|
|
225
|
+
const CREDITO_COM_DEVOLUCAO: ReadonlySet<string> = new Set(['03', '04', '06']);
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* CFOP de devolução (Tabela CFOP, `indDevol`) em NF-e que não é de devolução nem complementar: rejeição 328 (MOC 7.0
|
|
229
|
+
* Anexo I, RV I08-144, obrigatória no modelo 55; NT 2025.002 v1.52, que exclui a nota de crédito 03, 04 e 06). CFOP
|
|
230
|
+
* fora da tabela versionada não é recusado.
|
|
231
|
+
*/
|
|
232
|
+
export function cfopDeDevolucao(input: DadosNfe, issues: Issues): void {
|
|
233
|
+
const fin = input.finNFe ?? '1';
|
|
234
|
+
if (fin === '2' || fin === '4') return;
|
|
235
|
+
if (fin === '5' && input.tpNFCredito !== undefined && CREDITO_COM_DEVOLUCAO.has(input.tpNFCredito)) return;
|
|
236
|
+
input.itens.forEach((it, n) => {
|
|
237
|
+
if (indicadoresCfop(it.produto.CFOP.replace(/\D/g, ''))?.indDevol !== true) return;
|
|
238
|
+
issues.add(
|
|
239
|
+
`itens[${n}].produto.CFOP`,
|
|
240
|
+
'combinacao_invalida',
|
|
241
|
+
`CFOP ${it.produto.CFOP} é de devolução e a nota não é de devolução (finNFe ${fin}) (I08-144, rejeição 328)`,
|
|
242
|
+
);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** CST aceitos com destinatário não contribuinte (RV N12-70; o 61 entrou pela NT 2023.001). */
|
|
247
|
+
const CST_NAO_CONTRIBUINTE: ReadonlySet<string> = new Set(['00', '20', '40', '41', '60', '61']);
|
|
248
|
+
|
|
249
|
+
/** Códigos ANP que a exceção 5 da N12-70 deixa de fora (não derivados de petróleo). */
|
|
250
|
+
const ANP_FORA_DA_EXCECAO_5: ReadonlySet<string> = new Set([
|
|
251
|
+
'820101001',
|
|
252
|
+
'820101010',
|
|
253
|
+
'810102001',
|
|
254
|
+
'810102004',
|
|
255
|
+
'810102002',
|
|
256
|
+
'810102003',
|
|
257
|
+
'810101002',
|
|
258
|
+
'810101001',
|
|
259
|
+
'810101003',
|
|
260
|
+
'220101003',
|
|
261
|
+
'220101004',
|
|
262
|
+
'220101002',
|
|
263
|
+
'220101001',
|
|
264
|
+
'220101005',
|
|
265
|
+
'220101006',
|
|
266
|
+
'560101001',
|
|
267
|
+
]);
|
|
268
|
+
|
|
269
|
+
/** CFOP da exceção 7 da N12-70 (CST 51 em qualquer operação). */
|
|
270
|
+
const CFOP_CST51: ReadonlySet<string> = new Set(['5123', '5922', '6123', '6922']);
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* CST fora de 00, 20, 40, 41, 60 e 61 com destinatário não contribuinte (indIEDest 9): rejeição 508 (MOC 7.0 Anexo I,
|
|
274
|
+
* RV N12-70, obrigatória no modelo 55, no texto da NT 2023.001 v1.60 e da NT 2023.003 v1.40). Só o CST: a regra não
|
|
275
|
+
* fala do CSOSN. Ficam de fora todas as exceções:
|
|
276
|
+
*
|
|
277
|
+
* 1. NF-e de entrada; 3. nota com veículo novo (`veicProd`) em algum item; 6. CST 50 e 51 na devolução;
|
|
278
|
+
* 2. CST 50 com CFOP de retorno ou remessa (Tabela CFOP, `indRetor`, `indRemes`) ou 5949 e 6949, e com CFOP fora da
|
|
279
|
+
* tabela versionada, que a conferência não sabe classificar;
|
|
280
|
+
* 5. CST 30 interestadual com combustível derivado de petróleo; 9. CST 30 interestadual com energia elétrica (NCM
|
|
281
|
+
* 27160000);
|
|
282
|
+
* 7. CST 51 com CFOP 5123, 5922, 6123 e 6922, e em qualquer operação interna: a NT 2023.001 diz "operações internas" e
|
|
283
|
+
* a NT 2023.003 restringe ao retorno de depósito (5906 e 5907), e a conferência recusa só o que as duas recusam;
|
|
284
|
+
* 8. CST 10 e 02 em operação interna, a critério da UF; e o CST 90 com CFOP 5403 ou 5405 no CE (observação da NT
|
|
285
|
+
* 2023.003), também a critério da UF.
|
|
286
|
+
*
|
|
287
|
+
* A exceção 4 (emissão antes de 01/07/2016) não alcança nota montada agora.
|
|
288
|
+
*/
|
|
289
|
+
export function cstComNaoContribuinte(
|
|
290
|
+
input: DadosNfe,
|
|
291
|
+
contexto: { readonly idDest: string; readonly uf: string },
|
|
292
|
+
issues: Issues,
|
|
293
|
+
): void {
|
|
294
|
+
if (input.destinatario?.indIEDest !== '9' || input.tpNF === '0') return;
|
|
295
|
+
if (input.itens.some((it) => it.produto.especifico !== undefined && 'veicProd' in it.produto.especifico)) return;
|
|
296
|
+
const fin = input.finNFe ?? '1';
|
|
297
|
+
const interna = contexto.idDest === '1';
|
|
298
|
+
const interestadual = contexto.idDest === '2';
|
|
299
|
+
input.itens.forEach((it, n) => {
|
|
300
|
+
const icms = it.impostos.icms;
|
|
301
|
+
if (icms === undefined || !('CST' in icms)) return;
|
|
302
|
+
const cst = icms.CST;
|
|
303
|
+
if (CST_NAO_CONTRIBUINTE.has(cst)) return;
|
|
304
|
+
const cfop = it.produto.CFOP.replace(/\D/g, '');
|
|
305
|
+
const esp = it.produto.especifico;
|
|
306
|
+
if ((cst === '50' || cst === '51') && fin === '4') return;
|
|
307
|
+
if (cst === '50') {
|
|
308
|
+
const ind = indicadoresCfop(cfop);
|
|
309
|
+
if (ind === undefined || ind.indRetor || ind.indRemes || cfop === '5949' || cfop === '6949') return;
|
|
310
|
+
}
|
|
311
|
+
if (cst === '51' && (CFOP_CST51.has(cfop) || interna)) return;
|
|
312
|
+
if ((cst === '10' || cst === '02') && interna) return;
|
|
313
|
+
if (cst === '30' && interestadual) {
|
|
314
|
+
if (esp !== undefined && 'comb' in esp && !ANP_FORA_DA_EXCECAO_5.has(esp.comb.cProdANP)) return;
|
|
315
|
+
if (it.produto.NCM.replace(/\D/g, '') === '27160000') return;
|
|
316
|
+
}
|
|
317
|
+
if (cst === '90' && contexto.uf === 'CE' && (cfop === '5403' || cfop === '5405')) return;
|
|
318
|
+
issues.add(
|
|
319
|
+
`itens[${n}].impostos.icms.CST`,
|
|
320
|
+
'combinacao_invalida',
|
|
321
|
+
`CST ${cst} não se usa com destinatário não contribuinte (indIEDest 9) (N12-70, rejeição 508)`,
|
|
322
|
+
);
|
|
323
|
+
});
|
|
324
|
+
}
|