@sinete/nfe 0.1.0 → 0.3.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.
Files changed (90) hide show
  1. package/README.md +55 -50
  2. package/dist/build/build.d.ts +23 -23
  3. package/dist/build/build.d.ts.map +1 -1
  4. package/dist/build/destinatario.d.ts +2 -2
  5. package/dist/build/ibscbs.d.ts.map +1 -1
  6. package/dist/build/nfce.d.ts +5 -5
  7. package/dist/build/nfce.d.ts.map +1 -1
  8. package/dist/build/pl.d.ts +4 -4
  9. package/dist/build/pl.d.ts.map +1 -1
  10. package/dist/build/rejeicoes.d.ts +7 -7
  11. package/dist/build/rejeicoes.d.ts.map +1 -1
  12. package/dist/build/textos.d.ts +26 -0
  13. package/dist/build/textos.d.ts.map +1 -0
  14. package/dist/build/values.d.ts +8 -8
  15. package/dist/build/values.d.ts.map +1 -1
  16. package/dist/decimal.d.ts +2 -2
  17. package/dist/decimal.d.ts.map +1 -1
  18. package/dist/format.d.ts +19 -19
  19. package/dist/format.d.ts.map +1 -1
  20. package/dist/ibs-cbs.d.ts +10 -5
  21. package/dist/ibs-cbs.d.ts.map +1 -1
  22. package/dist/ibs-cbs.js +35 -35
  23. package/dist/ibs-cbs.js.map +3 -3
  24. package/dist/index.d.ts +18 -18
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +796 -588
  27. package/dist/index.js.map +27 -26
  28. package/dist/issues.d.ts +10 -10
  29. package/dist/issues.d.ts.map +1 -1
  30. package/dist/model.d.ts +4 -4
  31. package/dist/ports.d.ts +15 -15
  32. package/dist/ports.d.ts.map +1 -1
  33. package/dist/rotulo.d.ts +2 -2
  34. package/dist/rotulo.d.ts.map +1 -1
  35. package/dist/rtc.d.ts +23 -23
  36. package/dist/rtc.d.ts.map +1 -1
  37. package/dist/services/client.d.ts +44 -40
  38. package/dist/services/client.d.ts.map +1 -1
  39. package/dist/services/gzip.d.ts +1 -1
  40. package/dist/services/gzip.d.ts.map +1 -1
  41. package/dist/services/index.d.ts +4 -4
  42. package/dist/services/index.d.ts.map +1 -1
  43. package/dist/services/outcome.d.ts +3 -3
  44. package/dist/services/outcome.d.ts.map +1 -1
  45. package/dist/services/proc.d.ts +6 -6
  46. package/dist/services/proc.d.ts.map +1 -1
  47. package/dist/services/recuperar.d.ts +8 -7
  48. package/dist/services/recuperar.d.ts.map +1 -1
  49. package/dist/services/resolver.d.ts +12 -11
  50. package/dist/services/resolver.d.ts.map +1 -1
  51. package/dist/services/soap.d.ts +8 -8
  52. package/dist/services/soap.d.ts.map +1 -1
  53. package/dist/time.d.ts +4 -4
  54. package/dist/time.d.ts.map +1 -1
  55. package/dist/versao-gerada.d.ts +1 -1
  56. package/package.json +9 -9
  57. package/src/build/build.ts +213 -203
  58. package/src/build/destinatario.ts +8 -8
  59. package/src/build/ibscbs.ts +10 -6
  60. package/src/build/icms.ts +6 -6
  61. package/src/build/nfce.ts +19 -19
  62. package/src/build/pl.ts +12 -12
  63. package/src/build/rejeicoes.ts +13 -13
  64. package/src/build/textos.ts +228 -0
  65. package/src/build/values.ts +14 -14
  66. package/src/data/arredondamento.json +1 -1
  67. package/src/data/cstat.json +6 -6
  68. package/src/data/fusos.json +1 -1
  69. package/src/data/nfce-urls.json +2 -2
  70. package/src/data/produtor-rural.json +1 -1
  71. package/src/data/resp-tec.json +1 -1
  72. package/src/decimal.ts +10 -9
  73. package/src/format.ts +29 -28
  74. package/src/ibs-cbs.ts +79 -74
  75. package/src/index.ts +29 -27
  76. package/src/issues.ts +11 -11
  77. package/src/model.ts +4 -4
  78. package/src/ports.ts +15 -15
  79. package/src/rotulo.ts +4 -4
  80. package/src/rtc.ts +91 -91
  81. package/src/services/client.ts +248 -217
  82. package/src/services/gzip.ts +7 -7
  83. package/src/services/index.ts +12 -10
  84. package/src/services/outcome.ts +9 -9
  85. package/src/services/proc.ts +50 -49
  86. package/src/services/recuperar.ts +29 -25
  87. package/src/services/resolver.ts +25 -23
  88. package/src/services/soap.ts +35 -35
  89. package/src/time.ts +6 -6
  90. package/src/versao-gerada.ts +1 -1
