@autohubs/lib-cte 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +96 -0
  3. package/dist/application/use-cases/ConsultarCTeUseCase.d.ts +16 -0
  4. package/dist/application/use-cases/ConsultarCTeUseCase.d.ts.map +1 -0
  5. package/dist/application/use-cases/ConsultarCTeUseCase.js +51 -0
  6. package/dist/application/use-cases/ConsultarCTeUseCase.js.map +1 -0
  7. package/dist/application/use-cases/DesacordoCTeUseCase.d.ts +45 -0
  8. package/dist/application/use-cases/DesacordoCTeUseCase.d.ts.map +1 -0
  9. package/dist/application/use-cases/DesacordoCTeUseCase.js +102 -0
  10. package/dist/application/use-cases/DesacordoCTeUseCase.js.map +1 -0
  11. package/dist/application/use-cases/DistribuicaoDFeUseCase.d.ts +24 -0
  12. package/dist/application/use-cases/DistribuicaoDFeUseCase.d.ts.map +1 -0
  13. package/dist/application/use-cases/DistribuicaoDFeUseCase.js +56 -0
  14. package/dist/application/use-cases/DistribuicaoDFeUseCase.js.map +1 -0
  15. package/dist/application/use-cases/StatusServicoUseCase.d.ts +16 -0
  16. package/dist/application/use-cases/StatusServicoUseCase.d.ts.map +1 -0
  17. package/dist/application/use-cases/StatusServicoUseCase.js +60 -0
  18. package/dist/application/use-cases/StatusServicoUseCase.js.map +1 -0
  19. package/dist/contracts/CertificateProvider.d.ts +2 -0
  20. package/dist/contracts/CertificateProvider.d.ts.map +1 -0
  21. package/dist/contracts/CertificateProvider.js +3 -0
  22. package/dist/contracts/CertificateProvider.js.map +1 -0
  23. package/dist/contracts/SefazTransport.d.ts +2 -0
  24. package/dist/contracts/SefazTransport.d.ts.map +1 -0
  25. package/dist/contracts/SefazTransport.js +3 -0
  26. package/dist/contracts/SefazTransport.js.map +1 -0
  27. package/dist/contracts/XmlSigner.d.ts +2 -0
  28. package/dist/contracts/XmlSigner.d.ts.map +1 -0
  29. package/dist/contracts/XmlSigner.js +3 -0
  30. package/dist/contracts/XmlSigner.js.map +1 -0
  31. package/dist/contracts/index.d.ts +5 -0
  32. package/dist/contracts/index.d.ts.map +1 -0
  33. package/dist/contracts/index.js +3 -0
  34. package/dist/contracts/index.js.map +1 -0
  35. package/dist/core/CTeCore.d.ts +42 -0
  36. package/dist/core/CTeCore.d.ts.map +1 -0
  37. package/dist/core/CTeCore.js +83 -0
  38. package/dist/core/CTeCore.js.map +1 -0
  39. package/dist/core/types.d.ts +16 -0
  40. package/dist/core/types.d.ts.map +1 -0
  41. package/dist/core/types.js +3 -0
  42. package/dist/core/types.js.map +1 -0
  43. package/dist/domain/entities/CTe.d.ts +43 -0
  44. package/dist/domain/entities/CTe.d.ts.map +1 -0
  45. package/dist/domain/entities/CTe.js +28 -0
  46. package/dist/domain/entities/CTe.js.map +1 -0
  47. package/dist/domain/entities/Carga.d.ts +12 -0
  48. package/dist/domain/entities/Carga.d.ts.map +1 -0
  49. package/dist/domain/entities/Carga.js +3 -0
  50. package/dist/domain/entities/Carga.js.map +1 -0
  51. package/dist/domain/entities/Destinatario.d.ts +21 -0
  52. package/dist/domain/entities/Destinatario.d.ts.map +1 -0
  53. package/dist/domain/entities/Destinatario.js +3 -0
  54. package/dist/domain/entities/Destinatario.js.map +1 -0
  55. package/dist/domain/entities/Emitente.d.ts +18 -0
  56. package/dist/domain/entities/Emitente.d.ts.map +1 -0
  57. package/dist/domain/entities/Emitente.js +3 -0
  58. package/dist/domain/entities/Emitente.js.map +1 -0
  59. package/dist/domain/entities/Remetente.d.ts +22 -0
  60. package/dist/domain/entities/Remetente.d.ts.map +1 -0
  61. package/dist/domain/entities/Remetente.js +3 -0
  62. package/dist/domain/entities/Remetente.js.map +1 -0
  63. package/dist/domain/entities/index.d.ts +7 -0
  64. package/dist/domain/entities/index.d.ts.map +1 -0
  65. package/dist/domain/entities/index.js +6 -0
  66. package/dist/domain/entities/index.js.map +1 -0
  67. package/dist/index.d.ts +16 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +30 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/infra/sefaz/consulta-soap.d.ts +24 -0
  72. package/dist/infra/sefaz/consulta-soap.d.ts.map +1 -0
  73. package/dist/infra/sefaz/consulta-soap.js +56 -0
  74. package/dist/infra/sefaz/consulta-soap.js.map +1 -0
  75. package/dist/infra/sefaz/distribuicao-soap.d.ts +39 -0
  76. package/dist/infra/sefaz/distribuicao-soap.d.ts.map +1 -0
  77. package/dist/infra/sefaz/distribuicao-soap.js +92 -0
  78. package/dist/infra/sefaz/distribuicao-soap.js.map +1 -0
  79. package/dist/infra/sefaz/evento-soap.d.ts +48 -0
  80. package/dist/infra/sefaz/evento-soap.d.ts.map +1 -0
  81. package/dist/infra/sefaz/evento-soap.js +118 -0
  82. package/dist/infra/sefaz/evento-soap.js.map +1 -0
  83. package/dist/infra/sefaz/status-servico-soap.d.ts +24 -0
  84. package/dist/infra/sefaz/status-servico-soap.d.ts.map +1 -0
  85. package/dist/infra/sefaz/status-servico-soap.js +56 -0
  86. package/dist/infra/sefaz/status-servico-soap.js.map +1 -0
  87. package/dist/shared/constants/cte-an-urls.d.ts +7 -0
  88. package/dist/shared/constants/cte-an-urls.d.ts.map +1 -0
  89. package/dist/shared/constants/cte-an-urls.js +33 -0
  90. package/dist/shared/constants/cte-an-urls.js.map +1 -0
  91. package/dist/shared/constants/cte-urls.d.ts +76 -0
  92. package/dist/shared/constants/cte-urls.d.ts.map +1 -0
  93. package/dist/shared/constants/cte-urls.js +237 -0
  94. package/dist/shared/constants/cte-urls.js.map +1 -0
  95. package/dist/shared/errors/CTeError.d.ts +5 -0
  96. package/dist/shared/errors/CTeError.d.ts.map +1 -0
  97. package/dist/shared/errors/CTeError.js +12 -0
  98. package/dist/shared/errors/CTeError.js.map +1 -0
  99. package/dist/shared/errors/index.d.ts +3 -0
  100. package/dist/shared/errors/index.d.ts.map +1 -0
  101. package/dist/shared/errors/index.js +10 -0
  102. package/dist/shared/errors/index.js.map +1 -0
  103. package/dist/shared/helpers/evento-id.d.ts +6 -0
  104. package/dist/shared/helpers/evento-id.d.ts.map +1 -0
  105. package/dist/shared/helpers/evento-id.js +11 -0
  106. package/dist/shared/helpers/evento-id.js.map +1 -0
  107. package/package.json +55 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Raphael Serafim
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # @brasil-fiscal/cte
2
+
3
+ Lib open-source em TypeScript para emissao de **CTe (Conhecimento de Transporte Eletronico)** no Brasil. Parte do ecossistema [`@brasil-fiscal`](https://github.com/brasil-fiscal).
4
+
5
+ > **Status: Em desenvolvimento.** Implementados: `statusServico()`, `consultar()`, `desacordo.registrar/cancelar()` e `distribuicaoPorNSU()`. **Validados contra a SEFAZ real** (homologacao e/ou producao): `statusServico`, `consultar` e `distribuicaoPorNSU`. `desacordo` ainda nao foi testado contra a SEFAZ real (tem efeito colateral — registra um evento de verdade). Transmissao, cancelamento do CT-e e carta de correcao ainda nao implementados — ver [PLANO.md](PLANO.md).
6
+
7
+ ## Instalacao
8
+
9
+ ```bash
10
+ npm install @brasil-fiscal/cte
11
+ ```
12
+
13
+ ## O que eh o CTe?
14
+
15
+ O CTe (modelo 57) eh o documento fiscal eletronico que registra prestacoes de servicos de transporte. Ele substitui diversos documentos em papel (CTRC, Nota Fiscal de Servico de Transporte, etc.) e eh obrigatorio para transportadoras no Brasil.
16
+
17
+ ## Estrutura planejada
18
+
19
+ ```typescript
20
+ import { CTeCore } from '@brasil-fiscal/cte';
21
+ import { readFileSync } from 'node:fs';
22
+
23
+ const cte = CTeCore.create({
24
+ pfx: readFileSync('./certificado.pfx'),
25
+ senha: 'senha-do-certificado',
26
+ ambiente: 'homologacao',
27
+ uf: 'MT'
28
+ });
29
+
30
+ await cte.statusServico();
31
+ await cte.consultar('chave-44-digitos');
32
+ await cte.desacordo.registrar({ chaveAcesso, cnpjTomador, justificativa });
33
+ await cte.distribuicaoPorNSU(cnpj); // lista documentos de interesse do CNPJ, paginando por NSU
34
+
35
+ // TODO: Em desenvolvimento
36
+ // await cte.transmitir({ ... });
37
+ // await cte.cancelar({ ... }); // cancelamento do CT-e (documento)
38
+ ```
39
+
40
+ ## Validando contra a SEFAZ real
41
+
42
+ Os scripts em [`examples/`](examples/) sao smoke-tests manuais para rodar com um
43
+ certificado A1 de verdade contra a SEFAZ (recomendado: ambiente de
44
+ homologacao). Copie `.env.example` para `.env`, preencha os dados e rode:
45
+
46
+ ```bash
47
+ npx tsx --env-file=.env examples/status-servico.ts # mais seguro, nao toca em documento real
48
+ npx tsx --env-file=.env examples/consultar-cte.ts # precisa de uma chave real
49
+ npx tsx --env-file=.env examples/distribuicao.ts # lista documentos do CNPJ por NSU, so' leitura
50
+ npx tsx --env-file=.env examples/desacordo.ts --confirmar # registra evento REAL — ver avisos no arquivo
51
+ ```
52
+
53
+ A tabela de UFs/URLs em `src/shared/constants/cte-urls.ts` ainda e' parcial
54
+ (ver PLANO.md) — rode `status-servico.ts` primeiro pra validar UF, certificado
55
+ e webservice antes de qualquer coisa que dependa de uma chave de CT-e real.
56
+
57
+ **Nunca** commite `.env` nem o `.pfx`, e nunca cole conteudo de certificado,
58
+ senha ou dados de clientes reais em chat, issue ou log — ja cobertos pelo
59
+ `.gitignore`.
60
+
61
+ ## Entidades disponiveis
62
+
63
+ | Entidade | Descricao |
64
+ |----------|-----------|
65
+ | `CTe` | Documento principal com identificacao, emitente, remetente, destinatario, carga |
66
+ | `EmitenteProps` | Dados da transportadora emitente |
67
+ | `RemetenteProps` | Dados de quem envia a carga |
68
+ | `DestinatarioProps` | Dados de quem recebe a carga |
69
+ | `CargaProps` | Informacoes da carga (valor, peso, volumes) |
70
+
71
+ ## Dependencias
72
+
73
+ - [`@brasil-fiscal/core`](https://github.com/brasil-fiscal/core) — certificado digital, assinatura XML, transporte mTLS
74
+
75
+ ## Ecossistema @brasil-fiscal
76
+
77
+ | Pacote | Status | Descricao |
78
+ |--------|--------|-----------|
79
+ | [@brasil-fiscal/core](https://github.com/brasil-fiscal/core) | Estavel | Infraestrutura compartilhada |
80
+ | [@brasil-fiscal/nfe](https://github.com/brasil-fiscal/nfe) | Estavel | NFe e NFC-e |
81
+ | **@brasil-fiscal/cte** | Em desenvolvimento | CTe (este pacote) |
82
+ | [@brasil-fiscal/mdfe](https://github.com/brasil-fiscal/mdfe) | Em desenvolvimento | MDFe |
83
+
84
+ ## Requisitos
85
+
86
+ - Node.js >= 18
87
+ - Certificado digital A1 (.pfx ou .p12)
88
+ - OpenSSL instalado
89
+
90
+ ## Contribuindo
91
+
92
+ Contribuicoes sao muito bem-vindas, especialmente para implementar os use cases de transmissao, consulta e cancelamento.
93
+
94
+ ## Licenca
95
+
96
+ [MIT](LICENSE)
@@ -0,0 +1,16 @@
1
+ import { CertificateProvider } from '../../contracts/CertificateProvider';
2
+ import { SefazTransport } from '../../contracts/SefazTransport';
3
+ import { ConsultarCTeResult, CTeEnvironment } from '../../core/types';
4
+ type ConsultarDeps = {
5
+ readonly certificate: CertificateProvider;
6
+ readonly transport: SefazTransport;
7
+ readonly environment: CTeEnvironment;
8
+ };
9
+ export declare class ConsultarCTeUseCase {
10
+ private readonly deps;
11
+ constructor(deps: ConsultarDeps);
12
+ execute(chaveAcesso: string): Promise<ConsultarCTeResult>;
13
+ private validateChave;
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=ConsultarCTeUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsultarCTeUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/ConsultarCTeUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAUrE,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAMF,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,aAAa;IAE1C,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoC/D,OAAO,CAAC,aAAa;CAOtB"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsultarCTeUseCase = void 0;
4
+ const CTeError_1 = require("../../shared/errors/CTeError");
5
+ const core_1 = require("@brasil-fiscal/core");
6
+ const cte_urls_1 = require("../../shared/constants/cte-urls");
7
+ const consulta_soap_1 = require("../../infra/sefaz/consulta-soap");
8
+ function toCteEnv(env) {
9
+ return env === 'homologation' ? 'homologacao' : 'producao';
10
+ }
11
+ class ConsultarCTeUseCase {
12
+ deps;
13
+ constructor(deps) {
14
+ this.deps = deps;
15
+ }
16
+ async execute(chaveAcesso) {
17
+ this.validateChave(chaveAcesso);
18
+ const { certificate, transport, environment } = this.deps;
19
+ const uf = (0, cte_urls_1.ibgeToUf)(chaveAcesso.substring(0, 2));
20
+ const cteEnv = toCteEnv(environment);
21
+ const tpAmb = environment === 'production' ? '1' : '2';
22
+ const url = (0, cte_urls_1.getCteUrl)(uf, cteEnv, 'CTeConsultaProtocolo');
23
+ const envelope = (0, consulta_soap_1.buildConsultaEnvelope)(chaveAcesso, tpAmb);
24
+ const cert = await certificate.load();
25
+ const response = await transport.send({
26
+ url,
27
+ soapAction: consulta_soap_1.CONSULTA_SOAP_ACTION,
28
+ xml: envelope,
29
+ pfx: cert.pfx,
30
+ password: cert.password
31
+ });
32
+ const body = (0, core_1.extractSoapBody)(response.xml);
33
+ const result = (0, consulta_soap_1.parseConsultaResponse)(body);
34
+ if (result.cStat === '100' || result.cStat === '101') {
35
+ return {
36
+ codigoStatus: result.cStat,
37
+ motivo: result.xMotivo,
38
+ protocolo: result.nProt,
39
+ dataAutorizacao: result.dhRecbto ? new Date(result.dhRecbto) : undefined
40
+ };
41
+ }
42
+ throw new core_1.SefazRejectError(result.cStat, result.xMotivo, uf);
43
+ }
44
+ validateChave(chave) {
45
+ if (!/^\d{44}$/.test(chave)) {
46
+ throw new CTeError_1.CTeError(`Chave de acesso invalida: deve ter 44 digitos numericos, recebeu "${chave}"`);
47
+ }
48
+ }
49
+ }
50
+ exports.ConsultarCTeUseCase = ConsultarCTeUseCase;
51
+ //# sourceMappingURL=ConsultarCTeUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsultarCTeUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/ConsultarCTeUseCase.ts"],"names":[],"mappings":";;;AAGA,0DAAuD;AACvD,8CAAwE;AACxE,6DAA0G;AAC1G,kEAIwC;AAQxC,SAAS,QAAQ,CAAC,GAAmB;IACnC,OAAO,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;AAC7D,CAAC;AAED,MAAa,mBAAmB;IACD;IAA7B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO,CAAC,WAAmB;QAC/B,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAEhC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1D,MAAM,EAAE,GAAG,IAAA,mBAAQ,EAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,KAAK,GAAc,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAElE,MAAM,GAAG,GAAG,IAAA,oBAAS,EAAC,EAAE,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAA,qCAAqB,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;YACpC,GAAG;YACH,UAAU,EAAE,oCAAoB;YAChC,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAA,sBAAe,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAA,qCAAqB,EAAC,IAAI,CAAC,CAAC;QAE3C,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACrD,OAAO;gBACL,YAAY,EAAE,MAAM,CAAC,KAAK;gBAC1B,MAAM,EAAE,MAAM,CAAC,OAAO;gBACtB,SAAS,EAAE,MAAM,CAAC,KAAK;gBACvB,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;aACzE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,uBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,mBAAQ,CAChB,qEAAqE,KAAK,GAAG,CAC9E,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA9CD,kDA8CC"}
@@ -0,0 +1,45 @@
1
+ import { CertificateProvider } from '../../contracts/CertificateProvider';
2
+ import { SefazTransport } from '../../contracts/SefazTransport';
3
+ import { XmlSigner } from '../../contracts/XmlSigner';
4
+ import { CTeEnvironment } from '../../core/types';
5
+ import { EventoCTeResult } from '../../infra/sefaz/evento-soap';
6
+ export type { EventoCTeResult } from '../../infra/sefaz/evento-soap';
7
+ type DesacordoDeps = {
8
+ readonly certificate: CertificateProvider;
9
+ readonly transport: SefazTransport;
10
+ readonly xmlSigner: XmlSigner;
11
+ readonly environment: CTeEnvironment;
12
+ };
13
+ /**
14
+ * Exatamente um entre `cnpjTomador`/`cpfTomador` deve ser informado — o
15
+ * tomador do servico pode ser pessoa juridica (CNPJ) ou, desde que a SEFAZ
16
+ * passou a aceitar, pessoa fisica nao-contribuinte (CPF).
17
+ */
18
+ export type RegistrarDesacordoInput = {
19
+ readonly chaveAcesso: string;
20
+ readonly cnpjTomador?: string;
21
+ readonly cpfTomador?: string;
22
+ readonly justificativa: string;
23
+ };
24
+ export type CancelarDesacordoInput = {
25
+ readonly chaveAcesso: string;
26
+ readonly cnpjTomador?: string;
27
+ readonly cpfTomador?: string;
28
+ readonly protocoloDesacordo: string;
29
+ };
30
+ export declare class DesacordoCTeUseCase {
31
+ private readonly deps;
32
+ constructor(deps: DesacordoDeps);
33
+ registrar(input: RegistrarDesacordoInput): Promise<EventoCTeResult>;
34
+ cancelar(input: CancelarDesacordoInput): Promise<EventoCTeResult>;
35
+ private enviar;
36
+ private tpAmb;
37
+ private validateChave;
38
+ /**
39
+ * Exige exatamente um entre `cnpjTomador`/`cpfTomador` — nunca os dois,
40
+ * nunca nenhum. Retorna o `DocumentoTomador` ja' validado, pronto para
41
+ * montar o XML do evento.
42
+ */
43
+ private validateDocumentoTomador;
44
+ }
45
+ //# sourceMappingURL=DesacordoCTeUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesacordoCTeUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/DesacordoCTeUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,OAAO,EAML,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC,CAAC;AAMF,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,aAAa;IAE1C,SAAS,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC;IAoBnE,QAAQ,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;YAoBzD,MAAM;IA0CpB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,aAAa;IAMrB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;CAwBjC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DesacordoCTeUseCase = void 0;
4
+ const CTeError_1 = require("../../shared/errors/CTeError");
5
+ const core_1 = require("@brasil-fiscal/core");
6
+ const cte_urls_1 = require("../../shared/constants/cte-urls");
7
+ const evento_soap_1 = require("../../infra/sefaz/evento-soap");
8
+ function toCteEnv(env) {
9
+ return env === 'homologation' ? 'homologacao' : 'producao';
10
+ }
11
+ class DesacordoCTeUseCase {
12
+ deps;
13
+ constructor(deps) {
14
+ this.deps = deps;
15
+ }
16
+ async registrar(input) {
17
+ this.validateChave(input.chaveAcesso);
18
+ const documentoTomador = this.validateDocumentoTomador(input);
19
+ if (!input.justificativa || input.justificativa.length < 15) {
20
+ throw new CTeError_1.CTeError('Justificativa deve ter no minimo 15 caracteres');
21
+ }
22
+ const cOrgao = input.chaveAcesso.substring(0, 2);
23
+ const eventoXml = (0, evento_soap_1.buildDesacordoXml)(input.chaveAcesso, documentoTomador, cOrgao, this.tpAmb(), (0, core_1.formatDate)(new Date()), input.justificativa);
24
+ return this.enviar(eventoXml, cOrgao);
25
+ }
26
+ async cancelar(input) {
27
+ this.validateChave(input.chaveAcesso);
28
+ const documentoTomador = this.validateDocumentoTomador(input);
29
+ if (!input.protocoloDesacordo) {
30
+ throw new CTeError_1.CTeError('Protocolo do evento de Desacordo e obrigatorio para cancela-lo');
31
+ }
32
+ const cOrgao = input.chaveAcesso.substring(0, 2);
33
+ const eventoXml = (0, evento_soap_1.buildCancelDesacordoXml)(input.chaveAcesso, documentoTomador, cOrgao, this.tpAmb(), (0, core_1.formatDate)(new Date()), input.protocoloDesacordo);
34
+ return this.enviar(eventoXml, cOrgao);
35
+ }
36
+ async enviar(eventoXml, cOrgao) {
37
+ const { certificate, transport, xmlSigner, environment } = this.deps;
38
+ const uf = (0, cte_urls_1.ibgeToUf)(cOrgao);
39
+ const cert = await certificate.load();
40
+ const signedXml = xmlSigner.sign(eventoXml, cert);
41
+ // Guarda de seguranca: o `DefaultXmlSigner` do core so' reconhece
42
+ // <infEvento>/<evento> por padrao (config voltada para NFe). Eventos de
43
+ // CT-e usam a raiz <eventoCTe> — o `CTeCore` precisa instanciar o signer
44
+ // com a config estendida (ver CTeCore.ts). Se isso for esquecido, o
45
+ // `.replace()` interno do signer nao encontra o par de tags e devolve o
46
+ // XML sem assinatura, silenciosamente. Falhar aqui de forma explicita e'
47
+ // preferivel a enviar um evento nao assinado para a SEFAZ.
48
+ if (!signedXml.includes('<Signature')) {
49
+ throw new CTeError_1.CTeError('Falha ao assinar o evento: elemento <Signature> nao encontrado no XML resultante. ' +
50
+ 'Verifique se o XmlSigner esta configurado para reconhecer a raiz <eventoCTe>.');
51
+ }
52
+ const envelope = (0, evento_soap_1.wrapEventoEnvelope)(signedXml);
53
+ const url = (0, cte_urls_1.getCteUrl)(uf, toCteEnv(environment), 'CTeRecepcaoEvento');
54
+ const response = await transport.send({
55
+ url,
56
+ soapAction: evento_soap_1.EVENTO_SOAP_ACTION,
57
+ xml: envelope,
58
+ pfx: cert.pfx,
59
+ password: cert.password
60
+ });
61
+ const body = (0, core_1.extractSoapBody)(response.xml);
62
+ const result = (0, evento_soap_1.parseEventoResponse)(body);
63
+ if (result.cStat === '135' || result.cStat === '136') {
64
+ return result;
65
+ }
66
+ throw new core_1.SefazRejectError(result.cStat, result.xMotivo, uf);
67
+ }
68
+ tpAmb() {
69
+ return this.deps.environment === 'production' ? '1' : '2';
70
+ }
71
+ validateChave(chaveAcesso) {
72
+ if (!/^\d{44}$/.test(chaveAcesso)) {
73
+ throw new CTeError_1.CTeError('Chave de acesso invalida: deve ter 44 digitos numericos');
74
+ }
75
+ }
76
+ /**
77
+ * Exige exatamente um entre `cnpjTomador`/`cpfTomador` — nunca os dois,
78
+ * nunca nenhum. Retorna o `DocumentoTomador` ja' validado, pronto para
79
+ * montar o XML do evento.
80
+ */
81
+ validateDocumentoTomador(input) {
82
+ const { cnpjTomador, cpfTomador } = input;
83
+ if (cnpjTomador && cpfTomador) {
84
+ throw new CTeError_1.CTeError('Informe apenas um entre cnpjTomador e cpfTomador, nao os dois');
85
+ }
86
+ if (!cnpjTomador && !cpfTomador) {
87
+ throw new CTeError_1.CTeError('E necessario informar cnpjTomador ou cpfTomador');
88
+ }
89
+ if (cnpjTomador) {
90
+ if (!/^\d{14}$/.test(cnpjTomador)) {
91
+ throw new CTeError_1.CTeError('CNPJ do tomador invalido: deve ter 14 digitos numericos');
92
+ }
93
+ return { cnpj: cnpjTomador };
94
+ }
95
+ if (!/^\d{11}$/.test(cpfTomador)) {
96
+ throw new CTeError_1.CTeError('CPF do tomador invalido: deve ter 11 digitos numericos');
97
+ }
98
+ return { cpf: cpfTomador };
99
+ }
100
+ }
101
+ exports.DesacordoCTeUseCase = DesacordoCTeUseCase;
102
+ //# sourceMappingURL=DesacordoCTeUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesacordoCTeUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/DesacordoCTeUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { CertificateProvider } from '../../contracts/CertificateProvider';
2
+ import { SefazTransport } from '../../contracts/SefazTransport';
3
+ import { CTeEnvironment } from '../../core/types';
4
+ import { DistribuicaoResult } from '../../infra/sefaz/distribuicao-soap';
5
+ export type { DistribuicaoResult } from '../../infra/sefaz/distribuicao-soap';
6
+ export type { DFeDocument } from '../../infra/sefaz/distribuicao-soap';
7
+ type DistribuicaoDeps = {
8
+ readonly certificate: CertificateProvider;
9
+ readonly transport: SefazTransport;
10
+ readonly environment: CTeEnvironment;
11
+ };
12
+ export declare class DistribuicaoDFeUseCase {
13
+ private readonly deps;
14
+ constructor(deps: DistribuicaoDeps);
15
+ /**
16
+ * Consulta CT-e's e demais documentos de interesse do CNPJ a partir de um
17
+ * NSU (Numero Sequencial Unico). Retorna ate 50 documentos por chamada —
18
+ * use `ultNSU` do resultado como `ultNSU` da proxima chamada para paginar.
19
+ * Passe `ultNSU: '0'` (padrao) para comecar do zero.
20
+ */
21
+ consultarPorNSU(cnpj: string, uf: string, ultNSU?: string): Promise<DistribuicaoResult>;
22
+ private validateCnpj;
23
+ }
24
+ //# sourceMappingURL=DistribuicaoDFeUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DistribuicaoDFeUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/DistribuicaoDFeUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAIL,kBAAkB,EACnB,MAAM,oCAAoC,CAAC;AAE5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,YAAY,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAUF,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,gBAAgB;IAEnD;;;;;OAKG;IACG,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,MAAY,GACnB,OAAO,CAAC,kBAAkB,CAAC;IA8B9B,OAAO,CAAC,YAAY;CAKrB"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DistribuicaoDFeUseCase = void 0;
4
+ const CTeError_1 = require("../../shared/errors/CTeError");
5
+ const core_1 = require("@brasil-fiscal/core");
6
+ const cte_an_urls_1 = require("../../shared/constants/cte-an-urls");
7
+ const cte_urls_1 = require("../../shared/constants/cte-urls");
8
+ const distribuicao_soap_1 = require("../../infra/sefaz/distribuicao-soap");
9
+ function toAnEnv(env) {
10
+ return env === 'homologation' ? 'homologacao' : 'producao';
11
+ }
12
+ function toTpAmb(env) {
13
+ return env === 'production' ? '1' : '2';
14
+ }
15
+ class DistribuicaoDFeUseCase {
16
+ deps;
17
+ constructor(deps) {
18
+ this.deps = deps;
19
+ }
20
+ /**
21
+ * Consulta CT-e's e demais documentos de interesse do CNPJ a partir de um
22
+ * NSU (Numero Sequencial Unico). Retorna ate 50 documentos por chamada —
23
+ * use `ultNSU` do resultado como `ultNSU` da proxima chamada para paginar.
24
+ * Passe `ultNSU: '0'` (padrao) para comecar do zero.
25
+ */
26
+ async consultarPorNSU(cnpj, uf, ultNSU = '0') {
27
+ this.validateCnpj(cnpj);
28
+ const cUFAutor = (0, cte_urls_1.ufToIbge)(uf);
29
+ const anEnv = toAnEnv(this.deps.environment);
30
+ const tpAmb = toTpAmb(this.deps.environment);
31
+ const url = (0, cte_an_urls_1.getCteAnUrl)(anEnv, 'CTeDistribuicaoDFe');
32
+ const envelope = (0, distribuicao_soap_1.buildDistNSUEnvelope)(cnpj, cUFAutor, tpAmb, ultNSU);
33
+ const cert = await this.deps.certificate.load();
34
+ const response = await this.deps.transport.send({
35
+ url,
36
+ soapAction: distribuicao_soap_1.DISTRIBUICAO_SOAP_ACTION,
37
+ xml: envelope,
38
+ pfx: cert.pfx,
39
+ password: cert.password
40
+ });
41
+ const body = (0, core_1.extractSoapBody)(response.xml);
42
+ const result = (0, distribuicao_soap_1.parseDistribuicaoResponse)(body);
43
+ // 137 = nenhum documento localizado, 138 = documentos localizados
44
+ if (result.cStat === '137' || result.cStat === '138') {
45
+ return result;
46
+ }
47
+ throw new core_1.SefazRejectError(result.cStat, result.xMotivo, uf);
48
+ }
49
+ validateCnpj(cnpj) {
50
+ if (!/^\d{14}$/.test(cnpj)) {
51
+ throw new CTeError_1.CTeError(`CNPJ invalido: deve ter 14 digitos numericos, recebeu "${cnpj}"`);
52
+ }
53
+ }
54
+ }
55
+ exports.DistribuicaoDFeUseCase = DistribuicaoDFeUseCase;
56
+ //# sourceMappingURL=DistribuicaoDFeUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DistribuicaoDFeUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/DistribuicaoDFeUseCase.ts"],"names":[],"mappings":";;;AAGA,0DAAuD;AACvD,8CAAwE;AACxE,mEAAkF;AAClF,6DAA0D;AAC1D,0EAK4C;AAW5C,SAAS,OAAO,CAAC,GAAmB;IAClC,OAAO,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;AAC7D,CAAC;AAED,SAAS,OAAO,CAAC,GAAmB;IAClC,OAAO,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,MAAa,sBAAsB;IACJ;IAA7B,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CACnB,IAAY,EACZ,EAAU,EACV,SAAiB,GAAG;QAEpB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAA,mBAAQ,EAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAA,yBAAW,EAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAA,wCAAoB,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAErE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAEhD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC9C,GAAG;YACH,UAAU,EAAE,4CAAwB;YACpC,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAA,sBAAe,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAA,6CAAyB,EAAC,IAAI,CAAC,CAAC;QAE/C,kEAAkE;QAClE,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACrD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,uBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAEO,YAAY,CAAC,IAAY;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,mBAAQ,CAAC,0DAA0D,IAAI,GAAG,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;CACF;AAhDD,wDAgDC"}
@@ -0,0 +1,16 @@
1
+ import { CertificateProvider } from '../../contracts/CertificateProvider';
2
+ import { SefazTransport } from '../../contracts/SefazTransport';
3
+ import { StatusServicoResult, CTeEnvironment } from '../../core/types';
4
+ type StatusServicoDeps = {
5
+ readonly certificate: CertificateProvider;
6
+ readonly transport: SefazTransport;
7
+ readonly environment: CTeEnvironment;
8
+ };
9
+ export declare class StatusServicoUseCase {
10
+ private readonly deps;
11
+ constructor(deps: StatusServicoDeps);
12
+ execute(uf: string): Promise<StatusServicoResult>;
13
+ private validateUf;
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=StatusServicoUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusServicoUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/StatusServicoUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AActE,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAMF,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,iBAAiB;IAE9C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6CvD,OAAO,CAAC,UAAU;CAKnB"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatusServicoUseCase = void 0;
4
+ const CTeError_1 = require("../../shared/errors/CTeError");
5
+ const core_1 = require("@brasil-fiscal/core");
6
+ const cte_urls_1 = require("../../shared/constants/cte-urls");
7
+ const status_servico_soap_1 = require("../../infra/sefaz/status-servico-soap");
8
+ function toCteEnv(env) {
9
+ return env === 'homologation' ? 'homologacao' : 'producao';
10
+ }
11
+ class StatusServicoUseCase {
12
+ deps;
13
+ constructor(deps) {
14
+ this.deps = deps;
15
+ }
16
+ async execute(uf) {
17
+ this.validateUf(uf);
18
+ const { certificate, transport, environment } = this.deps;
19
+ const cteEnv = toCteEnv(environment);
20
+ const tpAmb = environment === 'production' ? '1' : '2';
21
+ const cUF = (0, cte_urls_1.ufToIbge)(uf);
22
+ const url = (0, cte_urls_1.getCteUrl)(uf, cteEnv, 'CTeStatusServico');
23
+ const envelope = (0, status_servico_soap_1.buildStatusServicoEnvelope)(cUF, tpAmb);
24
+ const cert = await certificate.load();
25
+ const response = await transport.send({
26
+ url,
27
+ soapAction: status_servico_soap_1.STATUS_SERVICO_SOAP_ACTION,
28
+ xml: envelope,
29
+ pfx: cert.pfx,
30
+ password: cert.password
31
+ });
32
+ const body = (0, core_1.extractSoapBody)(response.xml);
33
+ const result = (0, status_servico_soap_1.parseStatusServicoResponse)(body);
34
+ // 107 = Em Operacao, 108 = Paralisado Momentaneamente, 109 = Paralisado
35
+ // sem Previsao — todos sao respostas VALIDAS do servico, descrevendo o
36
+ // estado real da SEFAZ, nao uma rejeicao da requisicao. Diferente de
37
+ // ConsultarCTeUseCase/DesacordoCTeUseCase (onde cStat fora do esperado e'
38
+ // de fato uma falha de processamento), aqui o proprio objetivo do use
39
+ // case e' informar esse estado — lancar excecao para "servico pausado"
40
+ // obrigaria quem so' quer checar disponibilidade a fazer try/catch.
41
+ if (result.cStat === '107' || result.cStat === '108' || result.cStat === '109') {
42
+ return {
43
+ codigoStatus: result.cStat,
44
+ motivo: result.xMotivo,
45
+ emOperacao: result.cStat === '107',
46
+ cUF: result.cUF,
47
+ dataConsulta: result.dhRecbto ? new Date(result.dhRecbto) : undefined,
48
+ tempoMedioResposta: result.tMed
49
+ };
50
+ }
51
+ throw new core_1.SefazRejectError(result.cStat, result.xMotivo, uf);
52
+ }
53
+ validateUf(uf) {
54
+ if (!/^[A-Z]{2}$/.test(uf)) {
55
+ throw new CTeError_1.CTeError(`UF invalida: deve ter 2 letras maiusculas, recebeu "${uf}"`);
56
+ }
57
+ }
58
+ }
59
+ exports.StatusServicoUseCase = StatusServicoUseCase;
60
+ //# sourceMappingURL=StatusServicoUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusServicoUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/StatusServicoUseCase.ts"],"names":[],"mappings":";;;AAGA,0DAAuD;AACvD,8CAAwE;AACxE,6DAIwC;AACxC,8EAI8C;AAQ9C,SAAS,QAAQ,CAAC,GAAmB;IACnC,OAAO,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;AAC7D,CAAC;AAED,MAAa,oBAAoB;IACF;IAA7B,YAA6B,IAAuB;QAAvB,SAAI,GAAJ,IAAI,CAAmB;IAAG,CAAC;IAExD,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEpB,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,KAAK,GAAc,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAClE,MAAM,GAAG,GAAG,IAAA,mBAAQ,EAAC,EAAE,CAAC,CAAC;QAEzB,MAAM,GAAG,GAAG,IAAA,oBAAS,EAAC,EAAE,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAA,gDAA0B,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAExD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;YACpC,GAAG;YACH,UAAU,EAAE,gDAA0B;YACtC,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAA,sBAAe,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAA,gDAA0B,EAAC,IAAI,CAAC,CAAC;QAEhD,wEAAwE;QACxE,uEAAuE;QACvE,qEAAqE;QACrE,0EAA0E;QAC1E,sEAAsE;QACtE,uEAAuE;QACvE,oEAAoE;QACpE,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC/E,OAAO;gBACL,YAAY,EAAE,MAAM,CAAC,KAAK;gBAC1B,MAAM,EAAE,MAAM,CAAC,OAAO;gBACtB,UAAU,EAAE,MAAM,CAAC,KAAK,KAAK,KAAK;gBAClC,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrE,kBAAkB,EAAE,MAAM,CAAC,IAAI;aAChC,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,uBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAEO,UAAU,CAAC,EAAU;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,mBAAQ,CAAC,uDAAuD,EAAE,GAAG,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;CACF;AArDD,oDAqDC"}
@@ -0,0 +1,2 @@
1
+ export type { CertificateData, CertificateProvider } from '@brasil-fiscal/core';
2
+ //# sourceMappingURL=CertificateProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CertificateProvider.d.ts","sourceRoot":"","sources":["../../src/contracts/CertificateProvider.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=CertificateProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CertificateProvider.js","sourceRoot":"","sources":["../../src/contracts/CertificateProvider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export type { SefazTransport, SefazRequest, SefazResponse } from '@brasil-fiscal/core';
2
+ //# sourceMappingURL=SefazTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SefazTransport.d.ts","sourceRoot":"","sources":["../../src/contracts/SefazTransport.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SefazTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SefazTransport.js","sourceRoot":"","sources":["../../src/contracts/SefazTransport.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export type { XmlSigner } from '@brasil-fiscal/core';
2
+ //# sourceMappingURL=XmlSigner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlSigner.d.ts","sourceRoot":"","sources":["../../src/contracts/XmlSigner.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=XmlSigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlSigner.js","sourceRoot":"","sources":["../../src/contracts/XmlSigner.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export type { CertificateProvider, CertificateData } from '@brasil-fiscal/core';
2
+ export type { SefazTransport, SefazRequest, SefazResponse } from '@brasil-fiscal/core';
3
+ export type { XmlSigner } from '@brasil-fiscal/core';
4
+ export type { SchemaValidator, ValidationResult, ValidationError } from '@brasil-fiscal/core';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAChF,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":""}