@sinete/nfe 0.0.0 → 0.2.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/LICENSE +202 -0
- package/NOTICE +11 -0
- package/README.md +148 -1
- package/dist/build/build.d.ts +127 -0
- package/dist/build/build.d.ts.map +1 -0
- package/dist/build/destinatario.d.ts +19 -0
- package/dist/build/destinatario.d.ts.map +1 -0
- package/dist/build/ibscbs.d.ts +27 -0
- package/dist/build/ibscbs.d.ts.map +1 -0
- package/dist/build/icms.d.ts +42 -0
- package/dist/build/icms.d.ts.map +1 -0
- package/dist/build/nfce.d.ts +122 -0
- package/dist/build/nfce.d.ts.map +1 -0
- package/dist/build/pl.d.ts +19 -0
- package/dist/build/pl.d.ts.map +1 -0
- package/dist/build/rejeicoes.d.ts +52 -0
- package/dist/build/rejeicoes.d.ts.map +1 -0
- package/dist/build/tributos.d.ts +45 -0
- package/dist/build/tributos.d.ts.map +1 -0
- package/dist/build/values.d.ts +48 -0
- package/dist/build/values.d.ts.map +1 -0
- package/dist/decimal.d.ts +66 -0
- package/dist/decimal.d.ts.map +1 -0
- package/dist/format.d.ts +48 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/ibs-cbs.d.ts +14 -0
- package/dist/ibs-cbs.d.ts.map +1 -0
- package/dist/ibs-cbs.js +43 -0
- package/dist/ibs-cbs.js.map +10 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4399 -0
- package/dist/index.js.map +33 -0
- package/dist/issues.d.ts +24 -0
- package/dist/issues.d.ts.map +1 -0
- package/dist/model.d.ts +861 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/ports.d.ts +109 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/rotulo.d.ts +12 -0
- package/dist/rotulo.d.ts.map +1 -0
- package/dist/rtc.d.ts +65 -0
- package/dist/rtc.d.ts.map +1 -0
- package/dist/services/client.d.ts +277 -0
- package/dist/services/client.d.ts.map +1 -0
- package/dist/services/gzip.d.ts +7 -0
- package/dist/services/gzip.d.ts.map +1 -0
- package/dist/services/index.d.ts +14 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/outcome.d.ts +15 -0
- package/dist/services/outcome.d.ts.map +1 -0
- package/dist/services/proc.d.ts +41 -0
- package/dist/services/proc.d.ts.map +1 -0
- package/dist/services/recuperar.d.ts +28 -0
- package/dist/services/recuperar.d.ts.map +1 -0
- package/dist/services/resolver.d.ts +88 -0
- package/dist/services/resolver.d.ts.map +1 -0
- package/dist/services/soap.d.ts +43 -0
- package/dist/services/soap.d.ts.map +1 -0
- package/dist/time.d.ts +12 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/versao-gerada.d.ts +3 -0
- package/dist/versao-gerada.d.ts.map +1 -0
- package/package.json +58 -3
- package/src/build/build.ts +1503 -0
- package/src/build/destinatario.ts +212 -0
- package/src/build/ibscbs.ts +135 -0
- package/src/build/icms.ts +645 -0
- package/src/build/nfce.ts +425 -0
- package/src/build/pl.ts +73 -0
- package/src/build/rejeicoes.ts +142 -0
- package/src/build/tributos.ts +217 -0
- package/src/build/values.ts +126 -0
- package/src/data/arredondamento.json +30 -0
- package/src/data/cstat.json +36 -0
- package/src/data/fusos.json +17 -0
- package/src/data/nfce-urls.json +170 -0
- package/src/data/produtor-rural.json +17 -0
- package/src/data/reforma.json +6 -0
- package/src/data/resp-tec.json +13 -0
- package/src/data/servicos.json +44 -0
- package/src/data/suframa.json +7 -0
- package/src/decimal.ts +232 -0
- package/src/format.ts +65 -0
- package/src/ibs-cbs.ts +89 -0
- package/src/index.ts +155 -0
- package/src/issues.ts +80 -0
- package/src/model.ts +1033 -0
- package/src/ports.ts +96 -0
- package/src/rotulo.ts +137 -0
- package/src/rtc.ts +305 -0
- package/src/services/client.ts +1116 -0
- package/src/services/gzip.ts +26 -0
- package/src/services/index.ts +45 -0
- package/src/services/outcome.ts +50 -0
- package/src/services/proc.ts +165 -0
- package/src/services/recuperar.ts +93 -0
- package/src/services/resolver.ts +127 -0
- package/src/services/soap.ts +133 -0
- package/src/time.ts +23 -0
- package/src/versao-gerada.ts +3 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPI (O), II (P), PIS (Q, R), COFINS (S, T), ISSQN (U) e ICMS para a UF de destino (NA) do item.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
TIpi,
|
|
7
|
+
TNFe_infNFe_det_imposto_COFINS,
|
|
8
|
+
TNFe_infNFe_det_imposto_COFINSST,
|
|
9
|
+
TNFe_infNFe_det_imposto_ICMSUFDest,
|
|
10
|
+
TNFe_infNFe_det_imposto_II,
|
|
11
|
+
TNFe_infNFe_det_imposto_ISSQN,
|
|
12
|
+
TNFe_infNFe_det_imposto_PIS,
|
|
13
|
+
TNFe_infNFe_det_imposto_PISST,
|
|
14
|
+
} from '@sinete/schemas/nfe/PL_010f';
|
|
15
|
+
import type { DecimalInput } from '../decimal.ts';
|
|
16
|
+
import { Decimal } from '../decimal.ts';
|
|
17
|
+
import { D0302A04, D1104, D1104V, D1204, D1204V, D1302, D1302_OPC } from '../format.ts';
|
|
18
|
+
import type { IcmsUfDest, ImpostoImportacao, Ipi, Issqn, PisCofins, PisCofinsSt } from '../model.ts';
|
|
19
|
+
import type { Ctx } from './values.ts';
|
|
20
|
+
import { clean, digits } from './values.ts';
|
|
21
|
+
|
|
22
|
+
type Out = Record<string, string | undefined>;
|
|
23
|
+
|
|
24
|
+
/** IPI: por alíquota `vBC × pIPI` ou por unidade `qUnid × vUnid` (MOC O10 a O14; RV O14-10, nota *4). */
|
|
25
|
+
export function buildIpi(ctx: Ctx, input: Ipi, vOp: Decimal, path: string): { grupo: TIpi; vIPI: Decimal } {
|
|
26
|
+
const head: Out = {
|
|
27
|
+
CNPJProd: input.CNPJProd === undefined ? undefined : input.CNPJProd.replace(/[./-]/g, '').toUpperCase(),
|
|
28
|
+
cSelo: input.cSelo,
|
|
29
|
+
qSelo: input.qSelo,
|
|
30
|
+
cEnq: input.cEnq,
|
|
31
|
+
};
|
|
32
|
+
if (!['00', '49', '50', '99'].includes(input.CST)) {
|
|
33
|
+
return { grupo: { ...clean(head), IPINT: { CST: input.CST } } as unknown as TIpi, vIPI: Decimal.ZERO };
|
|
34
|
+
}
|
|
35
|
+
const i = input as {
|
|
36
|
+
CST: string;
|
|
37
|
+
vBC?: DecimalInput;
|
|
38
|
+
pIPI?: DecimalInput;
|
|
39
|
+
qUnid?: DecimalInput;
|
|
40
|
+
vUnid?: DecimalInput;
|
|
41
|
+
vIPI?: DecimalInput;
|
|
42
|
+
};
|
|
43
|
+
let trib: Out;
|
|
44
|
+
let vIPI: Decimal;
|
|
45
|
+
if (i.qUnid !== undefined || i.vUnid !== undefined) {
|
|
46
|
+
const qUnid = ctx.req(i.qUnid, `${path}.qUnid`, D1204V);
|
|
47
|
+
const vUnid = ctx.req(i.vUnid, `${path}.vUnid`, D1104);
|
|
48
|
+
vIPI = ctx.calc(i.vIPI, qUnid.times(vUnid), `${path}.vIPI`, D1302, 'ipi');
|
|
49
|
+
trib = { CST: i.CST, qUnid: ctx.s(qUnid, D1204V), vUnid: ctx.s(vUnid, D1104), vIPI: ctx.s(vIPI, D1302) };
|
|
50
|
+
} else {
|
|
51
|
+
const pIPI = ctx.req(i.pIPI, `${path}.pIPI`, D0302A04);
|
|
52
|
+
const vBC = ctx.base(i.vBC, vOp, `${path}.vBC`, D1302, 'ipi');
|
|
53
|
+
vIPI = ctx.calc(i.vIPI, vBC.percent(pIPI), `${path}.vIPI`, D1302, 'ipi');
|
|
54
|
+
trib = { CST: i.CST, vBC: ctx.s(vBC, D1302), pIPI: ctx.s(pIPI, D0302A04), vIPI: ctx.s(vIPI, D1302) };
|
|
55
|
+
}
|
|
56
|
+
return { grupo: { ...clean(head), IPITrib: clean(trib) } as unknown as TIpi, vIPI };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function buildIi(
|
|
60
|
+
ctx: Ctx,
|
|
61
|
+
input: ImpostoImportacao,
|
|
62
|
+
path: string,
|
|
63
|
+
): { grupo: TNFe_infNFe_det_imposto_II; vII: Decimal } {
|
|
64
|
+
const vII = ctx.req(input.vII, `${path}.vII`, D1302);
|
|
65
|
+
return {
|
|
66
|
+
grupo: {
|
|
67
|
+
vBC: ctx.s(ctx.req(input.vBC, `${path}.vBC`, D1302), D1302),
|
|
68
|
+
vDespAdu: ctx.s(ctx.req(input.vDespAdu, `${path}.vDespAdu`, D1302), D1302),
|
|
69
|
+
vII: ctx.s(vII, D1302),
|
|
70
|
+
vIOF: ctx.s(ctx.req(input.vIOF, `${path}.vIOF`, D1302), D1302),
|
|
71
|
+
},
|
|
72
|
+
vII,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* PIS ou COFINS (Q02 a Q05, S02 a S05): `valor = vBC × aliquota / 100` ou `qBCProd × vAliqProd` (RV Q09-10, S11-10,
|
|
78
|
+
* nota *4). `tag` escolhe os nomes do leiaute (`PIS`/`pPIS`/`vPIS` ou `COFINS`/`pCOFINS`/`vCOFINS`).
|
|
79
|
+
*/
|
|
80
|
+
export function buildPisCofins(
|
|
81
|
+
ctx: Ctx,
|
|
82
|
+
input: PisCofins,
|
|
83
|
+
tag: 'PIS' | 'COFINS',
|
|
84
|
+
path: string,
|
|
85
|
+
): { grupo: TNFe_infNFe_det_imposto_PIS | TNFe_infNFe_det_imposto_COFINS; valor: Decimal } {
|
|
86
|
+
const p = `p${tag}`;
|
|
87
|
+
const v = `v${tag}`;
|
|
88
|
+
const cst = input.CST;
|
|
89
|
+
if (!('vBC' in input) && !('qBCProd' in input)) {
|
|
90
|
+
return { grupo: { [`${tag}NT`]: { CST: cst } } as unknown as TNFe_infNFe_det_imposto_PIS, valor: Decimal.ZERO };
|
|
91
|
+
}
|
|
92
|
+
const i = input as {
|
|
93
|
+
CST: string;
|
|
94
|
+
vBC?: DecimalInput;
|
|
95
|
+
aliquota?: DecimalInput;
|
|
96
|
+
qBCProd?: DecimalInput;
|
|
97
|
+
vAliqProd?: DecimalInput;
|
|
98
|
+
valor?: DecimalInput;
|
|
99
|
+
};
|
|
100
|
+
let body: Out;
|
|
101
|
+
let valor: Decimal;
|
|
102
|
+
if (i.qBCProd !== undefined) {
|
|
103
|
+
const q = ctx.req(i.qBCProd, `${path}.qBCProd`, D1204V);
|
|
104
|
+
const a = ctx.req(i.vAliqProd, `${path}.vAliqProd`, D1104V);
|
|
105
|
+
valor = ctx.calc(i.valor, q.times(a), `${path}.valor`, D1302, 'pisCofins');
|
|
106
|
+
body = { CST: cst, qBCProd: ctx.s(q, D1204V), vAliqProd: ctx.s(a, D1104V), [v]: ctx.s(valor, D1302) };
|
|
107
|
+
} else {
|
|
108
|
+
const vBC = ctx.req(i.vBC, `${path}.vBC`, D1302);
|
|
109
|
+
const a = ctx.req(i.aliquota, `${path}.aliquota`, D0302A04);
|
|
110
|
+
valor = ctx.calc(i.valor, vBC.percent(a), `${path}.valor`, D1302, 'pisCofins');
|
|
111
|
+
body = { CST: cst, vBC: ctx.s(vBC, D1302), [p]: ctx.s(a, D0302A04), [v]: ctx.s(valor, D1302) };
|
|
112
|
+
}
|
|
113
|
+
const nome = cst === '01' || cst === '02' ? 'Aliq' : cst === '03' ? 'Qtde' : 'Outr';
|
|
114
|
+
return { grupo: { [`${tag}${nome}`]: body } as unknown as TNFe_infNFe_det_imposto_PIS, valor };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** PIS ST ou COFINS ST (R, T). */
|
|
118
|
+
export function buildPisCofinsSt(
|
|
119
|
+
ctx: Ctx,
|
|
120
|
+
input: PisCofinsSt,
|
|
121
|
+
tag: 'PIS' | 'COFINS',
|
|
122
|
+
path: string,
|
|
123
|
+
): { grupo: TNFe_infNFe_det_imposto_PISST | TNFe_infNFe_det_imposto_COFINSST; valor: Decimal; soma: boolean } {
|
|
124
|
+
let body: Out;
|
|
125
|
+
let valor: Decimal;
|
|
126
|
+
if (input.qBCProd !== undefined) {
|
|
127
|
+
const q = ctx.req(input.qBCProd, `${path}.qBCProd`, D1204);
|
|
128
|
+
const a = ctx.req(input.vAliqProd, `${path}.vAliqProd`, D1104);
|
|
129
|
+
valor = ctx.calc(input.valor, q.times(a), `${path}.valor`, D1302, 'pisCofins');
|
|
130
|
+
body = { qBCProd: ctx.s(q, D1204), vAliqProd: ctx.s(a, D1104) };
|
|
131
|
+
} else {
|
|
132
|
+
// No XSD o vBC do PISST é TDec_1302Opc (sem zero) e o do COFINSST é TDec_1302 (aceita zero).
|
|
133
|
+
const fBC = tag === 'PIS' ? D1302_OPC : D1302;
|
|
134
|
+
const vBC = ctx.req(input.vBC, `${path}.vBC`, fBC);
|
|
135
|
+
const a = ctx.req(input.aliquota, `${path}.aliquota`, D0302A04);
|
|
136
|
+
valor = ctx.calc(input.valor, vBC.percent(a), `${path}.valor`, D1302, 'pisCofins');
|
|
137
|
+
body = { vBC: ctx.s(vBC, fBC), [`p${tag}`]: ctx.s(a, D0302A04) };
|
|
138
|
+
}
|
|
139
|
+
body[`v${tag}`] = ctx.s(valor, D1302);
|
|
140
|
+
body[`indSoma${tag}ST`] = input.indSoma;
|
|
141
|
+
return { grupo: clean(body) as unknown as TNFe_infNFe_det_imposto_PISST, valor, soma: input.indSoma === '1' };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** ISSQN: `vISSQN = vBC × vAliq / 100` (RV U04-10, nota *4). */
|
|
145
|
+
export function buildIssqn(
|
|
146
|
+
ctx: Ctx,
|
|
147
|
+
input: Issqn,
|
|
148
|
+
path: string,
|
|
149
|
+
): { grupo: TNFe_infNFe_det_imposto_ISSQN; vBC: Decimal; vISSQN: Decimal; opcionais: Record<string, Decimal> } {
|
|
150
|
+
const vBC = ctx.req(input.vBC, `${path}.vBC`, D1302);
|
|
151
|
+
const vAliq = ctx.req(input.vAliq, `${path}.vAliq`, D0302A04);
|
|
152
|
+
const vISSQN = ctx.calc(input.vISSQN, vBC.percent(vAliq), `${path}.vISSQN`, D1302, 'issqn');
|
|
153
|
+
const opcionais: Record<string, Decimal> = {};
|
|
154
|
+
const opt = (k: 'vDeducao' | 'vOutro' | 'vDescIncond' | 'vDescCond' | 'vISSRet'): string | undefined => {
|
|
155
|
+
const d = ctx.opt(input[k], `${path}.${k}`, D1302);
|
|
156
|
+
if (d !== undefined) opcionais[k] = d;
|
|
157
|
+
return ctx.so(d, D1302_OPC);
|
|
158
|
+
};
|
|
159
|
+
return {
|
|
160
|
+
grupo: clean({
|
|
161
|
+
vBC: ctx.s(vBC, D1302),
|
|
162
|
+
vAliq: ctx.s(vAliq, D0302A04),
|
|
163
|
+
vISSQN: ctx.s(vISSQN, D1302),
|
|
164
|
+
cMunFG: input.cMunFG,
|
|
165
|
+
cListServ: input.cListServ,
|
|
166
|
+
vDeducao: opt('vDeducao'),
|
|
167
|
+
vOutro: opt('vOutro'),
|
|
168
|
+
vDescIncond: opt('vDescIncond'),
|
|
169
|
+
vDescCond: opt('vDescCond'),
|
|
170
|
+
vISSRet: opt('vISSRet'),
|
|
171
|
+
indISS: input.indISS,
|
|
172
|
+
cServico: input.cServico,
|
|
173
|
+
cMun: input.cMun,
|
|
174
|
+
cPais: input.cPais === undefined ? undefined : digits(input.cPais),
|
|
175
|
+
nProcesso: input.nProcesso,
|
|
176
|
+
indIncentivo: input.indIncentivo,
|
|
177
|
+
}) as TNFe_infNFe_det_imposto_ISSQN,
|
|
178
|
+
vBC,
|
|
179
|
+
vISSQN,
|
|
180
|
+
opcionais,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** ICMS para a UF de destino (NA): valores informados; defaults de partilha 100% e remetente zero desde 2019. */
|
|
185
|
+
export function buildIcmsUfDest(
|
|
186
|
+
ctx: Ctx,
|
|
187
|
+
input: IcmsUfDest,
|
|
188
|
+
path: string,
|
|
189
|
+
): { grupo: TNFe_infNFe_det_imposto_ICMSUFDest; vFCPUFDest: Decimal; vICMSUFDest: Decimal; vICMSUFRemet: Decimal } {
|
|
190
|
+
const pFCPUFDest = ctx.opt(input.pFCPUFDest, `${path}.pFCPUFDest`, D0302A04);
|
|
191
|
+
const vFCPUFDest = ctx.opt(input.vFCPUFDest, `${path}.vFCPUFDest`, D1302);
|
|
192
|
+
if (pFCPUFDest !== undefined && vFCPUFDest === undefined) {
|
|
193
|
+
ctx.issues.add(`${path}.vFCPUFDest`, 'campo_obrigatorio', 'pFCPUFDest informado exige vFCPUFDest');
|
|
194
|
+
}
|
|
195
|
+
const vICMSUFDest = ctx.req(input.vICMSUFDest, `${path}.vICMSUFDest`, D1302);
|
|
196
|
+
const vICMSUFRemet = ctx.opt(input.vICMSUFRemet, `${path}.vICMSUFRemet`, D1302) ?? Decimal.ZERO;
|
|
197
|
+
const vBCFCPUFDest = ctx.opt(input.vBCFCPUFDest, `${path}.vBCFCPUFDest`, D1302);
|
|
198
|
+
return {
|
|
199
|
+
grupo: clean({
|
|
200
|
+
vBCUFDest: ctx.s(ctx.req(input.vBCUFDest, `${path}.vBCUFDest`, D1302), D1302),
|
|
201
|
+
vBCFCPUFDest: ctx.so(vBCFCPUFDest, D1302),
|
|
202
|
+
pFCPUFDest: ctx.so(pFCPUFDest, D0302A04),
|
|
203
|
+
pICMSUFDest: ctx.s(ctx.req(input.pICMSUFDest, `${path}.pICMSUFDest`, D0302A04), D0302A04),
|
|
204
|
+
pICMSInter: input.pICMSInter,
|
|
205
|
+
pICMSInterPart: ctx.s(
|
|
206
|
+
ctx.opt(input.pICMSInterPart, `${path}.pICMSInterPart`, D0302A04) ?? Decimal.HUNDRED,
|
|
207
|
+
D0302A04,
|
|
208
|
+
),
|
|
209
|
+
vFCPUFDest: ctx.so(vFCPUFDest, D1302),
|
|
210
|
+
vICMSUFDest: ctx.s(vICMSUFDest, D1302),
|
|
211
|
+
vICMSUFRemet: ctx.s(vICMSUFRemet, D1302),
|
|
212
|
+
}) as TNFe_infNFe_det_imposto_ICMSUFDest,
|
|
213
|
+
vFCPUFDest: vFCPUFDest ?? Decimal.ZERO,
|
|
214
|
+
vICMSUFDest,
|
|
215
|
+
vICMSUFRemet,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contexto de uma montagem: coleta ocorrências e converte as entradas numéricas conferindo cada uma contra o formato do
|
|
3
|
+
* campo no leiaute. As contas usam o valor já na precisão do XML (uma alíquota com 5 casas é recusada, não
|
|
4
|
+
* arredondada em silêncio), para que o que vai no XML seja exatamente o que entrou na conta.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { DecimalInput, RoundingMode } from '../decimal.ts';
|
|
8
|
+
import { Decimal } from '../decimal.ts';
|
|
9
|
+
import type { FormatoDecimal } from '../format.ts';
|
|
10
|
+
import { formatarDecimal, problemaDeFormato } from '../format.ts';
|
|
11
|
+
import type { Issues } from '../issues.ts';
|
|
12
|
+
|
|
13
|
+
/** Famílias de campo com modo de arredondamento próprio (`data/arredondamento.json`). */
|
|
14
|
+
export type Familia = 'produto' | 'icms' | 'ipi' | 'pisCofins' | 'issqn' | 'ibsCbs';
|
|
15
|
+
|
|
16
|
+
/** Tolerância das regras de validação de valor (MOC 7.0 Anexo I, nota (*4); NT 2025.002, observações das RV UB). */
|
|
17
|
+
export const TOLERANCIA: Decimal = Decimal.of('0.01');
|
|
18
|
+
|
|
19
|
+
export class Ctx {
|
|
20
|
+
readonly issues: Issues;
|
|
21
|
+
readonly modes: Readonly<Record<Familia, RoundingMode>>;
|
|
22
|
+
/**
|
|
23
|
+
* Confere o valor informado contra o calculado. Desligado na NF-e complementar e na de ajuste (finNFe 2 e 3), cujos
|
|
24
|
+
* valores complementam outra nota e não seguem a conta do item (MOC 7.0 Anexo I, RV I11: "Se NF-e Normal").
|
|
25
|
+
*/
|
|
26
|
+
readonly conferir: boolean;
|
|
27
|
+
|
|
28
|
+
constructor(issues: Issues, modes: Readonly<Record<Familia, RoundingMode>>, conferir = true) {
|
|
29
|
+
this.issues = issues;
|
|
30
|
+
this.modes = modes;
|
|
31
|
+
this.conferir = conferir;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Entrada opcional; inválida vira ocorrência e `undefined`. */
|
|
35
|
+
opt(value: DecimalInput | undefined, path: string, format: FormatoDecimal): Decimal | undefined {
|
|
36
|
+
if (value === undefined) return undefined;
|
|
37
|
+
const d = Decimal.tryOf(value);
|
|
38
|
+
if (d === undefined) {
|
|
39
|
+
this.issues.add(path, 'decimal_invalido', 'número decimal inválido (use ponto como separador, sem milhar)');
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const problem = problemaDeFormato(d, format);
|
|
43
|
+
if (problem !== undefined) {
|
|
44
|
+
this.issues.add(path, 'decimal_invalido', `${problem} (${format.nome})`);
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
return d;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Entrada obrigatória; ausente ou inválida vira ocorrência e zero, para que a montagem siga e junte tudo. */
|
|
51
|
+
req(value: DecimalInput | undefined, path: string, format: FormatoDecimal): Decimal {
|
|
52
|
+
if (value === undefined) {
|
|
53
|
+
this.issues.add(path, 'campo_obrigatorio', 'campo obrigatório');
|
|
54
|
+
return Decimal.ZERO;
|
|
55
|
+
}
|
|
56
|
+
return this.opt(value, path, format) ?? Decimal.ZERO;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Arredonda um valor calculado no formato do campo pelo modo da família. */
|
|
60
|
+
round(value: Decimal, format: FormatoDecimal, familia: Familia): Decimal {
|
|
61
|
+
return value.round(format.max, this.modes[familia]);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Valor derivado: sem valor informado, o calculado (arredondado); com valor informado, o informado, conferido
|
|
66
|
+
* contra o calculado com a tolerância das regras de validação.
|
|
67
|
+
*/
|
|
68
|
+
/**
|
|
69
|
+
* Base de cálculo: a informada prevalece sem conferência (a base legal varia por operação, UF e regime); o padrão
|
|
70
|
+
* só vale quando nada veio.
|
|
71
|
+
*/
|
|
72
|
+
base(
|
|
73
|
+
given: DecimalInput | undefined,
|
|
74
|
+
padrao: Decimal,
|
|
75
|
+
path: string,
|
|
76
|
+
format: FormatoDecimal,
|
|
77
|
+
familia: Familia,
|
|
78
|
+
): Decimal {
|
|
79
|
+
return this.opt(given, path, format) ?? this.round(padrao, format, familia);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
calc(
|
|
83
|
+
given: DecimalInput | undefined,
|
|
84
|
+
computed: Decimal,
|
|
85
|
+
path: string,
|
|
86
|
+
format: FormatoDecimal,
|
|
87
|
+
familia: Familia,
|
|
88
|
+
): Decimal {
|
|
89
|
+
const r = this.round(computed, format, familia);
|
|
90
|
+
if (given === undefined) return r;
|
|
91
|
+
const g = this.opt(given, path, format);
|
|
92
|
+
if (g === undefined) return r;
|
|
93
|
+
if (this.conferir && g.minus(r).abs().gt(TOLERANCIA)) {
|
|
94
|
+
this.issues.add(
|
|
95
|
+
path,
|
|
96
|
+
'valor_divergente',
|
|
97
|
+
`valor informado difere do calculado (${r.toFixed(format.max)}) em mais de ${TOLERANCIA.toString()}`,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
return g;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Texto no formato do campo. */
|
|
104
|
+
s(value: Decimal, format: FormatoDecimal): string {
|
|
105
|
+
return formatarDecimal(value, format);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Texto opcional: ausente fica ausente, e zero some nos formatos que não aceitam zero. */
|
|
109
|
+
so(value: Decimal | undefined, format: FormatoDecimal): string | undefined {
|
|
110
|
+
if (value === undefined) return undefined;
|
|
111
|
+
if (format.naoNulo && value.isZero()) return undefined;
|
|
112
|
+
return formatarDecimal(value, format);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Remove as chaves com `undefined` (o serializer ignora, mas o objeto devolvido fica limpo e comparável). */
|
|
117
|
+
export function clean<T extends object>(o: T): T {
|
|
118
|
+
const out: Record<string, unknown> = {};
|
|
119
|
+
for (const [k, v] of Object.entries(o)) if (v !== undefined) out[k] = v;
|
|
120
|
+
return out as T;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Só dígitos (tira máscara de CEP, CNPJ numérico, telefone). */
|
|
124
|
+
export function digits(s: string): string {
|
|
125
|
+
return s.replace(/\D/g, '');
|
|
126
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"descricao": "Modo de arredondamento dos valores calculados pelo builder, por família de campo. HALF_UP é o arredondamento comercial; HALF_EVEN é o bancário (NBR 5891). Quem emite pode sobrepor por família em MontarNfeOpcoes.arredondamento.",
|
|
3
|
+
"atualizadoEm": "2026-09-26",
|
|
4
|
+
"familias": {
|
|
5
|
+
"produto": {
|
|
6
|
+
"modo": "HALF_UP",
|
|
7
|
+
"fonte": "MOC 7.0 Anexo I, nota (*4): o produto de multiplicações arredonda em 2 casas, com tolerância de R$ 0,01; o modo não é fixado. vProd = qCom x vUnCom (I11)."
|
|
8
|
+
},
|
|
9
|
+
"icms": {
|
|
10
|
+
"modo": "HALF_UP",
|
|
11
|
+
"fonte": "MOC 7.0 Anexo I, nota (*4) das regras N17, N16a, N16c, N23d: 2 casas, tolerância de R$ 0,01, modo não fixado."
|
|
12
|
+
},
|
|
13
|
+
"ipi": {
|
|
14
|
+
"modo": "HALF_UP",
|
|
15
|
+
"fonte": "MOC 7.0 Anexo I, nota (*4): 2 casas, tolerância de R$ 0,01."
|
|
16
|
+
},
|
|
17
|
+
"pisCofins": {
|
|
18
|
+
"modo": "HALF_UP",
|
|
19
|
+
"fonte": "MOC 7.0 Anexo I, nota (*4): 2 casas, tolerância de R$ 0,01."
|
|
20
|
+
},
|
|
21
|
+
"issqn": {
|
|
22
|
+
"modo": "HALF_UP",
|
|
23
|
+
"fonte": "MOC 7.0 Anexo I, nota (*4): 2 casas, tolerância de R$ 0,01."
|
|
24
|
+
},
|
|
25
|
+
"ibsCbs": {
|
|
26
|
+
"modo": "HALF_EVEN",
|
|
27
|
+
"fonte": "NT 2025.002 v1.51, RV UB35-10 e seguintes (tolerância de 0,01) e ADR 0007 (a Calculadora da RFB arredonda em HALF_EVEN)."
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"descricao": "Códigos de status de sucesso e de processamento (MOC 7.0 Anexo I, tabela 4.4.1) e os códigos que o @sinete/nfe trata de forma própria. Rejeições e denegações com mensagem oficial estão no @sinete/rejeicoes; aqui fica só o desfecho de cada código por serviço.",
|
|
3
|
+
"fonte": "MOC 7.0 Anexo I, tabela 4.4.1 (códigos de sucesso) e 4.4.2 (denegação 301, 302, 303); NT 2014.002 (Distribuição DF-e, 137 e 138); NT 2011.004 (lote em processamento, 105); MOC 7.0 Anexo I, consulta protocolo J03 a J06 (561, 562 e 613: a numeração da chave consultada tem outra NF-e)",
|
|
4
|
+
"atualizadoEm": "2026-09-26",
|
|
5
|
+
"autorizada": ["100", "150"],
|
|
6
|
+
"denegada": ["110", "301", "302", "303"],
|
|
7
|
+
"cancelada": ["101", "151", "155"],
|
|
8
|
+
"loteRecebido": ["103"],
|
|
9
|
+
"loteProcessado": ["104"],
|
|
10
|
+
"loteEmProcessamento": ["105"],
|
|
11
|
+
"loteNaoLocalizado": ["106"],
|
|
12
|
+
"servicoEmOperacao": ["107"],
|
|
13
|
+
"inutilizacaoHomologada": ["102"],
|
|
14
|
+
"eventoRegistrado": ["135", "136", "155"],
|
|
15
|
+
"loteEventoProcessado": ["128"],
|
|
16
|
+
"cadastroEncontrado": ["111", "112"],
|
|
17
|
+
"distribuicaoNenhumDocumento": ["137"],
|
|
18
|
+
"distribuicaoDocumentos": ["138"],
|
|
19
|
+
"duplicidade": ["204"],
|
|
20
|
+
"duplicidadeChaveDiferente": ["539"],
|
|
21
|
+
"naoConsta": ["217"],
|
|
22
|
+
"outraNfeNoNumero": ["561", "562", "613"],
|
|
23
|
+
"consumoIndevido": ["656"],
|
|
24
|
+
"dicas": {
|
|
25
|
+
"656": {
|
|
26
|
+
"causaProvavel": "Consumo indevido: consultas repetidas à Distribuição DF-e sem documento novo (ultNSU igual a maxNSU) ou acima do limite de requisições por hora.",
|
|
27
|
+
"comoCorrigir": "Aguardar uma hora antes de consultar de novo e só repetir a consulta quando ultNSU for menor que maxNSU; guardar o ultNSU devolvido e continuar dele.",
|
|
28
|
+
"fonte": "NT 2014.002 v1.02 (Distribuição DF-e), regras de consumo indevido"
|
|
29
|
+
},
|
|
30
|
+
"217": {
|
|
31
|
+
"causaProvavel": "A chave consultada não consta na base do autorizador consultado: a nota não foi recebida, ou foi autorizada em outro ambiente ou autorizador (SVC).",
|
|
32
|
+
"comoCorrigir": "Se o envio ficou sem resposta, reenviar exatamente o mesmo XML assinado; se foi emitida em contingência SVC, consultar no SVC.",
|
|
33
|
+
"fonte": "MOC 7.0 Anexo I, serviço de consulta protocolo"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"descricao": "Deslocamento do horário legal de cada UF em relação a UTC, em minutos, usado para formatar dhEmi, dhSaiEnt, dhCont e dhEvento quando quem emite não informa o fuso. Sem horário de verão desde 2019. UFs com mais de um fuso usam o da capital; o emitente de outro fuso informa deslocamentoMin.",
|
|
3
|
+
"atualizadoEm": "2026-09-26",
|
|
4
|
+
"fontes": [
|
|
5
|
+
"Lei 11.662/2008 e Lei 12.876/2013 (fusos horários do Brasil; Acre em UTC-5)",
|
|
6
|
+
"Decreto 9.772/2019 (fim do horário de verão)"
|
|
7
|
+
],
|
|
8
|
+
"padrao": -180,
|
|
9
|
+
"ufs": {
|
|
10
|
+
"AC": -300,
|
|
11
|
+
"AM": -240,
|
|
12
|
+
"MS": -240,
|
|
13
|
+
"MT": -240,
|
|
14
|
+
"RO": -240,
|
|
15
|
+
"RR": -240
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
{
|
|
2
|
+
"descricao": "Endereços da NFC-e (modelo 65) por UF e ambiente: a consulta via QR Code (1ª parte da URL do infNFeSupl/qrCode, sem o '?p=' que o builder acrescenta) e a consulta por chave de acesso (infNFeSupl/urlChave, impressa no DANFC-e). Cada UF tem uma lista de endereços com a data de início ('desde', AAAA-MM-DD, 00:00 de Brasília); vale o mais recente cujo início não passou da data de emissão. As tabelas do ENCAT foram transcritas como publicadas, com três ajustes: o '?' final e o exemplo de parâmetros (AM: '?chNFe=1315....') foram retirados, porque o builder monta a query; o espaço dentro do endereço de homologação do MA ('homolog acao') foi juntado; e o endereço de MG por chave de acesso vem da página de web services da própria SEFAZ-MG, mais nova que a do ENCAT. Onde a tabela não dá o protocolo ('http://' ou 'https://'), a URL do QR Code fica null: o schema exige o protocolo e não há fonte para escolher um; informe MontarNfeOpcoes.urlQrCode. A regra ZX02-20 (rejeição 395) compara o endereço sem diferenciar maiúsculas e minúsculas; ZX03-20 (rejeição 878) é opcional por UF.",
|
|
3
|
+
"atualizadoEm": "2026-09-26",
|
|
4
|
+
"fontes": [
|
|
5
|
+
"Portal Nacional da NFC-e (ENCAT), URL por UF utilizada QR code: https://nfce.encat.org/desenvolvedor/qrcode/ (coletada em 26/09/2026)",
|
|
6
|
+
"Portal Nacional da NFC-e (ENCAT), URL por UF utilizada para consulta chave, QR Code versão 2.0: https://nfce.encat.org/desenvolvedor/httpnfce-encat-orgconsulte-sua-nota-qr-code-versao-2-0/ (coletada em 26/09/2026)",
|
|
7
|
+
"SEFAZ-MG, web services da NFC-e: https://portalsped.fazenda.mg.gov.br/spedmg/nfce/web-services/ (a mesma fonte do urlsConsultaNfce do @sinete/transport) (coletada em 26/09/2026)",
|
|
8
|
+
"MOC 7.0 Anexo I, regras ZX02-20 e ZX03-20; NT 2025.001 v1.03, grupo ZX (campos ZX02 qrCode e ZX03 urlChave)"
|
|
9
|
+
],
|
|
10
|
+
"qrCode": {
|
|
11
|
+
"producao": {
|
|
12
|
+
"AC": [{ "url": "http://www.sefaznet.ac.gov.br/nfce/qrcode" }],
|
|
13
|
+
"AL": [{ "url": "http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp" }],
|
|
14
|
+
"AP": [{ "url": "https://www.sefaz.ap.gov.br/nfce/nfcep.php" }],
|
|
15
|
+
"AM": [
|
|
16
|
+
{ "url": null, "nota": "tabela do ENCAT sem protocolo: sistemas.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp" }
|
|
17
|
+
],
|
|
18
|
+
"BA": [{ "url": "http://nfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx" }],
|
|
19
|
+
"CE": [{ "url": "http://nfce.sefaz.ce.gov.br/pages/ShowNFCe.html" }],
|
|
20
|
+
"DF": [{ "url": "http://www.fazenda.df.gov.br/nfce/qrcode" }],
|
|
21
|
+
"ES": [{ "url": "http://app.sefaz.es.gov.br/ConsultaNFCe/" }],
|
|
22
|
+
"GO": [
|
|
23
|
+
{ "url": "http://nfe.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe" },
|
|
24
|
+
{ "url": "https://nfeweb.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe", "desde": "2025-06-16" }
|
|
25
|
+
],
|
|
26
|
+
"MA": [{ "url": null, "nota": "tabela do ENCAT sem protocolo: nfce.sefaz.ma.gov.br/portal/consultarNFCe.jsp" }],
|
|
27
|
+
"MT": [{ "url": "http://www.sefaz.mt.gov.br/nfce/consultanfce" }],
|
|
28
|
+
"MS": [{ "url": "http://www.dfe.ms.gov.br/nfce/qrcode" }],
|
|
29
|
+
"MG": [
|
|
30
|
+
{ "url": "https://nfce.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml" },
|
|
31
|
+
{ "url": "https://portalsped.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml", "desde": "2022-03-21" }
|
|
32
|
+
],
|
|
33
|
+
"PA": [{ "url": "https://appnfc.sefa.pa.gov.br/portal/view/consultas/nfce/nfceForm.seam" }],
|
|
34
|
+
"PB": [{ "url": "http://www.sefaz.pb.gov.br/nfce" }],
|
|
35
|
+
"PR": [{ "url": "http://www.fazenda.pr.gov.br/nfce/qrcode" }],
|
|
36
|
+
"PE": [{ "url": "http://nfce.sefaz.pe.gov.br/nfce/consulta" }],
|
|
37
|
+
"PI": [{ "url": "http://www.sefaz.pi.gov.br/nfce/qrcode" }],
|
|
38
|
+
"RJ": [
|
|
39
|
+
{ "url": "http://www4.fazenda.rj.gov.br/consultaNFCe/QRCode" },
|
|
40
|
+
{ "url": "https://consultadfe.fazenda.rj.gov.br/consultaNFCe/QRCode", "desde": "2023-12-19" }
|
|
41
|
+
],
|
|
42
|
+
"RN": [
|
|
43
|
+
{ "url": "http://nfce.set.rn.gov.br/consultarNFCe.aspx" },
|
|
44
|
+
{ "url": "https://nfce.sefaz.rn.gov.br/consultarNFCe.aspx", "desde": "2026-05-25" }
|
|
45
|
+
],
|
|
46
|
+
"RS": [{ "url": "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx" }],
|
|
47
|
+
"RO": [{ "url": "http://www.nfce.sefin.ro.gov.br/consultanfce/consulta.jsp" }],
|
|
48
|
+
"RR": [{ "url": "https://www.sefaz.rr.gov.br/nfce/servlet/qrcode" }],
|
|
49
|
+
"SC": [{ "url": "https://sat.sef.sc.gov.br/nfce/consulta" }],
|
|
50
|
+
"SP": [
|
|
51
|
+
{
|
|
52
|
+
"url": "https://www.nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaQRCode.aspx",
|
|
53
|
+
"nota": "a tabela do ENCAT lista também https://www.nfce.fazenda.sp.gov.br/qrcode"
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"SE": [{ "url": "http://www.nfce.se.gov.br/nfce/qrcode" }],
|
|
57
|
+
"TO": [{ "url": "http://www.sefaz.to.gov.br/nfce/qrcode" }]
|
|
58
|
+
},
|
|
59
|
+
"homologacao": {
|
|
60
|
+
"AC": [{ "url": "http://www.hml.sefaznet.ac.gov.br/nfce/qrcode" }],
|
|
61
|
+
"AL": [{ "url": "http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp" }],
|
|
62
|
+
"AP": [{ "url": "https://www.sefaz.ap.gov.br/nfcehml/nfce.php" }],
|
|
63
|
+
"AM": [
|
|
64
|
+
{ "url": null, "nota": "tabela do ENCAT sem protocolo: homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp" }
|
|
65
|
+
],
|
|
66
|
+
"BA": [{ "url": "http://hnfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx" }],
|
|
67
|
+
"CE": [{ "url": "http://nfceh.sefaz.ce.gov.br/pages/ShowNFCe.html" }],
|
|
68
|
+
"DF": [{ "url": "http://www.fazenda.df.gov.br/nfce/qrcode" }],
|
|
69
|
+
"ES": [{ "url": "http://homologacao.sefaz.es.gov.br/ConsultaNFCe/" }],
|
|
70
|
+
"GO": [
|
|
71
|
+
{ "url": "http://homolog.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe" },
|
|
72
|
+
{ "url": "https://nfewebhomolog.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe", "desde": "2025-06-16" }
|
|
73
|
+
],
|
|
74
|
+
"MA": [
|
|
75
|
+
{ "url": null, "nota": "tabela do ENCAT sem protocolo: homologacao.sefaz.ma.gov.br/portal/consultarNFCe.jsp" }
|
|
76
|
+
],
|
|
77
|
+
"MT": [{ "url": "http://homologacao.sefaz.mt.gov.br/nfce/consultanfce" }],
|
|
78
|
+
"MS": [{ "url": "http://www.dfe.ms.gov.br/nfce/qrcode" }],
|
|
79
|
+
"MG": [
|
|
80
|
+
{ "url": "https://nfce.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml" },
|
|
81
|
+
{ "url": "https://portalsped.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml", "desde": "2022-03-21" }
|
|
82
|
+
],
|
|
83
|
+
"PA": [{ "url": "https://appnfc.sefa.pa.gov.br/portal-homologacao/view/consultas/nfce/nfceForm.seam" }],
|
|
84
|
+
"PB": [{ "url": "http://www.sefaz.pb.gov.br/nfcehom" }],
|
|
85
|
+
"PR": [{ "url": "http://www.fazenda.pr.gov.br/nfce/qrcode" }],
|
|
86
|
+
"PE": [{ "url": "http://nfcehomolog.sefaz.pe.gov.br/nfce/consulta" }],
|
|
87
|
+
"PI": [{ "url": "http://www.sefaz.pi.gov.br/nfce/qrcode" }],
|
|
88
|
+
"RJ": [
|
|
89
|
+
{ "url": "http://www4.fazenda.rj.gov.br/consultaNFCe/QRCode" },
|
|
90
|
+
{ "url": "https://consultadfe.fazenda.rj.gov.br/consultaNFCe/QRCode", "desde": "2023-12-19" }
|
|
91
|
+
],
|
|
92
|
+
"RN": [
|
|
93
|
+
{ "url": "http://hom.nfce.set.rn.gov.br/consultarNFCe.aspx" },
|
|
94
|
+
{ "url": "https://hom.nfce.sefaz.rn.gov.br/consultarNFCe.aspx", "desde": "2026-05-25" }
|
|
95
|
+
],
|
|
96
|
+
"RS": [{ "url": "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx" }],
|
|
97
|
+
"RO": [{ "url": "http://www.nfce.sefin.ro.gov.br/consultanfce/consulta.jsp" }],
|
|
98
|
+
"RR": [{ "url": "http://200.174.88.103:8080/nfce/servlet/qrcode" }],
|
|
99
|
+
"SC": [{ "url": "https://hom.sat.sef.sc.gov.br/nfce/consulta" }],
|
|
100
|
+
"SP": [
|
|
101
|
+
{
|
|
102
|
+
"url": "https://www.homologacao.nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaQRCode.aspx",
|
|
103
|
+
"nota": "a tabela do ENCAT lista também https://www.homologacao.nfce.fazenda.sp.gov.br/qrcode"
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
"SE": [{ "url": "http://www.hom.nfe.se.gov.br/nfce/qrcode" }],
|
|
107
|
+
"TO": [{ "url": "http://homologacao.sefaz.to.gov.br/nfce/qrcode" }]
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"urlChave": {
|
|
111
|
+
"producao": {
|
|
112
|
+
"AC": [{ "url": "www.sefaznet.ac.gov.br/nfce/consulta" }],
|
|
113
|
+
"AL": [{ "url": "www.sefaz.al.gov.br/nfce/consulta" }],
|
|
114
|
+
"AP": [{ "url": "www.sefaz.ap.gov.br/nfce/consulta" }],
|
|
115
|
+
"AM": [{ "url": "www.sefaz.am.gov.br/nfce/consulta" }],
|
|
116
|
+
"BA": [{ "url": "www.sefaz.ba.gov.br/nfce/consulta" }],
|
|
117
|
+
"CE": [{ "url": "www.sefaz.ce.gov.br/nfce/consulta" }],
|
|
118
|
+
"DF": [{ "url": "www.fazenda.df.gov.br/nfce/consulta" }],
|
|
119
|
+
"ES": [{ "url": "www.sefaz.es.gov.br/nfce/consulta" }],
|
|
120
|
+
"GO": [{ "url": "www.sefaz.go.gov.br/nfce/consulta" }],
|
|
121
|
+
"MA": [{ "url": "www.sefaz.ma.gov.br/nfce/consulta" }],
|
|
122
|
+
"MT": [{ "url": "http://www.sefaz.mt.gov.br/nfce/consultanfce" }],
|
|
123
|
+
"MS": [{ "url": "www.dfe.ms.gov.br/nfce/consulta" }],
|
|
124
|
+
"MG": [{ "url": "https://portalsped.fazenda.mg.gov.br/portalnfce" }],
|
|
125
|
+
"PA": [{ "url": "www.sefa.pa.gov.br/nfce/consulta" }],
|
|
126
|
+
"PB": [{ "url": "www.receita.pb.gov.br/nfce/consulta" }],
|
|
127
|
+
"PR": [{ "url": "http://www.fazenda.pr.gov.br/nfce/consulta" }],
|
|
128
|
+
"PE": [{ "url": "nfce.sefaz.pe.gov.br/nfce/consulta" }],
|
|
129
|
+
"PI": [{ "url": "www.sefaz.pi.gov.br/nfce/consulta" }],
|
|
130
|
+
"RJ": [{ "url": "www.fazenda.rj.gov.br/nfce/consulta" }],
|
|
131
|
+
"RN": [{ "url": "www.set.rn.gov.br/nfce/consulta" }],
|
|
132
|
+
"RS": [{ "url": "www.sefaz.rs.gov.br/nfce/consulta" }],
|
|
133
|
+
"RO": [{ "url": "www.sefin.ro.gov.br/nfce/consulta" }],
|
|
134
|
+
"RR": [{ "url": "www.sefaz.rr.gov.br/nfce/consulta" }],
|
|
135
|
+
"SC": [{ "url": "https://sat.sef.sc.gov.br/nfce/consulta" }],
|
|
136
|
+
"SP": [{ "url": "https://www.nfce.fazenda.sp.gov.br/consulta" }],
|
|
137
|
+
"SE": [{ "url": "http://www.nfce.se.gov.br/nfce/consulta" }],
|
|
138
|
+
"TO": [{ "url": "www.sefaz.to.gov.br/nfce/consulta" }]
|
|
139
|
+
},
|
|
140
|
+
"homologacao": {
|
|
141
|
+
"AC": [{ "url": "www.sefaznet.ac.gov.br/nfce/consulta" }],
|
|
142
|
+
"AL": [{ "url": "www.sefaz.al.gov.br/nfce/consulta" }],
|
|
143
|
+
"AP": [{ "url": "www.sefaz.ap.gov.br/nfce/consulta" }],
|
|
144
|
+
"AM": [{ "url": "www.sefaz.am.gov.br/nfce/consulta" }],
|
|
145
|
+
"BA": [{ "url": "http://hinternet.sefaz.ba.gov.br/nfce/consulta" }],
|
|
146
|
+
"CE": [{ "url": "www.sefaz.ce.gov.br/nfce/consulta" }],
|
|
147
|
+
"DF": [{ "url": "www.fazenda.df.gov.br/nfce/consulta" }],
|
|
148
|
+
"ES": [{ "url": "www.sefaz.es.gov.br/nfce/consulta" }],
|
|
149
|
+
"GO": [{ "url": "www.sefaz.go.gov.br/nfce/consulta" }],
|
|
150
|
+
"MA": [{ "url": "www.sefaz.ma.gov.br/nfce/consulta" }],
|
|
151
|
+
"MT": [{ "url": "http://homologacao.sefaz.mt.gov.br/nfce/consultanfce" }],
|
|
152
|
+
"MS": [{ "url": "www.dfe.ms.gov.br/nfce/consulta" }],
|
|
153
|
+
"MG": [{ "url": "https://hportalsped.fazenda.mg.gov.br/portalnfce" }],
|
|
154
|
+
"PA": [{ "url": "www.sefa.pa.gov.br/nfce/consulta" }],
|
|
155
|
+
"PB": [{ "url": "www.receita.pb.gov.br/nfcehom" }],
|
|
156
|
+
"PR": [{ "url": "http://www.fazenda.pr.gov.br/nfce/consulta" }],
|
|
157
|
+
"PE": [{ "url": "nfce.sefaz.pe.gov.br/nfce/consulta" }],
|
|
158
|
+
"PI": [{ "url": "www.sefaz.pi.gov.br/nfce/consulta" }],
|
|
159
|
+
"RJ": [{ "url": "www.fazenda.rj.gov.br/nfce/consulta" }],
|
|
160
|
+
"RN": [{ "url": "www.set.rn.gov.br/nfce/consulta" }],
|
|
161
|
+
"RS": [{ "url": "www.sefaz.rs.gov.br/nfce/consulta" }],
|
|
162
|
+
"RO": [{ "url": "www.sefin.ro.gov.br/nfce/consulta" }],
|
|
163
|
+
"RR": [{ "url": "www.sefaz.rr.gov.br/nfce/consulta" }],
|
|
164
|
+
"SC": [{ "url": "https://hom.sat.sef.sc.gov.br/nfce/consulta" }],
|
|
165
|
+
"SP": [{ "url": "https://www.homologacao.nfce.fazenda.sp.gov.br/consulta" }],
|
|
166
|
+
"SE": [{ "url": "http://www.hom.nfe.se.gov.br/nfce/consulta" }],
|
|
167
|
+
"TO": [{ "url": "http://homologacao.sefaz.to.gov.br/nfce/consulta.jsf" }]
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"descricao": "Regras do produtor rural que variam no tempo ou por UF. refNFP: a nota fiscal de produtor em papel (modelo 04) foi extinta; uma NF-e ainda pode referenciar uma nota modelo 04 emitida antes do fim da vigência na UF da nota referenciada. vedadaDesde é o primeiro AAMM em que a UF não aceita mais nota modelo 04 emitida; a referência a nota com AAMM igual ou posterior é recusada pelo builder. series: faixas de série por tipo de emitente na emissão pelo contribuinte (procEmi 0, a única que o montarNfe monta).",
|
|
3
|
+
"atualizadoEm": "2026-09-28",
|
|
4
|
+
"refNFP": {
|
|
5
|
+
"modelo04": {
|
|
6
|
+
"vedadaDesde": "2601",
|
|
7
|
+
"fonte": "Ajuste SINIEF 10/2022 (extinção da nota fiscal de produtor modelo 4, com prazos prorrogados até 05/01/2026) e avisos das SEFAZ (RS e SP: fim do talão em 05/01/2026)."
|
|
8
|
+
},
|
|
9
|
+
"ufs": {}
|
|
10
|
+
},
|
|
11
|
+
"series": {
|
|
12
|
+
"cpf": [920, 969],
|
|
13
|
+
"fonte": "MOC 7.0 Anexo I, RV B07 e BA02-30: séries 920 a 969 reservadas à NF-e emitida por pessoa física (CPF).",
|
|
14
|
+
"cnpj": [0, 889],
|
|
15
|
+
"fonteCnpj": "MOC 7.0 Anexo I, RV C02-30 (emitente CNPJ: séries 0 a 909, rejeição 503) e B26-10 (emissão pelo contribuinte, procEmi 0: séries 0 a 889 ou 920 a 969, rejeição 244): as duas juntas deixam 0 a 889. A NT 2026.001 v1.02b (PAA, produção em 05/10/2026) abre 980 a 989 na C02-30 e mantém a B26-10, então a faixa continua 0 a 889."
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"descricao": "Parâmetros da reforma tributária no total do item e da nota. vItemSomaTributosDesde: a partir desta data do fato gerador (Brasília), vItem soma vIBS, vCBS, vIS e os totais monofásicos; antes dela, não soma (exceção de 2025 e 2026).",
|
|
3
|
+
"atualizadoEm": "2026-09-26",
|
|
4
|
+
"vItemSomaTributosDesde": "2027-01-01",
|
|
5
|
+
"fonte": "NT 2025.002 v1.51, RV VB01-10 e VB01-20, Exceção 1: em 2025 e 2026 não somar vIBS, vCBS, vIS, vTotIBSMonoItem e vTotCBSMonoItem."
|
|
6
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"descricao": "Exigência do grupo infRespTec e do CSRT por UF do emitente, com vigência por ambiente. infRespTec: 'obrigatorio' faz o builder recusar a nota sem responsável técnico; 'opcional' só o inclui quando informado. csrt: 'obrigatorio' exige idCSRT e hashCSRT (rejeição 975). Datas no formato AAAA-MM-DD, a partir de 00:00 de Brasília. UF ausente usa o padrão. A adesão é de cada UF (NT 2018.005); quem emite pode sobrepor em MontarNfeOpcoes.",
|
|
3
|
+
"atualizadoEm": "2026-09-26",
|
|
4
|
+
"fonte": "NT 2018.005 v1.50 (responsável técnico e CSRT, adesão a critério da UF)",
|
|
5
|
+
"padrao": { "infRespTec": "opcional", "csrt": "opcional" },
|
|
6
|
+
"ufs": {
|
|
7
|
+
"PR": {
|
|
8
|
+
"csrt": { "homologacao": "2025-03-02", "producao": "2025-09-15" },
|
|
9
|
+
"infRespTec": { "homologacao": "2025-03-02", "producao": "2025-09-15" },
|
|
10
|
+
"fonte": "SEFAZ-PR, NT 2018.005 v1.50: CSRT obrigatório na NF-e em homologação desde 02/03/2025 e em produção desde 15/09/2025 (aviso da SEFAZ-PR, reproduzido em https://inventti.com.br/nf-e-nfc-e-nt-2018-005-versao-1-50-prorroga-regras-de-validacao-para-uf-do-parana/)."
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|