@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.
- package/README.md +55 -50
- package/dist/build/build.d.ts +23 -23
- package/dist/build/build.d.ts.map +1 -1
- package/dist/build/destinatario.d.ts +2 -2
- package/dist/build/ibscbs.d.ts.map +1 -1
- package/dist/build/nfce.d.ts +5 -5
- package/dist/build/nfce.d.ts.map +1 -1
- package/dist/build/pl.d.ts +4 -4
- package/dist/build/pl.d.ts.map +1 -1
- package/dist/build/rejeicoes.d.ts +7 -7
- package/dist/build/rejeicoes.d.ts.map +1 -1
- package/dist/build/textos.d.ts +26 -0
- package/dist/build/textos.d.ts.map +1 -0
- package/dist/build/values.d.ts +8 -8
- package/dist/build/values.d.ts.map +1 -1
- package/dist/decimal.d.ts +2 -2
- package/dist/decimal.d.ts.map +1 -1
- package/dist/format.d.ts +19 -19
- package/dist/format.d.ts.map +1 -1
- package/dist/ibs-cbs.d.ts +10 -5
- package/dist/ibs-cbs.d.ts.map +1 -1
- package/dist/ibs-cbs.js +35 -35
- package/dist/ibs-cbs.js.map +3 -3
- package/dist/index.d.ts +18 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +796 -588
- package/dist/index.js.map +27 -26
- package/dist/issues.d.ts +10 -10
- package/dist/issues.d.ts.map +1 -1
- package/dist/model.d.ts +4 -4
- package/dist/ports.d.ts +15 -15
- package/dist/ports.d.ts.map +1 -1
- package/dist/rotulo.d.ts +2 -2
- package/dist/rotulo.d.ts.map +1 -1
- package/dist/rtc.d.ts +23 -23
- package/dist/rtc.d.ts.map +1 -1
- package/dist/services/client.d.ts +44 -40
- package/dist/services/client.d.ts.map +1 -1
- package/dist/services/gzip.d.ts +1 -1
- package/dist/services/gzip.d.ts.map +1 -1
- package/dist/services/index.d.ts +4 -4
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/outcome.d.ts +3 -3
- package/dist/services/outcome.d.ts.map +1 -1
- package/dist/services/proc.d.ts +6 -6
- package/dist/services/proc.d.ts.map +1 -1
- package/dist/services/recuperar.d.ts +8 -7
- package/dist/services/recuperar.d.ts.map +1 -1
- package/dist/services/resolver.d.ts +12 -11
- package/dist/services/resolver.d.ts.map +1 -1
- package/dist/services/soap.d.ts +8 -8
- package/dist/services/soap.d.ts.map +1 -1
- package/dist/time.d.ts +4 -4
- package/dist/time.d.ts.map +1 -1
- package/dist/versao-gerada.d.ts +1 -1
- package/package.json +9 -9
- package/src/build/build.ts +213 -203
- package/src/build/destinatario.ts +8 -8
- package/src/build/ibscbs.ts +10 -6
- package/src/build/icms.ts +6 -6
- package/src/build/nfce.ts +19 -19
- package/src/build/pl.ts +12 -12
- package/src/build/rejeicoes.ts +13 -13
- package/src/build/textos.ts +228 -0
- package/src/build/values.ts +14 -14
- package/src/data/arredondamento.json +1 -1
- package/src/data/cstat.json +6 -6
- package/src/data/fusos.json +1 -1
- package/src/data/nfce-urls.json +2 -2
- package/src/data/produtor-rural.json +1 -1
- package/src/data/resp-tec.json +1 -1
- package/src/decimal.ts +10 -9
- package/src/format.ts +29 -28
- package/src/ibs-cbs.ts +79 -74
- package/src/index.ts +29 -27
- package/src/issues.ts +11 -11
- package/src/model.ts +4 -4
- package/src/ports.ts +15 -15
- package/src/rotulo.ts +4 -4
- package/src/rtc.ts +91 -91
- package/src/services/client.ts +248 -217
- package/src/services/gzip.ts +7 -7
- package/src/services/index.ts +12 -10
- package/src/services/outcome.ts +9 -9
- package/src/services/proc.ts +50 -49
- package/src/services/recuperar.ts +29 -25
- package/src/services/resolver.ts +25 -23
- package/src/services/soap.ts +35 -35
- package/src/time.ts +6 -6
- package/src/versao-gerada.ts +1 -1
package/src/build/values.ts
CHANGED
|
@@ -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 {
|
|
10
|
-
import {
|
|
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:
|
|
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 =
|
|
42
|
+
const problem = problemaDeFormato(d, format);
|
|
43
43
|
if (problem !== undefined) {
|
|
44
|
-
this.issues.add(path, 'decimal_invalido', `${problem} (${format.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
105
|
-
return
|
|
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:
|
|
109
|
+
so(value: Decimal | undefined, format: FormatoDecimal): string | undefined {
|
|
110
110
|
if (value === undefined) return undefined;
|
|
111
|
-
if (format.
|
|
112
|
-
return
|
|
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
|
|
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": {
|
package/src/data/cstat.json
CHANGED
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
"consumoIndevido": ["656"],
|
|
24
24
|
"dicas": {
|
|
25
25
|
"656": {
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
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
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
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
|
}
|
package/src/data/fusos.json
CHANGED
|
@@ -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
|
|
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)",
|
package/src/data/nfce-urls.json
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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": {
|
package/src/data/resp-tec.json
CHANGED
|
@@ -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
|
|
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 {
|
|
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)
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
223
|
-
return Decimal.of(
|
|
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(
|
|
228
|
+
export function sum(valores: Iterable<Decimal>): Decimal {
|
|
228
229
|
let acc = Decimal.ZERO;
|
|
229
|
-
for (const v of
|
|
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
|
|
8
|
+
export interface FormatoDecimal {
|
|
9
9
|
/** Nome curto, para mensagens. */
|
|
10
|
-
readonly
|
|
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
|
|
16
|
+
readonly minimoAbaixoDeUm?: number;
|
|
17
17
|
/** O pattern recusa zero (`TDec_1302Opc`, `TDec_0302a04Opc`): o campo zerado deve ser omitido. */
|
|
18
|
-
readonly
|
|
18
|
+
readonly naoNulo?: boolean;
|
|
19
19
|
/** Maior quantidade de dígitos inteiros aceita. */
|
|
20
|
-
readonly
|
|
20
|
+
readonly digitosInteiros: number;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
/** `TDec_1302`, `TDec1302RTC`: 13 inteiros e exatamente 2 casas. */
|
|
24
|
-
export const D1302:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
50
|
-
const r =
|
|
51
|
-
let places = Math.max(
|
|
52
|
-
if (
|
|
53
|
-
|
|
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
|
|
58
|
-
if (
|
|
59
|
-
if (
|
|
60
|
-
if (
|
|
61
|
-
const intDigits =
|
|
62
|
-
if (intDigits >
|
|
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`: `
|
|
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`, `
|
|
9
|
-
* mesmos; a `
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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 (`
|
|
3
|
-
* estrita (`
|
|
4
|
-
* (`
|
|
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 {
|
|
33
|
-
export {
|
|
34
|
-
export type {
|
|
35
|
-
export {
|
|
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 {
|
|
110
|
+
export type { CalculadoraIbsCbs, PedidoIbsCbsItem, PedidoIbsCbsNota, RespostaIbsCbs } from './ports.ts';
|
|
111
111
|
export { rotuloDoCaminho } from './rotulo.ts';
|
|
112
|
-
export type {
|
|
113
|
-
export {
|
|
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
|
-
|
|
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
|
-
|
|
139
|
+
ResultadoAutorizacao,
|
|
140
|
+
ResultadoConsulta,
|
|
141
|
+
ResultadoEvento,
|
|
142
|
+
ResultadoInutilizacao,
|
|
142
143
|
StatusServico,
|
|
144
|
+
StatusServicoOpcoes,
|
|
143
145
|
} from './services/client.ts';
|
|
144
|
-
export { autorizadorContingencia,
|
|
145
|
-
export {
|
|
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,
|
|
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 {
|
|
155
|
+
export { deslocamentoDaUf, formatarDh } from './time.ts';
|