@acontplus/ng-common 1.0.1 → 1.0.3

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
@@ -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
 
@@ -70,17 +70,7 @@ export class MyComponent {
70
70
  ).subscribe();
71
71
  }
72
72
 
73
- // 3. Enviar documento por URL (requiere ventana 24h)
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 Configurado
121
+ ### Reportes con Builder Estático
140
122
 
141
123
  ```typescript
142
- import { ReportFacade, ReportParamsBuilder } from '@acontplus/ng-common';
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
- // Generar reporte usando el builder (RECOMENDADO)
137
+ // Ejemplo 1: Reporte simple de factura
152
138
  generateInvoiceReport(id: number, codEstab: string) {
153
- const docData = {
154
- codDoc: 'FV', // Factura
155
- id,
156
- codEstab
157
- };
158
-
159
- const reportOptions = this.reportBuilder.generateReportFor(docData, 'pdf', true);
160
-
161
- this.reports.generate(reportOptions).subscribe(response => {
162
- // Manejar respuesta
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
- // Generar reporte de Nota de Entrega
167
- generateDeliveryNote(id: number, codEstab: string) {
168
- const docData = {
169
- codDoc: 'NE', // Nota de Entrega
170
- id,
171
- codEstab
172
- };
173
-
174
- const reportOptions = this.reportBuilder.generateReportFor(docData, 'excel');
175
- this.reports.generate(reportOptions);
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
- // Generar reporte de Orden de Pedido
179
- generateOrder(id: number, codEstab: string) {
180
- const docData = {
181
- codDoc: 'NORMAL', // Orden
182
- id,
183
- codEstab
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
- const reportOptions = this.reportBuilder.generateReportFor(docData, 'word');
187
- this.reports.generate(reportOptions);
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 supportedTypes = this.reportBuilder.getSupportedDocumentTypes();
193
- console.log('Tipos soportados:', supportedTypes);
194
- // ['FV', 'NE', 'NORMAL', 'NC', 'ND', 'GR']
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 en navegadores antiguos
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: ` <acp-whatsapp-sender [config]="whatsappConfig"> </acp-whatsapp-sender> `,
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: 'FV',
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 (configurados en constants):
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 para documentos:
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
- ## Configuración de Reportes
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 responsabilidades:
434
+ ### Separación de Responsabilidades
324
435
 
325
- - **WhatsApp**: Solo mensajería
326
- - **Report**: Solo generación de reportes
327
- - **Printer**: Solo impresión
328
- - **Utils**: Utilidades estáticas sin dependencias
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 optimizada:
442
+ ### Estructura del Proyecto
331
443
 
332
444
  ```
333
445
  ng-common/
334
- ├── constants/ # URLs y configuraciones
335
- ├── contracts/ # Puertos/Interfaces separados
336
- ├── models/ # DTOs alineados con tu API
337
- ├── adapters/ # Implementaciones limpias
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/ # Constructores y builders configurados
341
- ├── utils/ # Utilidades estáticas (sin Injectable)
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
- - ✅ **Utilidades estáticas optimizadas** - Mejor performance, sin inyección de dependencias
348
- - ✅ **Builder configurado para reportes** - Escalable sin switch statements
349
- - ✅ **Formateo automático de teléfonos ecuatorianos** - 09xxxxxxxx +593 automáticamente
350
- - ✅ **Sin dependencias externas problemáticas** - No FileSaver, no SweetAlert2
351
- - ✅ **Constants en lugar de ConfigService** - Más simple y directo
352
- - ✅ **Separación clara** - Report Printer WhatsApp ≠ Utils
353
- - ✅ **API completamente alineada** - Con tu implementación real
354
- - ✅ **Código limpio** - Sin duplicación, principios DRY aplicados
355
- - ✅ **TypeScript completo** - Tipado fuerte con validaciones
356
- - ✅ **Fácil de mantener** - Estructura clara y coherente
357
- - ✅ **Tree-shaking optimizado** - Mejor bundle size con utilidades estáticas
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