@acontplus/ng-common 1.0.0 → 1.0.2
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 +262 -143
- package/fesm2022/acontplus-ng-common.mjs +361 -57
- package/fesm2022/acontplus-ng-common.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acontplus-ng-common.d.ts +185 -29
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @acontplus/ng-common
|
|
2
2
|
|
|
3
|
-
Librería común para aplicaciones Angular con funcionalidades de WhatsApp Cloud API, reportes e impresión. Incluye utilidades para formateo de teléfonos, manejo de archivos y generación de parámetros de reportes.
|
|
3
|
+
Librería común para aplicaciones Angular con funcionalidades de WhatsApp Cloud API, reportes e impresión. Incluye utilidades estáticas para formateo de teléfonos, manejo de archivos y generación de parámetros de reportes con configuración centralizada.
|
|
4
4
|
|
|
5
5
|
## Instalación
|
|
6
6
|
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
REPORT_PORT,
|
|
27
27
|
PRINTER_PORT,
|
|
28
28
|
MetaWhatsAppAdapter,
|
|
29
|
-
|
|
29
|
+
ReportAdapter,
|
|
30
30
|
PrinterAdapter,
|
|
31
31
|
} from '@acontplus/ng-common';
|
|
32
32
|
|
|
@@ -36,7 +36,7 @@ export const appConfig: ApplicationConfig = {
|
|
|
36
36
|
{ provide: WHATSAPP_MESSAGING_PORT, useClass: MetaWhatsAppAdapter },
|
|
37
37
|
|
|
38
38
|
// Reportes
|
|
39
|
-
{ provide: REPORT_PORT, useClass:
|
|
39
|
+
{ provide: REPORT_PORT, useClass: ReportAdapter },
|
|
40
40
|
|
|
41
41
|
// Impresión
|
|
42
42
|
{ provide: PRINTER_PORT, useClass: PrinterAdapter },
|
|
@@ -70,17 +70,7 @@ export class MyComponent {
|
|
|
70
70
|
).subscribe();
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
// 3. Enviar documento
|
|
74
|
-
sendDocumentByUrl() {
|
|
75
|
-
this.whatsapp.sendDocument(
|
|
76
|
-
'0987654321',
|
|
77
|
-
'https://mi-servidor.com/documento.pdf',
|
|
78
|
-
'Tu factura está lista',
|
|
79
|
-
'factura-001.pdf'
|
|
80
|
-
).subscribe();
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// 4. Enviar documento con template (funciona siempre - RECOMENDADO)
|
|
73
|
+
// 3. Enviar documento con template (funciona siempre - RECOMENDADO)
|
|
84
74
|
sendDocumentWithFile(file: File) {
|
|
85
75
|
this.whatsapp.sendDocumentWithTemplate({
|
|
86
76
|
phone: '0987654321',
|
|
@@ -123,79 +113,202 @@ if (validation.isValid) {
|
|
|
123
113
|
const apiPhone = PhoneFormatterUtil.formatForWhatsAppApi('0987654321');
|
|
124
114
|
// Resultado: "593987654321@c.us"
|
|
125
115
|
|
|
126
|
-
// Formatear para WhatsApp Web
|
|
127
|
-
const webPhone = PhoneFormatterUtil.formatForWhatsAppWeb('0987654321');
|
|
128
|
-
// Resultado: "593987654321"
|
|
129
|
-
|
|
130
116
|
// Formatear para mostrar al usuario
|
|
131
117
|
const displayPhone = PhoneFormatterUtil.formatForDisplay('0987654321');
|
|
132
118
|
// Resultado: "+593 98 765 4321"
|
|
133
|
-
|
|
134
|
-
// Obtener hints dinámicos
|
|
135
|
-
const hint = PhoneFormatterUtil.getPhoneHint('0987654321');
|
|
136
|
-
// Resultado: "Se enviará a: +593 98 765 4321"
|
|
137
119
|
```
|
|
138
120
|
|
|
139
|
-
### Reportes con Builder
|
|
121
|
+
### Reportes con Builder Estático
|
|
140
122
|
|
|
141
123
|
```typescript
|
|
142
|
-
import {
|
|
124
|
+
import {
|
|
125
|
+
ReportFacade,
|
|
126
|
+
ReportParamsBuilder,
|
|
127
|
+
SALE_CODE_REPORT,
|
|
128
|
+
INVENTORY_CODE_REPORT,
|
|
129
|
+
ELECTRONIC_DOCUMENT_CODE,
|
|
130
|
+
REPORT_FORMAT
|
|
131
|
+
} from '@acontplus/ng-common';
|
|
143
132
|
|
|
144
133
|
@Component({...})
|
|
145
134
|
export class ReportsComponent {
|
|
146
|
-
constructor(
|
|
147
|
-
private reports: ReportFacade,
|
|
148
|
-
private reportBuilder: ReportParamsBuilder
|
|
149
|
-
) {}
|
|
135
|
+
constructor(private reportFacade: ReportFacade) {}
|
|
150
136
|
|
|
151
|
-
//
|
|
137
|
+
// Ejemplo 1: Reporte simple de factura
|
|
152
138
|
generateInvoiceReport(id: number, codEstab: string) {
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
139
|
+
const reportOptions = ReportParamsBuilder.build(
|
|
140
|
+
{
|
|
141
|
+
codDoc: ELECTRONIC_DOCUMENT_CODE.FV,
|
|
142
|
+
id,
|
|
143
|
+
codEstab
|
|
144
|
+
},
|
|
145
|
+
REPORT_FORMAT.PDF,
|
|
146
|
+
true // returnBlob
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
this.reportFacade.generate(reportOptions).subscribe(response => {
|
|
150
|
+
console.log('Reporte generado');
|
|
163
151
|
});
|
|
164
152
|
}
|
|
165
153
|
|
|
166
|
-
//
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
154
|
+
// Ejemplo 2: Reporte de ventas con parámetros personalizados
|
|
155
|
+
generateSalesReport() {
|
|
156
|
+
const reportOptions = ReportParamsBuilder.build(
|
|
157
|
+
{
|
|
158
|
+
codDoc: SALE_CODE_REPORT.FG,
|
|
159
|
+
fechaInicio: '2024-01-01',
|
|
160
|
+
fechaFin: '2024-12-31',
|
|
161
|
+
codEstab: '001',
|
|
162
|
+
idUsuario: 5,
|
|
163
|
+
userRoleId: 2
|
|
164
|
+
},
|
|
165
|
+
REPORT_FORMAT.EXCEL
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
this.reportFacade.generate(reportOptions);
|
|
176
169
|
}
|
|
177
170
|
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
171
|
+
// Ejemplo 3: Reporte de inventario con múltiples parámetros
|
|
172
|
+
generateInventoryReport() {
|
|
173
|
+
const reportOptions = ReportParamsBuilder.build(
|
|
174
|
+
{
|
|
175
|
+
codDoc: INVENTORY_CODE_REPORT.ARTICULO_PVP,
|
|
176
|
+
tipo: 2,
|
|
177
|
+
stockStatusCode: 1,
|
|
178
|
+
idTarifa: 3,
|
|
179
|
+
idMarca: 10,
|
|
180
|
+
fechaInicio: this.fromDate,
|
|
181
|
+
fechaFin: this.toDate,
|
|
182
|
+
// Cualquier parámetro adicional se incluye automáticamente
|
|
183
|
+
customParam: 'valor'
|
|
184
|
+
},
|
|
185
|
+
REPORT_FORMAT.PDF
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
this.reportFacade.generate(reportOptions);
|
|
189
|
+
}
|
|
185
190
|
|
|
186
|
-
|
|
187
|
-
|
|
191
|
+
// Ejemplo 4: Reporte condicional
|
|
192
|
+
generateConditionalReport(useCustom: boolean) {
|
|
193
|
+
const reportCode = useCustom
|
|
194
|
+
? SALE_CODE_REPORT.SRRC
|
|
195
|
+
: SALE_CODE_REPORT.SRR;
|
|
196
|
+
|
|
197
|
+
const reportOptions = ReportParamsBuilder.build(
|
|
198
|
+
{
|
|
199
|
+
codDoc: reportCode,
|
|
200
|
+
porcentajeRenta: 15,
|
|
201
|
+
porcentajeComision: 5,
|
|
202
|
+
fechaInicio: this.fromDate,
|
|
203
|
+
fechaFin: this.toDate
|
|
204
|
+
},
|
|
205
|
+
REPORT_FORMAT.PDF
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
this.reportFacade.generate(reportOptions);
|
|
188
209
|
}
|
|
189
210
|
|
|
190
211
|
// Verificar tipos soportados
|
|
191
212
|
checkSupportedTypes() {
|
|
192
|
-
const
|
|
193
|
-
console.log('Tipos soportados:',
|
|
194
|
-
|
|
213
|
+
const types = ReportParamsBuilder.getSupportedDocumentTypes();
|
|
214
|
+
console.log('Tipos soportados:', types);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Verificar si un tipo está soportado
|
|
218
|
+
isSupported(code: string) {
|
|
219
|
+
return ReportParamsBuilder.isDocumentTypeSupported(code);
|
|
195
220
|
}
|
|
196
221
|
}
|
|
197
222
|
```
|
|
198
223
|
|
|
224
|
+
### Constantes de Reportes Disponibles
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
import {
|
|
228
|
+
SALE_CODE_REPORT,
|
|
229
|
+
PURCHASE_CODE_REPORT,
|
|
230
|
+
ACCOUNTING_CODE_REPORT,
|
|
231
|
+
CUSTOMER_CODE_REPORT,
|
|
232
|
+
INVENTORY_CODE_REPORT,
|
|
233
|
+
ELECTRONIC_DOCUMENT_CODE,
|
|
234
|
+
REPORT_FORMAT,
|
|
235
|
+
} from '@acontplus/ng-common';
|
|
236
|
+
|
|
237
|
+
// Reportes de Ventas
|
|
238
|
+
SALE_CODE_REPORT.SRR; // Reporte Rentabilidad
|
|
239
|
+
SALE_CODE_REPORT.SRRC; // Reporte Rentabilidad Custom
|
|
240
|
+
SALE_CODE_REPORT.FG; // Factura General
|
|
241
|
+
|
|
242
|
+
// Reportes de Compras
|
|
243
|
+
PURCHASE_CODE_REPORT.RCNH; // Reporte Compras Nota Hidden
|
|
244
|
+
PURCHASE_CODE_REPORT.RLC; // Reporte Liquidación Compra
|
|
245
|
+
|
|
246
|
+
// Reportes de Contabilidad
|
|
247
|
+
ACCOUNTING_CODE_REPORT.RCEGR; // Estado General Resultado
|
|
248
|
+
ACCOUNTING_CODE_REPORT.ACEDFP; // Estado Flujo de Pago
|
|
249
|
+
ACCOUNTING_CODE_REPORT.ACELC; // Estado Libro Caja
|
|
250
|
+
|
|
251
|
+
// Reportes de Clientes
|
|
252
|
+
CUSTOMER_CODE_REPORT.RCL; // Reporte Cliente Listado
|
|
253
|
+
|
|
254
|
+
// Reportes de Inventario
|
|
255
|
+
INVENTORY_CODE_REPORT.RK; // Kardex
|
|
256
|
+
INVENTORY_CODE_REPORT.CDAA; // Consolidado Artículos Agrupado
|
|
257
|
+
INVENTORY_CODE_REPORT.CDA; // Consolidado Artículos
|
|
258
|
+
INVENTORY_CODE_REPORT.STOCK_VALORACION; // Stock Valoración
|
|
259
|
+
INVENTORY_CODE_REPORT.ARTICULO_PVP; // Artículo Tabla
|
|
260
|
+
INVENTORY_CODE_REPORT.RAF; // Artículos Fraccionados
|
|
261
|
+
INVENTORY_CODE_REPORT.RCAA; // Caducidad Artículos
|
|
262
|
+
INVENTORY_CODE_REPORT.RASR; // Artículo Stock Valoración
|
|
263
|
+
INVENTORY_CODE_REPORT.RCD; // Consolidación Detalle
|
|
264
|
+
INVENTORY_CODE_REPORT.RTB; // Transferencia Bodega
|
|
265
|
+
|
|
266
|
+
// Documentos Electrónicos
|
|
267
|
+
ELECTRONIC_DOCUMENT_CODE.FV; // Factura
|
|
268
|
+
ELECTRONIC_DOCUMENT_CODE.NE; // Nota de Entrega
|
|
269
|
+
ELECTRONIC_DOCUMENT_CODE.NC; // Nota de Crédito
|
|
270
|
+
ELECTRONIC_DOCUMENT_CODE.ND; // Nota de Débito
|
|
271
|
+
ELECTRONIC_DOCUMENT_CODE.GR; // Guía de Remisión
|
|
272
|
+
ELECTRONIC_DOCUMENT_CODE.NORMAL; // Orden de Pedido
|
|
273
|
+
|
|
274
|
+
// Formatos
|
|
275
|
+
REPORT_FORMAT.PDF;
|
|
276
|
+
REPORT_FORMAT.EXCEL;
|
|
277
|
+
REPORT_FORMAT.WORD;
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Builders de Mensajes WhatsApp
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
import { WhatsAppMessageBuilder } from '@acontplus/ng-common';
|
|
284
|
+
|
|
285
|
+
// Mensaje de entrega de documento
|
|
286
|
+
const messages = WhatsAppMessageBuilder.buildDocumentDeliveryMessages({
|
|
287
|
+
comprador: 'Juan Pérez',
|
|
288
|
+
establecimiento: 'Mi Empresa S.A.',
|
|
289
|
+
serie: 'FAC-001-001-000001234',
|
|
290
|
+
tipo: 'FACTURA',
|
|
291
|
+
});
|
|
292
|
+
console.log(messages.main); // Mensaje principal
|
|
293
|
+
console.log(messages.promo); // Mensaje promocional
|
|
294
|
+
|
|
295
|
+
// Mensaje de bienvenida
|
|
296
|
+
const welcome = WhatsAppMessageBuilder.buildWelcomeMessage('Juan Pérez', 'Mi Empresa S.A.');
|
|
297
|
+
|
|
298
|
+
// Mensaje de confirmación de pedido
|
|
299
|
+
const confirmation = WhatsAppMessageBuilder.buildOrderConfirmationMessage(
|
|
300
|
+
'ORD-12345',
|
|
301
|
+
'Juan Pérez',
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
// Mensaje de recordatorio de pago
|
|
305
|
+
const reminder = WhatsAppMessageBuilder.buildPaymentReminderMessage(
|
|
306
|
+
'Juan Pérez',
|
|
307
|
+
150.5,
|
|
308
|
+
'2024-12-31',
|
|
309
|
+
);
|
|
310
|
+
```
|
|
311
|
+
|
|
199
312
|
### Utilidades de Archivos
|
|
200
313
|
|
|
201
314
|
```typescript
|
|
@@ -215,44 +328,23 @@ FileMapperUtil.openFile(blob, 'documento.pdf');
|
|
|
215
328
|
|
|
216
329
|
// Detectar navegador legacy
|
|
217
330
|
if (FileMapperUtil.isLegacyBrowser()) {
|
|
218
|
-
// Forzar descarga
|
|
219
|
-
}
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### Impresión
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
import { PrinterFacade } from '@acontplus/ng-common';
|
|
226
|
-
|
|
227
|
-
@Component({...})
|
|
228
|
-
export class PrintingComponent {
|
|
229
|
-
constructor(private printer: PrinterFacade) {}
|
|
230
|
-
|
|
231
|
-
// Imprimir factura
|
|
232
|
-
printInvoice(orderId: number, documentId: number) {
|
|
233
|
-
this.printer.printInvoice(orderId, documentId);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// Impresión automática
|
|
237
|
-
autoPrint(data: any, docType: string) {
|
|
238
|
-
this.printer.autoPrint(data, docType);
|
|
239
|
-
}
|
|
331
|
+
FileMapperUtil.downloadFile(blob, fileName); // Forzar descarga
|
|
240
332
|
}
|
|
241
333
|
```
|
|
242
334
|
|
|
243
335
|
### Componente UI para WhatsApp
|
|
244
336
|
|
|
245
337
|
```typescript
|
|
246
|
-
import { WhatsAppSender } from '@acontplus/ng-common';
|
|
338
|
+
import { WhatsAppSender, ELECTRONIC_DOCUMENT_CODE } from '@acontplus/ng-common';
|
|
247
339
|
|
|
248
340
|
@Component({
|
|
249
|
-
template:
|
|
341
|
+
template: `<acp-whatsapp-sender [config]="whatsappConfig"></acp-whatsapp-sender>`,
|
|
250
342
|
imports: [WhatsAppSender],
|
|
251
343
|
})
|
|
252
344
|
export class MyComponent {
|
|
253
345
|
whatsappConfig = {
|
|
254
346
|
documentData: {
|
|
255
|
-
codDoc:
|
|
347
|
+
codDoc: ELECTRONIC_DOCUMENT_CODE.FV,
|
|
256
348
|
id: 123,
|
|
257
349
|
codEstab: '001',
|
|
258
350
|
},
|
|
@@ -264,9 +356,59 @@ export class MyComponent {
|
|
|
264
356
|
}
|
|
265
357
|
```
|
|
266
358
|
|
|
359
|
+
## Configuración de Reportes
|
|
360
|
+
|
|
361
|
+
### Tipos de Documento Soportados
|
|
362
|
+
|
|
363
|
+
El `ReportParamsBuilder` incluye configuración para todos estos tipos:
|
|
364
|
+
|
|
365
|
+
| Categoría | Códigos Disponibles |
|
|
366
|
+
| --------------------------- | ------------------------------------------------------------------------ |
|
|
367
|
+
| **Documentos Electrónicos** | FV, NE, NC, ND, GR, NORMAL |
|
|
368
|
+
| **Ventas** | SRR, SRRC, FG |
|
|
369
|
+
| **Compras** | RCNH, RLC |
|
|
370
|
+
| **Contabilidad** | RCEGR, ACEDFP, ACELC |
|
|
371
|
+
| **Clientes** | RCL |
|
|
372
|
+
| **Inventario** | RK, CDAA, CDA, STOCK_VALORACION, ARTICULO_PVP, RAF, RCAA, RASR, RCD, RTB |
|
|
373
|
+
|
|
374
|
+
### Agregar Nuevos Tipos de Reporte
|
|
375
|
+
|
|
376
|
+
**Opción 1: Agregar a la configuración (Recomendado)**
|
|
377
|
+
|
|
378
|
+
```typescript
|
|
379
|
+
// 1. Agregar constante en report-codes.ts
|
|
380
|
+
export const enum PURCHASE_CODE_REPORT {
|
|
381
|
+
RCNH = 'RCNH',
|
|
382
|
+
RLC = 'RLC',
|
|
383
|
+
RNP = 'RNP', // ← NUEVO
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// 2. Agregar configuración en report-params.builder.ts
|
|
387
|
+
[PURCHASE_CODE_REPORT.RNP]: {
|
|
388
|
+
codigo: PURCHASE_CODE_REPORT.RNP,
|
|
389
|
+
hasService: true,
|
|
390
|
+
useV1Api: false,
|
|
391
|
+
idField: 'id',
|
|
392
|
+
hasParams: false,
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**Opción 2: Registro dinámico**
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
// En runtime
|
|
400
|
+
ReportParamsBuilder.registerReportType('CUSTOM_REPORT', {
|
|
401
|
+
codigo: 'CUSTOM_REPORT',
|
|
402
|
+
hasService: true,
|
|
403
|
+
useV1Api: false,
|
|
404
|
+
idField: 'id',
|
|
405
|
+
hasParams: true,
|
|
406
|
+
});
|
|
407
|
+
```
|
|
408
|
+
|
|
267
409
|
## API de WhatsApp Cloud
|
|
268
410
|
|
|
269
|
-
### Endpoints utilizados
|
|
411
|
+
### Endpoints utilizados
|
|
270
412
|
|
|
271
413
|
- `POST /api/common/whatsapp-cloud/text` - Texto directo
|
|
272
414
|
- `POST /api/common/whatsapp-cloud/text-template` - Texto con template
|
|
@@ -274,7 +416,7 @@ export class MyComponent {
|
|
|
274
416
|
- `POST /api/common/whatsapp-cloud/document-template` - Documento con template
|
|
275
417
|
- `GET /api/common/whatsapp-cloud/status` - Estado del proveedor
|
|
276
418
|
|
|
277
|
-
### Formato de FormData
|
|
419
|
+
### Formato de FormData
|
|
278
420
|
|
|
279
421
|
```typescript
|
|
280
422
|
// La librería maneja automáticamente el formato correcto:
|
|
@@ -283,75 +425,52 @@ formData.append('File', file);
|
|
|
283
425
|
formData.append('TemplateName', templateName);
|
|
284
426
|
formData.append('LanguageCode', languageCode);
|
|
285
427
|
formData.append('Filename', filename);
|
|
286
|
-
// BodyParams como array indexado
|
|
287
428
|
formData.append('BodyParams[0]', param1);
|
|
288
429
|
formData.append('BodyParams[1]', param2);
|
|
289
430
|
```
|
|
290
431
|
|
|
291
|
-
##
|
|
292
|
-
|
|
293
|
-
### Tipos de Documento Soportados:
|
|
294
|
-
|
|
295
|
-
El `ReportParamsBuilder` soporta múltiples tipos de documento configurados:
|
|
296
|
-
|
|
297
|
-
| Código | Descripción | API Version | ID Field | Características |
|
|
298
|
-
| -------- | ---------------- | ----------- | -------- | -------------------------------- |
|
|
299
|
-
| `FV` | Factura | v1 | `id` | Incluye establecimiento y código |
|
|
300
|
-
| `NE` | Nota de Entrega | v1 | `id` | Parámetros extra: `tipo: 1` |
|
|
301
|
-
| `NORMAL` | Orden de Pedido | v2 | `id` | Sin servicio adicional |
|
|
302
|
-
| `NC` | Nota de Crédito | v1 | `id` | Incluye establecimiento |
|
|
303
|
-
| `ND` | Nota de Débito | v1 | `id` | Incluye establecimiento |
|
|
304
|
-
| `GR` | Guía de Remisión | v2 | `id` | Con servicio |
|
|
305
|
-
|
|
306
|
-
### Agregar Nuevos Tipos:
|
|
307
|
-
|
|
308
|
-
Para agregar un nuevo tipo de documento, simplemente agrega la configuración:
|
|
309
|
-
|
|
310
|
-
```typescript
|
|
311
|
-
// En ReportParamsBuilder, agregar a reportConfigs:
|
|
312
|
-
RET: {
|
|
313
|
-
codigo: 'RET',
|
|
314
|
-
hasService: true,
|
|
315
|
-
useV1Api: true,
|
|
316
|
-
idField: 'id',
|
|
317
|
-
includeEstabInData: true,
|
|
318
|
-
}
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
## Arquitectura Limpia
|
|
432
|
+
## Arquitectura
|
|
322
433
|
|
|
323
|
-
### Separación de
|
|
434
|
+
### Separación de Responsabilidades
|
|
324
435
|
|
|
325
|
-
- **WhatsApp**:
|
|
326
|
-
- **
|
|
327
|
-
- **Printer**:
|
|
328
|
-
- **Utils**: Utilidades estáticas
|
|
436
|
+
- **WhatsApp**: Mensajería y notificaciones
|
|
437
|
+
- **Report**: Generación de reportes
|
|
438
|
+
- **Printer**: Impresión de documentos
|
|
439
|
+
- **Utils**: Utilidades estáticas reutilizables
|
|
440
|
+
- **Builders**: Construcción de parámetros y mensajes
|
|
329
441
|
|
|
330
|
-
### Estructura
|
|
442
|
+
### Estructura del Proyecto
|
|
331
443
|
|
|
332
444
|
```
|
|
333
445
|
ng-common/
|
|
334
|
-
├── constants/ #
|
|
335
|
-
├── contracts/ #
|
|
336
|
-
├── models/ # DTOs
|
|
337
|
-
├── adapters/ # Implementaciones
|
|
446
|
+
├── constants/ # Constantes y códigos de reporte
|
|
447
|
+
├── contracts/ # Interfaces y puertos
|
|
448
|
+
├── models/ # DTOs y modelos de datos
|
|
449
|
+
├── adapters/ # Implementaciones de puertos
|
|
338
450
|
├── facades/ # Servicios de alto nivel
|
|
339
451
|
├── tokens/ # Tokens de inyección
|
|
340
|
-
├── builders/ #
|
|
341
|
-
├── utils/ # Utilidades estáticas
|
|
452
|
+
├── builders/ # Builders estáticos
|
|
453
|
+
├── utils/ # Utilidades estáticas
|
|
342
454
|
└── ui/ # Componentes UI
|
|
343
455
|
```
|
|
344
456
|
|
|
345
457
|
## Características
|
|
346
458
|
|
|
347
|
-
- ✅ **
|
|
348
|
-
- ✅ **
|
|
349
|
-
- ✅ **
|
|
350
|
-
- ✅ **
|
|
351
|
-
- ✅ **
|
|
352
|
-
- ✅ **
|
|
353
|
-
- ✅ **
|
|
354
|
-
- ✅ **
|
|
355
|
-
- ✅ **
|
|
356
|
-
- ✅ **
|
|
357
|
-
- ✅ **Tree-shaking
|
|
459
|
+
- ✅ **Builders estáticos** - Sin inyección de dependencias, uso directo
|
|
460
|
+
- ✅ **Constantes centralizadas** - Todos los códigos de reporte en un solo lugar
|
|
461
|
+
- ✅ **Configuración escalable** - Agregar nuevos reportes sin modificar código
|
|
462
|
+
- ✅ **Utilidades optimizadas** - Mejor performance con métodos estáticos
|
|
463
|
+
- ✅ **Formateo automático** - Teléfonos ecuatorianos 09xxxxxxxx → +593
|
|
464
|
+
- ✅ **Type-safe** - TypeScript completo con enums y tipos
|
|
465
|
+
- ✅ **Clean Architecture** - Separación clara de responsabilidades
|
|
466
|
+
- ✅ **Sin dependencias problemáticas** - No FileSaver, no SweetAlert2
|
|
467
|
+
- ✅ **API alineada** - Formato exacto de tu backend
|
|
468
|
+
- ✅ **DRY** - Sin duplicación de código
|
|
469
|
+
- ✅ **Tree-shaking** - Mejor optimización del bundle
|
|
470
|
+
- ✅ **Fácil de mantener** - Código limpio y bien organizado
|
|
471
|
+
- ✅ **Extensible** - Múltiples formas de agregar funcionalidad
|
|
472
|
+
|
|
473
|
+
## Soporte
|
|
474
|
+
|
|
475
|
+
Para reportar problemas o solicitar nuevas funcionalidades, visita:
|
|
476
|
+
https://github.com/Acontplus-S-A-S/acontplus-libs/issues
|