@acontplus/ng-common 1.0.4 → 1.0.5

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
@@ -134,7 +134,7 @@ import {
134
134
  export class ReportsComponent {
135
135
  constructor(private reportFacade: ReportFacade) {}
136
136
 
137
- // Ejemplo 1: Reporte simple de factura
137
+ // Ejemplo 1: Generar y abrir PDF automáticamente
138
138
  generateInvoiceReport(id: number, codEstab: string) {
139
139
  const reportOptions = ReportParamsBuilder.build(
140
140
  {
@@ -142,16 +142,18 @@ export class ReportsComponent {
142
142
  id,
143
143
  codEstab
144
144
  },
145
- REPORT_FORMAT.PDF,
146
- true // returnBlob
145
+ REPORT_FORMAT.PDF
147
146
  );
148
147
 
149
- this.reportFacade.generate(reportOptions).subscribe(response => {
150
- console.log('Reporte generado');
151
- });
148
+ // Se abre automáticamente en nueva ventana (o descarga en navegadores legacy)
149
+ this.reportFacade.openPDF(reportOptions.data, reportOptions.useV1Api)
150
+ .subscribe({
151
+ next: () => console.log('Reporte generado'),
152
+ error: (err) => console.error('Error:', err)
153
+ });
152
154
  }
153
155
 
154
- // Ejemplo 2: Reporte de ventas con parámetros personalizados
156
+ // Ejemplo 2: Generar Excel y descargar automáticamente
155
157
  generateSalesReport() {
156
158
  const reportOptions = ReportParamsBuilder.build(
157
159
  {
@@ -165,47 +167,54 @@ export class ReportsComponent {
165
167
  REPORT_FORMAT.EXCEL
166
168
  );
167
169
 
168
- this.reportFacade.generate(reportOptions);
170
+ this.reportFacade.downloadExcel(reportOptions.data, reportOptions.useV1Api)
171
+ .subscribe();
169
172
  }
170
173
 
171
- // Ejemplo 3: Reporte de inventario con múltiples parámetros
172
- generateInventoryReport() {
174
+ // Ejemplo 3: Control total sobre el blob
175
+ generateCustomReport() {
173
176
  const reportOptions = ReportParamsBuilder.build(
174
177
  {
175
178
  codDoc: INVENTORY_CODE_REPORT.ARTICULO_PVP,
176
179
  tipo: 2,
177
180
  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'
181
+ idTarifa: 3
184
182
  },
185
183
  REPORT_FORMAT.PDF
186
184
  );
187
185
 
188
- this.reportFacade.generate(reportOptions);
186
+ this.reportFacade.generate(reportOptions)
187
+ .subscribe({
188
+ next: (response) => {
189
+ // Tienes control total del blob
190
+ const blob = response.body;
191
+ if (blob) {
192
+ // Hacer lo que quieras: enviar por WhatsApp, guardar, etc.
193
+ this.sendViaWhatsApp(blob);
194
+ }
195
+ }
196
+ });
189
197
  }
190
198
 
191
- // Ejemplo 4: Reporte condicional
192
- generateConditionalReport(useCustom: boolean) {
193
- const reportCode = useCustom
194
- ? SALE_CODE_REPORT.SRRC
195
- : SALE_CODE_REPORT.SRR;
196
-
199
+ // Ejemplo 4: Usar métodos genéricos
200
+ quickPDFReport() {
197
201
  const reportOptions = ReportParamsBuilder.build(
198
- {
199
- codDoc: reportCode,
200
- porcentajeRenta: 15,
201
- porcentajeComision: 5,
202
- fechaInicio: this.fromDate,
203
- fechaFin: this.toDate
204
- },
202
+ { codDoc: SALE_CODE_REPORT.SRR },
205
203
  REPORT_FORMAT.PDF
206
204
  );
207
205
 
208
- this.reportFacade.generate(reportOptions);
206
+ // Abre automáticamente
207
+ this.reportFacade.open(reportOptions).subscribe();
208
+ }
209
+
210
+ quickExcelDownload() {
211
+ const reportOptions = ReportParamsBuilder.build(
212
+ { codDoc: INVENTORY_CODE_REPORT.RCD },
213
+ REPORT_FORMAT.EXCEL
214
+ );
215
+
216
+ // Descarga automáticamente
217
+ this.reportFacade.download(reportOptions).subscribe();
209
218
  }
210
219
 
211
220
  // Verificar tipos soportados
@@ -213,11 +222,6 @@ export class ReportsComponent {
213
222
  const types = ReportParamsBuilder.getSupportedDocumentTypes();
214
223
  console.log('Tipos soportados:', types);
215
224
  }
216
-
217
- // Verificar si un tipo está soportado
218
- isSupported(code: string) {
219
- return ReportParamsBuilder.isDocumentTypeSupported(code);
220
- }
221
225
  }
222
226
  ```
223
227
 
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, Injectable, signal, Input, Component } from '@angular/core';
3
+ import { tap, Observable, throwError } from 'rxjs';
3
4
  import { HttpClient } from '@angular/common/http';
4
- import { Observable, throwError } from 'rxjs';
5
5
  import * as i1 from '@angular/forms';
6
6
  import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
7
7
  import { CommonModule } from '@angular/common';
@@ -184,40 +184,307 @@ const WHATSAPP_MESSAGING_PORT = new InjectionToken('WHATSAPP_MESSAGING_PORT');
184
184
 
185
185
  const PRINTER_PORT = new InjectionToken('PRINTER_PORT');
186
186
 
187
+ /**
188
+ * Utilidades para manejo de archivos y respuestas HTTP
189
+ */
190
+ class FileMapperUtil {
191
+ /**
192
+ * Extrae el nombre de archivo desde el header Content-Disposition
193
+ */
194
+ static extractFileName(response) {
195
+ const contentDisposition = response.headers?.get('content-disposition');
196
+ if (!contentDisposition) {
197
+ return this.generateDefaultFileName();
198
+ }
199
+ // Método más robusto para extraer filename
200
+ const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition);
201
+ if (matches && matches[1]) {
202
+ let fileName = matches[1].replace(/['"]/g, '');
203
+ // Limpiar caracteres especiales
204
+ fileName = fileName.replaceAll('+', ' ').trim();
205
+ return fileName || this.generateDefaultFileName();
206
+ }
207
+ // Fallback: método simple
208
+ const simpleParse = contentDisposition.split('filename=')[1];
209
+ if (simpleParse) {
210
+ return simpleParse.replace(/['"]/g, '').trim() || this.generateDefaultFileName();
211
+ }
212
+ return this.generateDefaultFileName();
213
+ }
214
+ /**
215
+ * Crea un objeto File desde una respuesta HTTP
216
+ */
217
+ static fromResponse(response) {
218
+ const fileName = this.extractFileName(response);
219
+ const contentType = response.headers?.get('content-type') || 'application/octet-stream';
220
+ return new File([response.body], fileName, { type: contentType });
221
+ }
222
+ /**
223
+ * Descarga un archivo usando la API nativa del navegador
224
+ */
225
+ static downloadFile(blob, fileName) {
226
+ const url = URL.createObjectURL(blob);
227
+ const link = document.createElement('a');
228
+ link.href = url;
229
+ link.download = fileName;
230
+ link.style.display = 'none';
231
+ document.body.appendChild(link);
232
+ link.click();
233
+ document.body.removeChild(link);
234
+ // Limpiar el objeto URL
235
+ URL.revokeObjectURL(url);
236
+ }
237
+ /**
238
+ * Abre un archivo en una nueva ventana (para PDFs)
239
+ */
240
+ static openFile(blob, fileName) {
241
+ const fileURL = URL.createObjectURL(blob);
242
+ window.open(fileURL, fileName);
243
+ // Limpiar URL después de un tiempo
244
+ setTimeout(() => URL.revokeObjectURL(fileURL), 1000);
245
+ }
246
+ /**
247
+ * Detecta si es un navegador legacy que requiere descarga forzada
248
+ */
249
+ static isLegacyBrowser() {
250
+ const userAgent = navigator.userAgent;
251
+ return !!(userAgent.match(/Edge/g) || userAgent.match(/.NET/g) || userAgent.match(/MSIE/g));
252
+ }
253
+ static generateDefaultFileName() {
254
+ const timestamp = Date.now();
255
+ return `document_${timestamp}.pdf`;
256
+ }
257
+ }
258
+
259
+ /**
260
+ * Facade para generación de reportes
261
+ *
262
+ * Proporciona una API de alto nivel para generar reportes con manejo automático de archivos.
263
+ * Todos los métodos devuelven Observables - el consumidor debe hacer subscribe().
264
+ *
265
+ * @example
266
+ * ```typescript
267
+ * // Control total del blob
268
+ * this.reportFacade.generate(options).subscribe(response => {
269
+ * const blob = response.body;
270
+ * // Procesar blob manualmente
271
+ * });
272
+ *
273
+ * // Descarga automática
274
+ * this.reportFacade.download(options).subscribe();
275
+ *
276
+ * // Abrir PDF automáticamente
277
+ * this.reportFacade.open(options).subscribe();
278
+ * ```
279
+ */
187
280
  class ReportFacade {
188
281
  reportPort = inject(REPORT_PORT);
189
- // Método principal unificado
282
+ /**
283
+ * Genera un reporte y devuelve el Observable con el blob
284
+ *
285
+ * Este método proporciona control total sobre el blob generado.
286
+ * No realiza ninguna acción automática (descarga/apertura).
287
+ * Útil cuando necesitas procesar el blob manualmente (enviar por WhatsApp, guardar en servidor, etc.)
288
+ *
289
+ * @template T - Tipo de datos del reporte
290
+ * @param options - Opciones de generación del reporte
291
+ * @param options.data - Datos del reporte (usar ReportParamsBuilder.build())
292
+ * @param options.format - Formato del reporte: 'pdf' | 'excel' | 'word'
293
+ * @param options.useV1Api - Si debe usar la API v1 (por defecto false)
294
+ * @returns Observable con la respuesta HTTP que contiene el blob
295
+ *
296
+ * @example
297
+ * ```typescript
298
+ * const options = ReportParamsBuilder.build(
299
+ * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },
300
+ * 'pdf'
301
+ * );
302
+ *
303
+ * this.reportFacade.generate(options).subscribe({
304
+ * next: (response) => {
305
+ * const blob = response.body;
306
+ * const fileName = FileMapperUtil.extractFileName(response);
307
+ * // Procesar blob según necesidad
308
+ * },
309
+ * error: (err) => console.error('Error:', err)
310
+ * });
311
+ * ```
312
+ */
190
313
  generate(options) {
191
314
  return this.reportPort.generate(options);
192
315
  }
193
- // Métodos de conveniencia para casos comunes
194
- generatePDF(data, forceDownload = false) {
195
- this.reportPort.generate({
316
+ /**
317
+ * Genera un reporte y lo descarga automáticamente
318
+ *
319
+ * Extrae el nombre del archivo desde los headers HTTP y descarga el archivo automáticamente.
320
+ * Funciona para cualquier formato (PDF, Excel, Word).
321
+ * El Observable se completa después de iniciar la descarga.
322
+ *
323
+ * @template T - Tipo de datos del reporte
324
+ * @param options - Opciones de generación del reporte
325
+ * @returns Observable que se completa después de iniciar la descarga
326
+ *
327
+ * @example
328
+ * ```typescript
329
+ * // Con formato dinámico
330
+ * const options = ReportParamsBuilder.build(
331
+ * { codDoc: SALE_CODE_REPORT.FG },
332
+ * this.selectedFormat // 'pdf' | 'excel' | 'word'
333
+ * );
334
+ * this.reportFacade.download(options).subscribe();
335
+ *
336
+ * // Con formato fijo
337
+ * const options = ReportParamsBuilder.build(
338
+ * { codDoc: INVENTORY_CODE_REPORT.RCD },
339
+ * 'excel'
340
+ * );
341
+ * this.reportFacade.download(options).subscribe();
342
+ * ```
343
+ */
344
+ download(options) {
345
+ return this.reportPort.generate(options).pipe(tap((response) => {
346
+ const fileName = FileMapperUtil.extractFileName(response);
347
+ if (response.body) {
348
+ FileMapperUtil.downloadFile(response.body, fileName);
349
+ }
350
+ }));
351
+ }
352
+ /**
353
+ * Genera un reporte y lo abre en nueva ventana (o descarga en navegadores legacy)
354
+ *
355
+ * Comportamiento inteligente según el navegador:
356
+ * - Navegadores modernos: Abre el archivo en nueva ventana/pestaña
357
+ * - Navegadores legacy (IE, Edge antiguo): Descarga el archivo
358
+ *
359
+ * Ideal para PDFs que el usuario quiere visualizar inmediatamente.
360
+ * También funciona con Excel/Word pero la experiencia puede variar según el navegador.
361
+ *
362
+ * @template T - Tipo de datos del reporte
363
+ * @param options - Opciones de generación del reporte
364
+ * @returns Observable que se completa después de abrir/descargar el archivo
365
+ *
366
+ * @example
367
+ * ```typescript
368
+ * // Abrir PDF
369
+ * const options = ReportParamsBuilder.build(
370
+ * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },
371
+ * 'pdf'
372
+ * );
373
+ * this.reportFacade.open(options).subscribe();
374
+ *
375
+ * // Con formato dinámico
376
+ * const format = this.isPDF ? 'pdf' : 'excel';
377
+ * const options = ReportParamsBuilder.build({ codDoc: code }, format);
378
+ * this.reportFacade.open(options).subscribe();
379
+ * ```
380
+ */
381
+ open(options) {
382
+ return this.reportPort.generate(options).pipe(tap((response) => {
383
+ const fileName = FileMapperUtil.extractFileName(response);
384
+ if (response.body) {
385
+ if (FileMapperUtil.isLegacyBrowser()) {
386
+ FileMapperUtil.downloadFile(response.body, fileName);
387
+ }
388
+ else {
389
+ FileMapperUtil.openFile(response.body, fileName);
390
+ }
391
+ }
392
+ }));
393
+ }
394
+ /**
395
+ * Genera un PDF y lo abre automáticamente (shortcut)
396
+ *
397
+ * Método de conveniencia para el caso común de generar y abrir PDFs.
398
+ * Equivalente a llamar open() con format: 'pdf'.
399
+ *
400
+ * @template T - Tipo de datos del reporte
401
+ * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)
402
+ * @param useV1Api - Si debe usar la API v1 (por defecto false)
403
+ * @returns Observable que se completa después de abrir el PDF
404
+ *
405
+ * @example
406
+ * ```typescript
407
+ * const reportOptions = ReportParamsBuilder.build(
408
+ * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },
409
+ * 'pdf'
410
+ * );
411
+ *
412
+ * // Forma corta
413
+ * this.reportFacade.openPDF(
414
+ * reportOptions.data,
415
+ * reportOptions.useV1Api
416
+ * ).subscribe();
417
+ * ```
418
+ */
419
+ openPDF(data, useV1Api = false) {
420
+ return this.open({
196
421
  data,
197
422
  format: 'pdf',
198
- forceDownload,
423
+ useV1Api,
199
424
  });
200
425
  }
201
- generateExcel(data, forceDownload = false) {
202
- this.reportPort.generate({
426
+ /**
427
+ * Genera un Excel y lo descarga automáticamente (shortcut)
428
+ *
429
+ * Método de conveniencia para el caso común de generar y descargar archivos Excel.
430
+ * Equivalente a llamar download() con format: 'excel'.
431
+ *
432
+ * @template T - Tipo de datos del reporte
433
+ * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)
434
+ * @param useV1Api - Si debe usar la API v1 (por defecto false)
435
+ * @returns Observable que se completa después de iniciar la descarga
436
+ *
437
+ * @example
438
+ * ```typescript
439
+ * const reportOptions = ReportParamsBuilder.build(
440
+ * { codDoc: SALE_CODE_REPORT.FG, fechaInicio: '2024-01-01' },
441
+ * 'excel'
442
+ * );
443
+ *
444
+ * // Forma corta
445
+ * this.reportFacade.downloadExcel(
446
+ * reportOptions.data,
447
+ * reportOptions.useV1Api
448
+ * ).subscribe();
449
+ * ```
450
+ */
451
+ downloadExcel(data, useV1Api = false) {
452
+ return this.download({
203
453
  data,
204
454
  format: 'excel',
205
- forceDownload,
455
+ useV1Api,
206
456
  });
207
457
  }
208
- generateWord(data, forceDownload = false) {
209
- this.reportPort.generate({
458
+ /**
459
+ * Genera un Word y lo descarga automáticamente (shortcut)
460
+ *
461
+ * Método de conveniencia para el caso común de generar y descargar archivos Word.
462
+ * Equivalente a llamar download() con format: 'word'.
463
+ *
464
+ * @template T - Tipo de datos del reporte
465
+ * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)
466
+ * @param useV1Api - Si debe usar la API v1 (por defecto false)
467
+ * @returns Observable que se completa después de iniciar la descarga
468
+ *
469
+ * @example
470
+ * ```typescript
471
+ * const reportOptions = ReportParamsBuilder.build(
472
+ * { codDoc: CUSTOMER_CODE_REPORT.RCL },
473
+ * 'word'
474
+ * );
475
+ *
476
+ * // Forma corta
477
+ * this.reportFacade.downloadWord(
478
+ * reportOptions.data,
479
+ * reportOptions.useV1Api
480
+ * ).subscribe();
481
+ * ```
482
+ */
483
+ downloadWord(data, useV1Api = false) {
484
+ return this.download({
210
485
  data,
211
486
  format: 'word',
212
- forceDownload,
213
- });
214
- }
215
- // Método para generar y retornar blob
216
- generateBlob(data, format = 'pdf') {
217
- return this.reportPort.generate({
218
- data,
219
- format,
220
- returnBlob: true,
487
+ useV1Api,
221
488
  });
222
489
  }
223
490
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReportFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -615,113 +882,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
615
882
  }] });
616
883
 
617
884
  /**
618
- * Utilidades para manejo de archivos y respuestas HTTP
885
+ * Adapter para generación de reportes
886
+ * Siempre devuelve Observable - el consumidor decide qué hacer con el blob
619
887
  */
620
- class FileMapperUtil {
621
- /**
622
- * Extrae el nombre de archivo desde el header Content-Disposition
623
- */
624
- static extractFileName(response) {
625
- const contentDisposition = response.headers?.get('content-disposition');
626
- if (!contentDisposition) {
627
- return this.generateDefaultFileName();
628
- }
629
- // Método más robusto para extraer filename
630
- const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition);
631
- if (matches && matches[1]) {
632
- let fileName = matches[1].replace(/['"]/g, '');
633
- // Limpiar caracteres especiales
634
- fileName = fileName.replaceAll('+', ' ').trim();
635
- return fileName || this.generateDefaultFileName();
636
- }
637
- // Fallback: método simple
638
- const simpleParse = contentDisposition.split('filename=')[1];
639
- if (simpleParse) {
640
- return simpleParse.replace(/['"]/g, '').trim() || this.generateDefaultFileName();
641
- }
642
- return this.generateDefaultFileName();
643
- }
644
- /**
645
- * Crea un objeto File desde una respuesta HTTP
646
- */
647
- static fromResponse(response) {
648
- const fileName = this.extractFileName(response);
649
- const contentType = response.headers?.get('content-type') || 'application/octet-stream';
650
- return new File([response.body], fileName, { type: contentType });
651
- }
652
- /**
653
- * Descarga un archivo usando la API nativa del navegador
654
- */
655
- static downloadFile(blob, fileName) {
656
- const url = URL.createObjectURL(blob);
657
- const link = document.createElement('a');
658
- link.href = url;
659
- link.download = fileName;
660
- link.style.display = 'none';
661
- document.body.appendChild(link);
662
- link.click();
663
- document.body.removeChild(link);
664
- // Limpiar el objeto URL
665
- URL.revokeObjectURL(url);
666
- }
667
- /**
668
- * Abre un archivo en una nueva ventana (para PDFs)
669
- */
670
- static openFile(blob, fileName) {
671
- const fileURL = URL.createObjectURL(blob);
672
- window.open(fileURL, fileName);
673
- // Limpiar URL después de un tiempo
674
- setTimeout(() => URL.revokeObjectURL(fileURL), 1000);
675
- }
676
- /**
677
- * Detecta si es un navegador legacy que requiere descarga forzada
678
- */
679
- static isLegacyBrowser() {
680
- const userAgent = navigator.userAgent;
681
- return !!(userAgent.match(/Edge/g) || userAgent.match(/.NET/g) || userAgent.match(/MSIE/g));
682
- }
683
- static generateDefaultFileName() {
684
- const timestamp = Date.now();
685
- return `document_${timestamp}.pdf`;
686
- }
687
- }
688
-
689
888
  class ReportAdapter {
690
889
  http = inject(HttpClient);
691
890
  generate(options) {
692
- const { data, format = 'pdf', useV1Api = false, forceDownload = false, returnBlob = false, } = options;
693
- const reportVersionPath = useV1Api ? '/v1/' : '/v2/';
694
- const fullPath = `${API_PATHS.REPORTS}${reportVersionPath}download`;
695
- const requestOptions = {
891
+ const { data, useV1Api = false } = options;
892
+ const reportVersionPath = useV1Api ? '/reporte/download' : '/v2/reporte/download';
893
+ const fullPath = `${API_PATHS.REPORTS}${reportVersionPath}`;
894
+ return this.http.post(fullPath, data, {
696
895
  observe: 'response',
697
896
  responseType: 'blob',
698
- };
699
- if (returnBlob) {
700
- return this.http.post(fullPath, data, requestOptions);
701
- }
702
- this.http.post(fullPath, data, requestOptions).subscribe({
703
- next: (response) => this.saveFile(response, format, forceDownload),
704
- error: (err) => {
705
- console.error('Error al descargar el reporte:', err);
706
- },
707
897
  });
708
- return;
709
- }
710
- getFileName(response) {
711
- return FileMapperUtil.extractFileName(response);
712
- }
713
- saveFile(response, format, forceDownload = false) {
714
- const fileName = this.getFileName(response);
715
- if (!response.body)
716
- return;
717
- if (format === 'pdf' && !forceDownload && !FileMapperUtil.isLegacyBrowser()) {
718
- // Abrir PDF en nueva ventana para navegadores modernos
719
- FileMapperUtil.openFile(response.body, fileName);
720
- }
721
- else {
722
- // Descargar archivo (Excel, Word, o PDF forzado)
723
- FileMapperUtil.downloadFile(response.body, fileName);
724
- }
725
898
  }
726
899
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReportAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
727
900
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReportAdapter });
@@ -1 +1 @@
1
- {"version":3,"file":"acontplus-ng-common.mjs","sources":["../../../../packages/ng-common/src/lib/constants/report-codes.ts","../../../../packages/ng-common/src/lib/constants/api-paths.ts","../../../../packages/ng-common/src/lib/tokens/report.token.ts","../../../../packages/ng-common/src/lib/tokens/whatsapp.token.ts","../../../../packages/ng-common/src/lib/tokens/printer.token.ts","../../../../packages/ng-common/src/lib/facades/report.facade.ts","../../../../packages/ng-common/src/lib/builders/whatsapp-message.builder.ts","../../../../packages/ng-common/src/lib/utils/phone-formatter.util.ts","../../../../packages/ng-common/src/lib/facades/whatsapp.facade.ts","../../../../packages/ng-common/src/lib/facades/printer.facade.ts","../../../../packages/ng-common/src/lib/adapters/meta-whatsapp.adapter.ts","../../../../packages/ng-common/src/lib/adapters/green-whatsapp.adapter.ts","../../../../packages/ng-common/src/lib/utils/file-mapper.util.ts","../../../../packages/ng-common/src/lib/adapters/report.adapter.ts","../../../../packages/ng-common/src/lib/adapters/printer.adapter.ts","../../../../packages/ng-common/src/lib/builders/report-params.builder.ts","../../../../packages/ng-common/src/lib/ui/whatsapp-sender/whatsapp-sender.ts","../../../../packages/ng-common/src/lib/ui/whatsapp-sender/whatsapp-sender.html","../../../../packages/ng-common/src/lib/index.ts","../../../../packages/ng-common/src/acontplus-ng-common.ts"],"sourcesContent":["/**\n * Códigos de reportes de ventas\n */\nexport enum SALE_CODE_REPORT {\n /**\n * SALE REPORT RENTABILIDAD\n */\n SRR = 'SRR',\n\n /**\n * SALE REPORT RENTABILIDAD CUSTOM\n */\n SRRC = 'SRRC',\n\n /**\n * SALE REPORT INVOICE GENERAL\n */\n FG = 'FG',\n}\n\n/**\n * Códigos de reportes de compras\n */\nexport enum PURCHASE_CODE_REPORT {\n /**\n * REPORTE COMPRAS NOTA HIDDEN\n */\n RCNH = 'RCNH',\n\n /**\n * REPORTE LIQUIDACION COMPRA\n */\n RLC = 'RLC',\n}\n\n/**\n * Códigos de reportes de contabilidad\n */\nexport enum ACCOUNTING_CODE_REPORT {\n /**\n * REPORTE CONTABLE ESTADO GENERAL RESULTADO\n */\n RCEGR = 'RCEGR',\n\n /**\n * ASIENTO CONTABLE ESTADO DE FLUJO DE PAGO\n */\n ACEDFP = 'ACEDFP',\n\n /**\n * ASIENTO CONTABLE ESTADO LIBRO CAJA\n */\n ACELC = 'ACELC',\n}\n\n/**\n * Códigos de reportes de clientes\n */\nexport enum CUSTOMER_CODE_REPORT {\n /**\n * REPORTE CLIENTE LISTADO\n */\n RCL = 'RCL',\n}\n\n/**\n * Códigos de reportes de inventario\n */\nexport enum INVENTORY_CODE_REPORT {\n /**\n * REPORTE KARDEX\n */\n RK = 'RK',\n\n /**\n * CONSOLIDADO DE ARTICULOS AGRUPADO\n */\n CDAA = 'CDAA',\n\n /**\n * CONSOLIDADO DE ARTICULOS\n */\n CDA = 'CDA',\n\n /**\n * INVENTARIO REPORTE VALORACION\n */\n STOCK_VALORACION = 'INVRV',\n\n /**\n * INVENTARIO ARTICULO TABLA\n */\n ARTICULO_PVP = 'INVAT',\n\n /**\n * REPORTE DE ARTICULOS FRACCIONADOS\n */\n RAF = 'RAF',\n\n /**\n * REPORTE DE CADUCIDAD DE ARTICULOS\n */\n RCAA = 'RCAA',\n\n /**\n * REPORTE DE ARTICULO STOCK VALORACION\n */\n RASR = 'RASR',\n\n /**\n * REPORTE CONSOLIDACION DETALLE\n */\n RCD = 'RCD',\n\n /**\n * REPORTE TRANSFERENCIA BODEGA\n */\n RTB = 'RTB',\n}\n\n/**\n * Códigos de documentos electrónicos\n */\nexport enum ELECTRONIC_DOCUMENT_CODE {\n /**\n * FACTURA\n */\n FV = 'FV',\n\n /**\n * NOTA DE ENTREGA\n */\n NE = 'NE',\n\n /**\n * NOTA DE CREDITO\n */\n NC = 'NC',\n\n /**\n * NOTA DE DEBITO\n */\n ND = 'ND',\n\n /**\n * GUIA DE REMISION\n */\n GR = 'GR',\n\n /**\n * ORDEN DE PEDIDO\n */\n NORMAL = 'NORMAL',\n}\n\n/**\n * Formatos de reporte disponibles\n */\nexport enum REPORT_FORMAT {\n PDF = 'pdf',\n EXCEL = 'excel',\n WORD = 'word',\n}\n","export const API_PATHS = {\n WHATSAPP: 'common/whatsapp-cloud',\n REPORTS: 'reports',\n CONFIG: 'config',\n} as const;\n\nexport const DOCUMENT_TYPES = {\n NORMAL: 'NORMAL',\n FACTURA: 'FACTURA',\n NOTA_ENTREGA: 'NOTA_ENTREGA',\n} as const;\n","import { InjectionToken } from '@angular/core';\nimport { ReportPort } from '../contracts/report.port';\n\nexport const REPORT_PORT = new InjectionToken<ReportPort>('REPORT_PORT');\n","import { InjectionToken } from '@angular/core';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\n\nexport const WHATSAPP_MESSAGING_PORT = new InjectionToken<WhatsAppMessagingPort>(\n 'WHATSAPP_MESSAGING_PORT',\n);\n","import { InjectionToken } from '@angular/core';\nimport { PrinterPort } from '../contracts/printer.port';\n\nexport const PRINTER_PORT = new InjectionToken<PrinterPort>('PRINTER_PORT');\n","import { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { REPORT_PORT } from '../tokens/report.token';\nimport { ReportOptions } from '../contracts/report.port';\n\n@Injectable({ providedIn: 'root' })\nexport class ReportFacade {\n private readonly reportPort = inject(REPORT_PORT);\n\n // Método principal unificado\n generate<T>(options: ReportOptions<T>): Observable<any> | void {\n return this.reportPort.generate(options);\n }\n\n // Métodos de conveniencia para casos comunes\n generatePDF<T>(data: T, forceDownload = false): void {\n this.reportPort.generate({\n data,\n format: 'pdf',\n forceDownload,\n });\n }\n\n generateExcel<T>(data: T, forceDownload = false): void {\n this.reportPort.generate({\n data,\n format: 'excel',\n forceDownload,\n });\n }\n\n generateWord<T>(data: T, forceDownload = false): void {\n this.reportPort.generate({\n data,\n format: 'word',\n forceDownload,\n });\n }\n\n // Método para generar y retornar blob\n generateBlob<T>(data: T, format: 'pdf' | 'excel' | 'word' = 'pdf'): Observable<any> {\n return this.reportPort.generate({\n data,\n format,\n returnBlob: true,\n }) as Observable<any>;\n }\n}\n","export interface DocumentDeliveryData {\n comprador: string;\n establecimiento: string;\n serie: string;\n tipo: string;\n}\n\nexport interface WhatsAppMessages {\n main: string;\n promo: string;\n}\n\n/**\n * Builder para construir mensajes de WhatsApp\n * Clase utilitaria con métodos estáticos\n */\nexport class WhatsAppMessageBuilder {\n static buildDocumentDeliveryMessages(data: DocumentDeliveryData): WhatsAppMessages {\n const main = this.buildMainMessage(data);\n const promo = this.buildPromoMessage(data.establecimiento);\n\n return { main, promo };\n }\n\n static buildWelcomeMessage(customerName: string, establishmentName: string): string {\n return `¡Hola *${customerName}*! 👋\\n\\nBienvenido a *${establishmentName}*. Estamos aquí para ayudarte.`;\n }\n\n static buildOrderConfirmationMessage(orderNumber: string, customerName: string): string {\n return `Estimado(a) *${customerName}*,\\n\\n✅ Tu pedido #${orderNumber} ha sido confirmado.\\n\\nTe notificaremos cuando esté listo.`;\n }\n\n static buildPaymentReminderMessage(\n customerName: string,\n amount: number,\n dueDate: string,\n ): string {\n return `Estimado(a) *${customerName}*,\\n\\n💰 Recordatorio de pago:\\nMonto: ${amount}\\nVencimiento: ${dueDate}\\n\\nGracias por tu preferencia.`;\n }\n\n private static buildMainMessage(data: DocumentDeliveryData): string {\n const documentTypeDisplay = this.getDocumentTypeDisplay(data.tipo);\n\n return (\n `Estimado(a) *${data.comprador}*,\\n\\n` +\n `📄 Su ${documentTypeDisplay} ha sido generado exitosamente.\\n\\n` +\n `🏪 Establecimiento: *${data.establecimiento}*\\n` +\n `📋 Serie: ${data.serie}\\n\\n` +\n `Adjunto encontrará el documento solicitado.`\n );\n }\n\n private static buildPromoMessage(establishmentName: string): string {\n return (\n `📱 Documento enviado por *${establishmentName}*\\n` +\n `Powered by *Acontplus* 🚀\\n\\n` +\n `¿Necesita ayuda? Contáctenos.`\n );\n }\n\n private static getDocumentTypeDisplay(tipo: string): string {\n const types: Record<string, string> = {\n FACTURA: 'factura electrónica',\n NOTA_ENTREGA: 'nota de entrega',\n PROFORMA: 'proforma',\n COTIZACION: 'cotización',\n RECIBO: 'recibo',\n };\n\n return types[tipo] || 'documento';\n }\n}\n","export interface PhoneValidationResult {\n isValid: boolean;\n cleanPhone: string;\n errorMessage?: string;\n}\n\n/**\n * Utilidades para formateo y validación de números telefónicos\n */\nexport class PhoneFormatterUtil {\n /**\n * Limpia el teléfono removiendo todos los caracteres no numéricos\n */\n static cleanPhone(phone: string): string {\n return phone.replace(/\\D/g, '');\n }\n\n /**\n * Valida si un teléfono ecuatoriano es válido\n */\n static validateEcuadorianPhone(phone: string): PhoneValidationResult {\n const cleanPhone = this.cleanPhone(phone);\n\n if (!cleanPhone) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede estar vacío',\n };\n }\n\n if (cleanPhone.length < 10) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede ser menor a diez dígitos',\n };\n }\n\n if (cleanPhone.length > 10) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede ser mayor a diez dígitos',\n };\n }\n\n // Validar formato ecuatoriano (09xxxxxxxx) o internacional (593xxxxxxxxx)\n const isValidEcuadorian = /^09\\d{8}$/.test(cleanPhone);\n const isValidInternational = /^593\\d{9}$/.test(cleanPhone);\n\n if (!isValidEcuadorian && !isValidInternational) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'Formato inválido. Use: 09xxxxxxxx',\n };\n }\n\n return {\n isValid: true,\n cleanPhone,\n };\n }\n\n /**\n * Convierte número local ecuatoriano a formato internacional\n */\n static toInternationalFormat(phone: string): string {\n let cleanPhone = this.cleanPhone(phone);\n\n // Si empieza con 0, convertir a formato internacional ecuatoriano\n if (cleanPhone.startsWith('0')) {\n cleanPhone = '593' + cleanPhone.slice(1);\n }\n\n return cleanPhone;\n }\n\n /**\n * Formatea teléfono para la API de WhatsApp Business (con @c.us)\n */\n static formatForWhatsAppApi(phone: string): string {\n const internationalPhone = this.toInternationalFormat(phone);\n\n if (!internationalPhone.endsWith('@c.us')) {\n return `${internationalPhone}@c.us`;\n }\n\n return internationalPhone;\n }\n\n /**\n * Formatea teléfono para WhatsApp Web (sin @c.us)\n */\n static formatForWhatsAppWeb(phone: string): string {\n return this.toInternationalFormat(phone);\n }\n\n /**\n * Formatea teléfono para mostrar al usuario (con espacios y +)\n */\n static formatForDisplay(phone: string): string {\n const cleanPhone = this.cleanPhone(phone);\n\n if (!cleanPhone) return '';\n\n // Si es número local ecuatoriano (09xxxxxxxx)\n if (/^09\\d{8}$/.test(cleanPhone)) {\n return `+593 ${cleanPhone.slice(1, 3)} ${cleanPhone.slice(3, 6)} ${cleanPhone.slice(6)}`;\n }\n\n // Si ya tiene formato internacional (593xxxxxxxxx)\n if (/^593\\d{9}$/.test(cleanPhone)) {\n return `+593 ${cleanPhone.slice(3, 5)} ${cleanPhone.slice(5, 8)} ${cleanPhone.slice(8)}`;\n }\n\n // Para otros formatos internacionales\n if (cleanPhone.length > 10) {\n return `+${cleanPhone}`;\n }\n\n return phone;\n }\n\n /**\n * Validación general para teléfonos internacionales\n */\n static isValidInternationalPhone(phone: string): boolean {\n const cleanPhone = this.cleanPhone(phone);\n return /^\\+?[1-9]\\d{1,14}$/.test(cleanPhone);\n }\n\n /**\n * Genera el hint apropiado según el estado del teléfono\n */\n static getPhoneHint(phone: string): string {\n if (!phone) {\n return 'Ingrese número ecuatoriano (09xxxxxxxx)';\n }\n\n const validation = this.validateEcuadorianPhone(phone);\n\n if (validation.isValid) {\n return `Se enviará a: ${this.formatForDisplay(phone)}`;\n }\n\n return 'Formato: 09xxxxxxxx';\n }\n\n /**\n * Obtiene el placeholder para el campo de teléfono\n */\n static getPhonePlaceholder(): string {\n return 'Ej: 0987654321';\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WHATSAPP_MESSAGING_PORT } from '../tokens/whatsapp.token';\nimport { WhatsAppResponse, DocumentDeliveryParams } from '../models/whatsapp.model';\nimport { WhatsAppMessageBuilder } from '../builders/whatsapp-message.builder';\nimport { PhoneFormatterUtil } from '../utils/phone-formatter.util';\n\n@Injectable({ providedIn: 'root' })\nexport class WhatsAppMessagingFacade {\n private readonly messagingPort = inject(WHATSAPP_MESSAGING_PORT);\n\n // Métodos de alto nivel con lógica de negocio\n sendSimpleText(to: string, message: string, previewUrl = true): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendText({\n to: formattedPhone,\n message,\n previewUrl,\n });\n }\n\n sendTemplateText(\n to: string,\n templateName: string,\n params?: string[],\n languageCode = 'es_EC',\n ): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendTextTemplate({\n to: formattedPhone,\n templateName,\n languageCode,\n bodyParams: params,\n });\n }\n\n sendDocument(\n to: string,\n documentUrl: string,\n caption?: string,\n filename?: string,\n ): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendDocument({\n to: formattedPhone,\n documentUrl,\n caption,\n filename,\n });\n }\n\n // Caso de uso específico: Entrega de documentos\n deliverDocument(params: DocumentDeliveryParams): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(params.phone);\n const messages = WhatsAppMessageBuilder.buildDocumentDeliveryMessages({\n comprador: params.customerName,\n establecimiento: params.establishmentName,\n serie: params.documentSeries,\n tipo: params.documentType,\n });\n\n return this.messagingPort.sendDocumentTemplate({\n to: formattedPhone,\n file: params.file,\n templateName: 'notificacion_documento',\n languageCode: 'es_EC',\n bodyParams: [messages.main, messages.promo],\n });\n }\n\n // Método mejorado para envío de documentos con template\n sendDocumentWithTemplate(params: {\n phone: string;\n file: File;\n templateName: string;\n bodyParams?: string[];\n languageCode?: string;\n filename?: string;\n }): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(params.phone);\n\n return this.messagingPort.sendDocumentTemplate({\n to: formattedPhone,\n file: params.file,\n templateName: params.templateName,\n languageCode: params.languageCode || 'es_EC',\n bodyParams: params.bodyParams,\n filename: params.filename,\n });\n }\n\n // Método legacy para compatibilidad (pero mejorado)\n sendDocumentWithMessages(params: {\n phone: string;\n file: File;\n messages: { main: string; promo: string };\n }): Observable<WhatsAppResponse> {\n return this.sendDocumentWithTemplate({\n phone: params.phone,\n file: params.file,\n templateName: 'documento_generico',\n bodyParams: [params.messages.main, params.messages.promo],\n });\n }\n\n getProviderStatus(): Observable<any> {\n return this.messagingPort.getStatus();\n }\n\n // Métodos públicos que delegan a las utilidades estáticas\n isValidPhone(phone: string): boolean {\n return PhoneFormatterUtil.isValidInternationalPhone(phone);\n }\n\n toDisplayFormat(phone: string): string {\n return PhoneFormatterUtil.formatForDisplay(phone);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { PRINTER_PORT } from '../tokens/printer.token';\nimport { PrintParams } from '../contracts/printer.port';\n\n@Injectable({ providedIn: 'root' })\nexport class PrinterFacade {\n private readonly printerPort = inject(PRINTER_PORT);\n\n // Métodos de impresión\n askToPrint(params: PrintParams): void {\n this.printerPort.askToPrint(params);\n }\n\n printOrder(id: number): void {\n this.printerPort.createPrintOrder(id);\n }\n\n printCommanda(id: number): void {\n this.printerPort.createPrintCommanda(id);\n }\n\n printOrderWithCommanda(id: number): void {\n this.printerPort.createPrintOrderWithCommanda(id);\n }\n\n printInvoice(id: number, documentoId: number): void {\n this.printerPort.createInvoicePrint(id, documentoId);\n }\n\n printNotaEntrega(id: number, documentoId: number): void {\n this.printerPort.createNotaEntregaPrint(id, documentoId);\n }\n\n // Método para configurar automáticamente la impresión\n autoPrint(\n data: { printerAutomatic: boolean; orderId: number; idDocumento: number },\n codDoc: string,\n ): void {\n if (data.printerAutomatic) {\n if (codDoc === 'FACTURA') {\n this.printInvoice(data.orderId, data.idDocumento);\n }\n if (codDoc === 'NOTA_ENTREGA') {\n this.printNotaEntrega(data.orderId, data.idDocumento);\n }\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\nimport {\n WhatsAppTextRequest,\n WhatsAppTextTemplateRequest,\n WhatsAppDocumentRequest,\n WhatsAppDocumentTemplateRequest,\n WhatsAppResponse,\n WhatsAppStatusResponse,\n} from '../models/whatsapp.model';\nimport { API_PATHS } from '../constants/api-paths';\n\n@Injectable()\nexport class MetaWhatsAppAdapter implements WhatsAppMessagingPort {\n private readonly http = inject(HttpClient);\n\n // 1. Texto directo (requiere ventana 24h)\n sendText(request: WhatsAppTextRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/text`, request);\n }\n\n // 2. Texto con template (funciona siempre)\n sendTextTemplate(request: WhatsAppTextTemplateRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/text-template`, request);\n }\n\n // 3. Documento directo via URL (requiere ventana 24h)\n sendDocument(request: WhatsAppDocumentRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/document`, request);\n }\n\n // 4. Documento con template (funciona siempre)\n sendDocumentTemplate(request: WhatsAppDocumentTemplateRequest): Observable<WhatsAppResponse> {\n const formData = new FormData();\n\n // Usar nombres de campos que espera tu API (con mayúsculas)\n formData.append('To', request.to);\n formData.append('File', request.file);\n\n if (request.templateName) formData.append('TemplateName', request.templateName);\n if (request.languageCode) formData.append('LanguageCode', request.languageCode);\n if (request.filename) formData.append('Filename', request.filename);\n\n // Enviar bodyParams como array (formato que espera tu API)\n if (request.bodyParams && request.bodyParams.length > 0) {\n request.bodyParams.forEach((param, index) => {\n formData.append(`BodyParams[${index}]`, param);\n });\n }\n\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/document-template`, formData);\n }\n\n getStatus(): Observable<WhatsAppStatusResponse> {\n return this.http.get<WhatsAppStatusResponse>(`${API_PATHS.WHATSAPP}/status`);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\nimport {\n WhatsAppTextRequest,\n WhatsAppTextTemplateRequest,\n WhatsAppDocumentRequest,\n WhatsAppDocumentTemplateRequest,\n WhatsAppResponse,\n WhatsAppStatusResponse,\n} from '../models/whatsapp.model';\n\n/**\n * Adaptador para Green API (legacy)\n * Implementa la interfaz WhatsApp usando Green API\n */\n@Injectable()\nexport class GreenWhatsAppAdapter implements WhatsAppMessagingPort {\n private readonly http = inject(HttpClient);\n\n // Implementación para Green API - mapea los métodos de WhatsApp a Green\n sendText(request: WhatsAppTextRequest): Observable<WhatsAppResponse> {\n // Mapear a Green API call\n return this.http.post<WhatsAppResponse>('/api/green/send-text', {\n chatId: request.to,\n message: request.message,\n });\n }\n\n sendTextTemplate(request: WhatsAppTextTemplateRequest): Observable<WhatsAppResponse> {\n // Green API no soporta templates, enviar como texto simple\n return this.http.post<WhatsAppResponse>('/api/green/send-text', {\n chatId: request.to,\n message: `Template: ${request.templateName}`,\n });\n }\n\n sendDocument(request: WhatsAppDocumentRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>('/api/green/send-file', {\n chatId: request.to,\n fileUrl: request.documentUrl,\n caption: request.caption,\n });\n }\n\n sendDocumentTemplate(request: WhatsAppDocumentTemplateRequest): Observable<WhatsAppResponse> {\n // Green API - enviar archivo con template como caption\n const formData = new FormData();\n formData.append('chatId', request.to);\n formData.append('file', request.file);\n formData.append('caption', `Template: ${request.templateName}`);\n\n return this.http.post<WhatsAppResponse>('/api/green/send-file-upload', formData);\n }\n\n getStatus(): Observable<WhatsAppStatusResponse> {\n return this.http.get<WhatsAppStatusResponse>('/api/green/status');\n }\n}\n","/**\n * Utilidades para manejo de archivos y respuestas HTTP\n */\nexport class FileMapperUtil {\n /**\n * Extrae el nombre de archivo desde el header Content-Disposition\n */\n static extractFileName(response: any): string {\n const contentDisposition = response.headers?.get('content-disposition');\n\n if (!contentDisposition) {\n return this.generateDefaultFileName();\n }\n\n // Método más robusto para extraer filename\n const matches = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/.exec(contentDisposition);\n\n if (matches && matches[1]) {\n let fileName = matches[1].replace(/['\"]/g, '');\n // Limpiar caracteres especiales\n fileName = fileName.replaceAll('+', ' ').trim();\n return fileName || this.generateDefaultFileName();\n }\n\n // Fallback: método simple\n const simpleParse = contentDisposition.split('filename=')[1];\n if (simpleParse) {\n return simpleParse.replace(/['\"]/g, '').trim() || this.generateDefaultFileName();\n }\n\n return this.generateDefaultFileName();\n }\n\n /**\n * Crea un objeto File desde una respuesta HTTP\n */\n static fromResponse(response: any): File {\n const fileName = this.extractFileName(response);\n const contentType = response.headers?.get('content-type') || 'application/octet-stream';\n\n return new File([response.body], fileName, { type: contentType });\n }\n\n /**\n * Descarga un archivo usando la API nativa del navegador\n */\n static downloadFile(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Limpiar el objeto URL\n URL.revokeObjectURL(url);\n }\n\n /**\n * Abre un archivo en una nueva ventana (para PDFs)\n */\n static openFile(blob: Blob, fileName: string): void {\n const fileURL = URL.createObjectURL(blob);\n window.open(fileURL, fileName);\n\n // Limpiar URL después de un tiempo\n setTimeout(() => URL.revokeObjectURL(fileURL), 1000);\n }\n\n /**\n * Detecta si es un navegador legacy que requiere descarga forzada\n */\n static isLegacyBrowser(): boolean {\n const userAgent = navigator.userAgent;\n return !!(userAgent.match(/Edge/g) || userAgent.match(/.NET/g) || userAgent.match(/MSIE/g));\n }\n\n private static generateDefaultFileName(): string {\n const timestamp = Date.now();\n return `document_${timestamp}.pdf`;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ReportPort, ReportOptions } from '../contracts/report.port';\nimport { API_PATHS } from '../constants/api-paths';\nimport { FileMapperUtil } from '../utils/file-mapper.util';\n\n@Injectable()\nexport class ReportAdapter implements ReportPort {\n private readonly http = inject(HttpClient);\n\n generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> | void {\n const {\n data,\n format = 'pdf',\n useV1Api = false,\n forceDownload = false,\n returnBlob = false,\n } = options;\n\n const reportVersionPath = useV1Api ? '/v1/' : '/v2/';\n const fullPath = `${API_PATHS.REPORTS}${reportVersionPath}download`;\n\n const requestOptions = {\n observe: 'response' as const,\n responseType: 'blob' as const,\n };\n\n if (returnBlob) {\n return this.http.post(fullPath, data, requestOptions);\n }\n\n this.http.post(fullPath, data, requestOptions).subscribe({\n next: (response) => this.saveFile(response, format, forceDownload),\n error: (err) => {\n console.error('Error al descargar el reporte:', err);\n },\n });\n\n return;\n }\n\n getFileName(response: any): string {\n return FileMapperUtil.extractFileName(response);\n }\n\n saveFile(response: any, format?: string, forceDownload = false): void {\n const fileName = this.getFileName(response);\n\n if (!response.body) return;\n\n if (format === 'pdf' && !forceDownload && !FileMapperUtil.isLegacyBrowser()) {\n // Abrir PDF en nueva ventana para navegadores modernos\n FileMapperUtil.openFile(response.body, fileName);\n } else {\n // Descargar archivo (Excel, Word, o PDF forzado)\n FileMapperUtil.downloadFile(response.body, fileName);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { PrinterPort, PrintParams, ApiResponse } from '../contracts/printer.port';\nimport { API_PATHS, DOCUMENT_TYPES } from '../constants/api-paths';\n\n@Injectable()\nexport class PrinterAdapter implements PrinterPort {\n private readonly http = inject(HttpClient);\n\n askToPrint(obj: PrintParams): void {\n if (typeof window !== 'undefined') {\n const confirmed = window.confirm('¿Desea Imprimir este comprobante?');\n if (confirmed) {\n this.getPrintConfig(obj).subscribe();\n }\n }\n }\n\n getPrintConfig(obj: PrintParams): Observable<ApiResponse> {\n const json = JSON.stringify({\n codDoc: obj.codDoc,\n getUrlPrintServer: true,\n id: obj.id,\n codEstab: obj.codEstab,\n });\n\n return new Observable((observer) => {\n const url = `${API_PATHS.CONFIG}Print/?json=${json}`;\n this.http.get<ApiResponse>(url).subscribe({\n next: (response) => {\n if (response.code === '0') {\n console.warn(response.message);\n }\n if (response.code === '1') {\n this.print(response.payload as string, obj).subscribe();\n }\n observer.next(response);\n observer.complete();\n },\n error: (err) => {\n console.error(err);\n observer.error(err);\n },\n });\n });\n }\n\n print(urlPrinter: string, paramsToPrint: PrintParams): Observable<ApiResponse> {\n return new Observable((observer) => {\n this.http.post<ApiResponse>(`${urlPrinter}/Print`, paramsToPrint).subscribe({\n next: (response) => {\n console.log({\n type: response.code === '1' ? 'success' : 'warning',\n message: response.message,\n });\n observer.next(response);\n observer.complete();\n },\n error: (err) => {\n console.error(err);\n observer.error(err);\n },\n });\n });\n }\n\n createPrintOrder(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 5,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createPrintCommanda(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 6,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createPrintOrderWithCommanda(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 2,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createInvoicePrint(id: number, documentoId: number): void {\n this.getPrintConfig({\n id,\n documentoId,\n tipo: 3,\n codDoc: DOCUMENT_TYPES.FACTURA,\n }).subscribe();\n }\n\n createNotaEntregaPrint(id: number, documentoId: number): void {\n this.getPrintConfig({\n id,\n documentoId,\n tipo: 4,\n codDoc: DOCUMENT_TYPES.NOTA_ENTREGA,\n }).subscribe();\n }\n}\n","import {\n SALE_CODE_REPORT,\n PURCHASE_CODE_REPORT,\n ACCOUNTING_CODE_REPORT,\n CUSTOMER_CODE_REPORT,\n INVENTORY_CODE_REPORT,\n ELECTRONIC_DOCUMENT_CODE,\n} from '../constants/report-codes';\n\nexport interface ReportDocumentData {\n codDoc: string;\n codEstab?: string;\n id?: number;\n serie?: string;\n // Campos adicionales para reportes personalizados\n [key: string]: any;\n}\n\nexport interface ReportParams {\n hasService?: boolean;\n reportParams: string;\n dataParams: string;\n}\n\ninterface ReportConfig {\n codigo: string;\n hasService: boolean;\n useV1Api: boolean;\n idField: string;\n extraDataParams?: Record<string, any>;\n includeEstabInData?: boolean;\n includeCodigoInData?: boolean;\n hasParams?: boolean;\n}\n\n/**\n * Builder para construir parámetros de reportes\n * Clase utilitaria con métodos estáticos\n */\nexport class ReportParamsBuilder {\n private static readonly reportConfigs: Record<string, ReportConfig> = {\n // Documentos electrónicos\n [ELECTRONIC_DOCUMENT_CODE.FV]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.FV,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n includeCodigoInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.NE]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.NE,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n extraDataParams: { tipo: 1 },\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.NORMAL]: {\n codigo: 'OR',\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ELECTRONIC_DOCUMENT_CODE.NC]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.NC,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.ND]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.ND,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.GR]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.GR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n\n // Reportes de ventas\n [SALE_CODE_REPORT.SRR]: {\n codigo: SALE_CODE_REPORT.SRR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [SALE_CODE_REPORT.SRRC]: {\n codigo: SALE_CODE_REPORT.SRRC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [SALE_CODE_REPORT.FG]: {\n codigo: SALE_CODE_REPORT.FG,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de compras\n [PURCHASE_CODE_REPORT.RCNH]: {\n codigo: PURCHASE_CODE_REPORT.RCNH,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [PURCHASE_CODE_REPORT.RLC]: {\n codigo: PURCHASE_CODE_REPORT.RLC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de contabilidad\n [ACCOUNTING_CODE_REPORT.RCEGR]: {\n codigo: ACCOUNTING_CODE_REPORT.RCEGR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.ACEDFP]: {\n codigo: ACCOUNTING_CODE_REPORT.ACEDFP,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.ACELC]: {\n codigo: ACCOUNTING_CODE_REPORT.ACELC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de clientes\n [CUSTOMER_CODE_REPORT.RCL]: {\n codigo: CUSTOMER_CODE_REPORT.RCL,\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de inventario\n [INVENTORY_CODE_REPORT.RK]: {\n codigo: INVENTORY_CODE_REPORT.RK,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [INVENTORY_CODE_REPORT.CDAA]: {\n codigo: INVENTORY_CODE_REPORT.CDAA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.CDA]: {\n codigo: INVENTORY_CODE_REPORT.CDA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.STOCK_VALORACION]: {\n codigo: INVENTORY_CODE_REPORT.STOCK_VALORACION,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.ARTICULO_PVP]: {\n codigo: INVENTORY_CODE_REPORT.ARTICULO_PVP,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RAF]: {\n codigo: INVENTORY_CODE_REPORT.RAF,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RCAA]: {\n codigo: INVENTORY_CODE_REPORT.RCAA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RASR]: {\n codigo: INVENTORY_CODE_REPORT.RASR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RCD]: {\n codigo: INVENTORY_CODE_REPORT.RCD,\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [INVENTORY_CODE_REPORT.RTB]: {\n codigo: INVENTORY_CODE_REPORT.RTB,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n };\n\n /**\n * Construye los parámetros de reporte según el tipo de documento\n */\n static buildParams(\n docData: ReportDocumentData,\n format: 'pdf' | 'excel' | 'word' = 'pdf',\n ): ReportParams {\n const config = this.getReportConfig(docData.codDoc);\n\n return {\n hasService: config.hasService,\n reportParams: this.buildReportParams(docData, config, format),\n dataParams: this.buildDataParams(docData, config, format),\n };\n }\n\n /**\n * Determina si debe usar la API v1 según el tipo de documento\n */\n static shouldUseV1Api(codDoc: string): boolean {\n const config = this.getReportConfig(codDoc);\n return config.useV1Api;\n }\n\n /**\n * Obtiene la configuración para un tipo de documento\n */\n private static getReportConfig(codDoc: string): ReportConfig {\n const config = this.reportConfigs[codDoc];\n if (!config) {\n throw new Error(\n `Tipo de documento no soportado: ${codDoc}. Tipos disponibles: ${Object.keys(this.reportConfigs).join(', ')}`,\n );\n }\n return config;\n }\n\n /**\n * Construye los parámetros del reporte\n */\n private static buildReportParams(\n docData: ReportDocumentData,\n config: ReportConfig,\n format: string,\n ): string {\n const params: any = {\n codigo: config.codigo,\n format,\n };\n\n // Agregar hasParams según configuración\n if (config.hasParams !== undefined) {\n params.hasParams = config.hasParams;\n }\n\n // Agregar codEstab si existe\n if (docData.codEstab) {\n params.codEstab = docData.codEstab;\n }\n\n // Solo agregar aditionalParams si hasService es true y hasParams es true\n if (config.hasService && config.hasParams) {\n params.aditionalParams = [];\n }\n\n return JSON.stringify(params);\n }\n\n /**\n * Construye los parámetros de datos\n */\n private static buildDataParams(\n docData: ReportDocumentData,\n config: ReportConfig,\n format: string,\n ): string {\n const params: any = {};\n\n // Agregar ID si existe el campo configurado\n if (config.idField && docData[config.idField]) {\n params.id = docData[config.idField];\n }\n\n // Agregar parámetros adicionales según configuración\n if (config.includeEstabInData && docData.codEstab) {\n params.codEstab = docData.codEstab;\n }\n\n if (config.includeCodigoInData) {\n params.codigo = config.codigo;\n }\n\n if (config.hasService && config.hasParams) {\n params.hasParams = true;\n if (config.includeCodigoInData) {\n params.format = format;\n }\n }\n\n // Agregar parámetros extra específicos del tipo\n if (config.extraDataParams) {\n Object.assign(params, config.extraDataParams);\n }\n\n // Agregar cualquier parámetro adicional del docData\n Object.keys(docData).forEach((key) => {\n if (!['codDoc', 'codEstab', 'id', 'serie'].includes(key) && docData[key] !== undefined) {\n params[key] = docData[key];\n }\n });\n\n return JSON.stringify(params);\n }\n\n /**\n * Construye las opciones completas para generar un reporte\n */\n static build(\n docData: ReportDocumentData,\n format: 'pdf' | 'excel' | 'word' = 'pdf',\n returnBlob = false,\n ) {\n return {\n data: this.buildParams(docData, format),\n format,\n useV1Api: this.shouldUseV1Api(docData.codDoc),\n returnBlob,\n };\n }\n\n /**\n * Obtiene la lista de tipos de documento soportados\n */\n static getSupportedDocumentTypes(): string[] {\n return Object.keys(this.reportConfigs);\n }\n\n /**\n * Verifica si un tipo de documento está soportado\n */\n static isDocumentTypeSupported(codDoc: string): boolean {\n return codDoc in this.reportConfigs;\n }\n\n /**\n * Registra un nuevo tipo de reporte dinámicamente\n */\n static registerReportType(codDoc: string, config: ReportConfig): void {\n this.reportConfigs[codDoc] = config;\n }\n}\n","import { Component, OnInit, inject, Input, signal } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { Observable, throwError } from 'rxjs';\nimport { WhatsAppMessagingFacade } from '../../facades/whatsapp.facade';\nimport { ReportFacade } from '../../facades/report.facade';\nimport { ReportParamsBuilder } from '../../builders/report-params.builder';\nimport { PhoneFormatterUtil } from '../../utils/phone-formatter.util';\nimport { FileMapperUtil } from '../../utils/file-mapper.util';\n\nexport interface DocumentData {\n idDocumentoElectronico?: number;\n documentoId?: number;\n codDoc: string;\n docType?: string;\n codEstab?: string;\n id?: number;\n serie?: string;\n}\n\nexport interface WhatsAppSendConfig {\n documentData?: DocumentData;\n phoneNumbers?: string[];\n defaultMessage?: string;\n establishmentPhone?: string;\n establishmentName?: string;\n customerName?: string;\n}\n\n@Component({\n selector: 'acp-whatsapp-sender',\n templateUrl: './whatsapp-sender.html',\n styleUrls: ['./whatsapp-sender.scss'],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCardModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatSelectModule,\n ],\n})\nexport class WhatsAppSender implements OnInit {\n @Input() config?: WhatsAppSendConfig;\n\n private readonly fb = inject(FormBuilder);\n private readonly whatsappFacade = inject(WhatsAppMessagingFacade);\n private readonly reportFacade = inject(ReportFacade);\n private readonly snackBar = inject(MatSnackBar);\n\n whatsappForm!: FormGroup;\n isLoading = signal(false);\n messageLength = 0;\n phoneNumbers = signal<string[]>([]);\n showWhatsAppWebLink = signal(false);\n whatsAppWebUrl = signal('');\n\n // Datos del documento y establecimiento\n establishmentPhone = '';\n establishmentName = '';\n customerName = '';\n\n ngOnInit(): void {\n this.initializeForm();\n this.setupMessageLengthCounter();\n this.loadConfigData();\n }\n\n private loadConfigData(): void {\n if (this.config) {\n if (this.config.phoneNumbers) {\n this.phoneNumbers.set(this.config.phoneNumbers);\n if (this.config.phoneNumbers.length > 0) {\n this.whatsappForm.patchValue({ phoneNumber: this.config.phoneNumbers[0] });\n }\n }\n\n if (this.config.defaultMessage) {\n this.whatsappForm.patchValue({ message: this.config.defaultMessage });\n }\n\n this.establishmentPhone = this.config.establishmentPhone || '';\n this.establishmentName = this.config.establishmentName || '';\n this.customerName = this.config.customerName || '';\n }\n }\n\n private initializeForm(): void {\n this.whatsappForm = this.fb.group({\n phoneNumber: ['', [Validators.required, this.ecuadorianPhoneValidator.bind(this)]],\n message: ['', [Validators.required, Validators.maxLength(500)]],\n });\n }\n\n // Validador personalizado para números ecuatorianos\n private ecuadorianPhoneValidator(control: any) {\n if (!control.value) return null;\n\n const validation = PhoneFormatterUtil.validateEcuadorianPhone(control.value);\n\n return validation.isValid ? null : { invalidPhone: true };\n }\n\n private setupMessageLengthCounter(): void {\n this.whatsappForm.get('message')?.valueChanges.subscribe((value) => {\n this.messageLength = value ? value.length : 0;\n });\n }\n\n sendWhatsApp(): void {\n if (this.whatsappForm.valid) {\n if (!this.validatePhoneNumber()) return;\n\n const { phoneNumber, message } = this.whatsappForm.value;\n\n // Si hay configuración de documento, generar y enviar archivo\n if (this.config?.documentData) {\n this.sendWithDocument(phoneNumber, message);\n } else {\n // Envío simple de texto\n this.sendSimpleMessage(phoneNumber, message);\n }\n }\n }\n\n private validatePhoneNumber(): boolean {\n const phoneNumber = this.whatsappForm.get('phoneNumber')?.value;\n const validation = PhoneFormatterUtil.validateEcuadorianPhone(phoneNumber);\n\n if (!validation.isValid) {\n this.showError(validation.errorMessage || 'Número de teléfono inválido');\n return false;\n }\n\n return true;\n }\n\n private sendSimpleMessage(phoneNumber: string, message: string): void {\n this.isLoading.set(true);\n\n this.whatsappFacade.sendSimpleText(phoneNumber, message).subscribe({\n next: (response) => {\n this.isLoading.set(false);\n if (response.success) {\n this.showSuccess('Mensaje enviado exitosamente');\n this.clearForm();\n } else {\n this.showError(response.error?.message || 'Error al enviar mensaje');\n this.prepareWhatsAppWebLink(phoneNumber, message);\n }\n },\n error: (_error) => {\n this.isLoading.set(false);\n this.showError('Error de conexión');\n this.prepareWhatsAppWebLink(phoneNumber, message);\n },\n });\n }\n\n private sendWithDocument(phoneNumber: string, message: string): void {\n if (!this.config?.documentData) return;\n\n this.isLoading.set(true);\n\n // Generar el reporte primero\n this.generateReport().subscribe({\n next: (reportResponse) => {\n if (reportResponse) {\n const { file, fileName } = this.processReportFile(reportResponse);\n this.sendMediaWithMessages(phoneNumber, message, file, fileName);\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error generando reporte:', error);\n this.showError('Error al generar el documento');\n },\n });\n }\n\n private generateReport(): Observable<any> {\n const docData = this.config!.documentData!;\n\n // Construir opciones de reporte\n const reportOptions = ReportParamsBuilder.build(docData, 'pdf', true);\n\n const reportResult = this.reportFacade.generate(reportOptions);\n\n // Manejar el caso donde generate puede retornar void\n return reportResult || throwError(() => new Error('No se pudo generar el reporte'));\n }\n\n private processReportFile(response: any): { file: File; fileName: string } {\n const file = FileMapperUtil.fromResponse(response);\n const fileName = FileMapperUtil.extractFileName(response);\n\n return { file, fileName };\n }\n\n private sendMediaWithMessages(\n phoneNumber: string,\n message: string,\n file: File,\n fileName: string,\n ): void {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(phoneNumber);\n\n // Enviar solo el documento con el mensaje como caption\n this.whatsappFacade\n .sendDocumentWithTemplate({\n phone: formattedPhone,\n file: file,\n templateName: 'documento_generico',\n bodyParams: [message],\n filename: fileName,\n })\n .subscribe({\n next: () => {\n this.isLoading.set(false);\n this.showSuccess('Documento enviado correctamente');\n this.clearForm();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error enviando documento:', error);\n this.showError('Error al enviar el documento');\n this.prepareWhatsAppWebLink(phoneNumber, message);\n },\n });\n }\n\n private prepareWhatsAppWebLink(phoneNumber: string, message: string): void {\n const cleanPhoneNumber = PhoneFormatterUtil.formatForWhatsAppWeb(phoneNumber);\n const encodedMessage = encodeURIComponent(message);\n const whatsappUrl = `https://wa.me/${cleanPhoneNumber}?text=${encodedMessage}`;\n\n this.whatsAppWebUrl.set(whatsappUrl);\n this.showWhatsAppWebLink.set(true);\n }\n\n openWhatsAppWeb(): void {\n const url = this.whatsAppWebUrl();\n if (url) {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n }\n\n hideWhatsAppWebLink(): void {\n this.showWhatsAppWebLink.set(false);\n this.whatsAppWebUrl.set('');\n }\n\n private showSuccess(message: string): void {\n this.snackBar.open(message, 'Cerrar', {\n duration: 3000,\n panelClass: ['success-snackbar'],\n });\n }\n\n private showError(message: string): void {\n this.snackBar.open(message, 'Cerrar', {\n duration: 5000,\n panelClass: ['error-snackbar'],\n });\n }\n\n clearForm(): void {\n this.whatsappForm.reset();\n this.messageLength = 0;\n this.hideWhatsAppWebLink();\n }\n\n // Método para mostrar el formato del teléfono\n get formattedPhoneDisplay(): string {\n const phone = this.whatsappForm.get('phoneNumber')?.value;\n return PhoneFormatterUtil.formatForDisplay(phone || '');\n }\n\n // Método para obtener placeholder dinámico\n get phonePlaceholder(): string {\n return PhoneFormatterUtil.getPhonePlaceholder();\n }\n\n // Método para obtener el hint del campo\n get phoneHint(): string {\n const phone = this.whatsappForm.get('phoneNumber')?.value;\n return PhoneFormatterUtil.getPhoneHint(phone || '');\n }\n}\n","<div class=\"whatsapp-sender-container\">\n <mat-card class=\"sender-card\">\n <mat-card-header>\n <div mat-card-avatar class=\"whatsapp-avatar\">\n <mat-icon>chat</mat-icon>\n </div>\n <mat-card-title>Enviar por WhatsApp</mat-card-title>\n <mat-card-subtitle>Comparte contenido directamente</mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <form [formGroup]=\"whatsappForm\" (ngSubmit)=\"sendWhatsApp()\">\n <!-- Campo para número de teléfono -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Número de teléfono</mat-label>\n @if (phoneNumbers().length > 1) {\n <mat-select formControlName=\"phoneNumber\">\n @for (phone of phoneNumbers(); track phone) {\n <mat-option [value]=\"phone\">{{ phone }}</mat-option>\n }\n </mat-select>\n } @else {\n <input\n matInput\n formControlName=\"phoneNumber\"\n [placeholder]=\"phonePlaceholder\"\n type=\"tel\"\n />\n }\n <mat-icon matSuffix>phone</mat-icon>\n <mat-hint>{{ phoneHint }}</mat-hint>\n @if (whatsappForm.get('phoneNumber')?.hasError('required')) {\n <mat-error>El número de teléfono es requerido</mat-error>\n }\n @if (whatsappForm.get('phoneNumber')?.hasError('invalidPhone')) {\n <mat-error>Ingrese un número ecuatoriano válido (09xxxxxxxx)</mat-error>\n }\n </mat-form-field>\n\n <!-- Campo para mensaje -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Mensaje</mat-label>\n <textarea\n matInput\n formControlName=\"message\"\n placeholder=\"Escribe tu mensaje aquí...\"\n rows=\"4\"\n maxlength=\"500\"\n >\n </textarea>\n <mat-icon matSuffix>message</mat-icon>\n <mat-hint align=\"end\">{{ messageLength }}/500 caracteres</mat-hint>\n @if (whatsappForm.get('message')?.hasError('required')) {\n <mat-error>El mensaje es requerido</mat-error>\n }\n </mat-form-field>\n\n <!-- Botones de acción -->\n <div class=\"action-buttons\">\n <button\n mat-raised-button\n color=\"primary\"\n type=\"submit\"\n [disabled]=\"whatsappForm.invalid || isLoading()\"\n class=\"send-button\"\n >\n @if (!isLoading()) {\n <mat-icon>send</mat-icon>\n }\n @if (isLoading()) {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n {{ isLoading() ? 'Enviando...' : 'Enviar por WhatsApp' }}\n </button>\n\n <button mat-button type=\"button\" (click)=\"clearForm()\" [disabled]=\"isLoading()\">\n <mat-icon>clear</mat-icon>\n Limpiar\n </button>\n </div>\n\n <!-- Enlace opcional a WhatsApp Web -->\n @if (showWhatsAppWebLink()) {\n <div class=\"whatsapp-web-link\">\n <mat-icon>info</mat-icon>\n <span>¿No se pudo enviar? Prueba enviando directamente:</span>\n <button mat-button color=\"accent\" (click)=\"openWhatsAppWeb()\">\n <mat-icon>open_in_new</mat-icon>\n Abrir WhatsApp Web\n </button>\n <button mat-icon-button (click)=\"hideWhatsAppWebLink()\" aria-label=\"Cerrar\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n }\n </form>\n </mat-card-content>\n </mat-card>\n</div>\n","// Contracts\nexport * from './contracts';\n// Models\nexport * from './models/whatsapp.model';\n// Constants\nexport * from './constants';\n// Tokens\nexport * from './tokens';\n\n// Facades\nexport * from './facades';\n// Adapters\nexport * from './adapters';\n// Builders\nexport * from './builders';\n// Utils\nexport * from './utils';\n\n// UI Components\nexport * from './ui';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acontplus-ng-common.mjs","sources":["../../../../packages/ng-common/src/lib/constants/report-codes.ts","../../../../packages/ng-common/src/lib/constants/api-paths.ts","../../../../packages/ng-common/src/lib/tokens/report.token.ts","../../../../packages/ng-common/src/lib/tokens/whatsapp.token.ts","../../../../packages/ng-common/src/lib/tokens/printer.token.ts","../../../../packages/ng-common/src/lib/utils/file-mapper.util.ts","../../../../packages/ng-common/src/lib/facades/report.facade.ts","../../../../packages/ng-common/src/lib/builders/whatsapp-message.builder.ts","../../../../packages/ng-common/src/lib/utils/phone-formatter.util.ts","../../../../packages/ng-common/src/lib/facades/whatsapp.facade.ts","../../../../packages/ng-common/src/lib/facades/printer.facade.ts","../../../../packages/ng-common/src/lib/adapters/meta-whatsapp.adapter.ts","../../../../packages/ng-common/src/lib/adapters/green-whatsapp.adapter.ts","../../../../packages/ng-common/src/lib/adapters/report.adapter.ts","../../../../packages/ng-common/src/lib/adapters/printer.adapter.ts","../../../../packages/ng-common/src/lib/builders/report-params.builder.ts","../../../../packages/ng-common/src/lib/ui/whatsapp-sender/whatsapp-sender.ts","../../../../packages/ng-common/src/lib/ui/whatsapp-sender/whatsapp-sender.html","../../../../packages/ng-common/src/lib/index.ts","../../../../packages/ng-common/src/acontplus-ng-common.ts"],"sourcesContent":["/**\n * Códigos de reportes de ventas\n */\nexport enum SALE_CODE_REPORT {\n /**\n * SALE REPORT RENTABILIDAD\n */\n SRR = 'SRR',\n\n /**\n * SALE REPORT RENTABILIDAD CUSTOM\n */\n SRRC = 'SRRC',\n\n /**\n * SALE REPORT INVOICE GENERAL\n */\n FG = 'FG',\n}\n\n/**\n * Códigos de reportes de compras\n */\nexport enum PURCHASE_CODE_REPORT {\n /**\n * REPORTE COMPRAS NOTA HIDDEN\n */\n RCNH = 'RCNH',\n\n /**\n * REPORTE LIQUIDACION COMPRA\n */\n RLC = 'RLC',\n}\n\n/**\n * Códigos de reportes de contabilidad\n */\nexport enum ACCOUNTING_CODE_REPORT {\n /**\n * REPORTE CONTABLE ESTADO GENERAL RESULTADO\n */\n RCEGR = 'RCEGR',\n\n /**\n * ASIENTO CONTABLE ESTADO DE FLUJO DE PAGO\n */\n ACEDFP = 'ACEDFP',\n\n /**\n * ASIENTO CONTABLE ESTADO LIBRO CAJA\n */\n ACELC = 'ACELC',\n}\n\n/**\n * Códigos de reportes de clientes\n */\nexport enum CUSTOMER_CODE_REPORT {\n /**\n * REPORTE CLIENTE LISTADO\n */\n RCL = 'RCL',\n}\n\n/**\n * Códigos de reportes de inventario\n */\nexport enum INVENTORY_CODE_REPORT {\n /**\n * REPORTE KARDEX\n */\n RK = 'RK',\n\n /**\n * CONSOLIDADO DE ARTICULOS AGRUPADO\n */\n CDAA = 'CDAA',\n\n /**\n * CONSOLIDADO DE ARTICULOS\n */\n CDA = 'CDA',\n\n /**\n * INVENTARIO REPORTE VALORACION\n */\n STOCK_VALORACION = 'INVRV',\n\n /**\n * INVENTARIO ARTICULO TABLA\n */\n ARTICULO_PVP = 'INVAT',\n\n /**\n * REPORTE DE ARTICULOS FRACCIONADOS\n */\n RAF = 'RAF',\n\n /**\n * REPORTE DE CADUCIDAD DE ARTICULOS\n */\n RCAA = 'RCAA',\n\n /**\n * REPORTE DE ARTICULO STOCK VALORACION\n */\n RASR = 'RASR',\n\n /**\n * REPORTE CONSOLIDACION DETALLE\n */\n RCD = 'RCD',\n\n /**\n * REPORTE TRANSFERENCIA BODEGA\n */\n RTB = 'RTB',\n}\n\n/**\n * Códigos de documentos electrónicos\n */\nexport enum ELECTRONIC_DOCUMENT_CODE {\n /**\n * FACTURA\n */\n FV = 'FV',\n\n /**\n * NOTA DE ENTREGA\n */\n NE = 'NE',\n\n /**\n * NOTA DE CREDITO\n */\n NC = 'NC',\n\n /**\n * NOTA DE DEBITO\n */\n ND = 'ND',\n\n /**\n * GUIA DE REMISION\n */\n GR = 'GR',\n\n /**\n * ORDEN DE PEDIDO\n */\n NORMAL = 'NORMAL',\n}\n\n/**\n * Formatos de reporte disponibles\n */\nexport enum REPORT_FORMAT {\n PDF = 'pdf',\n EXCEL = 'excel',\n WORD = 'word',\n}\n","export const API_PATHS = {\n WHATSAPP: 'common/whatsapp-cloud',\n REPORTS: 'reports',\n CONFIG: 'config',\n} as const;\n\nexport const DOCUMENT_TYPES = {\n NORMAL: 'NORMAL',\n FACTURA: 'FACTURA',\n NOTA_ENTREGA: 'NOTA_ENTREGA',\n} as const;\n","import { InjectionToken } from '@angular/core';\nimport { ReportPort } from '../contracts/report.port';\n\nexport const REPORT_PORT = new InjectionToken<ReportPort>('REPORT_PORT');\n","import { InjectionToken } from '@angular/core';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\n\nexport const WHATSAPP_MESSAGING_PORT = new InjectionToken<WhatsAppMessagingPort>(\n 'WHATSAPP_MESSAGING_PORT',\n);\n","import { InjectionToken } from '@angular/core';\nimport { PrinterPort } from '../contracts/printer.port';\n\nexport const PRINTER_PORT = new InjectionToken<PrinterPort>('PRINTER_PORT');\n","/**\n * Utilidades para manejo de archivos y respuestas HTTP\n */\nexport class FileMapperUtil {\n /**\n * Extrae el nombre de archivo desde el header Content-Disposition\n */\n static extractFileName(response: any): string {\n const contentDisposition = response.headers?.get('content-disposition');\n\n if (!contentDisposition) {\n return this.generateDefaultFileName();\n }\n\n // Método más robusto para extraer filename\n const matches = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/.exec(contentDisposition);\n\n if (matches && matches[1]) {\n let fileName = matches[1].replace(/['\"]/g, '');\n // Limpiar caracteres especiales\n fileName = fileName.replaceAll('+', ' ').trim();\n return fileName || this.generateDefaultFileName();\n }\n\n // Fallback: método simple\n const simpleParse = contentDisposition.split('filename=')[1];\n if (simpleParse) {\n return simpleParse.replace(/['\"]/g, '').trim() || this.generateDefaultFileName();\n }\n\n return this.generateDefaultFileName();\n }\n\n /**\n * Crea un objeto File desde una respuesta HTTP\n */\n static fromResponse(response: any): File {\n const fileName = this.extractFileName(response);\n const contentType = response.headers?.get('content-type') || 'application/octet-stream';\n\n return new File([response.body], fileName, { type: contentType });\n }\n\n /**\n * Descarga un archivo usando la API nativa del navegador\n */\n static downloadFile(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Limpiar el objeto URL\n URL.revokeObjectURL(url);\n }\n\n /**\n * Abre un archivo en una nueva ventana (para PDFs)\n */\n static openFile(blob: Blob, fileName: string): void {\n const fileURL = URL.createObjectURL(blob);\n window.open(fileURL, fileName);\n\n // Limpiar URL después de un tiempo\n setTimeout(() => URL.revokeObjectURL(fileURL), 1000);\n }\n\n /**\n * Detecta si es un navegador legacy que requiere descarga forzada\n */\n static isLegacyBrowser(): boolean {\n const userAgent = navigator.userAgent;\n return !!(userAgent.match(/Edge/g) || userAgent.match(/.NET/g) || userAgent.match(/MSIE/g));\n }\n\n private static generateDefaultFileName(): string {\n const timestamp = Date.now();\n return `document_${timestamp}.pdf`;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\nimport { Observable, tap } from 'rxjs';\nimport { REPORT_PORT } from '../tokens/report.token';\nimport { ReportOptions } from '../contracts/report.port';\nimport { FileMapperUtil } from '../utils/file-mapper.util';\n\n/**\n * Facade para generación de reportes\n *\n * Proporciona una API de alto nivel para generar reportes con manejo automático de archivos.\n * Todos los métodos devuelven Observables - el consumidor debe hacer subscribe().\n *\n * @example\n * ```typescript\n * // Control total del blob\n * this.reportFacade.generate(options).subscribe(response => {\n * const blob = response.body;\n * // Procesar blob manualmente\n * });\n *\n * // Descarga automática\n * this.reportFacade.download(options).subscribe();\n *\n * // Abrir PDF automáticamente\n * this.reportFacade.open(options).subscribe();\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportFacade {\n private readonly reportPort = inject(REPORT_PORT);\n\n /**\n * Genera un reporte y devuelve el Observable con el blob\n *\n * Este método proporciona control total sobre el blob generado.\n * No realiza ninguna acción automática (descarga/apertura).\n * Útil cuando necesitas procesar el blob manualmente (enviar por WhatsApp, guardar en servidor, etc.)\n *\n * @template T - Tipo de datos del reporte\n * @param options - Opciones de generación del reporte\n * @param options.data - Datos del reporte (usar ReportParamsBuilder.build())\n * @param options.format - Formato del reporte: 'pdf' | 'excel' | 'word'\n * @param options.useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable con la respuesta HTTP que contiene el blob\n *\n * @example\n * ```typescript\n * const options = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },\n * 'pdf'\n * );\n *\n * this.reportFacade.generate(options).subscribe({\n * next: (response) => {\n * const blob = response.body;\n * const fileName = FileMapperUtil.extractFileName(response);\n * // Procesar blob según necesidad\n * },\n * error: (err) => console.error('Error:', err)\n * });\n * ```\n */\n generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n return this.reportPort.generate(options);\n }\n\n /**\n * Genera un reporte y lo descarga automáticamente\n *\n * Extrae el nombre del archivo desde los headers HTTP y descarga el archivo automáticamente.\n * Funciona para cualquier formato (PDF, Excel, Word).\n * El Observable se completa después de iniciar la descarga.\n *\n * @template T - Tipo de datos del reporte\n * @param options - Opciones de generación del reporte\n * @returns Observable que se completa después de iniciar la descarga\n *\n * @example\n * ```typescript\n * // Con formato dinámico\n * const options = ReportParamsBuilder.build(\n * { codDoc: SALE_CODE_REPORT.FG },\n * this.selectedFormat // 'pdf' | 'excel' | 'word'\n * );\n * this.reportFacade.download(options).subscribe();\n *\n * // Con formato fijo\n * const options = ReportParamsBuilder.build(\n * { codDoc: INVENTORY_CODE_REPORT.RCD },\n * 'excel'\n * );\n * this.reportFacade.download(options).subscribe();\n * ```\n */\n download<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n return this.reportPort.generate(options).pipe(\n tap((response) => {\n const fileName = FileMapperUtil.extractFileName(response);\n if (response.body) {\n FileMapperUtil.downloadFile(response.body, fileName);\n }\n }),\n );\n }\n\n /**\n * Genera un reporte y lo abre en nueva ventana (o descarga en navegadores legacy)\n *\n * Comportamiento inteligente según el navegador:\n * - Navegadores modernos: Abre el archivo en nueva ventana/pestaña\n * - Navegadores legacy (IE, Edge antiguo): Descarga el archivo\n *\n * Ideal para PDFs que el usuario quiere visualizar inmediatamente.\n * También funciona con Excel/Word pero la experiencia puede variar según el navegador.\n *\n * @template T - Tipo de datos del reporte\n * @param options - Opciones de generación del reporte\n * @returns Observable que se completa después de abrir/descargar el archivo\n *\n * @example\n * ```typescript\n * // Abrir PDF\n * const options = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },\n * 'pdf'\n * );\n * this.reportFacade.open(options).subscribe();\n *\n * // Con formato dinámico\n * const format = this.isPDF ? 'pdf' : 'excel';\n * const options = ReportParamsBuilder.build({ codDoc: code }, format);\n * this.reportFacade.open(options).subscribe();\n * ```\n */\n open<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n return this.reportPort.generate(options).pipe(\n tap((response) => {\n const fileName = FileMapperUtil.extractFileName(response);\n if (response.body) {\n if (FileMapperUtil.isLegacyBrowser()) {\n FileMapperUtil.downloadFile(response.body, fileName);\n } else {\n FileMapperUtil.openFile(response.body, fileName);\n }\n }\n }),\n );\n }\n\n /**\n * Genera un PDF y lo abre automáticamente (shortcut)\n *\n * Método de conveniencia para el caso común de generar y abrir PDFs.\n * Equivalente a llamar open() con format: 'pdf'.\n *\n * @template T - Tipo de datos del reporte\n * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)\n * @param useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable que se completa después de abrir el PDF\n *\n * @example\n * ```typescript\n * const reportOptions = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },\n * 'pdf'\n * );\n *\n * // Forma corta\n * this.reportFacade.openPDF(\n * reportOptions.data,\n * reportOptions.useV1Api\n * ).subscribe();\n * ```\n */\n openPDF<T>(data: T, useV1Api = false): Observable<HttpResponse<Blob>> {\n return this.open({\n data,\n format: 'pdf',\n useV1Api,\n });\n }\n\n /**\n * Genera un Excel y lo descarga automáticamente (shortcut)\n *\n * Método de conveniencia para el caso común de generar y descargar archivos Excel.\n * Equivalente a llamar download() con format: 'excel'.\n *\n * @template T - Tipo de datos del reporte\n * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)\n * @param useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable que se completa después de iniciar la descarga\n *\n * @example\n * ```typescript\n * const reportOptions = ReportParamsBuilder.build(\n * { codDoc: SALE_CODE_REPORT.FG, fechaInicio: '2024-01-01' },\n * 'excel'\n * );\n *\n * // Forma corta\n * this.reportFacade.downloadExcel(\n * reportOptions.data,\n * reportOptions.useV1Api\n * ).subscribe();\n * ```\n */\n downloadExcel<T>(data: T, useV1Api = false): Observable<HttpResponse<Blob>> {\n return this.download({\n data,\n format: 'excel',\n useV1Api,\n });\n }\n\n /**\n * Genera un Word y lo descarga automáticamente (shortcut)\n *\n * Método de conveniencia para el caso común de generar y descargar archivos Word.\n * Equivalente a llamar download() con format: 'word'.\n *\n * @template T - Tipo de datos del reporte\n * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)\n * @param useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable que se completa después de iniciar la descarga\n *\n * @example\n * ```typescript\n * const reportOptions = ReportParamsBuilder.build(\n * { codDoc: CUSTOMER_CODE_REPORT.RCL },\n * 'word'\n * );\n *\n * // Forma corta\n * this.reportFacade.downloadWord(\n * reportOptions.data,\n * reportOptions.useV1Api\n * ).subscribe();\n * ```\n */\n downloadWord<T>(data: T, useV1Api = false): Observable<HttpResponse<Blob>> {\n return this.download({\n data,\n format: 'word',\n useV1Api,\n });\n }\n}\n","export interface DocumentDeliveryData {\n comprador: string;\n establecimiento: string;\n serie: string;\n tipo: string;\n}\n\nexport interface WhatsAppMessages {\n main: string;\n promo: string;\n}\n\n/**\n * Builder para construir mensajes de WhatsApp\n * Clase utilitaria con métodos estáticos\n */\nexport class WhatsAppMessageBuilder {\n static buildDocumentDeliveryMessages(data: DocumentDeliveryData): WhatsAppMessages {\n const main = this.buildMainMessage(data);\n const promo = this.buildPromoMessage(data.establecimiento);\n\n return { main, promo };\n }\n\n static buildWelcomeMessage(customerName: string, establishmentName: string): string {\n return `¡Hola *${customerName}*! 👋\\n\\nBienvenido a *${establishmentName}*. Estamos aquí para ayudarte.`;\n }\n\n static buildOrderConfirmationMessage(orderNumber: string, customerName: string): string {\n return `Estimado(a) *${customerName}*,\\n\\n✅ Tu pedido #${orderNumber} ha sido confirmado.\\n\\nTe notificaremos cuando esté listo.`;\n }\n\n static buildPaymentReminderMessage(\n customerName: string,\n amount: number,\n dueDate: string,\n ): string {\n return `Estimado(a) *${customerName}*,\\n\\n💰 Recordatorio de pago:\\nMonto: ${amount}\\nVencimiento: ${dueDate}\\n\\nGracias por tu preferencia.`;\n }\n\n private static buildMainMessage(data: DocumentDeliveryData): string {\n const documentTypeDisplay = this.getDocumentTypeDisplay(data.tipo);\n\n return (\n `Estimado(a) *${data.comprador}*,\\n\\n` +\n `📄 Su ${documentTypeDisplay} ha sido generado exitosamente.\\n\\n` +\n `🏪 Establecimiento: *${data.establecimiento}*\\n` +\n `📋 Serie: ${data.serie}\\n\\n` +\n `Adjunto encontrará el documento solicitado.`\n );\n }\n\n private static buildPromoMessage(establishmentName: string): string {\n return (\n `📱 Documento enviado por *${establishmentName}*\\n` +\n `Powered by *Acontplus* 🚀\\n\\n` +\n `¿Necesita ayuda? Contáctenos.`\n );\n }\n\n private static getDocumentTypeDisplay(tipo: string): string {\n const types: Record<string, string> = {\n FACTURA: 'factura electrónica',\n NOTA_ENTREGA: 'nota de entrega',\n PROFORMA: 'proforma',\n COTIZACION: 'cotización',\n RECIBO: 'recibo',\n };\n\n return types[tipo] || 'documento';\n }\n}\n","export interface PhoneValidationResult {\n isValid: boolean;\n cleanPhone: string;\n errorMessage?: string;\n}\n\n/**\n * Utilidades para formateo y validación de números telefónicos\n */\nexport class PhoneFormatterUtil {\n /**\n * Limpia el teléfono removiendo todos los caracteres no numéricos\n */\n static cleanPhone(phone: string): string {\n return phone.replace(/\\D/g, '');\n }\n\n /**\n * Valida si un teléfono ecuatoriano es válido\n */\n static validateEcuadorianPhone(phone: string): PhoneValidationResult {\n const cleanPhone = this.cleanPhone(phone);\n\n if (!cleanPhone) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede estar vacío',\n };\n }\n\n if (cleanPhone.length < 10) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede ser menor a diez dígitos',\n };\n }\n\n if (cleanPhone.length > 10) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede ser mayor a diez dígitos',\n };\n }\n\n // Validar formato ecuatoriano (09xxxxxxxx) o internacional (593xxxxxxxxx)\n const isValidEcuadorian = /^09\\d{8}$/.test(cleanPhone);\n const isValidInternational = /^593\\d{9}$/.test(cleanPhone);\n\n if (!isValidEcuadorian && !isValidInternational) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'Formato inválido. Use: 09xxxxxxxx',\n };\n }\n\n return {\n isValid: true,\n cleanPhone,\n };\n }\n\n /**\n * Convierte número local ecuatoriano a formato internacional\n */\n static toInternationalFormat(phone: string): string {\n let cleanPhone = this.cleanPhone(phone);\n\n // Si empieza con 0, convertir a formato internacional ecuatoriano\n if (cleanPhone.startsWith('0')) {\n cleanPhone = '593' + cleanPhone.slice(1);\n }\n\n return cleanPhone;\n }\n\n /**\n * Formatea teléfono para la API de WhatsApp Business (con @c.us)\n */\n static formatForWhatsAppApi(phone: string): string {\n const internationalPhone = this.toInternationalFormat(phone);\n\n if (!internationalPhone.endsWith('@c.us')) {\n return `${internationalPhone}@c.us`;\n }\n\n return internationalPhone;\n }\n\n /**\n * Formatea teléfono para WhatsApp Web (sin @c.us)\n */\n static formatForWhatsAppWeb(phone: string): string {\n return this.toInternationalFormat(phone);\n }\n\n /**\n * Formatea teléfono para mostrar al usuario (con espacios y +)\n */\n static formatForDisplay(phone: string): string {\n const cleanPhone = this.cleanPhone(phone);\n\n if (!cleanPhone) return '';\n\n // Si es número local ecuatoriano (09xxxxxxxx)\n if (/^09\\d{8}$/.test(cleanPhone)) {\n return `+593 ${cleanPhone.slice(1, 3)} ${cleanPhone.slice(3, 6)} ${cleanPhone.slice(6)}`;\n }\n\n // Si ya tiene formato internacional (593xxxxxxxxx)\n if (/^593\\d{9}$/.test(cleanPhone)) {\n return `+593 ${cleanPhone.slice(3, 5)} ${cleanPhone.slice(5, 8)} ${cleanPhone.slice(8)}`;\n }\n\n // Para otros formatos internacionales\n if (cleanPhone.length > 10) {\n return `+${cleanPhone}`;\n }\n\n return phone;\n }\n\n /**\n * Validación general para teléfonos internacionales\n */\n static isValidInternationalPhone(phone: string): boolean {\n const cleanPhone = this.cleanPhone(phone);\n return /^\\+?[1-9]\\d{1,14}$/.test(cleanPhone);\n }\n\n /**\n * Genera el hint apropiado según el estado del teléfono\n */\n static getPhoneHint(phone: string): string {\n if (!phone) {\n return 'Ingrese número ecuatoriano (09xxxxxxxx)';\n }\n\n const validation = this.validateEcuadorianPhone(phone);\n\n if (validation.isValid) {\n return `Se enviará a: ${this.formatForDisplay(phone)}`;\n }\n\n return 'Formato: 09xxxxxxxx';\n }\n\n /**\n * Obtiene el placeholder para el campo de teléfono\n */\n static getPhonePlaceholder(): string {\n return 'Ej: 0987654321';\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WHATSAPP_MESSAGING_PORT } from '../tokens/whatsapp.token';\nimport { WhatsAppResponse, DocumentDeliveryParams } from '../models/whatsapp.model';\nimport { WhatsAppMessageBuilder } from '../builders/whatsapp-message.builder';\nimport { PhoneFormatterUtil } from '../utils/phone-formatter.util';\n\n@Injectable({ providedIn: 'root' })\nexport class WhatsAppMessagingFacade {\n private readonly messagingPort = inject(WHATSAPP_MESSAGING_PORT);\n\n // Métodos de alto nivel con lógica de negocio\n sendSimpleText(to: string, message: string, previewUrl = true): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendText({\n to: formattedPhone,\n message,\n previewUrl,\n });\n }\n\n sendTemplateText(\n to: string,\n templateName: string,\n params?: string[],\n languageCode = 'es_EC',\n ): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendTextTemplate({\n to: formattedPhone,\n templateName,\n languageCode,\n bodyParams: params,\n });\n }\n\n sendDocument(\n to: string,\n documentUrl: string,\n caption?: string,\n filename?: string,\n ): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendDocument({\n to: formattedPhone,\n documentUrl,\n caption,\n filename,\n });\n }\n\n // Caso de uso específico: Entrega de documentos\n deliverDocument(params: DocumentDeliveryParams): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(params.phone);\n const messages = WhatsAppMessageBuilder.buildDocumentDeliveryMessages({\n comprador: params.customerName,\n establecimiento: params.establishmentName,\n serie: params.documentSeries,\n tipo: params.documentType,\n });\n\n return this.messagingPort.sendDocumentTemplate({\n to: formattedPhone,\n file: params.file,\n templateName: 'notificacion_documento',\n languageCode: 'es_EC',\n bodyParams: [messages.main, messages.promo],\n });\n }\n\n // Método mejorado para envío de documentos con template\n sendDocumentWithTemplate(params: {\n phone: string;\n file: File;\n templateName: string;\n bodyParams?: string[];\n languageCode?: string;\n filename?: string;\n }): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(params.phone);\n\n return this.messagingPort.sendDocumentTemplate({\n to: formattedPhone,\n file: params.file,\n templateName: params.templateName,\n languageCode: params.languageCode || 'es_EC',\n bodyParams: params.bodyParams,\n filename: params.filename,\n });\n }\n\n // Método legacy para compatibilidad (pero mejorado)\n sendDocumentWithMessages(params: {\n phone: string;\n file: File;\n messages: { main: string; promo: string };\n }): Observable<WhatsAppResponse> {\n return this.sendDocumentWithTemplate({\n phone: params.phone,\n file: params.file,\n templateName: 'documento_generico',\n bodyParams: [params.messages.main, params.messages.promo],\n });\n }\n\n getProviderStatus(): Observable<any> {\n return this.messagingPort.getStatus();\n }\n\n // Métodos públicos que delegan a las utilidades estáticas\n isValidPhone(phone: string): boolean {\n return PhoneFormatterUtil.isValidInternationalPhone(phone);\n }\n\n toDisplayFormat(phone: string): string {\n return PhoneFormatterUtil.formatForDisplay(phone);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { PRINTER_PORT } from '../tokens/printer.token';\nimport { PrintParams } from '../contracts/printer.port';\n\n@Injectable({ providedIn: 'root' })\nexport class PrinterFacade {\n private readonly printerPort = inject(PRINTER_PORT);\n\n // Métodos de impresión\n askToPrint(params: PrintParams): void {\n this.printerPort.askToPrint(params);\n }\n\n printOrder(id: number): void {\n this.printerPort.createPrintOrder(id);\n }\n\n printCommanda(id: number): void {\n this.printerPort.createPrintCommanda(id);\n }\n\n printOrderWithCommanda(id: number): void {\n this.printerPort.createPrintOrderWithCommanda(id);\n }\n\n printInvoice(id: number, documentoId: number): void {\n this.printerPort.createInvoicePrint(id, documentoId);\n }\n\n printNotaEntrega(id: number, documentoId: number): void {\n this.printerPort.createNotaEntregaPrint(id, documentoId);\n }\n\n // Método para configurar automáticamente la impresión\n autoPrint(\n data: { printerAutomatic: boolean; orderId: number; idDocumento: number },\n codDoc: string,\n ): void {\n if (data.printerAutomatic) {\n if (codDoc === 'FACTURA') {\n this.printInvoice(data.orderId, data.idDocumento);\n }\n if (codDoc === 'NOTA_ENTREGA') {\n this.printNotaEntrega(data.orderId, data.idDocumento);\n }\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\nimport {\n WhatsAppTextRequest,\n WhatsAppTextTemplateRequest,\n WhatsAppDocumentRequest,\n WhatsAppDocumentTemplateRequest,\n WhatsAppResponse,\n WhatsAppStatusResponse,\n} from '../models/whatsapp.model';\nimport { API_PATHS } from '../constants/api-paths';\n\n@Injectable()\nexport class MetaWhatsAppAdapter implements WhatsAppMessagingPort {\n private readonly http = inject(HttpClient);\n\n // 1. Texto directo (requiere ventana 24h)\n sendText(request: WhatsAppTextRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/text`, request);\n }\n\n // 2. Texto con template (funciona siempre)\n sendTextTemplate(request: WhatsAppTextTemplateRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/text-template`, request);\n }\n\n // 3. Documento directo via URL (requiere ventana 24h)\n sendDocument(request: WhatsAppDocumentRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/document`, request);\n }\n\n // 4. Documento con template (funciona siempre)\n sendDocumentTemplate(request: WhatsAppDocumentTemplateRequest): Observable<WhatsAppResponse> {\n const formData = new FormData();\n\n // Usar nombres de campos que espera tu API (con mayúsculas)\n formData.append('To', request.to);\n formData.append('File', request.file);\n\n if (request.templateName) formData.append('TemplateName', request.templateName);\n if (request.languageCode) formData.append('LanguageCode', request.languageCode);\n if (request.filename) formData.append('Filename', request.filename);\n\n // Enviar bodyParams como array (formato que espera tu API)\n if (request.bodyParams && request.bodyParams.length > 0) {\n request.bodyParams.forEach((param, index) => {\n formData.append(`BodyParams[${index}]`, param);\n });\n }\n\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/document-template`, formData);\n }\n\n getStatus(): Observable<WhatsAppStatusResponse> {\n return this.http.get<WhatsAppStatusResponse>(`${API_PATHS.WHATSAPP}/status`);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\nimport {\n WhatsAppTextRequest,\n WhatsAppTextTemplateRequest,\n WhatsAppDocumentRequest,\n WhatsAppDocumentTemplateRequest,\n WhatsAppResponse,\n WhatsAppStatusResponse,\n} from '../models/whatsapp.model';\n\n/**\n * Adaptador para Green API (legacy)\n * Implementa la interfaz WhatsApp usando Green API\n */\n@Injectable()\nexport class GreenWhatsAppAdapter implements WhatsAppMessagingPort {\n private readonly http = inject(HttpClient);\n\n // Implementación para Green API - mapea los métodos de WhatsApp a Green\n sendText(request: WhatsAppTextRequest): Observable<WhatsAppResponse> {\n // Mapear a Green API call\n return this.http.post<WhatsAppResponse>('/api/green/send-text', {\n chatId: request.to,\n message: request.message,\n });\n }\n\n sendTextTemplate(request: WhatsAppTextTemplateRequest): Observable<WhatsAppResponse> {\n // Green API no soporta templates, enviar como texto simple\n return this.http.post<WhatsAppResponse>('/api/green/send-text', {\n chatId: request.to,\n message: `Template: ${request.templateName}`,\n });\n }\n\n sendDocument(request: WhatsAppDocumentRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>('/api/green/send-file', {\n chatId: request.to,\n fileUrl: request.documentUrl,\n caption: request.caption,\n });\n }\n\n sendDocumentTemplate(request: WhatsAppDocumentTemplateRequest): Observable<WhatsAppResponse> {\n // Green API - enviar archivo con template como caption\n const formData = new FormData();\n formData.append('chatId', request.to);\n formData.append('file', request.file);\n formData.append('caption', `Template: ${request.templateName}`);\n\n return this.http.post<WhatsAppResponse>('/api/green/send-file-upload', formData);\n }\n\n getStatus(): Observable<WhatsAppStatusResponse> {\n return this.http.get<WhatsAppStatusResponse>('/api/green/status');\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ReportPort, ReportOptions } from '../contracts/report.port';\nimport { API_PATHS } from '../constants/api-paths';\n\n/**\n * Adapter para generación de reportes\n * Siempre devuelve Observable - el consumidor decide qué hacer con el blob\n */\n@Injectable()\nexport class ReportAdapter implements ReportPort {\n private readonly http = inject(HttpClient);\n\n generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n const { data, useV1Api = false } = options;\n\n const reportVersionPath = useV1Api ? '/reporte/download' : '/v2/reporte/download';\n const fullPath = `${API_PATHS.REPORTS}${reportVersionPath}`;\n\n return this.http.post<Blob>(fullPath, data, {\n observe: 'response',\n responseType: 'blob' as 'json',\n });\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { PrinterPort, PrintParams, ApiResponse } from '../contracts/printer.port';\nimport { API_PATHS, DOCUMENT_TYPES } from '../constants/api-paths';\n\n@Injectable()\nexport class PrinterAdapter implements PrinterPort {\n private readonly http = inject(HttpClient);\n\n askToPrint(obj: PrintParams): void {\n if (typeof window !== 'undefined') {\n const confirmed = window.confirm('¿Desea Imprimir este comprobante?');\n if (confirmed) {\n this.getPrintConfig(obj).subscribe();\n }\n }\n }\n\n getPrintConfig(obj: PrintParams): Observable<ApiResponse> {\n const json = JSON.stringify({\n codDoc: obj.codDoc,\n getUrlPrintServer: true,\n id: obj.id,\n codEstab: obj.codEstab,\n });\n\n return new Observable((observer) => {\n const url = `${API_PATHS.CONFIG}Print/?json=${json}`;\n this.http.get<ApiResponse>(url).subscribe({\n next: (response) => {\n if (response.code === '0') {\n console.warn(response.message);\n }\n if (response.code === '1') {\n this.print(response.payload as string, obj).subscribe();\n }\n observer.next(response);\n observer.complete();\n },\n error: (err) => {\n console.error(err);\n observer.error(err);\n },\n });\n });\n }\n\n print(urlPrinter: string, paramsToPrint: PrintParams): Observable<ApiResponse> {\n return new Observable((observer) => {\n this.http.post<ApiResponse>(`${urlPrinter}/Print`, paramsToPrint).subscribe({\n next: (response) => {\n console.log({\n type: response.code === '1' ? 'success' : 'warning',\n message: response.message,\n });\n observer.next(response);\n observer.complete();\n },\n error: (err) => {\n console.error(err);\n observer.error(err);\n },\n });\n });\n }\n\n createPrintOrder(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 5,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createPrintCommanda(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 6,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createPrintOrderWithCommanda(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 2,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createInvoicePrint(id: number, documentoId: number): void {\n this.getPrintConfig({\n id,\n documentoId,\n tipo: 3,\n codDoc: DOCUMENT_TYPES.FACTURA,\n }).subscribe();\n }\n\n createNotaEntregaPrint(id: number, documentoId: number): void {\n this.getPrintConfig({\n id,\n documentoId,\n tipo: 4,\n codDoc: DOCUMENT_TYPES.NOTA_ENTREGA,\n }).subscribe();\n }\n}\n","import {\n SALE_CODE_REPORT,\n PURCHASE_CODE_REPORT,\n ACCOUNTING_CODE_REPORT,\n CUSTOMER_CODE_REPORT,\n INVENTORY_CODE_REPORT,\n ELECTRONIC_DOCUMENT_CODE,\n} from '../constants/report-codes';\n\nexport interface ReportDocumentData {\n codDoc: string;\n codEstab?: string;\n id?: number;\n serie?: string;\n // Campos adicionales para reportes personalizados\n [key: string]: any;\n}\n\nexport interface ReportParams {\n hasService?: boolean;\n reportParams: string;\n dataParams: string;\n}\n\ninterface ReportConfig {\n codigo: string;\n hasService: boolean;\n useV1Api: boolean;\n idField: string;\n extraDataParams?: Record<string, any>;\n includeEstabInData?: boolean;\n includeCodigoInData?: boolean;\n hasParams?: boolean;\n}\n\n/**\n * Builder para construir parámetros de reportes\n * Clase utilitaria con métodos estáticos\n */\nexport class ReportParamsBuilder {\n private static readonly reportConfigs: Record<string, ReportConfig> = {\n // Documentos electrónicos\n [ELECTRONIC_DOCUMENT_CODE.FV]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.FV,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n includeCodigoInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.NE]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.NE,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n extraDataParams: { tipo: 1 },\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.NORMAL]: {\n codigo: 'OR',\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ELECTRONIC_DOCUMENT_CODE.NC]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.NC,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.ND]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.ND,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.GR]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.GR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n\n // Reportes de ventas\n [SALE_CODE_REPORT.SRR]: {\n codigo: SALE_CODE_REPORT.SRR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [SALE_CODE_REPORT.SRRC]: {\n codigo: SALE_CODE_REPORT.SRRC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [SALE_CODE_REPORT.FG]: {\n codigo: SALE_CODE_REPORT.FG,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de compras\n [PURCHASE_CODE_REPORT.RCNH]: {\n codigo: PURCHASE_CODE_REPORT.RCNH,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [PURCHASE_CODE_REPORT.RLC]: {\n codigo: PURCHASE_CODE_REPORT.RLC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de contabilidad\n [ACCOUNTING_CODE_REPORT.RCEGR]: {\n codigo: ACCOUNTING_CODE_REPORT.RCEGR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.ACEDFP]: {\n codigo: ACCOUNTING_CODE_REPORT.ACEDFP,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.ACELC]: {\n codigo: ACCOUNTING_CODE_REPORT.ACELC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de clientes\n [CUSTOMER_CODE_REPORT.RCL]: {\n codigo: CUSTOMER_CODE_REPORT.RCL,\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de inventario\n [INVENTORY_CODE_REPORT.RK]: {\n codigo: INVENTORY_CODE_REPORT.RK,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [INVENTORY_CODE_REPORT.CDAA]: {\n codigo: INVENTORY_CODE_REPORT.CDAA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.CDA]: {\n codigo: INVENTORY_CODE_REPORT.CDA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.STOCK_VALORACION]: {\n codigo: INVENTORY_CODE_REPORT.STOCK_VALORACION,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.ARTICULO_PVP]: {\n codigo: INVENTORY_CODE_REPORT.ARTICULO_PVP,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RAF]: {\n codigo: INVENTORY_CODE_REPORT.RAF,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RCAA]: {\n codigo: INVENTORY_CODE_REPORT.RCAA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RASR]: {\n codigo: INVENTORY_CODE_REPORT.RASR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RCD]: {\n codigo: INVENTORY_CODE_REPORT.RCD,\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [INVENTORY_CODE_REPORT.RTB]: {\n codigo: INVENTORY_CODE_REPORT.RTB,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n };\n\n /**\n * Construye los parámetros de reporte según el tipo de documento\n */\n static buildParams(\n docData: ReportDocumentData,\n format: 'pdf' | 'excel' | 'word' = 'pdf',\n ): ReportParams {\n const config = this.getReportConfig(docData.codDoc);\n\n return {\n hasService: config.hasService,\n reportParams: this.buildReportParams(docData, config, format),\n dataParams: this.buildDataParams(docData, config, format),\n };\n }\n\n /**\n * Determina si debe usar la API v1 según el tipo de documento\n */\n static shouldUseV1Api(codDoc: string): boolean {\n const config = this.getReportConfig(codDoc);\n return config.useV1Api;\n }\n\n /**\n * Obtiene la configuración para un tipo de documento\n */\n private static getReportConfig(codDoc: string): ReportConfig {\n const config = this.reportConfigs[codDoc];\n if (!config) {\n throw new Error(\n `Tipo de documento no soportado: ${codDoc}. Tipos disponibles: ${Object.keys(this.reportConfigs).join(', ')}`,\n );\n }\n return config;\n }\n\n /**\n * Construye los parámetros del reporte\n */\n private static buildReportParams(\n docData: ReportDocumentData,\n config: ReportConfig,\n format: string,\n ): string {\n const params: any = {\n codigo: config.codigo,\n format,\n };\n\n // Agregar hasParams según configuración\n if (config.hasParams !== undefined) {\n params.hasParams = config.hasParams;\n }\n\n // Agregar codEstab si existe\n if (docData.codEstab) {\n params.codEstab = docData.codEstab;\n }\n\n // Solo agregar aditionalParams si hasService es true y hasParams es true\n if (config.hasService && config.hasParams) {\n params.aditionalParams = [];\n }\n\n return JSON.stringify(params);\n }\n\n /**\n * Construye los parámetros de datos\n */\n private static buildDataParams(\n docData: ReportDocumentData,\n config: ReportConfig,\n format: string,\n ): string {\n const params: any = {};\n\n // Agregar ID si existe el campo configurado\n if (config.idField && docData[config.idField]) {\n params.id = docData[config.idField];\n }\n\n // Agregar parámetros adicionales según configuración\n if (config.includeEstabInData && docData.codEstab) {\n params.codEstab = docData.codEstab;\n }\n\n if (config.includeCodigoInData) {\n params.codigo = config.codigo;\n }\n\n if (config.hasService && config.hasParams) {\n params.hasParams = true;\n if (config.includeCodigoInData) {\n params.format = format;\n }\n }\n\n // Agregar parámetros extra específicos del tipo\n if (config.extraDataParams) {\n Object.assign(params, config.extraDataParams);\n }\n\n // Agregar cualquier parámetro adicional del docData\n Object.keys(docData).forEach((key) => {\n if (!['codDoc', 'codEstab', 'id', 'serie'].includes(key) && docData[key] !== undefined) {\n params[key] = docData[key];\n }\n });\n\n return JSON.stringify(params);\n }\n\n /**\n * Construye las opciones completas para generar un reporte\n */\n static build(\n docData: ReportDocumentData,\n format: 'pdf' | 'excel' | 'word' = 'pdf',\n returnBlob = false,\n ) {\n return {\n data: this.buildParams(docData, format),\n format,\n useV1Api: this.shouldUseV1Api(docData.codDoc),\n returnBlob,\n };\n }\n\n /**\n * Obtiene la lista de tipos de documento soportados\n */\n static getSupportedDocumentTypes(): string[] {\n return Object.keys(this.reportConfigs);\n }\n\n /**\n * Verifica si un tipo de documento está soportado\n */\n static isDocumentTypeSupported(codDoc: string): boolean {\n return codDoc in this.reportConfigs;\n }\n\n /**\n * Registra un nuevo tipo de reporte dinámicamente\n */\n static registerReportType(codDoc: string, config: ReportConfig): void {\n this.reportConfigs[codDoc] = config;\n }\n}\n","import { Component, OnInit, inject, Input, signal } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { Observable, throwError } from 'rxjs';\nimport { WhatsAppMessagingFacade } from '../../facades/whatsapp.facade';\nimport { ReportFacade } from '../../facades/report.facade';\nimport { ReportParamsBuilder } from '../../builders/report-params.builder';\nimport { PhoneFormatterUtil } from '../../utils/phone-formatter.util';\nimport { FileMapperUtil } from '../../utils/file-mapper.util';\n\nexport interface DocumentData {\n idDocumentoElectronico?: number;\n documentoId?: number;\n codDoc: string;\n docType?: string;\n codEstab?: string;\n id?: number;\n serie?: string;\n}\n\nexport interface WhatsAppSendConfig {\n documentData?: DocumentData;\n phoneNumbers?: string[];\n defaultMessage?: string;\n establishmentPhone?: string;\n establishmentName?: string;\n customerName?: string;\n}\n\n@Component({\n selector: 'acp-whatsapp-sender',\n templateUrl: './whatsapp-sender.html',\n styleUrls: ['./whatsapp-sender.scss'],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCardModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatSelectModule,\n ],\n})\nexport class WhatsAppSender implements OnInit {\n @Input() config?: WhatsAppSendConfig;\n\n private readonly fb = inject(FormBuilder);\n private readonly whatsappFacade = inject(WhatsAppMessagingFacade);\n private readonly reportFacade = inject(ReportFacade);\n private readonly snackBar = inject(MatSnackBar);\n\n whatsappForm!: FormGroup;\n isLoading = signal(false);\n messageLength = 0;\n phoneNumbers = signal<string[]>([]);\n showWhatsAppWebLink = signal(false);\n whatsAppWebUrl = signal('');\n\n // Datos del documento y establecimiento\n establishmentPhone = '';\n establishmentName = '';\n customerName = '';\n\n ngOnInit(): void {\n this.initializeForm();\n this.setupMessageLengthCounter();\n this.loadConfigData();\n }\n\n private loadConfigData(): void {\n if (this.config) {\n if (this.config.phoneNumbers) {\n this.phoneNumbers.set(this.config.phoneNumbers);\n if (this.config.phoneNumbers.length > 0) {\n this.whatsappForm.patchValue({ phoneNumber: this.config.phoneNumbers[0] });\n }\n }\n\n if (this.config.defaultMessage) {\n this.whatsappForm.patchValue({ message: this.config.defaultMessage });\n }\n\n this.establishmentPhone = this.config.establishmentPhone || '';\n this.establishmentName = this.config.establishmentName || '';\n this.customerName = this.config.customerName || '';\n }\n }\n\n private initializeForm(): void {\n this.whatsappForm = this.fb.group({\n phoneNumber: ['', [Validators.required, this.ecuadorianPhoneValidator.bind(this)]],\n message: ['', [Validators.required, Validators.maxLength(500)]],\n });\n }\n\n // Validador personalizado para números ecuatorianos\n private ecuadorianPhoneValidator(control: any) {\n if (!control.value) return null;\n\n const validation = PhoneFormatterUtil.validateEcuadorianPhone(control.value);\n\n return validation.isValid ? null : { invalidPhone: true };\n }\n\n private setupMessageLengthCounter(): void {\n this.whatsappForm.get('message')?.valueChanges.subscribe((value) => {\n this.messageLength = value ? value.length : 0;\n });\n }\n\n sendWhatsApp(): void {\n if (this.whatsappForm.valid) {\n if (!this.validatePhoneNumber()) return;\n\n const { phoneNumber, message } = this.whatsappForm.value;\n\n // Si hay configuración de documento, generar y enviar archivo\n if (this.config?.documentData) {\n this.sendWithDocument(phoneNumber, message);\n } else {\n // Envío simple de texto\n this.sendSimpleMessage(phoneNumber, message);\n }\n }\n }\n\n private validatePhoneNumber(): boolean {\n const phoneNumber = this.whatsappForm.get('phoneNumber')?.value;\n const validation = PhoneFormatterUtil.validateEcuadorianPhone(phoneNumber);\n\n if (!validation.isValid) {\n this.showError(validation.errorMessage || 'Número de teléfono inválido');\n return false;\n }\n\n return true;\n }\n\n private sendSimpleMessage(phoneNumber: string, message: string): void {\n this.isLoading.set(true);\n\n this.whatsappFacade.sendSimpleText(phoneNumber, message).subscribe({\n next: (response) => {\n this.isLoading.set(false);\n if (response.success) {\n this.showSuccess('Mensaje enviado exitosamente');\n this.clearForm();\n } else {\n this.showError(response.error?.message || 'Error al enviar mensaje');\n this.prepareWhatsAppWebLink(phoneNumber, message);\n }\n },\n error: (_error) => {\n this.isLoading.set(false);\n this.showError('Error de conexión');\n this.prepareWhatsAppWebLink(phoneNumber, message);\n },\n });\n }\n\n private sendWithDocument(phoneNumber: string, message: string): void {\n if (!this.config?.documentData) return;\n\n this.isLoading.set(true);\n\n // Generar el reporte primero\n this.generateReport().subscribe({\n next: (reportResponse) => {\n if (reportResponse) {\n const { file, fileName } = this.processReportFile(reportResponse);\n this.sendMediaWithMessages(phoneNumber, message, file, fileName);\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error generando reporte:', error);\n this.showError('Error al generar el documento');\n },\n });\n }\n\n private generateReport(): Observable<any> {\n const docData = this.config!.documentData!;\n\n // Construir opciones de reporte\n const reportOptions = ReportParamsBuilder.build(docData, 'pdf', true);\n\n const reportResult = this.reportFacade.generate(reportOptions);\n\n // Manejar el caso donde generate puede retornar void\n return reportResult || throwError(() => new Error('No se pudo generar el reporte'));\n }\n\n private processReportFile(response: any): { file: File; fileName: string } {\n const file = FileMapperUtil.fromResponse(response);\n const fileName = FileMapperUtil.extractFileName(response);\n\n return { file, fileName };\n }\n\n private sendMediaWithMessages(\n phoneNumber: string,\n message: string,\n file: File,\n fileName: string,\n ): void {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(phoneNumber);\n\n // Enviar solo el documento con el mensaje como caption\n this.whatsappFacade\n .sendDocumentWithTemplate({\n phone: formattedPhone,\n file: file,\n templateName: 'documento_generico',\n bodyParams: [message],\n filename: fileName,\n })\n .subscribe({\n next: () => {\n this.isLoading.set(false);\n this.showSuccess('Documento enviado correctamente');\n this.clearForm();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error enviando documento:', error);\n this.showError('Error al enviar el documento');\n this.prepareWhatsAppWebLink(phoneNumber, message);\n },\n });\n }\n\n private prepareWhatsAppWebLink(phoneNumber: string, message: string): void {\n const cleanPhoneNumber = PhoneFormatterUtil.formatForWhatsAppWeb(phoneNumber);\n const encodedMessage = encodeURIComponent(message);\n const whatsappUrl = `https://wa.me/${cleanPhoneNumber}?text=${encodedMessage}`;\n\n this.whatsAppWebUrl.set(whatsappUrl);\n this.showWhatsAppWebLink.set(true);\n }\n\n openWhatsAppWeb(): void {\n const url = this.whatsAppWebUrl();\n if (url) {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n }\n\n hideWhatsAppWebLink(): void {\n this.showWhatsAppWebLink.set(false);\n this.whatsAppWebUrl.set('');\n }\n\n private showSuccess(message: string): void {\n this.snackBar.open(message, 'Cerrar', {\n duration: 3000,\n panelClass: ['success-snackbar'],\n });\n }\n\n private showError(message: string): void {\n this.snackBar.open(message, 'Cerrar', {\n duration: 5000,\n panelClass: ['error-snackbar'],\n });\n }\n\n clearForm(): void {\n this.whatsappForm.reset();\n this.messageLength = 0;\n this.hideWhatsAppWebLink();\n }\n\n // Método para mostrar el formato del teléfono\n get formattedPhoneDisplay(): string {\n const phone = this.whatsappForm.get('phoneNumber')?.value;\n return PhoneFormatterUtil.formatForDisplay(phone || '');\n }\n\n // Método para obtener placeholder dinámico\n get phonePlaceholder(): string {\n return PhoneFormatterUtil.getPhonePlaceholder();\n }\n\n // Método para obtener el hint del campo\n get phoneHint(): string {\n const phone = this.whatsappForm.get('phoneNumber')?.value;\n return PhoneFormatterUtil.getPhoneHint(phone || '');\n }\n}\n","<div class=\"whatsapp-sender-container\">\n <mat-card class=\"sender-card\">\n <mat-card-header>\n <div mat-card-avatar class=\"whatsapp-avatar\">\n <mat-icon>chat</mat-icon>\n </div>\n <mat-card-title>Enviar por WhatsApp</mat-card-title>\n <mat-card-subtitle>Comparte contenido directamente</mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <form [formGroup]=\"whatsappForm\" (ngSubmit)=\"sendWhatsApp()\">\n <!-- Campo para número de teléfono -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Número de teléfono</mat-label>\n @if (phoneNumbers().length > 1) {\n <mat-select formControlName=\"phoneNumber\">\n @for (phone of phoneNumbers(); track phone) {\n <mat-option [value]=\"phone\">{{ phone }}</mat-option>\n }\n </mat-select>\n } @else {\n <input\n matInput\n formControlName=\"phoneNumber\"\n [placeholder]=\"phonePlaceholder\"\n type=\"tel\"\n />\n }\n <mat-icon matSuffix>phone</mat-icon>\n <mat-hint>{{ phoneHint }}</mat-hint>\n @if (whatsappForm.get('phoneNumber')?.hasError('required')) {\n <mat-error>El número de teléfono es requerido</mat-error>\n }\n @if (whatsappForm.get('phoneNumber')?.hasError('invalidPhone')) {\n <mat-error>Ingrese un número ecuatoriano válido (09xxxxxxxx)</mat-error>\n }\n </mat-form-field>\n\n <!-- Campo para mensaje -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Mensaje</mat-label>\n <textarea\n matInput\n formControlName=\"message\"\n placeholder=\"Escribe tu mensaje aquí...\"\n rows=\"4\"\n maxlength=\"500\"\n >\n </textarea>\n <mat-icon matSuffix>message</mat-icon>\n <mat-hint align=\"end\">{{ messageLength }}/500 caracteres</mat-hint>\n @if (whatsappForm.get('message')?.hasError('required')) {\n <mat-error>El mensaje es requerido</mat-error>\n }\n </mat-form-field>\n\n <!-- Botones de acción -->\n <div class=\"action-buttons\">\n <button\n mat-raised-button\n color=\"primary\"\n type=\"submit\"\n [disabled]=\"whatsappForm.invalid || isLoading()\"\n class=\"send-button\"\n >\n @if (!isLoading()) {\n <mat-icon>send</mat-icon>\n }\n @if (isLoading()) {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n {{ isLoading() ? 'Enviando...' : 'Enviar por WhatsApp' }}\n </button>\n\n <button mat-button type=\"button\" (click)=\"clearForm()\" [disabled]=\"isLoading()\">\n <mat-icon>clear</mat-icon>\n Limpiar\n </button>\n </div>\n\n <!-- Enlace opcional a WhatsApp Web -->\n @if (showWhatsAppWebLink()) {\n <div class=\"whatsapp-web-link\">\n <mat-icon>info</mat-icon>\n <span>¿No se pudo enviar? Prueba enviando directamente:</span>\n <button mat-button color=\"accent\" (click)=\"openWhatsAppWeb()\">\n <mat-icon>open_in_new</mat-icon>\n Abrir WhatsApp Web\n </button>\n <button mat-icon-button (click)=\"hideWhatsAppWebLink()\" aria-label=\"Cerrar\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n }\n </form>\n </mat-card-content>\n </mat-card>\n</div>\n","// Contracts\nexport * from './contracts';\n// Models\nexport * from './models/whatsapp.model';\n// Constants\nexport * from './constants';\n// Tokens\nexport * from './tokens';\n\n// Facades\nexport * from './facades';\n// Adapters\nexport * from './adapters';\n// Builders\nexport * from './builders';\n// Utils\nexport * from './utils';\n\n// UI Components\nexport * from './ui';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acontplus/ng-common",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Common Angular library with shared components, services, and utilities for enterprise applications. Includes WhatsApp messaging, report generation, document printing, and reusable UI components built with clean architecture patterns.",
5
5
  "peerDependencies": {
6
6
  "@angular/core": "^21.0.0",
@@ -106,17 +106,17 @@ interface ReportOptions<T = any> {
106
106
  data: T;
107
107
  format?: 'pdf' | 'excel' | 'word';
108
108
  useV1Api?: boolean;
109
- forceDownload?: boolean;
110
- returnBlob?: boolean;
111
109
  }
112
110
  /**
113
111
  * Puerto para generación de reportes
114
112
  * Solo se encarga de generar reportes, no de impresión
115
113
  */
116
114
  interface ReportPort {
117
- generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> | void;
118
- saveFile(response: any, format?: string, forceDownload?: boolean): void;
119
- getFileName(response: any): string;
115
+ /**
116
+ * Genera un reporte y devuelve el Observable
117
+ * El consumidor decide si descargar, abrir o procesar el blob
118
+ */
119
+ generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>>;
120
120
  }
121
121
 
122
122
  /**
@@ -275,13 +275,198 @@ declare const WHATSAPP_MESSAGING_PORT: InjectionToken<WhatsAppMessagingPort>;
275
275
 
276
276
  declare const PRINTER_PORT: InjectionToken<PrinterPort>;
277
277
 
278
+ /**
279
+ * Facade para generación de reportes
280
+ *
281
+ * Proporciona una API de alto nivel para generar reportes con manejo automático de archivos.
282
+ * Todos los métodos devuelven Observables - el consumidor debe hacer subscribe().
283
+ *
284
+ * @example
285
+ * ```typescript
286
+ * // Control total del blob
287
+ * this.reportFacade.generate(options).subscribe(response => {
288
+ * const blob = response.body;
289
+ * // Procesar blob manualmente
290
+ * });
291
+ *
292
+ * // Descarga automática
293
+ * this.reportFacade.download(options).subscribe();
294
+ *
295
+ * // Abrir PDF automáticamente
296
+ * this.reportFacade.open(options).subscribe();
297
+ * ```
298
+ */
278
299
  declare class ReportFacade {
279
300
  private readonly reportPort;
280
- generate<T>(options: ReportOptions<T>): Observable<any> | void;
281
- generatePDF<T>(data: T, forceDownload?: boolean): void;
282
- generateExcel<T>(data: T, forceDownload?: boolean): void;
283
- generateWord<T>(data: T, forceDownload?: boolean): void;
284
- generateBlob<T>(data: T, format?: 'pdf' | 'excel' | 'word'): Observable<any>;
301
+ /**
302
+ * Genera un reporte y devuelve el Observable con el blob
303
+ *
304
+ * Este método proporciona control total sobre el blob generado.
305
+ * No realiza ninguna acción automática (descarga/apertura).
306
+ * Útil cuando necesitas procesar el blob manualmente (enviar por WhatsApp, guardar en servidor, etc.)
307
+ *
308
+ * @template T - Tipo de datos del reporte
309
+ * @param options - Opciones de generación del reporte
310
+ * @param options.data - Datos del reporte (usar ReportParamsBuilder.build())
311
+ * @param options.format - Formato del reporte: 'pdf' | 'excel' | 'word'
312
+ * @param options.useV1Api - Si debe usar la API v1 (por defecto false)
313
+ * @returns Observable con la respuesta HTTP que contiene el blob
314
+ *
315
+ * @example
316
+ * ```typescript
317
+ * const options = ReportParamsBuilder.build(
318
+ * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },
319
+ * 'pdf'
320
+ * );
321
+ *
322
+ * this.reportFacade.generate(options).subscribe({
323
+ * next: (response) => {
324
+ * const blob = response.body;
325
+ * const fileName = FileMapperUtil.extractFileName(response);
326
+ * // Procesar blob según necesidad
327
+ * },
328
+ * error: (err) => console.error('Error:', err)
329
+ * });
330
+ * ```
331
+ */
332
+ generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>>;
333
+ /**
334
+ * Genera un reporte y lo descarga automáticamente
335
+ *
336
+ * Extrae el nombre del archivo desde los headers HTTP y descarga el archivo automáticamente.
337
+ * Funciona para cualquier formato (PDF, Excel, Word).
338
+ * El Observable se completa después de iniciar la descarga.
339
+ *
340
+ * @template T - Tipo de datos del reporte
341
+ * @param options - Opciones de generación del reporte
342
+ * @returns Observable que se completa después de iniciar la descarga
343
+ *
344
+ * @example
345
+ * ```typescript
346
+ * // Con formato dinámico
347
+ * const options = ReportParamsBuilder.build(
348
+ * { codDoc: SALE_CODE_REPORT.FG },
349
+ * this.selectedFormat // 'pdf' | 'excel' | 'word'
350
+ * );
351
+ * this.reportFacade.download(options).subscribe();
352
+ *
353
+ * // Con formato fijo
354
+ * const options = ReportParamsBuilder.build(
355
+ * { codDoc: INVENTORY_CODE_REPORT.RCD },
356
+ * 'excel'
357
+ * );
358
+ * this.reportFacade.download(options).subscribe();
359
+ * ```
360
+ */
361
+ download<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>>;
362
+ /**
363
+ * Genera un reporte y lo abre en nueva ventana (o descarga en navegadores legacy)
364
+ *
365
+ * Comportamiento inteligente según el navegador:
366
+ * - Navegadores modernos: Abre el archivo en nueva ventana/pestaña
367
+ * - Navegadores legacy (IE, Edge antiguo): Descarga el archivo
368
+ *
369
+ * Ideal para PDFs que el usuario quiere visualizar inmediatamente.
370
+ * También funciona con Excel/Word pero la experiencia puede variar según el navegador.
371
+ *
372
+ * @template T - Tipo de datos del reporte
373
+ * @param options - Opciones de generación del reporte
374
+ * @returns Observable que se completa después de abrir/descargar el archivo
375
+ *
376
+ * @example
377
+ * ```typescript
378
+ * // Abrir PDF
379
+ * const options = ReportParamsBuilder.build(
380
+ * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },
381
+ * 'pdf'
382
+ * );
383
+ * this.reportFacade.open(options).subscribe();
384
+ *
385
+ * // Con formato dinámico
386
+ * const format = this.isPDF ? 'pdf' : 'excel';
387
+ * const options = ReportParamsBuilder.build({ codDoc: code }, format);
388
+ * this.reportFacade.open(options).subscribe();
389
+ * ```
390
+ */
391
+ open<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>>;
392
+ /**
393
+ * Genera un PDF y lo abre automáticamente (shortcut)
394
+ *
395
+ * Método de conveniencia para el caso común de generar y abrir PDFs.
396
+ * Equivalente a llamar open() con format: 'pdf'.
397
+ *
398
+ * @template T - Tipo de datos del reporte
399
+ * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)
400
+ * @param useV1Api - Si debe usar la API v1 (por defecto false)
401
+ * @returns Observable que se completa después de abrir el PDF
402
+ *
403
+ * @example
404
+ * ```typescript
405
+ * const reportOptions = ReportParamsBuilder.build(
406
+ * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },
407
+ * 'pdf'
408
+ * );
409
+ *
410
+ * // Forma corta
411
+ * this.reportFacade.openPDF(
412
+ * reportOptions.data,
413
+ * reportOptions.useV1Api
414
+ * ).subscribe();
415
+ * ```
416
+ */
417
+ openPDF<T>(data: T, useV1Api?: boolean): Observable<HttpResponse<Blob>>;
418
+ /**
419
+ * Genera un Excel y lo descarga automáticamente (shortcut)
420
+ *
421
+ * Método de conveniencia para el caso común de generar y descargar archivos Excel.
422
+ * Equivalente a llamar download() con format: 'excel'.
423
+ *
424
+ * @template T - Tipo de datos del reporte
425
+ * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)
426
+ * @param useV1Api - Si debe usar la API v1 (por defecto false)
427
+ * @returns Observable que se completa después de iniciar la descarga
428
+ *
429
+ * @example
430
+ * ```typescript
431
+ * const reportOptions = ReportParamsBuilder.build(
432
+ * { codDoc: SALE_CODE_REPORT.FG, fechaInicio: '2024-01-01' },
433
+ * 'excel'
434
+ * );
435
+ *
436
+ * // Forma corta
437
+ * this.reportFacade.downloadExcel(
438
+ * reportOptions.data,
439
+ * reportOptions.useV1Api
440
+ * ).subscribe();
441
+ * ```
442
+ */
443
+ downloadExcel<T>(data: T, useV1Api?: boolean): Observable<HttpResponse<Blob>>;
444
+ /**
445
+ * Genera un Word y lo descarga automáticamente (shortcut)
446
+ *
447
+ * Método de conveniencia para el caso común de generar y descargar archivos Word.
448
+ * Equivalente a llamar download() con format: 'word'.
449
+ *
450
+ * @template T - Tipo de datos del reporte
451
+ * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)
452
+ * @param useV1Api - Si debe usar la API v1 (por defecto false)
453
+ * @returns Observable que se completa después de iniciar la descarga
454
+ *
455
+ * @example
456
+ * ```typescript
457
+ * const reportOptions = ReportParamsBuilder.build(
458
+ * { codDoc: CUSTOMER_CODE_REPORT.RCL },
459
+ * 'word'
460
+ * );
461
+ *
462
+ * // Forma corta
463
+ * this.reportFacade.downloadWord(
464
+ * reportOptions.data,
465
+ * reportOptions.useV1Api
466
+ * ).subscribe();
467
+ * ```
468
+ */
469
+ downloadWord<T>(data: T, useV1Api?: boolean): Observable<HttpResponse<Blob>>;
285
470
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportFacade, never>;
286
471
  static ɵprov: i0.ɵɵInjectableDeclaration<ReportFacade>;
287
472
  }
@@ -358,11 +543,13 @@ declare class GreenWhatsAppAdapter implements WhatsAppMessagingPort {
358
543
  static ɵprov: i0.ɵɵInjectableDeclaration<GreenWhatsAppAdapter>;
359
544
  }
360
545
 
546
+ /**
547
+ * Adapter para generación de reportes
548
+ * Siempre devuelve Observable - el consumidor decide qué hacer con el blob
549
+ */
361
550
  declare class ReportAdapter implements ReportPort {
362
551
  private readonly http;
363
- generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> | void;
364
- getFileName(response: any): string;
365
- saveFile(response: any, format?: string, forceDownload?: boolean): void;
552
+ generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>>;
366
553
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportAdapter, never>;
367
554
  static ɵprov: i0.ɵɵInjectableDeclaration<ReportAdapter>;
368
555
  }