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 +93 -14
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/ose/ose.client.d.ts +24 -0
- package/dist/ose/ose.client.js +101 -0
- package/dist/ose/ose.client.js.map +1 -0
- package/dist/sunat-engine.module.d.ts +17 -0
- package/dist/sunat-engine.module.js +3 -0
- package/dist/sunat-engine.module.js.map +1 -1
- package/dist/sunat-engine.service.d.ts +13 -7
- package/dist/sunat-engine.service.js +71 -78
- package/dist/sunat-engine.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
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
|
|
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
|
-
|
|
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
|
|
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;
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
}
|