sunat-engine-nest 1.0.4 → 1.0.6

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 CHANGED
@@ -14,7 +14,7 @@ pnpm add sunat-engine-nest
14
14
 
15
15
  ## Configuración
16
16
 
17
- Registra el módulo en tu `AppModule`:
17
+ Registra el módulo en tu `AppModule`. Puedes definir las credenciales de tu empresa **una sola vez** en el módulo usando el campo `sunat`, evitando repetirlas en cada llamada.
18
18
 
19
19
  ```typescript
20
20
  import { SunatEngineModule } from 'sunat-engine-nest';
@@ -23,6 +23,13 @@ import { SunatEngineModule } from 'sunat-engine-nest';
23
23
  @Module({
24
24
  imports: [
25
25
  SunatEngineModule.forRoot({
26
+ sunat: {
27
+ ruc: '20123456789',
28
+ solUser: 'MODDATOS',
29
+ solPass: 'moddatos',
30
+ certPem: 'BASE64_DEL_P12_O_PEM',
31
+ endpointMode: 'beta', // 'beta' | 'produccion'
32
+ },
26
33
  gre: {
27
34
  authUrl: 'https://gre-test.nubefact.com/v1',
28
35
  apiUrl: 'https://gre-test.nubefact.com/v1',
@@ -47,6 +54,13 @@ import { ConfigModule, ConfigService } from '@nestjs/config';
47
54
  imports: [ConfigModule],
48
55
  inject: [ConfigService],
49
56
  useFactory: (config: ConfigService) => ({
57
+ sunat: {
58
+ ruc: config.get('SUNAT_RUC'),
59
+ solUser: config.get('SUNAT_SOL_USER'),
60
+ solPass: config.get('SUNAT_SOL_PASS'),
61
+ certPem: config.get('SUNAT_CERT_PEM'),
62
+ endpointMode: config.get('SUNAT_MODE') ?? 'beta',
63
+ },
50
64
  gre: {
51
65
  authUrl: config.get('GRE_AUTH_URL'),
52
66
  apiUrl: config.get('GRE_API_URL'),
@@ -60,37 +74,35 @@ import { ConfigModule, ConfigService } from '@nestjs/config';
60
74
  export class AppModule {}
61
75
  ```
62
76
 
63
- ## Variables de entorno (GRE)
77
+ ## Variables de entorno (sunat + GRE)
64
78
 
65
79
  ```env
80
+ SUNAT_RUC=20123456789
81
+ SUNAT_SOL_USER=MODDATOS
82
+ SUNAT_SOL_PASS=moddatos
83
+ SUNAT_CERT_PEM=BASE64_DEL_P12
84
+ SUNAT_MODE=beta
85
+
66
86
  GRE_AUTH_URL=https://gre-test.nubefact.com/v1
67
87
  GRE_API_URL=https://gre-test.nubefact.com/v1
68
88
  GRE_CLIENT_ID=tu_client_id
69
89
  GRE_CLIENT_SECRET=tu_client_secret
70
- GRE_SCOPE=https://api-cpe.sunat.gob.pe
71
90
  ```
72
91
 
73
92
  ## Uso
74
93
 
75
- Inyecta `SunatEngineService` en cualquier servicio o controlador:
94
+ Inyecta `SunatEngineService` en cualquier servicio o controlador. Si configuraste `sunat:{}` en el módulo, **no necesitas pasar credenciales en cada llamada**:
76
95
 
