@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.
- package/LICENSE +21 -0
- package/README.md +96 -0
- package/dist/application/use-cases/ConsultarCTeUseCase.d.ts +16 -0
- package/dist/application/use-cases/ConsultarCTeUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/ConsultarCTeUseCase.js +51 -0
- package/dist/application/use-cases/ConsultarCTeUseCase.js.map +1 -0
- package/dist/application/use-cases/DesacordoCTeUseCase.d.ts +45 -0
- package/dist/application/use-cases/DesacordoCTeUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/DesacordoCTeUseCase.js +102 -0
- package/dist/application/use-cases/DesacordoCTeUseCase.js.map +1 -0
- package/dist/application/use-cases/DistribuicaoDFeUseCase.d.ts +24 -0
- package/dist/application/use-cases/DistribuicaoDFeUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/DistribuicaoDFeUseCase.js +56 -0
- package/dist/application/use-cases/DistribuicaoDFeUseCase.js.map +1 -0
- package/dist/application/use-cases/StatusServicoUseCase.d.ts +16 -0
- package/dist/application/use-cases/StatusServicoUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/StatusServicoUseCase.js +60 -0
- package/dist/application/use-cases/StatusServicoUseCase.js.map +1 -0
- package/dist/contracts/CertificateProvider.d.ts +2 -0
- package/dist/contracts/CertificateProvider.d.ts.map +1 -0
- package/dist/contracts/CertificateProvider.js +3 -0
- package/dist/contracts/CertificateProvider.js.map +1 -0
- package/dist/contracts/SefazTransport.d.ts +2 -0
- package/dist/contracts/SefazTransport.d.ts.map +1 -0
- package/dist/contracts/SefazTransport.js +3 -0
- package/dist/contracts/SefazTransport.js.map +1 -0
- package/dist/contracts/XmlSigner.d.ts +2 -0
- package/dist/contracts/XmlSigner.d.ts.map +1 -0
- package/dist/contracts/XmlSigner.js +3 -0
- package/dist/contracts/XmlSigner.js.map +1 -0
- package/dist/contracts/index.d.ts +5 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +3 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/core/CTeCore.d.ts +42 -0
- package/dist/core/CTeCore.d.ts.map +1 -0
- package/dist/core/CTeCore.js +83 -0
- package/dist/core/CTeCore.js.map +1 -0
- package/dist/core/types.d.ts +16 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/domain/entities/CTe.d.ts +43 -0
- package/dist/domain/entities/CTe.d.ts.map +1 -0
- package/dist/domain/entities/CTe.js +28 -0
- package/dist/domain/entities/CTe.js.map +1 -0
- package/dist/domain/entities/Carga.d.ts +12 -0
- package/dist/domain/entities/Carga.d.ts.map +1 -0
- package/dist/domain/entities/Carga.js +3 -0
- package/dist/domain/entities/Carga.js.map +1 -0
- package/dist/domain/entities/Destinatario.d.ts +21 -0
- package/dist/domain/entities/Destinatario.d.ts.map +1 -0
- package/dist/domain/entities/Destinatario.js +3 -0
- package/dist/domain/entities/Destinatario.js.map +1 -0
- package/dist/domain/entities/Emitente.d.ts +18 -0
- package/dist/domain/entities/Emitente.d.ts.map +1 -0
- package/dist/domain/entities/Emitente.js +3 -0
- package/dist/domain/entities/Emitente.js.map +1 -0
- package/dist/domain/entities/Remetente.d.ts +22 -0
- package/dist/domain/entities/Remetente.d.ts.map +1 -0
- package/dist/domain/entities/Remetente.js +3 -0
- package/dist/domain/entities/Remetente.js.map +1 -0
- package/dist/domain/entities/index.d.ts +7 -0
- package/dist/domain/entities/index.d.ts.map +1 -0
- package/dist/domain/entities/index.js +6 -0
- package/dist/domain/entities/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/sefaz/consulta-soap.d.ts +24 -0
- package/dist/infra/sefaz/consulta-soap.d.ts.map +1 -0
- package/dist/infra/sefaz/consulta-soap.js +56 -0
- package/dist/infra/sefaz/consulta-soap.js.map +1 -0
- package/dist/infra/sefaz/distribuicao-soap.d.ts +39 -0
- package/dist/infra/sefaz/distribuicao-soap.d.ts.map +1 -0
- package/dist/infra/sefaz/distribuicao-soap.js +92 -0
- package/dist/infra/sefaz/distribuicao-soap.js.map +1 -0
- package/dist/infra/sefaz/evento-soap.d.ts +48 -0
- package/dist/infra/sefaz/evento-soap.d.ts.map +1 -0
- package/dist/infra/sefaz/evento-soap.js +118 -0
- package/dist/infra/sefaz/evento-soap.js.map +1 -0
- package/dist/infra/sefaz/status-servico-soap.d.ts +24 -0
- package/dist/infra/sefaz/status-servico-soap.d.ts.map +1 -0
- package/dist/infra/sefaz/status-servico-soap.js +56 -0
- package/dist/infra/sefaz/status-servico-soap.js.map +1 -0
- package/dist/shared/constants/cte-an-urls.d.ts +7 -0
- package/dist/shared/constants/cte-an-urls.d.ts.map +1 -0
- package/dist/shared/constants/cte-an-urls.js +33 -0
- package/dist/shared/constants/cte-an-urls.js.map +1 -0
- package/dist/shared/constants/cte-urls.d.ts +76 -0
- package/dist/shared/constants/cte-urls.d.ts.map +1 -0
- package/dist/shared/constants/cte-urls.js +237 -0
- package/dist/shared/constants/cte-urls.js.map +1 -0
- package/dist/shared/errors/CTeError.d.ts +5 -0
- package/dist/shared/errors/CTeError.d.ts.map +1 -0
- package/dist/shared/errors/CTeError.js +12 -0
- package/dist/shared/errors/CTeError.js.map +1 -0
- package/dist/shared/errors/index.d.ts +3 -0
- package/dist/shared/errors/index.d.ts.map +1 -0
- package/dist/shared/errors/index.js +10 -0
- package/dist/shared/errors/index.js.map +1 -0
- package/dist/shared/helpers/evento-id.d.ts +6 -0
- package/dist/shared/helpers/evento-id.d.ts.map +1 -0
- package/dist/shared/helpers/evento-id.js +11 -0
- package/dist/shared/helpers/evento-id.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"CertificateProvider.js","sourceRoot":"","sources":["../../src/contracts/CertificateProvider.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"SefazTransport.js","sourceRoot":"","sources":["../../src/contracts/SefazTransport.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":""}
|