@@ -6,8 +6,8 @@
6
6
 
7
7
  import type { DecimalInput, RoundingMode } from '../decimal.ts';
8
8
  import { Decimal } from '../decimal.ts';
9
- import type { DecimalFormat } from '../format.ts';
10
- import { formatDecimal, formatProblem } from '../format.ts';
9
+ import type { FormatoDecimal } from '../format.ts';
10
+ import { formatarDecimal, problemaDeFormato } from '../format.ts';
11
11
  import type { Issues } from '../issues.ts';
12
12
 
13
13
  /** Famílias de campo com modo de arredondamento próprio (`data/arredondamento.json`). */
@@ -32,23 +32,23 @@ export class Ctx {
32
32
  }
33
33
 
34
34
  /** Entrada opcional; inválida vira ocorrência e `undefined`. */
35
- opt(value: DecimalInput | undefined, path: string, format: DecimalFormat): Decimal | undefined {
35
+ opt(value: DecimalInput | undefined, path: string, format: FormatoDecimal): Decimal | undefined {
36
36
  if (value === undefined) return undefined;
37
37
  const d = Decimal.tryOf(value);
38
38
  if (d === undefined) {
39
39
  this.issues.add(path, 'decimal_invalido', 'número decimal inválido (use ponto como separador, sem milhar)');
40
40
  return undefined;
41
41
  }
42
- const problem = formatProblem(d, format);
42
+ const problem = problemaDeFormato(d, format);
43
43
  if (problem !== undefined) {
44
- this.issues.add(path, 'decimal_invalido', `${problem} (${format.name})`);
44
+ this.issues.add(path, 'decimal_invalido', `${problem} (${format.nome})`);
45
45
  return undefined;
46
46
  }
47
47
  return d;
48
48
  }
49
49
 
50
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: DecimalFormat): Decimal {
51
+ req(value: DecimalInput | undefined, path: string, format: FormatoDecimal): Decimal {
52
52
  if (value === undefined) {
53
53
  this.issues.add(path, 'campo_obrigatorio', 'campo obrigatório');
54
54
  return Decimal.ZERO;
@@ -57,7 +57,7 @@ export class Ctx {
57
57
  }
58
58
 
59
59
  /** Arredonda um valor calculado no formato do campo pelo modo da família. */
60
- round(value: Decimal, format: DecimalFormat, familia: Familia): Decimal {
60
+ round(value: Decimal, format: FormatoDecimal, familia: Familia): Decimal {
61
61
  return value.round(format.max, this.modes[familia]);
62
62
  }
63
63
 
@@ -73,7 +73,7 @@ export class Ctx {
73
73
  given: DecimalInput | undefined,
74
74
  padrao: Decimal,
75
75
  path: string,
76
- format: DecimalFormat,
76
+ format: FormatoDecimal,
77
77
  familia: Familia,
78
78
  ): Decimal {
79
79
  return this.opt(given, path, format) ?? this.round(padrao, format, familia);
@@ -83,7 +83,7 @@ export class Ctx {
83
83
  given: DecimalInput | undefined,
84
84
  computed: Decimal,
85
85
  path: string,
86
- format: DecimalFormat,
86
+ format: FormatoDecimal,
87
87
  familia: Familia,
88
88
  ): Decimal {
89
89
  const r = this.round(computed, format, familia);
@@ -101,15 +101,15 @@ export class Ctx {
101
101
  }
102
102
 
103
103
  /** Texto no formato do campo. */
104
- s(value: Decimal, format: DecimalFormat): string {
105
- return formatDecimal(value, format);
104
+ s(value: Decimal, format: FormatoDecimal): string {
105
+ return formatarDecimal(value, format);
106
106
  }
107
107
 
108
108
  /** Texto opcional: ausente fica ausente, e zero some nos formatos que não aceitam zero. */
109
- so(value: Decimal | undefined, format: DecimalFormat): string | undefined {
109
+ so(value: Decimal | undefined, format: FormatoDecimal): string | undefined {
110
110
  if (value === undefined) return undefined;
111
- if (format.nonZero && value.isZero()) return undefined;
112
- return formatDecimal(value, format);
111
+ if (format.naoNulo && value.isZero()) return undefined;
112
+ return formatarDecimal(value, format);
113
113
  }
114
114
  }
115
115
 
@@ -1,5 +1,5 @@
1
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 BuildNfeOptions.arredondamento.",
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
3
  "atualizadoEm": "2026-09-26",
4
4
  "familias": {
5
5
  "produto": {
@@ -23,14 +23,14 @@
23
23
  "consumoIndevido": ["656"],
24
24
  "dicas": {
25
25
  "656": {
26
- "probableCause": "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
- "suggestedFix": "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
- "source": "NT 2014.002 v1.02 (Distribuição DF-e), regras de consumo indevido"
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
29
  },
30
30
  "217": {
31
- "probableCause": "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
- "suggestedFix": "Se o envio ficou sem resposta, reenviar exatamente o mesmo XML assinado; se foi emitida em contingência SVC, consultar no SVC.",
33
- "source": "MOC 7.0 Anexo I, serviço de consulta protocolo"
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
34
  }
35
35
  }
36
36
  }
@@ -1,5 +1,5 @@
1
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 offsetMinutes.",
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
3
  "atualizadoEm": "2026-09-26",
4
4
  "fontes": [
5
5
  "Lei 11.662/2008 e Lei 12.876/2013 (fusos horários do Brasil; Acre em UTC-5)",
@@ -1,10 +1,10 @@
1
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 BuildNfeOptions.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.",
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
3
  "atualizadoEm": "2026-09-26",
4
4
  "fontes": [
5
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
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 nfceConsultaUrls do @sinete/transport) (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
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
9
  ],
10
10
  "qrCode": {
@@ -1,5 +1,5 @@
1
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 buildNfe monta).",
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
3
  "atualizadoEm": "2026-09-28",
4
4
  "refNFP": {
5
5
  "modelo04": {
@@ -1,5 +1,5 @@
1
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 BuildNfeOptions.",
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
3
  "atualizadoEm": "2026-09-26",
4
4
  "fonte": "NT 2018.005 v1.50 (responsável técnico e CSRT, adesão a critério da UF)",
5
5
  "padrao": { "infRespTec": "opcional", "csrt": "opcional" },
package/src/decimal.ts CHANGED
@@ -12,7 +12,7 @@
12
12
  * Qual modo vale para qual campo é dado (`data/arredondamento.json`), não regra espalhada no código.
13
13
  */
14
14
 
15
- import { ConfigError } from '@sinete/core';
15
+ import { ErroDeConfiguracao } from '@sinete/core';
16
16
 
17
17
  export type RoundingMode = 'HALF_EVEN' | 'HALF_UP' | 'DOWN';
18
18
 
@@ -44,7 +44,8 @@ export class Decimal {
44
44
 
45
45
  /** Constrói a partir do coeficiente e da escala (`fromParts(1234n, 2)` = 12.34). */
46
46
  static fromParts(coef: bigint, scale: number): Decimal {
47
- if (!Number.isInteger(scale) || scale < 0 || scale > MAX_SCALE) throw new ConfigError(`escala inválida: ${scale}`);
47
+ if (!Number.isInteger(scale) || scale < 0 || scale > MAX_SCALE)
48
+ throw new ErroDeConfiguracao(`escala inválida: ${scale}`);
48
49
  return new Decimal(coef, scale);
49
50
  }
50
51
 
@@ -54,7 +55,7 @@ export class Decimal {
54
55
  */
55
56
  static of(input: DecimalInput): Decimal {
56
57
  const d = Decimal.tryOf(input);
57
- if (d === undefined) throw new ConfigError(`número decimal inválido: ${JSON.stringify(String(input))}`);
58
+ if (d === undefined) throw new ErroDeConfiguracao(`número decimal inválido: ${JSON.stringify(String(input))}`);
58
59
  return d;
59
60
  }
60
61
 
@@ -114,7 +115,7 @@ export class Decimal {
114
115
  /** Divisão com o resultado arredondado em `scale` casas pelo modo dado. */
115
116
  dividedBy(other: DecimalInput, scale: number, mode: RoundingMode): Decimal {
116
117
  const o = Decimal.of(other);
117
- if (o.coef === 0n) throw new ConfigError('divisão por zero');
118
+ if (o.coef === 0n) throw new ErroDeConfiguracao('divisão por zero');
118
119
  // (a / 10^sa) / (b / 10^sb) = a * 10^(sb + scale + 1 - sa) / b, com uma casa de guarda para o arredondamento.
119
120
  const shift = o.scale + scale + 1 - this.scale;
120
121
  const num = shift >= 0 ? this.coef * pow10(shift) : this.coef;
@@ -140,7 +141,7 @@ export class Decimal {
140
141
 
141
142
  /** Arredonda para `scale` casas. Com `scale` maior que a atual, só completa com zeros. */
142
143
  round(scale: number, mode: RoundingMode): Decimal {
143
- if (!Number.isInteger(scale) || scale < 0) throw new ConfigError(`casas decimais inválidas: ${scale}`);
144
+ if (!Number.isInteger(scale) || scale < 0) throw new ErroDeConfiguracao(`casas decimais inválidas: ${scale}`);
144
145
  if (scale >= this.scale) return new Decimal(this.coef * pow10(scale - this.scale), scale);
145
146
  return roundCoef(this.coef, this.scale, scale, mode, false);
146
147
  }
@@ -219,13 +220,13 @@ function roundCoef(coef: bigint, from: number, to: number, mode: RoundingMode, s
219
220
  }
220
221
 
221
222
  /** Atalho para `Decimal.of`. */
222
- export function dec(input: DecimalInput): Decimal {
223
- return Decimal.of(input);
223
+ export function dec(valor: DecimalInput): Decimal {
224
+ return Decimal.of(valor);
224
225
  }
225
226
 
226
227
  /** Soma uma lista (vazia = zero). */
227
- export function sum(values: Iterable<Decimal>): Decimal {
228
+ export function sum(valores: Iterable<Decimal>): Decimal {
228
229
  let acc = Decimal.ZERO;
229
- for (const v of values) acc = acc.plus(v);
230
+ for (const v of valores) acc = acc.plus(v);
230
231
  return acc;
231
232
  }
package/src/format.ts CHANGED
@@ -5,60 +5,61 @@
5
5
 
6
6
  import type { Decimal, RoundingMode } from './decimal.ts';
7
7
 
8
- export interface DecimalFormat {
8
+ export interface FormatoDecimal {
9
9
  /** Nome curto, para mensagens. */
10
- readonly name: string;
10
+ readonly nome: string;
11
11
  /** Casas mínimas (completa com zeros até aqui). */
12
12
  readonly min: number;
13
13
  /** Casas máximas aceitas pelo pattern. */
14
14
  readonly max: number;
15
15
  /** Casas exigidas quando a parte inteira é zero e o valor não é zero (`TDec_0803v`: `0\.[0-9]{3}`). */
16
- readonly minBelowOne?: number;
16
+ readonly minimoAbaixoDeUm?: number;
17
17
  /** O pattern recusa zero (`TDec_1302Opc`, `TDec_0302a04Opc`): o campo zerado deve ser omitido. */
18
- readonly nonZero?: boolean;
18
+ readonly naoNulo?: boolean;
19
19
  /** Maior quantidade de dígitos inteiros aceita. */
20
- readonly intDigits: number;
20
+ readonly digitosInteiros: number;
21
21
  }
22
22
 
23
23
  /** `TDec_1302`, `TDec1302RTC`: 13 inteiros e exatamente 2 casas. */
24
- export const D1302: DecimalFormat = { name: 'TDec_1302', min: 2, max: 2, intDigits: 13 };
24
+ export const D1302: FormatoDecimal = { nome: 'TDec_1302', min: 2, max: 2, digitosInteiros: 13 };
25
25
  /** `TDec_1302Opc`: como `TDec_1302`, sem zero. */
26
- export const D1302_OPC: DecimalFormat = { name: 'TDec_1302Opc', min: 2, max: 2, intDigits: 13, nonZero: true };
26
+ export const D1302_OPC: FormatoDecimal = { nome: 'TDec_1302Opc', min: 2, max: 2, digitosInteiros: 13, naoNulo: true };
27
27
  /** `TDec_0302a04`, `TDec_0302_04RTC`, `TDec_0302a04Max100`: 3 inteiros e 2 a 4 casas. */
28
- export const D0302A04: DecimalFormat = { name: 'TDec_0302a04', min: 2, max: 4, intDigits: 3 };
28
+ export const D0302A04: FormatoDecimal = { nome: 'TDec_0302a04', min: 2, max: 4, digitosInteiros: 3 };
29
29
  /** `TDec_0302a04Opc`: o pattern (`0\.[0-9]{2,4}|...`) aceita zero, ao contrário de `TDec_1302Opc`. */
30
- export const D0302A04_OPC: DecimalFormat = { name: 'TDec_0302a04Opc', min: 2, max: 4, intDigits: 3 };
30
+ export const D0302A04_OPC: FormatoDecimal = { nome: 'TDec_0302a04Opc', min: 2, max: 4, digitosInteiros: 3 };
31
31
  /** `TDec_0302Max100`: 2 casas exatas. */
32
- export const D0302: DecimalFormat = { name: 'TDec_0302Max100', min: 2, max: 2, intDigits: 3 };
32
+ export const D0302: FormatoDecimal = { nome: 'TDec_0302Max100', min: 2, max: 2, digitosInteiros: 3 };
33
33
  /** `TDec_1104v`: 11 inteiros e 0 a 4 casas. */
34
- export const D1104V: DecimalFormat = { name: 'TDec_1104v', min: 0, max: 4, intDigits: 11 };
34
+ export const D1104V: FormatoDecimal = { nome: 'TDec_1104v', min: 0, max: 4, digitosInteiros: 11 };
35
35
  /** `TDec_1104`, `TDec1104RTC`: 11 inteiros e 4 casas. */
36
- export const D1104: DecimalFormat = { name: 'TDec_1104', min: 4, max: 4, intDigits: 11 };
36
+ export const D1104: FormatoDecimal = { nome: 'TDec_1104', min: 4, max: 4, digitosInteiros: 11 };
37
37
  /** `TDec_1110v`: 11 inteiros e 0 a 10 casas. */
38
- export const D1110V: DecimalFormat = { name: 'TDec_1110v', min: 0, max: 10, intDigits: 11 };
38
+ export const D1110V: FormatoDecimal = { nome: 'TDec_1110v', min: 0, max: 10, digitosInteiros: 11 };
39
39
  /** `TDec_1204v`: 12 inteiros e 0 a 4 casas. */
40
- export const D1204V: DecimalFormat = { name: 'TDec_1204v', min: 0, max: 4, intDigits: 12 };
40
+ export const D1204V: FormatoDecimal = { nome: 'TDec_1204v', min: 0, max: 4, digitosInteiros: 12 };
41
41
  /** `TDec_1204`: 12 inteiros e 4 casas quando há fração (4 fixas aqui, que o pattern aceita sempre). */
42
- export const D1204: DecimalFormat = { name: 'TDec_1204', min: 4, max: 4, intDigits: 12 };
42
+ export const D1204: FormatoDecimal = { nome: 'TDec_1204', min: 4, max: 4, digitosInteiros: 12 };
43
43
  /** `TDec_1203`: 12 inteiros e 3 casas. */
44
- export const D1203: DecimalFormat = { name: 'TDec_1203', min: 3, max: 3, intDigits: 12 };
44
+ export const D1203: FormatoDecimal = { nome: 'TDec_1203', min: 3, max: 3, digitosInteiros: 12 };
45
45
  /** `TDec_0803v`: 8 inteiros e até 3 casas; abaixo de 1, exatamente 3. */
46
- export const D0803V: DecimalFormat = { name: 'TDec_0803v', min: 0, max: 3, intDigits: 8, minBelowOne: 3 };
46
+ export const D0803V: FormatoDecimal = { nome: 'TDec_0803v', min: 0, max: 3, digitosInteiros: 8, minimoAbaixoDeUm: 3 };
47
47
 
48
48
  /** Texto do valor já arredondado no formato (arredonda em `max` casas pelo modo dado). */
49
- export function formatDecimal(value: Decimal, format: DecimalFormat, mode: RoundingMode = 'HALF_UP'): string {
50
- const r = value.round(format.max, mode);
51
- let places = Math.max(format.min, Math.min(format.max, r.significantScale()));
52
- if (format.minBelowOne !== undefined && !r.isZero() && r.abs().lt(1)) places = Math.max(places, format.minBelowOne);
53
- return r.toFixed(places, mode);
49
+ export function formatarDecimal(valor: Decimal, formato: FormatoDecimal, modo: RoundingMode = 'HALF_UP'): string {
50
+ const r = valor.round(formato.max, modo);
51
+ let places = Math.max(formato.min, Math.min(formato.max, r.significantScale()));
52
+ if (formato.minimoAbaixoDeUm !== undefined && !r.isZero() && r.abs().lt(1))
53
+ places = Math.max(places, formato.minimoAbaixoDeUm);
54
+ return r.toFixed(places, modo);
54
55
  }
55
56
 
56
57
  /** Por que o valor não cabe no formato, ou `undefined` se cabe sem perder dígitos. */
57
- export function formatProblem(value: Decimal, format: DecimalFormat): string | undefined {
58
- if (value.isNegative()) return 'valor negativo';
59
- if (format.nonZero && value.isZero()) return 'valor zero não é aceito neste campo';
60
- if (value.significantScale() > format.max) return `mais de ${format.max} casas decimais`;
61
- const intDigits = value.round(0, 'DOWN').abs().toString().replace(/^0$/, '').length;
62
- if (intDigits > format.intDigits) return `mais de ${format.intDigits} dígitos inteiros`;
58
+ export function problemaDeFormato(valor: Decimal, formato: FormatoDecimal): string | undefined {
59
+ if (valor.isNegative()) return 'valor negativo';
60
+ if (formato.naoNulo && valor.isZero()) return 'valor zero não é aceito neste campo';
61
+ if (valor.significantScale() > formato.max) return `mais de ${formato.max} casas decimais`;
62
+ const intDigits = valor.round(0, 'DOWN').abs().toString().replace(/^0$/, '').length;
63
+ if (intDigits > formato.digitosInteiros) return `mais de ${formato.digitosInteiros} dígitos inteiros`;
63
64
  return undefined;
64
65
  }
package/src/ibs-cbs.ts CHANGED
@@ -3,87 +3,92 @@
3
3
  * `@sinete/ibs-cbs-dados` diretamente.
4
4
  *
5
5
  * Reexporta o motor inteiro (`@sinete/ibs-cbs`: alíquotas, cálculo, regras da NT 2025.002 e determinação de CST e
6
- * cClassTrib) e o leitor do dataset (`@sinete/ibs-cbs-dados`: `loadDataset`, `verifyDataset`, diff, tipos). O dataset
6
+ * cClassTrib) e o leitor do dataset (`@sinete/ibs-cbs-dados`: `carregarDataset`, `conferirDataset`, diff, tipos). O dataset
7
7
  * embarcado não entra aqui, para não ir para o bundle de quem não o usa: `carregarDatasetEmbarcado()`, na raiz do
8
- * `@sinete/nfe`, o importa sob demanda. `Dec`, `IsoDate` e `Validity` vêm do motor (os de `Dec` e `IsoDate` são os
9
- * mesmos; a `Validity` dos dados, com os campos do dataset, fica acessível pelos tipos que a usam).
8
+ * `@sinete/nfe`, o importa sob demanda. `Dec`, `DataIso` e `Vigencia` vêm do motor (os de `Dec` e `DataIso` são os
9
+ * mesmos; a `Vigencia` dos dados, com os campos do dataset, fica acessível pelos tipos que a usam).
10
+ *
11
+ * Experimental (ADR 0016, seção 5) até o `@sinete/ibs-cbs` sair 1.0: a calculadora espera a norma da base de cálculo
12
+ * (NT 2025.002, UB16-10), e este subpath pode mudar em minor, sempre com changeset.
13
+ *
14
+ * @experimental
10
15
  */
11
16
 
12
17
  // biome-ignore lint/performance/noReExportAll: o subpath existe para reexportar o motor inteiro, e as duas pontas são do mesmo repo.
13
18
  export * from '@sinete/ibs-cbs';
14
19
  export type {
15
- ActorClassTribRecord,
16
- ActorFilter,
17
- ActorGroupRecord,
18
- ActorRecord,
19
- ActorRole,
20
- AnnexRecord,
21
- Applicability,
22
- ApplicabilityRecord,
23
- ApplicabilityResult,
24
- ByTributo,
25
- CbsTransferRecord,
26
- ChangeKind,
27
- ClassTribCredit,
28
- ClassTribFilter,
29
- ClassTribGroups,
30
- ClassTribLegal,
31
- ClassTribRecord,
32
- CredPresCalculation,
33
- CredPresGroups,
34
- CredPresInForce,
35
- CredPresRates,
36
- CredPresRecord,
37
- CstGroups,
38
- CstRecord,
39
- DataSource,
40
- DatasetBundle,
41
- DatasetDiff,
42
- DatasetManifest,
43
- DatasetTables,
44
- DfeLink,
45
- DfeTypeRecord,
46
- Family,
47
- FieldChange,
48
- FixedRateRecord,
49
- GovPurchaseReducerRecord,
50
- IbsCbsDataErrorCode,
51
- IbsCbsDataset,
52
- Indicator,
53
- LegalBasis,
54
- NfseNbsRecord,
55
- Nomenclature,
56
- PrefixException,
57
- RateKind,
58
- RecordChange,
59
- ReductionRecord,
60
- SourceId,
61
- TableDiff,
62
- TableManifest,
63
- TableName,
64
- TaxContent,
65
- TreatmentExpressions,
66
- TreatmentFlags,
67
- TreatmentLink,
68
- TreatmentRecord,
20
+ AliquotasCredPres,
21
+ Aplicabilidade,
22
+ BaseLegal,
23
+ BaseLegalClassTrib,
24
+ BundleDoDataset,
25
+ CalculoCredPres,
26
+ CodigoErroDadosIbsCbs,
27
+ ConteudoTributario,
28
+ CreditoClassTrib,
29
+ CredPresVigente,
30
+ DatasetIbsCbs,
31
+ DiferencaDeDatasets,
32
+ DiferencaDeTabela,
33
+ ExcecaoDePrefixo,
34
+ ExpressoesDoTratamento,
35
+ Familia,
36
+ FiltroClassTrib,
37
+ FiltroDeAtores,
38
+ FonteDoDataset,
39
+ GruposClassTrib,
40
+ GruposCredPres,
41
+ GruposCst,
42
+ IdDaFonte,
43
+ Indicador,
44
+ IndicadoresDoTratamento,
45
+ ManifestoDaTabela,
46
+ ManifestoDoDataset,
47
+ MudancaDeCampo,
48
+ MudancaDeRegistro,
49
+ NomeDaTabela,
50
+ Nomenclatura,
51
+ PapelDoAtor,
52
+ PorTributo,
53
+ RegistroAliquotaFixa,
54
+ RegistroAnexo,
55
+ RegistroAplicabilidade,
56
+ RegistroAtor,
57
+ RegistroAtorClassTrib,
58
+ RegistroClassTrib,
59
+ RegistroCredPres,
60
+ RegistroCst,
61
+ RegistroGrupoDeAtores,
62
+ RegistroNfseNbs,
63
+ RegistroReducao,
64
+ RegistroRedutorCompraGov,
65
+ RegistroTipoDfe,
66
+ RegistroTransferenciaCbs,
67
+ RegistroTratamento,
68
+ ResultadoAplicabilidade,
69
+ TabelasDoDataset,
70
+ TipoDeAliquota,
71
+ TipoDeMudanca,
69
72
  Tributo,
73
+ VinculoDfe,
74
+ VinculoTratamento,
70
75
  } from '@sinete/ibs-cbs-dados';
71
76
  export {
72
- applicability,
73
- BRASILIA_OFFSET_MINUTES,
74
- canonicalJson,
75
- canonicalTable,
76
- changeKind,
77
- civilDate,
78
- contentVersionOf,
79
- DATA_SCHEMA_VERSION,
80
- diffDatasets,
81
- formatDiff,
82
- IbsCbsDataError,
83
- inForce,
84
- isIsoDate,
85
- loadDataset,
86
- requireIsoDate,
87
- TABLE_NAMES,
88
- verifyDataset,
77
+ aplicabilidade,
78
+ carregarDataset,
79
+ compararDatasets,
80
+ conferirDataset,
81
+ DESLOCAMENTO_BRASILIA_MIN,
82
+ dataCivil,
83
+ ErroDadosIbsCbs,
84
+ ehDataIso,
85
+ exigirDataIso,
86
+ formatarDiferenca,
87
+ jsonCanonico,
88
+ NOMES_DAS_TABELAS,
89
+ tabelaCanonica,
90
+ tipoDeMudanca,
91
+ VERSAO_DO_FORMATO_DOS_DADOS,
92
+ versaoDoConteudo,
93
+ vigente,
89
94
  } from '@sinete/ibs-cbs-dados';
package/src/index.ts CHANGED
@@ -1,25 +1,25 @@
1
1
  /**
2
- * `@sinete/nfe`: NF-e modelo 55 e NFC-e modelo 65. Entrada do domínio (`NfeInput`), montagem com totais em decimal exato e validação
3
- * estrita (`buildNfe`), assinatura por splice (`signNfe`) e os serviços da SEFAZ sobre `@sinete/transport`
4
- * (`createNfeClient`). IBS/CBS pelo motor do sinete por padrão (`ibsCbsCalculator`), com o dataset carregado sob
2
+ * `@sinete/nfe`: NF-e modelo 55 e NFC-e modelo 65. Entrada do domínio (`DadosNfe`), montagem com totais em decimal exato e validação
3
+ * estrita (`montarNfe`), assinatura por splice (`assinarNfe`) e os serviços da SEFAZ sobre `@sinete/transport`
4
+ * (`criarClienteNfe`). IBS/CBS pelo motor do sinete por padrão (`calculadoraIbsCbs`), com o dataset carregado sob
5
5
  * demanda. O emissor (bytes gravados antes do envio, trava, retomada, cancelamento com recuperação) está em
6
6
  * `@sinete/emissor/nfe` (ADR 0010).
7
7
  */
8
8
 
9
9
  export type {
10
- BuildNfeOptions,
11
- BuildNfeResult,
12
- BuiltNfe,
13
10
  ExigenciaRespTec,
11
+ MontarNfeOpcoes,
12
+ NfeMontada,
13
+ ResultadoMontagemNfe,
14
14
  } from './build/build.ts';
15
15
  export {
16
+ assinarNfe,
16
17
  assinaturaQrCode,
17
- buildNfe,
18
18
  comQrCode,
19
19
  exigenciaRespTec,
20
20
  hashCsrt,
21
+ montarNfe,
21
22
  NFE_NS,
22
- signNfe,
23
23
  XNOME_HOMOLOGACAO,
24
24
  XPROD_HOMOLOGACAO_NFCE,
25
25
  } from './build/build.ts';
@@ -29,16 +29,17 @@ export { conferirEmitenteDoCertificado } from './build/rejeicoes.ts';
29
29
  export type { Familia } from './build/values.ts';
30
30
  export type { DecimalInput, RoundingMode } from './decimal.ts';
31
31
  export { Decimal, dec, sum } from './decimal.ts';
32
- export type { DecimalFormat } from './format.ts';
33
- export { formatDecimal, formatProblem } from './format.ts';
34
- export type { NfeIssueCode } from './issues.ts';
35
- export { NFE_ISSUE_CODES } from './issues.ts';
32
+ export type { FormatoDecimal } from './format.ts';
33
+ export { formatarDecimal, problemaDeFormato } from './format.ts';
34
+ export type { CodigoOcorrenciaNfe } from './issues.ts';
35
+ export { CODIGOS_OCORRENCIA_NFE } from './issues.ts';
36
36
  export type {
37
37
  ClassificacaoIbsCbs,
38
38
  Cobranca,
39
39
  Contingencia,
40
40
  Crt,
41
41
  CstPisCofinsOutras,
42
+ DadosNfe,
42
43
  Desoneracao,
43
44
  DesoneracaoSt,
44
45
  Destinatario,
@@ -89,7 +90,6 @@ export type {
89
90
  ModBC,
90
91
  ModBCST,
91
92
  ModFrete,
92
- NfeInput,
93
93
  Origem,
94
94
  Pagamento,
95
95
  PisCofins,
@@ -107,47 +107,49 @@ export type {
107
107
  Volume,
108
108
  } from './model.ts';
109
109
  export { MotivoDesoneracaoIcms, TipoPagamento } from './model.ts';
110
- export type { IbsCbsCalculator, IbsCbsItemRequest, IbsCbsNotaRequest, IbsCbsResponse } from './ports.ts';
110
+ export type { CalculadoraIbsCbs, PedidoIbsCbsItem, PedidoIbsCbsNota, RespostaIbsCbs } from './ports.ts';
111
111
  export { rotuloDoCaminho } from './rotulo.ts';
112
- export type { GrupoIbsCbs, IbsCbsCalculatorOptions } from './rtc.ts';
113
- export { carregarDatasetEmbarcado, ibsCbsCalculator, localDaOperacao } from './rtc.ts';
112
+ export type { CalculadoraIbsCbsOpcoes, GrupoIbsCbs } from './rtc.ts';
113
+ export { calculadoraIbsCbs, carregarDatasetEmbarcado, localDaOperacao } from './rtc.ts';
114
114
  export type {
115
115
  AutorDocumento,
116
- AutorizacaoOutcome,
117
116
  AutorizarOpcoes,
118
117
  Cadastro,
119
118
  CadastroPedido,
120
119
  CancelamentoPedido,
121
120
  CancelamentoSubstituicaoPedido,
122
121
  CartaCorrecaoPedido,
122
+ ClienteNfe,
123
+ ClienteNfeOpcoes,
123
124
  ConsultaNfe,
124
- ConsultaOutcome,
125
125
  ConsultaReciboOpcoes,
126
126
  Distribuicao,
127
127
  DistribuicaoConsulta,
128
128
  DistribuicaoOpcoes,
129
129
  DocumentoDistribuido,
130
- EventoOutcome,
130
+ EnvioOpcoes,
131
+ Espera,
131
132
  EventoRegistrado,
132
133
  Inutilizacao,
133
- InutilizacaoOutcome,
134
134
  InutilizacaoPedido,
135
135
  ManifestacaoPedido,
136
136
  ManifestacaoTipo,
137
- NfeClient,
138
- NfeClientOptions,
139
137
  PoliticaRecibo,
140
138
  ProtocoloNfe,
141
- Sleep,
139
+ ResultadoAutorizacao,
140
+ ResultadoConsulta,
141
+ ResultadoEvento,
142
+ ResultadoInutilizacao,
142
143
  StatusServico,
144
+ StatusServicoOpcoes,
143
145
  } from './services/client.ts';
144
- export { autorizadorContingencia, createNfeClient } from './services/client.ts';
145
- export { gunzipBase64 } from './services/gzip.ts';
146
+ export { autorizadorContingencia, criarClienteNfe } from './services/client.ts';
147
+ export { descomprimirGzipBase64 } from './services/gzip.ts';
146
148
  export type { DocumentoAssinado } from './services/proc.ts';
147
- export { documentoAssinado, nfeAssinadaDoProc, sliceElement } from './services/proc.ts';
149
+ export { documentoAssinado, nfeAssinadaDoProc, recortarElemento } from './services/proc.ts';
148
150
  export type { RecuperacaoEvento } from './services/recuperar.ts';
149
151
  export { recuperarEventoRegistrado } from './services/recuperar.ts';
150
152
  export type { ConteudoDoProtocolo, ResolucaoEnvio } from './services/resolver.ts';
151
153
  export { chaveDaDuplicidade, resolverEnvioSemResposta } from './services/resolver.ts';
152
154
  export type { Instante } from './time.ts';
153
- export { formatDh, offsetDaUf } from './time.ts';
155
+ export { deslocamentoDaUf, formatarDh } from './time.ts';