77
96
  ```typescript
78
97
  import { Injectable } from '@nestjs/common';
79
- import { SunatEngineService, InvoicePayload, CompanyCredentials } from 'sunat-engine-nest';
98
+ import { SunatEngineService, InvoicePayload } from 'sunat-engine-nest';
80
99
 
81
100
  @Injectable()
82
101
  export class InvoicesService {
83
102
  constructor(private readonly engine: SunatEngineService) {}
84
103
 
85
104
  async sendInvoice() {
86
- const credentials: CompanyCredentials = {
87
- ruc: '20123456789',
88
- solUser: 'MODDATOS',
89
- solPass: 'moddatos',
90
- certPem: 'BASE64_DEL_P12_O_PEM',
91
- endpointMode: 'beta', // 'beta' | 'produccion'
92
- };
93
-
105
+ // Sin credenciales usa las del módulo automáticamente
94
106
  const payload: InvoicePayload = {
95
107
  tipoOperacion: '0101',
96
108
  tipoDoc: '01', // 01=Factura, 03=Boleta
@@ -132,11 +144,25 @@ export class InvoicesService {
132
144
  mtoImpVenta: 236,
133
145
  };
134
146
 
135
- return this.engine.sendInvoice(payload, credentials);
147
+ return this.engine.sendInvoice(payload); // credenciales del módulo
136
148
  }
137
149
  }
138
150
  ```
139
151
 
