@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/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.
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,mGAAmG;AACnG,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACpF,uEAAuE;IACvE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,+GAA+G;IAC/G,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,uGAAuG;AACvG,MAAM,WAAW,gBAAgB;IAC/B,8GAA8G;IAC9G,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,mHAAmH;IACnH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACpF,kHAAkH;IAClH,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7G;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,sGAAsG;AACtG,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;KAAE,EAAE,CAAC;IACjF;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAClE;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;QAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;KAC7C,GAAG,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC9C"}
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,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExG,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;AAoCD;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAAC,aAAa,CAAC,CASjE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,uBAA4B,GAAG,iBAAiB,CAYzF"}
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"}
@@ -1,3 +1,3 @@
1
1
  /** Versão de `@sinete/nfe`, para o padrão de `verProc`/`verAplic` (`formatarVerProc` do @sinete/core). */
2
- export declare const VERSAO_PACOTE = "0.3.0";
2
+ export declare const VERSAO_PACOTE = "0.4.0";
3
3
  //# sourceMappingURL=versao-gerada.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sinete/nfe",
3
- "version": "0.3.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",
@@ -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
- issues.montagem(
932
- `itens[${n}].impostos.ibsCbs`,
933
- 'ibscbs_calculo',
934
- 'a calculadora não devolveu o grupo IBSCBS do item',
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 { CalculadoraIbsCbs, PedidoIbsCbsItem, PedidoIbsCbsNota, RespostaIbsCbs } from './ports.ts';
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 { CalculadoraIbsCbs, PedidoIbsCbsItem, PedidoIbsCbsNota, RespostaIbsCbs } from './ports.ts';
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
- /** Erro do motor ou das alíquotas como ocorrência no item (ou na nota, quando o erro não diz o item). */
113
- function ocorrenciaDoMotor(e: unknown, itens: readonly PedidoIbsCbsItem[]): Ocorrencia | undefined {
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
- return { caminho: 'impostos.ibsCbs', code: e.code, mensagem: e.message, origem: 'montagem' };
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
- let roc: Roc;
238
- try {
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
  }
@@ -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.0';
3
+ export const VERSAO_PACOTE = '0.4.0';