@sinete/nfe 0.3.0 → 0.4.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/dist/build/build.d.ts +8 -1
- package/dist/build/build.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -14
- package/dist/index.js.map +5 -5
- package/dist/ports.d.ts +18 -0
- package/dist/ports.d.ts.map +1 -1
- package/dist/rtc.d.ts.map +1 -1
- package/dist/versao-gerada.d.ts +1 -1
- package/package.json +1 -1
- package/src/build/build.ts +20 -6
- package/src/index.ts +7 -1
- package/src/ports.ts +19 -0
- package/src/rtc.ts +50 -9
- package/src/versao-gerada.ts +1 -1
package/dist/ports.d.ts
CHANGED
|
@@ -84,12 +84,30 @@ export interface PedidoIbsCbsNota {
|
|
|
84
84
|
readonly tpOperGov: string;
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Alíquota do IBS/CBS que entrou no cálculo de um item vinda de quem integra (`comAliquotasInformadas`), e não da tabela
|
|
89
|
+
* oficial do pacote.
|
|
90
|
+
*/
|
|
91
|
+
export interface AliquotaIbsCbsInformada {
|
|
92
|
+
/** Número do item na nota (1 a 990). */
|
|
93
|
+
readonly nItem: number;
|
|
94
|
+
readonly tributo: 'CBS' | 'IBSUF' | 'IBSMun';
|
|
95
|
+
/** Percentual nominal informado (`'8.7'` = 8,7%). */
|
|
96
|
+
readonly valor: string;
|
|
97
|
+
/** O motivo declarado em `comAliquotasInformadas`. */
|
|
98
|
+
readonly motivo: string;
|
|
99
|
+
}
|
|
87
100
|
/** Resultado da calculadora: o grupo `IBSCBS` de cada item pedido, já na forma lexical do leiaute. */
|
|
88
101
|
export interface RespostaIbsCbs {
|
|
89
102
|
readonly itens: readonly {
|
|
90
103
|
readonly nItem: number;
|
|
91
104
|
readonly IBSCBS: TTribNFe;
|
|
92
105
|
}[];
|
|
106
|
+
/**
|
|
107
|
+
* As alíquotas que não vieram da tabela oficial: a montagem as repassa em `NfeMontada.aliquotasInformadas`. Ausente
|
|
108
|
+
* ou vazio quando todas foram oficiais; a calculadora de fora do sinete que não sabe dizer pode omitir.
|
|
109
|
+
*/
|
|
110
|
+
readonly aliquotasInformadas?: readonly AliquotaIbsCbsInformada[];
|
|
93
111
|
/**
|
|
94
112
|
* Problemas de classificação ou de dado (`caminho` relativo ao item, como `itens[2].impostos.ibsCbs`). A ocorrência sem
|
|
95
113
|
* `origem` entra como `montagem` (ADR 0011); marque `entrada` a que aponta um valor da nota.
|
package/dist/ports.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"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"}
|
package/dist/rtc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtc.d.ts","sourceRoot":"","sources":["../src/rtc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAGV,eAAe,EAIhB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"rtc.d.ts","sourceRoot":"","sources":["../src/rtc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAGV,eAAe,EAIhB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAEV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEpE,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,gIAAgI;IAChI,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,KAAK,MAAM,CAAC;IAC3E;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;QAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACrG,wGAAwG;IACxG,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAmBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAQvE;AA+DD;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAAC,aAAa,CAAC,CASjE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,uBAA4B,GAAG,iBAAiB,CAYzF"}
|
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.4.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",
|
package/src/build/build.ts
CHANGED
|
@@ -50,7 +50,7 @@ import type {
|
|
|
50
50
|
Referenciada,
|
|
51
51
|
ResponsavelTecnico,
|
|
52
52
|
} from '../model.ts';
|
|
53
|
-
import type { CalculadoraIbsCbs, PedidoIbsCbsItem } from '../ports.ts';
|
|
53
|
+
import type { AliquotaIbsCbsInformada, CalculadoraIbsCbs, PedidoIbsCbsItem } from '../ports.ts';
|
|
54
54
|
import { calculadoraIbsCbs } from '../rtc.ts';
|
|
55
55
|
import type { Instante } from '../time.ts';
|
|
56
56
|
import { deslocamentoDaUf, formatarDh } from '../time.ts';
|
|
@@ -159,6 +159,13 @@ export interface NfeMontada {
|
|
|
159
159
|
readonly infNFe: TNFe_infNFe;
|
|
160
160
|
/** `<NFe xmlns="...">` com o `infNFe` canônico, sem assinatura, já validado contra o schema. */
|
|
161
161
|
readonly xml: string;
|
|
162
|
+
/**
|
|
163
|
+
* Alíquotas do IBS/CBS que a calculadora usou vindas de quem integra (`comAliquotasInformadas`), e não da tabela
|
|
164
|
+
* oficial do pacote, por item. Ausente quando todas foram oficiais. A montagem não recusa por isso: é o caminho para
|
|
165
|
+
* emitir com uma alíquota já publicada antes de o pacote trazê-la. Guarde junto com a nota e alerte quem opera; em
|
|
166
|
+
* produção, a alíquota informada é responsabilidade de quem a informou.
|
|
167
|
+
*/
|
|
168
|
+
readonly aliquotasInformadas?: readonly AliquotaIbsCbsInformada[];
|
|
162
169
|
}
|
|
163
170
|
|
|
164
171
|
export type ResultadoMontagemNfe =
|
|
@@ -849,6 +856,7 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
849
856
|
const classificados = entrada.itens
|
|
850
857
|
.map((it, n) => ({ it, n }))
|
|
851
858
|
.filter(({ it }) => it.impostos.ibsCbs?.classificacao !== undefined);
|
|
859
|
+
let aliquotasInformadas: readonly AliquotaIbsCbsInformada[] = [];
|
|
852
860
|
if (classificados.length > 0) {
|
|
853
861
|
const calculadora = opcoes.ibsCbs ?? calculadoraPadrao();
|
|
854
862
|
const reqs: PedidoIbsCbsItem[] = classificados.map(({ it, n }) => {
|
|
@@ -925,14 +933,19 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
925
933
|
itens: reqs,
|
|
926
934
|
});
|
|
927
935
|
issues.addAll(resp.ocorrencias ?? [], 'montagem');
|
|
936
|
+
aliquotasInformadas = resp.aliquotasInformadas ?? [];
|
|
937
|
+
// A calculadora que recusou já disse por quê: o grupo que faltar é consequência da ocorrência dela, e uma segunda
|
|
938
|
+
// ocorrência por item repetiria a causa. `ibscbs_calculo` fica para a calculadora que omite um item sem explicar.
|
|
939
|
+
const explicou = (resp.ocorrencias?.length ?? 0) > 0;
|
|
928
940
|
for (const { n } of classificados) {
|
|
929
941
|
const g = resp.itens.find((x) => x.nItem === n + 1);
|
|
930
942
|
if (g === undefined) {
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
943
|
+
if (!explicou)
|
|
944
|
+
issues.montagem(
|
|
945
|
+
`itens[${n}].impostos.ibsCbs`,
|
|
946
|
+
'ibscbs_calculo',
|
|
947
|
+
'a calculadora não devolveu o grupo IBSCBS do item',
|
|
948
|
+
);
|
|
936
949
|
continue;
|
|
937
950
|
}
|
|
938
951
|
((itens[n] as ItemMontado).det.imposto as Record<string, unknown>).IBSCBS = g.IBSCBS;
|
|
@@ -1418,6 +1431,7 @@ export async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Pro
|
|
|
1418
1431
|
pl: pl.vigencia,
|
|
1419
1432
|
infNFe: inf,
|
|
1420
1433
|
xml,
|
|
1434
|
+
...(aliquotasInformadas.length === 0 ? {} : { aliquotasInformadas }),
|
|
1421
1435
|
},
|
|
1422
1436
|
};
|
|
1423
1437
|
}
|
package/src/index.ts
CHANGED
|
@@ -107,7 +107,13 @@ export type {
|
|
|
107
107
|
Volume,
|
|
108
108
|
} from './model.ts';
|
|
109
109
|
export { MotivoDesoneracaoIcms, TipoPagamento } from './model.ts';
|
|
110
|
-
export type {
|
|
110
|
+
export type {
|
|
111
|
+
AliquotaIbsCbsInformada,
|
|
112
|
+
CalculadoraIbsCbs,
|
|
113
|
+
PedidoIbsCbsItem,
|
|
114
|
+
PedidoIbsCbsNota,
|
|
115
|
+
RespostaIbsCbs,
|
|
116
|
+
} from './ports.ts';
|
|
111
117
|
export { rotuloDoCaminho } from './rotulo.ts';
|
|
112
118
|
export type { CalculadoraIbsCbsOpcoes, GrupoIbsCbs } from './rtc.ts';
|
|
113
119
|
export { calculadoraIbsCbs, carregarDatasetEmbarcado, localDaOperacao } from './rtc.ts';
|
package/src/ports.ts
CHANGED
|
@@ -74,9 +74,28 @@ export interface PedidoIbsCbsNota {
|
|
|
74
74
|
readonly compraGov?: { readonly tpEnteGov: string; readonly pRedutor: Decimal; readonly tpOperGov: string };
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Alíquota do IBS/CBS que entrou no cálculo de um item vinda de quem integra (`comAliquotasInformadas`), e não da tabela
|
|
79
|
+
* oficial do pacote.
|
|
80
|
+
*/
|
|
81
|
+
export interface AliquotaIbsCbsInformada {
|
|
82
|
+
/** Número do item na nota (1 a 990). */
|
|
83
|
+
readonly nItem: number;
|
|
84
|
+
readonly tributo: 'CBS' | 'IBSUF' | 'IBSMun';
|
|
85
|
+
/** Percentual nominal informado (`'8.7'` = 8,7%). */
|
|
86
|
+
readonly valor: string;
|
|
87
|
+
/** O motivo declarado em `comAliquotasInformadas`. */
|
|
88
|
+
readonly motivo: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
77
91
|
/** Resultado da calculadora: o grupo `IBSCBS` de cada item pedido, já na forma lexical do leiaute. */
|
|
78
92
|
export interface RespostaIbsCbs {
|
|
79
93
|
readonly itens: readonly { readonly nItem: number; readonly IBSCBS: TTribNFe }[];
|
|
94
|
+
/**
|
|
95
|
+
* As alíquotas que não vieram da tabela oficial: a montagem as repassa em `NfeMontada.aliquotasInformadas`. Ausente
|
|
96
|
+
* ou vazio quando todas foram oficiais; a calculadora de fora do sinete que não sabe dizer pode omitir.
|
|
97
|
+
*/
|
|
98
|
+
readonly aliquotasInformadas?: readonly AliquotaIbsCbsInformada[];
|
|
80
99
|
/**
|
|
81
100
|
* Problemas de classificação ou de dado (`caminho` relativo ao item, como `itens[2].impostos.ibsCbs`). A ocorrência sem
|
|
82
101
|
* `origem` entra como `montagem` (ADR 0011); marque `entrada` a que aponta um valor da nota.
|
package/src/rtc.ts
CHANGED
|
@@ -28,7 +28,13 @@ import { calcular, ErroClassificacao, ErroRegimeNaoSuportado } from '@sinete/ibs
|
|
|
28
28
|
import type { Regra } from '@sinete/ibs-cbs/validar';
|
|
29
29
|
import { documentoDoRoc, validar } from '@sinete/ibs-cbs/validar';
|
|
30
30
|
import type { DatasetIbsCbs } from '@sinete/ibs-cbs-dados';
|
|
31
|
-
import type {
|
|
31
|
+
import type {
|
|
32
|
+
AliquotaIbsCbsInformada,
|
|
33
|
+
CalculadoraIbsCbs,
|
|
34
|
+
PedidoIbsCbsItem,
|
|
35
|
+
PedidoIbsCbsNota,
|
|
36
|
+
RespostaIbsCbs,
|
|
37
|
+
} from './ports.ts';
|
|
32
38
|
|
|
33
39
|
/** Grupo `IBSCBS` do item, como o `@sinete/nfe` o recebe. */
|
|
34
40
|
export type GrupoIbsCbs = RespostaIbsCbs['itens'][number]['IBSCBS'];
|
|
@@ -109,15 +115,42 @@ function grupoDoLeiaute(g: IBSCBS, indDoacao: '1' | undefined): GrupoIbsCbs {
|
|
|
109
115
|
} as GrupoIbsCbs;
|
|
110
116
|
}
|
|
111
117
|
|
|
112
|
-
/**
|
|
113
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Erro do motor ou das alíquotas como uma ocorrência no caminho do item (o primeiro, quando o erro não diz o item).
|
|
120
|
+
* `semAliquota` acha o item que pediu a alíquota desconhecida: o erro do provedor diz o tributo e a data, não o item.
|
|
121
|
+
*/
|
|
122
|
+
function ocorrenciaDoMotor(
|
|
123
|
+
e: unknown,
|
|
124
|
+
itens: readonly PedidoIbsCbsItem[],
|
|
125
|
+
semAliquota: () => number | undefined,
|
|
126
|
+
): Ocorrencia | undefined {
|
|
114
127
|
if (e instanceof ErroClassificacao || e instanceof ErroRegimeNaoSuportado) {
|
|
115
128
|
const path = e.item !== undefined ? caminho(e.item) : caminho(itens[0]?.nItem ?? 1);
|
|
116
129
|
return { caminho: path, code: e.code, mensagem: e.message, origem: 'entrada' };
|
|
117
130
|
}
|
|
118
131
|
// Alíquota que o sinete não conhece para a data: falta de dado do pacote, não da nota.
|
|
119
|
-
if (e instanceof ErroAliquotaDesconhecida)
|
|
120
|
-
|
|
132
|
+
if (e instanceof ErroAliquotaDesconhecida) {
|
|
133
|
+
const n = semAliquota() ?? itens[0]?.nItem ?? 1;
|
|
134
|
+
return { caminho: caminho(n), code: e.code, mensagem: e.message, origem: 'montagem' };
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* O primeiro item (pela ordem de `nItem`, a do motor) cujo cálculo sozinho pede uma alíquota desconhecida. Só roda na
|
|
141
|
+
* recusa, para pôr a ocorrência no item em vez de na nota.
|
|
142
|
+
*/
|
|
143
|
+
function primeiroItemSemAliquota(
|
|
144
|
+
op: OperacaoClassificada,
|
|
145
|
+
calc: (op: OperacaoClassificada) => unknown,
|
|
146
|
+
): number | undefined {
|
|
147
|
+
for (const it of [...op.itens].sort((a, b) => a.n - b.n)) {
|
|
148
|
+
try {
|
|
149
|
+
calc({ ...op, itens: [it] });
|
|
150
|
+
} catch (e) {
|
|
151
|
+
if (e instanceof ErroAliquotaDesconhecida) return it.n;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
121
154
|
return undefined;
|
|
122
155
|
}
|
|
123
156
|
|
|
@@ -234,16 +267,18 @@ function calcularCom(
|
|
|
234
267
|
itens: classificados,
|
|
235
268
|
};
|
|
236
269
|
const time = contextoDeTempo({ emissao: relogioFixo(nota.emissao), fatoGerador: relogioFixo(nota.fatoGerador) });
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
roc = calcular(op, {
|
|
270
|
+
const calc = (o: OperacaoClassificada): Roc =>
|
|
271
|
+
calcular(o, {
|
|
240
272
|
dataset,
|
|
241
273
|
aliquotas: rates,
|
|
242
274
|
tempo: time,
|
|
243
275
|
...(options.deslocamentoMin === undefined ? {} : { deslocamentoMin: options.deslocamentoMin }),
|
|
244
276
|
});
|
|
277
|
+
let roc: Roc;
|
|
278
|
+
try {
|
|
279
|
+
roc = calc(op);
|
|
245
280
|
} catch (e) {
|
|
246
|
-
const issue = ocorrenciaDoMotor(e, itens);
|
|
281
|
+
const issue = ocorrenciaDoMotor(e, itens, () => primeiroItemSemAliquota(op, calc));
|
|
247
282
|
if (issue === undefined) throw e;
|
|
248
283
|
return { itens: [], ocorrencias: [issue] };
|
|
249
284
|
}
|
|
@@ -295,11 +330,17 @@ function calcularCom(
|
|
|
295
330
|
}
|
|
296
331
|
|
|
297
332
|
const porItem = new Map(itens.map((it) => [it.nItem, it]));
|
|
333
|
+
const informadas: AliquotaIbsCbsInformada[] = roc.itens.flatMap((r) =>
|
|
334
|
+
r.aliquotas
|
|
335
|
+
.filter((a) => a.situacao === 'informada')
|
|
336
|
+
.map((a) => ({ nItem: r.nItem, tributo: a.tributo, valor: a.valor, motivo: a.motivo ?? '' })),
|
|
337
|
+
);
|
|
298
338
|
return {
|
|
299
339
|
itens: roc.itens.map((r) => ({
|
|
300
340
|
nItem: r.nItem,
|
|
301
341
|
IBSCBS: grupoDoLeiaute(r.IBSCBS, porItem.get(r.nItem)?.indDoacao),
|
|
302
342
|
})),
|
|
343
|
+
...(informadas.length === 0 ? {} : { aliquotasInformadas: informadas }),
|
|
303
344
|
...(issues.length === 0 ? {} : { ocorrencias: issues }),
|
|
304
345
|
};
|
|
305
346
|
}
|
package/src/versao-gerada.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// GERADO por scripts/versao-gerada.ts a partir do package.json. Não edite: rode `bun scripts/versao-gerada.ts`.
|
|
2
2
|
/** Versão de `@sinete/nfe`, para o padrão de `verProc`/`verAplic` (`formatarVerProc` do @sinete/core). */
|
|
3
|
-
export const VERSAO_PACOTE = '0.
|
|
3
|
+
export const VERSAO_PACOTE = '0.4.0';
|