152
+ También puedes sobreescribir las credenciales por llamada cuando manejas múltiples empresas:
153
+
154
+ ```typescript
155
+ // Credenciales específicas para esta llamada (tienen prioridad sobre el módulo)
156
+ return this.engine.sendInvoice(payload, {
157
+ ruc: '20987654321',
158
+ solUser: 'OTRO_USUARIO',
159
+ solPass: 'otra_clave',
160
+ certPem: 'OTRO_CERT_BASE64',
161
+ });
162
+ ```
163
+
164
+ ```
165
+
140
166
  ## Documentos soportados
141
167
 
142
168
  | Tipo | Método | Descripción |
@@ -212,6 +238,59 @@ interface EngineResponse {
212
238
  | `beta` | e-beta.sunat.gob.pe | gre-test.nubefact.com |
213
239
  | `produccion` | e-factura.sunat.gob.pe | api-cpe.sunat.gob.pe |
214
240
 
241
+ ## Proveedor: SUNAT directo vs OSE
242
+
243
+ Puedes elegir enviar tus comprobantes **directamente a SUNAT** o a través de un **OSE (Operador de Servicios Electrónicos)** autorizado como Nubefact, EFACT, DigiFlow, Bizlinks, entre otros.
244
+
245
+ ```typescript
246
+ // Envío directo a SUNAT (por defecto)
247
+ SunatEngineModule.forRoot({
248
+ provider: 'sunat',
249
+ sunat: { ruc: '...', solUser: '...', solPass: '...', certPem: '...' },
250
+ })
251
+
252
+ // Envío a través de un OSE
253
+ SunatEngineModule.forRoot({
254
+ provider: 'ose',
255
+ sunat: { ruc: '...', certPem: '...' }, // solo se usa para firmar el XML
256
+ ose: {
257
+ url: 'https://api.tuose.com/v1/documents',
258
+ token: 'TU_TOKEN_OSE', // Bearer token
259
+ // o en lugar de token:
260
+ // username: 'usuario',
261
+ // password: 'clave',
262
+ },
263
+ })
264
+ ```
265
+
266
+ Con variables de entorno:
267
+
268
+ ```typescript
269
+ SunatEngineModule.forRootAsync({
270
+ useFactory: (config: ConfigService) => ({
271
+ provider: config.get('PROVIDER'), // 'sunat' | 'ose'
272
+ sunat: {
273
+ ruc: config.get('SUNAT_RUC'),
274
+ solUser: config.get('SUNAT_SOL_USER'),
275
+ solPass: config.get('SUNAT_SOL_PASS'),
276
+ certPem: config.get('SUNAT_CERT_PEM'),
277
+ },
278
+ ose: {
279
+ url: config.get('OSE_URL'),
280
+ token: config.get('OSE_TOKEN'),
281
+ },
282
+ }),
283
+ })
284
+ ```
285
+
286
+ ```env
287
+ PROVIDER=ose
288
+ OSE_URL=https://api.tuose.com/v1/documents
289
+ OSE_TOKEN=tu_token_aqui
290
+ ```
291
+
292
+ > El `OseClient` es genérico y compatible con cualquier OSE que acepte `{ fileName, contentFile }` (ZIP en base64) vía POST con autenticación Bearer o Basic.
293
+
215
294
  ## Soporte y actualizaciones
216
295
 
217
296
  SUNAT actualiza continuamente sus esquemas, validaciones y normativas de facturación electrónica. Este paquete recibe mantenimiento activo para mantenerse alineado con cada cambio oficial, garantizando que tu integración siga funcionando sin interrupciones.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  export { SunatEngineModule, SUNAT_ENGINE_OPTIONS } from './sunat-engine.module';
2
- export type { SunatEngineOptions, SunatEngineAsyncOptions, SunatEngineGreOptions } from './sunat-engine.module';
2
+ export type { SunatEngineOptions, SunatEngineAsyncOptions, SunatEngineGreOptions, SunatEngineCredentialsOptions, SunatEngineOseOptions } from './sunat-engine.module';
3
3
  export { SunatEngineService } from './sunat-engine.service';
4
4
  export { XmlSignerService } from './signer/xml-signer.service';
5
5
  export { SunatSoapClient } from './soap/sunat-soap.client';
6
6
  export type { SoapSendResult, SunatEndpointType } from './soap/sunat-soap.client';
7
7
  export { SunatGreClient } from './gre/sunat-gre.client';
8
+ export { OseClient } from './ose/ose.client';
9
+ export type { OseClientOptions } from './ose/ose.client';
8
10
  export { CdrParserService } from './cdr/cdr-parser.service';
9
11
  export { DocumentPdfService } from './pdf/document-pdf.service';
10
12
  export type { PdfFormat } from './pdf/document-pdf.service';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildVoidedXml = exports.buildSummaryXml = exports.buildDespatchXml = exports.buildNoteXml = exports.buildInvoiceXml = exports.DocumentPdfService = exports.CdrParserService = exports.SunatGreClient = exports.SunatSoapClient = exports.XmlSignerService = exports.SunatEngineService = exports.SUNAT_ENGINE_OPTIONS = exports.SunatEngineModule = void 0;
3
+ exports.buildVoidedXml = exports.buildSummaryXml = exports.buildDespatchXml = exports.buildNoteXml = exports.buildInvoiceXml = exports.DocumentPdfService = exports.CdrParserService = exports.OseClient = exports.SunatGreClient = exports.SunatSoapClient = exports.XmlSignerService = exports.SunatEngineService = exports.SUNAT_ENGINE_OPTIONS = exports.SunatEngineModule = void 0;
4
4
  var sunat_engine_module_1 = require("./sunat-engine.module");
5
5
  Object.defineProperty(exports, "SunatEngineModule", { enumerable: true, get: function () { return sunat_engine_module_1.SunatEngineModule; } });
6
6
  Object.defineProperty(exports, "SUNAT_ENGINE_OPTIONS", { enumerable: true, get: function () { return sunat_engine_module_1.SUNAT_ENGINE_OPTIONS; } });
@@ -12,6 +12,8 @@ var sunat_soap_client_1 = require("./soap/sunat-soap.client");
12
12
  Object.defineProperty(exports, "SunatSoapClient", { enumerable: true, get: function () { return sunat_soap_client_1.SunatSoapClient; } });
13
13
  var sunat_gre_client_1 = require("./gre/sunat-gre.client");
14
14
  Object.defineProperty(exports, "SunatGreClient", { enumerable: true, get: function () { return sunat_gre_client_1.SunatGreClient; } });
15
+ var ose_client_1 = require("./ose/ose.client");
16
+ Object.defineProperty(exports, "OseClient", { enumerable: true, get: function () { return ose_client_1.OseClient; } });
15
17
  var cdr_parser_service_1 = require("./cdr/cdr-parser.service");
16
18
  Object.defineProperty(exports, "CdrParserService", { enumerable: true, get: function () { return cdr_parser_service_1.CdrParserService; } });
17
19
  var document_pdf_service_1 = require("./pdf/document-pdf.service");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,6DAAgF;AAAvE,wHAAA,iBAAiB,OAAA;AAAE,2HAAA,oBAAoB,OAAA;AAIhD,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAG3B,kEAA+D;AAAtD,sHAAA,gBAAgB,OAAA;AACzB,8DAA2D;AAAlD,oHAAA,eAAe,OAAA;AAExB,2DAAwD;AAA/C,kHAAA,cAAc,OAAA;AACvB,+DAA4D;AAAnD,sHAAA,gBAAgB,OAAA;AACzB,mEAAgE;AAAvD,0HAAA,kBAAkB,OAAA;AAI3B,yDAAwD;AAA/C,kHAAA,eAAe,OAAA;AACxB,mDAAkD;AAAzC,4GAAA,YAAY,OAAA;AACrB,2DAA0D;AAAjD,oHAAA,gBAAgB,OAAA;AACzB,yDAAwD;AAA/C,kHAAA,eAAe,OAAA;AACxB,uDAAsD;AAA7C,gHAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,6DAAgF;AAAvE,wHAAA,iBAAiB,OAAA;AAAE,2HAAA,oBAAoB,OAAA;AAIhD,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAG3B,kEAA+D;AAAtD,sHAAA,gBAAgB,OAAA;AACzB,8DAA2D;AAAlD,oHAAA,eAAe,OAAA;AAExB,2DAAwD;AAA/C,kHAAA,cAAc,OAAA;AACvB,+CAA6C;AAApC,uGAAA,SAAS,OAAA;AAElB,+DAA4D;AAAnD,sHAAA,gBAAgB,OAAA;AACzB,mEAAgE;AAAvD,0HAAA,kBAAkB,OAAA;AAI3B,yDAAwD;AAA/C,kHAAA,eAAe,OAAA;AACxB,mDAAkD;AAAzC,4GAAA,YAAY,OAAA;AACrB,2DAA0D;AAAjD,oHAAA,gBAAgB,OAAA;AACzB,yDAAwD;AAA/C,kHAAA,eAAe,OAAA;AACxB,uDAAsD;AAA7C,gHAAA,cAAc,OAAA"}
@@ -0,0 +1,24 @@
1
+ import { SoapSendResult } from '../soap/sunat-soap.client';
2
+ export interface OseClientOptions {
3
+ url: string;
4
+ token?: string;
5
+ username?: string;
6
+ password?: string;
7
+ }
8
+ export declare class OseClient {
9
+ private readonly logger;
10
+ sendBill(params: {
11
+ fileName: string;
12
+ xmlSigned: string;
13
+ ose: OseClientOptions;
14
+ }): Promise<SoapSendResult>;
15
+ sendSummary(params: {
16
+ fileName: string;
17
+ xmlSigned: string;
18
+ ose: OseClientOptions;
19
+ }): Promise<SoapSendResult>;
20
+ private parseResponse;
21
+ private buildAuth;
22
+ private handleError;
23
+ private createZip;
24
+ }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var OseClient_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.OseClient = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const axios_1 = require("axios");
13
+ const JSZip = require("jszip");
14
+ let OseClient = OseClient_1 = class OseClient {
15
+ constructor() {
16
+ this.logger = new common_1.Logger(OseClient_1.name);
17
+ }
18
+ async sendBill(params) {
19
+ const contentFile = await this.createZip(params.fileName, params.xmlSigned);
20
+ try {
21
+ const response = await axios_1.default.post(params.ose.url, { fileName: params.fileName.replace(/\.zip$/i, ''), contentFile }, {
22
+ headers: {
23
+ 'Content-Type': 'application/json',
24
+ 'Authorization': this.buildAuth(params.ose),
25
+ },
26
+ timeout: 60_000,
27
+ });
28
+ return this.parseResponse(response.data);
29
+ }
30
+ catch (err) {
31
+ return this.handleError(err);
32
+ }
33
+ }
34
+ async sendSummary(params) {
35
+ const contentFile = await this.createZip(params.fileName, params.xmlSigned);
36
+ try {
37
+ const response = await axios_1.default.post(params.ose.url, { fileName: params.fileName.replace(/\.zip$/i, ''), contentFile }, {
38
+ headers: {
39
+ 'Content-Type': 'application/json',
40
+ 'Authorization': this.buildAuth(params.ose),
41
+ },
42
+ timeout: 60_000,
43
+ });
44
+ return this.parseResponse(response.data);
45
+ }
46
+ catch (err) {
47
+ return this.handleError(err);
48
+ }
49
+ }
50
+ parseResponse(data) {
51
+ if (!data) {
52
+ return { success: false, error: { code: 'EMPTY_RESPONSE', message: 'El OSE no devolvió respuesta' } };
53
+ }
54
+ const cdrZip = data.cdrZip || data.cdr || data.applicationResponse || data.contentFile || undefined;
55
+ const ticket = data.ticket ?? data.numTicket;
56
+ const codeRaw = data.cdrResponse?.code ?? data.code ?? data.codigoRespuesta;
57
+ const code = codeRaw !== undefined ? String(codeRaw) : undefined;
58
+ const description = data.cdrResponse?.description ?? data.description ?? data.descripcion;
59
+ const success = data.success !== undefined ? Boolean(data.success) : code === '0';
60
+ if (!success) {
61
+ return {
62
+ success: false,
63
+ error: {
64
+ code: code ?? 'OSE_ERROR',
65
+ message: description ?? 'Error devuelto por el OSE',
66
+ },
67
+ };
68
+ }
69
+ return { success: true, cdrZipBase64: cdrZip, ticket };
70
+ }
71
+ buildAuth(ose) {
72
+ if (ose.token)
73
+ return `Bearer ${ose.token}`;
74
+ if (ose.username && ose.password) {
75
+ return `Basic ${Buffer.from(`${ose.username}:${ose.password}`).toString('base64')}`;
76
+ }
77
+ return '';
78
+ }
79
+ handleError(err) {
80
+ const data = err.response?.data;
81
+ if (data) {
82
+ const msg = data.message ?? data.description ?? data.descripcion ?? JSON.stringify(data);
83
+ const code = String(data.code ?? data.codigoRespuesta ?? err.response?.status ?? 'OSE_ERROR');
84
+ return { success: false, error: { code, message: msg } };
85
+ }
86
+ this.logger.error(`Error OSE: ${err.message}`);
87
+ return { success: false, error: { code: 'NETWORK_ERROR', message: err.message } };
88
+ }
89
+ async createZip(fileName, xmlContent) {
90
+ const zip = new JSZip();
91
+ const xmlFileName = fileName.replace(/\.zip$/i, '.xml');
92
+ zip.file(xmlFileName, xmlContent, { compression: 'DEFLATE' });
93
+ const zipBuffer = await zip.generateAsync({ type: 'nodebuffer' });
94
+ return zipBuffer.toString('base64');
95
+ }
96
+ };
97
+ exports.OseClient = OseClient;
98
+ exports.OseClient = OseClient = OseClient_1 = __decorate([
99
+ (0, common_1.Injectable)()
100
+ ], OseClient);
101
+ //# sourceMappingURL=ose.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ose.client.js","sourceRoot":"","sources":["../../src/ose/ose.client.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,24 @@ export interface SunatEngineGreOptions {
9
9
  solPass?: string;
10
10
  scope?: string;
11
11
  }
12
+ export interface SunatEngineCredentialsOptions {
13
+ ruc?: string;
14
+ solUser?: string;
15
+ solPass?: string;
16
+ certPem?: string;
17
+ certKey?: string;
18
+ endpointMode?: 'beta' | 'produccion';
19
+ }
20
+ export interface SunatEngineOseOptions {
21
+ url: string;
22
+ token?: string;
23
+ username?: string;
24
+ password?: string;
25
+ }
12
26
  export interface SunatEngineOptions {
27
+ provider?: 'sunat' | 'ose';
28
+ sunat?: SunatEngineCredentialsOptions;
29
+ ose?: SunatEngineOseOptions;
13
30
  gre?: SunatEngineGreOptions;
14
31
  }
15
32
  export interface SunatEngineAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
@@ -15,12 +15,14 @@ const sunat_soap_client_1 = require("./soap/sunat-soap.client");
15
15
  const sunat_gre_client_1 = require("./gre/sunat-gre.client");
16
16
  const cdr_parser_service_1 = require("./cdr/cdr-parser.service");
17
17
  const document_pdf_service_1 = require("./pdf/document-pdf.service");
18
+ const ose_client_1 = require("./ose/ose.client");
18
19
  exports.SUNAT_ENGINE_OPTIONS = 'SUNAT_ENGINE_OPTIONS';
19
20
  const ENGINE_PROVIDERS = [
20
21
  sunat_engine_service_1.SunatEngineService,
21
22
  xml_signer_service_1.XmlSignerService,
22
23
  sunat_soap_client_1.SunatSoapClient,
23
24
  sunat_gre_client_1.SunatGreClient,
25
+ ose_client_1.OseClient,
24
26
  cdr_parser_service_1.CdrParserService,
25
27
  document_pdf_service_1.DocumentPdfService,
26
28
  ];
@@ -29,6 +31,7 @@ const ENGINE_EXPORTS = [
29
31
  xml_signer_service_1.XmlSignerService,
30
32
  sunat_soap_client_1.SunatSoapClient,
31
33
  sunat_gre_client_1.SunatGreClient,
34
+ ose_client_1.OseClient,
32
35
  cdr_parser_service_1.CdrParserService,
33
36
  document_pdf_service_1.DocumentPdfService,
34
37
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"sunat-engine.module.js","sourceRoot":"","sources":["../src/sunat-engine.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+E;AAC/E,iEAA4D;AAC5D,oEAA+D;AAC/D,gEAA2D;AAC3D,6DAAwD;AACxD,iEAA4D;AAC5D,qEAAgE;AAwBnD,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAI3D,MAAM,gBAAgB,GAAG;IACvB,yCAAkB;IAClB,qCAAgB;IAChB,mCAAe;IACf,iCAAc;IACd,qCAAgB;IAChB,yCAAkB;CACnB,CAAC;AAEF,MAAM,cAAc,GAAG;IACrB,yCAAkB;IAClB,qCAAgB;IAChB,mCAAe;IACf,iCAAc;IACd,qCAAgB;IAChB,yCAAkB;CACnB,CAAC;AAIK,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAc5B,MAAM,CAAC,OAAO,CAAC,UAA8B,EAAE;QAC7C,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,4BAAoB,EAAE,QAAQ,EAAE,OAAO,EAAE;gBACpD,GAAG,gBAAgB;aACpB;YACD,OAAO,EAAE,cAAc;SACxB,CAAC;IACJ,CAAC;IAkBD,MAAM,CAAC,YAAY,CAAC,YAAqC;QACvD,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,EAAE;YACnC,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,4BAAoB;oBAC7B,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE;iBAClC;gBACD,GAAG,gBAAgB;aACpB;YACD,OAAO,EAAE,cAAc;SACxB,CAAC;IACJ,CAAC;CACF,CAAA;AA1DY,8CAAiB;4BAAjB,iBAAiB;IAF7B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,iBAAiB,CA0D7B"}
1
+ {"version":3,"file":"sunat-engine.module.js","sourceRoot":"","sources":["../src/sunat-engine.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+E;AAC/E,iEAA4D;AAC5D,oEAA+D;AAC/D,gEAA2D;AAC3D,6DAAwD;AACxD,iEAA4D;AAC5D,qEAAgE;AAChE,iDAA6C;AA2ChC,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAI3D,MAAM,gBAAgB,GAAG;IACvB,yCAAkB;IAClB,qCAAgB;IAChB,mCAAe;IACf,iCAAc;IACd,sBAAS;IACT,qCAAgB;IAChB,yCAAkB;CACnB,CAAC;AAEF,MAAM,cAAc,GAAG;IACrB,yCAAkB;IAClB,qCAAgB;IAChB,mCAAe;IACf,iCAAc;IACd,sBAAS;IACT,qCAAgB;IAChB,yCAAkB;CACnB,CAAC;AAIK,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAc5B,MAAM,CAAC,OAAO,CAAC,UAA8B,EAAE;QAC7C,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,4BAAoB,EAAE,QAAQ,EAAE,OAAO,EAAE;gBACpD,GAAG,gBAAgB;aACpB;YACD,OAAO,EAAE,cAAc;SACxB,CAAC;IACJ,CAAC;IAkBD,MAAM,CAAC,YAAY,CAAC,YAAqC;QACvD,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,EAAE;YACnC,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,4BAAoB;oBAC7B,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE;iBAClC;gBACD,GAAG,gBAAgB;aACpB;YACD,OAAO,EAAE,cAAc;SACxB,CAAC;IACJ,CAAC;CACF,CAAA;AA1DY,8CAAiB;4BAAjB,iBAAiB;IAF7B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,iBAAiB,CA0D7B"}
@@ -2,19 +2,25 @@ import { CompanyCredentials, EngineResponse, InvoicePayload, NotePayload, Despat
2
2
  import { XmlSignerService } from './signer/xml-signer.service';
3
3
  import { SunatSoapClient } from './soap/sunat-soap.client';
4
4
  import { SunatGreClient } from './gre/sunat-gre.client';
5
+ import { OseClient } from './ose/ose.client';
5
6
  import { CdrParserService } from './cdr/cdr-parser.service';
7
+ import { SunatEngineOptions } from './sunat-engine.module';
6
8
  export declare class SunatEngineService {
7
9
  private readonly signer;
8
10
  private readonly soap;
9
11
  private readonly gre;
12
+ private readonly oseClient;
10
13
  private readonly cdrParser;
14
+ private readonly options;
11
15
  private readonly logger;
12
- constructor(signer: XmlSignerService, soap: SunatSoapClient, gre: SunatGreClient, cdrParser: CdrParserService);
13
- sendInvoice(payload: InvoicePayload, credentials: CompanyCredentials): Promise<EngineResponse>;
14
- sendNote(payload: NotePayload, credentials: CompanyCredentials): Promise<EngineResponse>;
15
- sendDespatch(payload: DespatchPayload, credentials: CompanyCredentials): Promise<EngineResponse>;
16
- sendSummary(payload: SummaryPayload, credentials: CompanyCredentials): Promise<EngineResponse>;
17
- sendVoided(payload: VoidedPayload, credentials: CompanyCredentials): Promise<EngineResponse>;
18
- getTicketStatus(ticket: string, credentials: CompanyCredentials, endpointType?: 'factura' | 'guia'): Promise<EngineResponse>;
16
+ constructor(signer: XmlSignerService, soap: SunatSoapClient, gre: SunatGreClient, oseClient: OseClient, cdrParser: CdrParserService, options: SunatEngineOptions);
17
+ private useOse;
18
+ private resolveCredentials;
19
+ sendInvoice(payload: InvoicePayload, credentials?: Partial<CompanyCredentials>): Promise<EngineResponse>;
20
+ sendNote(payload: NotePayload, credentials?: Partial<CompanyCredentials>): Promise<EngineResponse>;
21
+ sendDespatch(payload: DespatchPayload, credentials?: Partial<CompanyCredentials>): Promise<EngineResponse>;
22
+ sendSummary(payload: SummaryPayload, credentials?: Partial<CompanyCredentials>): Promise<EngineResponse>;
23
+ sendVoided(payload: VoidedPayload, credentials?: Partial<CompanyCredentials>): Promise<EngineResponse>;
24
+ getTicketStatus(ticket: string, credentials?: Partial<CompanyCredentials>, endpointType?: 'factura' | 'guia'): Promise<EngineResponse>;
19
25
  private signDocument;
20
26
  }