@acontplus/ng-common 1.0.11 → 1.0.12

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
@@ -477,4 +477,4 @@ ng-common/
477
477
  ## Soporte
478
478
 
479
479
  Para reportar problemas o solicitar nuevas funcionalidades, visita:
480
- https://github.com/Acontplus-S-A-S/acontplus-libs/issues
480
+ https://github.com/acontplus/acontplus-libs/issues
@@ -629,10 +629,10 @@ class ReportFacade {
629
629
  useV1Api,
630
630
  });
631
631
  }
632
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReportFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
633
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReportFacade, providedIn: 'root' });
632
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ReportFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
633
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ReportFacade, providedIn: 'root' });
634
634
  }
635
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReportFacade, decorators: [{
635
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ReportFacade, decorators: [{
636
636
  type: Injectable,
637
637
  args: [{ providedIn: 'root' }]
638
638
  }] });
@@ -885,10 +885,10 @@ class WhatsAppMessagingFacade {
885
885
  toDisplayFormat(phone) {
886
886
  return PhoneFormatterUtil.formatForDisplay(phone);
887
887
  }
888
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WhatsAppMessagingFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
889
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WhatsAppMessagingFacade, providedIn: 'root' });
888
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WhatsAppMessagingFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
889
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WhatsAppMessagingFacade, providedIn: 'root' });
890
890
  }
891
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WhatsAppMessagingFacade, decorators: [{
891
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WhatsAppMessagingFacade, decorators: [{
892
892
  type: Injectable,
893
893
  args: [{ providedIn: 'root' }]
894
894
  }] });
@@ -925,10 +925,10 @@ class PrinterFacade {
925
925
  }
926
926
  }
927
927
  }
928
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: PrinterFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
929
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: PrinterFacade, providedIn: 'root' });
928
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PrinterFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
929
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PrinterFacade, providedIn: 'root' });
930
930
  }
931
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: PrinterFacade, decorators: [{
931
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PrinterFacade, decorators: [{
932
932
  type: Injectable,
933
933
  args: [{ providedIn: 'root' }]
934
934
  }] });
@@ -970,10 +970,10 @@ class MetaWhatsAppAdapter {
970
970
  getStatus() {
971
971
  return this.http.get(`${API_PATHS.WHATSAPP}/status`);
972
972
  }
973
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: MetaWhatsAppAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
974
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: MetaWhatsAppAdapter });
973
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: MetaWhatsAppAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
974
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: MetaWhatsAppAdapter });
975
975
  }
976
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: MetaWhatsAppAdapter, decorators: [{
976
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: MetaWhatsAppAdapter, decorators: [{
977
977
  type: Injectable
978
978
  }] });
979
979
 
@@ -1016,10 +1016,10 @@ class GreenWhatsAppAdapter {
1016
1016
  getStatus() {
1017
1017
  return this.http.get('/api/green/status');
1018
1018
  }
1019
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: GreenWhatsAppAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1020
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: GreenWhatsAppAdapter });
1019
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: GreenWhatsAppAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1020
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: GreenWhatsAppAdapter });
1021
1021
  }
1022
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: GreenWhatsAppAdapter, decorators: [{
1022
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: GreenWhatsAppAdapter, decorators: [{
1023
1023
  type: Injectable
1024
1024
  }] });
1025
1025
 
@@ -1038,10 +1038,10 @@ class ReportAdapter {
1038
1038
  responseType: 'blob',
1039
1039
  });
1040
1040
  }
1041
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReportAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1042
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReportAdapter });
1041
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ReportAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1042
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ReportAdapter });
1043
1043
  }
1044
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReportAdapter, decorators: [{
1044
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ReportAdapter, decorators: [{
1045
1045
  type: Injectable
1046
1046
  }] });
1047
1047
 
@@ -1140,10 +1140,10 @@ class PrinterAdapter {
1140
1140
  codDoc: DOCUMENT_TYPES.NOTA_ENTREGA,
1141
1141
  }).subscribe();
1142
1142
  }
1143
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: PrinterAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1144
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: PrinterAdapter });
1143
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PrinterAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1144
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PrinterAdapter });
1145
1145
  }
1146
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: PrinterAdapter, decorators: [{
1146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: PrinterAdapter, decorators: [{
1147
1147
  type: Injectable
1148
1148
  }] });
1149
1149
 
@@ -1351,6 +1351,17 @@ class ReportParamsBuilder {
1351
1351
  hasParams: false,
1352
1352
  hasIdUsuarioRol: true,
1353
1353
  },
1354
+ [ACCOUNTING_CODE_REPORT.RMIE]: {
1355
+ codigo: ACCOUNTING_CODE_REPORT.RMIE,
1356
+ hasService: false,
1357
+ useV1Api: false,
1358
+ },
1359
+ [ACCOUNTING_CODE_REPORT.CDCC]: {
1360
+ codigo: ACCOUNTING_CODE_REPORT.CDCC,
1361
+ hasService: true,
1362
+ useV1Api: true,
1363
+ idField: 'id',
1364
+ },
1354
1365
  // Reportes de clientes
1355
1366
  [CUSTOMER_CODE_REPORT.RCL]: {
1356
1367
  codigo: CUSTOMER_CODE_REPORT.RCL,
@@ -1362,57 +1373,58 @@ class ReportParamsBuilder {
1362
1373
  // Reportes de inventario
1363
1374
  [INVENTORY_CODE_REPORT.RK]: {
1364
1375
  codigo: INVENTORY_CODE_REPORT.RK,
1365
- hasService: true,
1376
+ hasService: false,
1366
1377
  useV1Api: false,
1367
1378
  idField: 'id',
1368
1379
  hasParams: true,
1380
+ hasIdUsuarioRol: true,
1369
1381
  },
1370
1382
  [INVENTORY_CODE_REPORT.CDAA]: {
1371
1383
  codigo: INVENTORY_CODE_REPORT.CDAA,
1372
1384
  hasService: true,
1373
- useV1Api: false,
1385
+ useV1Api: true,
1374
1386
  idField: 'id',
1375
1387
  hasParams: false,
1376
1388
  },
1377
1389
  [INVENTORY_CODE_REPORT.CDA]: {
1378
1390
  codigo: INVENTORY_CODE_REPORT.CDA,
1379
1391
  hasService: true,
1380
- useV1Api: false,
1392
+ useV1Api: true,
1381
1393
  idField: 'id',
1382
1394
  hasParams: false,
1383
1395
  },
1384
1396
  [INVENTORY_CODE_REPORT.STOCK_VALORACION]: {
1385
1397
  codigo: INVENTORY_CODE_REPORT.STOCK_VALORACION,
1386
1398
  hasService: true,
1387
- useV1Api: false,
1399
+ useV1Api: true,
1388
1400
  idField: 'id',
1389
1401
  hasParams: false,
1390
1402
  },
1391
1403
  [INVENTORY_CODE_REPORT.ARTICULO_PVP]: {
1392
1404
  codigo: INVENTORY_CODE_REPORT.ARTICULO_PVP,
1393
1405
  hasService: true,
1394
- useV1Api: false,
1406
+ useV1Api: true,
1395
1407
  idField: 'id',
1396
1408
  hasParams: false,
1397
1409
  },
1398
1410
  [INVENTORY_CODE_REPORT.RAF]: {
1399
1411
  codigo: INVENTORY_CODE_REPORT.RAF,
1400
1412
  hasService: true,
1401
- useV1Api: false,
1413
+ useV1Api: true,
1402
1414
  idField: 'id',
1403
1415
  hasParams: false,
1404
1416
  },
1405
1417
  [INVENTORY_CODE_REPORT.RCAA]: {
1406
1418
  codigo: INVENTORY_CODE_REPORT.RCAA,
1407
1419
  hasService: true,
1408
- useV1Api: false,
1420
+ useV1Api: true,
1409
1421
  idField: 'id',
1410
1422
  hasParams: false,
1411
1423
  },
1412
1424
  [INVENTORY_CODE_REPORT.RASR]: {
1413
1425
  codigo: INVENTORY_CODE_REPORT.RASR,
1414
1426
  hasService: true,
1415
- useV1Api: false,
1427
+ useV1Api: true,
1416
1428
  idField: 'id',
1417
1429
  hasParams: false,
1418
1430
  },
@@ -1972,10 +1984,10 @@ class WhatsAppSender {
1972
1984
  const phone = this.whatsappForm.get('phoneNumber')?.value;
1973
1985
  return PhoneFormatterUtil.getPhoneHint(phone || '');
1974
1986
  }
1975
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WhatsAppSender, deps: [], target: i0.ɵɵFactoryTarget.Component });
1976
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: WhatsAppSender, isStandalone: true, selector: "acp-whatsapp-sender", inputs: { config: "config" }, ngImport: i0, template: "<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\u00FAmero de tel\u00E9fono -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>N\u00FAmero de tel\u00E9fono</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\u00FAmero de tel\u00E9fono es requerido</mat-error>\n }\n @if (whatsappForm.get('phoneNumber')?.hasError('invalidPhone')) {\n <mat-error>Ingrese un n\u00FAmero ecuatoriano v\u00E1lido (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\u00ED...\"\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\u00F3n -->\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>\u00BFNo 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", styles: [".whatsapp-sender-container{max-width:500px;margin:0 auto;padding:16px}.whatsapp-sender-container .sender-card{box-shadow:0 4px 8px #0000001a;border-radius:12px}.whatsapp-sender-container .sender-card mat-card-header{padding-bottom:16px}.whatsapp-sender-container .sender-card mat-card-header .whatsapp-avatar{background:linear-gradient(135deg,#25d366,#128c7e);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:50%;width:40px;height:40px}.whatsapp-sender-container .sender-card mat-card-header .whatsapp-avatar mat-icon{font-size:24px}.whatsapp-sender-container .sender-card mat-card-header mat-card-title{color:#128c7e;font-weight:600}.whatsapp-sender-container .sender-card mat-card-header mat-card-subtitle{color:#666}.whatsapp-sender-container .sender-card mat-card-content{padding-top:0}.whatsapp-sender-container .sender-card mat-card-content .full-width{width:100%;margin-bottom:16px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons{display:flex;gap:12px;justify-content:flex-end;margin-top:24px;flex-wrap:wrap}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button{background:linear-gradient(135deg,#25d366,#128c7e);color:#fff;min-width:180px;height:44px;border-radius:22px;font-weight:500}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button:hover:not(:disabled){background:linear-gradient(135deg,#128c7e,#25d366);transform:translateY(-1px);box-shadow:0 4px 12px #25d3664d}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button:disabled{background:#ccc;color:#666}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button mat-icon{margin-right:8px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button mat-spinner{margin-right:8px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons button[mat-button]{color:#666;border-radius:22px;height:44px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons button[mat-button]:hover:not(:disabled){background-color:#0000000a}.whatsapp-sender-container .sender-card mat-card-content .action-buttons button[mat-button] mat-icon{margin-right:4px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link{display:flex;align-items:center;gap:8px;margin-top:16px;padding:12px 16px;background-color:#f5f5f5;border-radius:8px;border-left:4px solid #25d366;flex-wrap:wrap}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link mat-icon:first-child{color:#25d366;font-size:20px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link span{color:#666;font-size:14px;flex:1;min-width:200px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-button]{color:#25d366;font-weight:500;border-radius:20px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-button]:hover{background-color:#25d3661a}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-button] mat-icon{margin-right:4px;font-size:18px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-icon-button]{color:#999;width:32px;height:32px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-icon-button]:hover{background-color:#0000001a}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-icon-button] mat-icon{font-size:18px}@media(max-width:600px){.whatsapp-sender-container{padding:8px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons{flex-direction:column;align-items:stretch}.whatsapp-sender-container .sender-card mat-card-content .action-buttons button{width:100%;margin-bottom:8px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link{flex-direction:column;align-items:flex-start;gap:12px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link span{min-width:auto;width:100%}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-button]{width:100%;justify-content:center}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-icon-button]{align-self:flex-end;position:absolute;top:8px;right:8px}}.whatsapp-sender-container mat-form-field.mat-form-field-appearance-outline .mat-form-field-outline{color:#e0e0e0}.whatsapp-sender-container mat-form-field.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#25d366}.whatsapp-sender-container mat-form-field.mat-form-field-appearance-outline .mat-form-field-label{color:#666}.whatsapp-sender-container mat-form-field.mat-form-field-appearance-outline.mat-focused .mat-form-field-label{color:#25d366}.whatsapp-sender-container mat-form-field mat-icon[matSuffix]{color:#25d366}.whatsapp-sender-container mat-form-field .mat-hint{color:#999;font-size:12px}.whatsapp-sender-container mat-form-field .mat-error{color:#f44336;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i2.MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "directive", type: i2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i2.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }] });
1987
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WhatsAppSender, deps: [], target: i0.ɵɵFactoryTarget.Component });
1988
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: WhatsAppSender, isStandalone: true, selector: "acp-whatsapp-sender", inputs: { config: "config" }, ngImport: i0, template: "<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\u00FAmero de tel\u00E9fono -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>N\u00FAmero de tel\u00E9fono</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\u00FAmero de tel\u00E9fono es requerido</mat-error>\n }\n @if (whatsappForm.get('phoneNumber')?.hasError('invalidPhone')) {\n <mat-error>Ingrese un n\u00FAmero ecuatoriano v\u00E1lido (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\u00ED...\"\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\u00F3n -->\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>\u00BFNo 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", styles: [".whatsapp-sender-container{max-width:500px;margin:0 auto;padding:16px}.whatsapp-sender-container .sender-card{box-shadow:0 4px 8px #0000001a;border-radius:12px}.whatsapp-sender-container .sender-card mat-card-header{padding-bottom:16px}.whatsapp-sender-container .sender-card mat-card-header .whatsapp-avatar{background:linear-gradient(135deg,#25d366,#128c7e);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:50%;width:40px;height:40px}.whatsapp-sender-container .sender-card mat-card-header .whatsapp-avatar mat-icon{font-size:24px}.whatsapp-sender-container .sender-card mat-card-header mat-card-title{color:#128c7e;font-weight:600}.whatsapp-sender-container .sender-card mat-card-header mat-card-subtitle{color:#666}.whatsapp-sender-container .sender-card mat-card-content{padding-top:0}.whatsapp-sender-container .sender-card mat-card-content .full-width{width:100%;margin-bottom:16px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons{display:flex;gap:12px;justify-content:flex-end;margin-top:24px;flex-wrap:wrap}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button{background:linear-gradient(135deg,#25d366,#128c7e);color:#fff;min-width:180px;height:44px;border-radius:22px;font-weight:500}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button:hover:not(:disabled){background:linear-gradient(135deg,#128c7e,#25d366);transform:translateY(-1px);box-shadow:0 4px 12px #25d3664d}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button:disabled{background:#ccc;color:#666}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button mat-icon{margin-right:8px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons .send-button mat-spinner{margin-right:8px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons button[mat-button]{color:#666;border-radius:22px;height:44px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons button[mat-button]:hover:not(:disabled){background-color:#0000000a}.whatsapp-sender-container .sender-card mat-card-content .action-buttons button[mat-button] mat-icon{margin-right:4px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link{display:flex;align-items:center;gap:8px;margin-top:16px;padding:12px 16px;background-color:#f5f5f5;border-radius:8px;border-left:4px solid #25d366;flex-wrap:wrap}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link mat-icon:first-child{color:#25d366;font-size:20px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link span{color:#666;font-size:14px;flex:1;min-width:200px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-button]{color:#25d366;font-weight:500;border-radius:20px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-button]:hover{background-color:#25d3661a}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-button] mat-icon{margin-right:4px;font-size:18px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-icon-button]{color:#999;width:32px;height:32px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-icon-button]:hover{background-color:#0000001a}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-icon-button] mat-icon{font-size:18px}@media(max-width:600px){.whatsapp-sender-container{padding:8px}.whatsapp-sender-container .sender-card mat-card-content .action-buttons{flex-direction:column;align-items:stretch}.whatsapp-sender-container .sender-card mat-card-content .action-buttons button{width:100%;margin-bottom:8px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link{flex-direction:column;align-items:flex-start;gap:12px}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link span{min-width:auto;width:100%}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-button]{width:100%;justify-content:center}.whatsapp-sender-container .sender-card mat-card-content .whatsapp-web-link button[mat-icon-button]{align-self:flex-end;position:absolute;top:8px;right:8px}}.whatsapp-sender-container mat-form-field.mat-form-field-appearance-outline .mat-form-field-outline{color:#e0e0e0}.whatsapp-sender-container mat-form-field.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#25d366}.whatsapp-sender-container mat-form-field.mat-form-field-appearance-outline .mat-form-field-label{color:#666}.whatsapp-sender-container mat-form-field.mat-form-field-appearance-outline.mat-focused .mat-form-field-label{color:#25d366}.whatsapp-sender-container mat-form-field mat-icon[matSuffix]{color:#25d366}.whatsapp-sender-container mat-form-field .mat-hint{color:#999;font-size:12px}.whatsapp-sender-container mat-form-field .mat-error{color:#f44336;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i2.MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "directive", type: i2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i2.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }] });
1977
1989
  }
1978
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WhatsAppSender, decorators: [{
1990
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WhatsAppSender, decorators: [{
1979
1991
  type: Component,
1980
1992
  args: [{ selector: 'acp-whatsapp-sender', imports: [
1981
1993
  CommonModule,
@@ -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/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 * REPORTE FACTURA\n */\n RF = 'RF',\n\n /**\n * FACTURA GENERAL\n */\n FG = 'FG',\n\n /**\n * REPORTE NOTA ENTREGA\n */\n RNE = 'RNE',\n\n /**\n * REPORTE NOTA CREDITO\n */\n RNC = 'RNCC',\n\n /**\n * REPORTE PROFORMA\n */\n PR = 'PR',\n\n /**\n * REPORTE RENTABILIDAD\n */\n SRR = 'SRR',\n\n /**\n * REPORTE RENTABILIDAD CUSTOM\n */\n SRRC = 'SRRC',\n}\n\n/**\n * Códigos de reportes de compras\n */\nexport enum PURCHASE_CODE_REPORT {\n /**\n * REPORTE LIQUIDACION COMPRA\n */\n RLC = 'RLC',\n\n /**\n * REPORTE COMPRA DETALLE\n */\n RCD = 'RCD',\n\n /**\n * REPORTE FACTURA COMPRA\n */\n RFC = 'RFC',\n\n /**\n * REPORTE COMPRAS NOTA HIDDEN (No Habitual)\n */\n RCNH = 'RCNH',\n\n /**\n * ORDEN COMPRA\n */\n ROC = 'ROC',\n\n /**\n * REPORTE COMPRAS\n */\n RCP = 'RCP',\n\n /**\n * REPORTE RECEPCION FACTURA\n */\n RRF = 'RRF',\n\n /**\n * RECEPCION NOTA CREDITO\n */\n RRNC = 'RRNC',\n\n /**\n * RECEPCION RETENCION GENERAL\n */\n RRG = 'RRG',\n\n /**\n * REPORTE RECEPCION NOTA DEBITO\n */\n RRND = 'RRND',\n}\n\n/**\n * Códigos de reportes de contabilidad\n */\nexport enum ACCOUNTING_CODE_REPORT {\n /**\n * REPORTE CONTROL CAJA\n */\n RCC = 'RCC',\n\n /**\n * CONTABILIDAD DETALLE CONTROL CAJA\n */\n CDCC = 'CDCC',\n\n /** Reporte Movimiento Caja (Caja / Anticipo) */\n RMC = 'RMC',\n\n /** Comprobante Caja por */\n CCCR = 'CCCR',\n\n /** Comprobante Caja */\n CCR = 'CCR',\n\n /** Reporte Movimiento por ID de Documento (Caja / Anticipo) */\n RMIE = 'RMIE',\n\n /** Resumen Movimiento Contable (Accounting Movement) */\n RAAM = 'RAAM',\n\n /** Reporte Comprobante de Egreso */\n RCEGR = 'RCEGR',\n\n /** Listado Comprobantes de Egreso (Accounting - Comprobante Egreso) */\n ACELC = 'ACELC',\n\n /** Detalles de formas de pago **/\n ACEDFP = 'ACEDFP',\n}\n\n/**\n * Códigos de reportes de clientes y cartera\n */\nexport enum CUSTOMER_CODE_REPORT {\n /**\n * REPORTE CLIENTE LISTADO\n */\n RCL = 'RCL',\n\n /**\n * CUENTA POR COBRAR\n */\n CCR = 'CCR',\n\n /**\n * CONTABILIDAD CARTERA PROVEEDOR\n */\n CCP = 'CCP',\n\n /**\n * CONTABILIDAD CARTERA PROVEEDOR CUOTA\n */\n CCPC = 'CCPC',\n\n /**\n * CONTABILIDAD COBROS POR CUOTAS\n */\n RCXC = 'RCXC',\n\n /**\n * CONTABILIDAD COBROS POR DOCUMENTOS\n */\n RCXD = 'RCXD',\n\n /**\n * CONTABILIDAD COBROS POR PAGOS\n */\n RCXP = 'RCXP',\n\n /**\n * REPORTE ANTICIPO\n */\n RA = 'RA',\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 * Códigos de reporte de Facturación Electrónico\n */\nexport enum BILLING_CODE_REPORT {\n /**\n * FACTURACION ELECTRONICA GENERAL\n */\n FEG = 'FEG',\n\n /**\n * NOTA CREDITO REPORTE GENERAL\n */\n NCRG = 'NCRG',\n\n /**\n * FACTURACION RETENCION REPORTE GENERAL\n */\n FCRRG = 'FCRRG',\n\n /**\n * LIQUIDACION COMPRA REPORTE GENERAL\n */\n LCRG = 'LCRG',\n\n /**\n * REPORTE GUIA REMISION GENERAL\n */\n RGGR = 'RGGR',\n\n /**\n * REPORTE RETENCION\n */\n RRC = 'RRC',\n}\n\n/**\n * Códigos de aprobación de documentos\n */\nexport enum APPROVAL_CODE_REPORT {\n /**\n * APROBACION FACTURA\n */\n PRE_F = 'RAC',\n\n /**\n * APROBACION NOTA ENTREGA\n */\n P_NE = 'P-NE',\n}\n\n/**\n * Formatos de reporte disponibles\n */\nexport enum REPORT_FORMAT {\n PDF = 'pdf',\n EXCEL = 'excel',\n WORD = 'word',\n}\n\n/**\n * Códigos de soporte técnico\n */\nexport enum TECHNICAL_SUPPORT_CODE_REPORT {\n /**\n * REPORTE SOPORTE TECNICO\n */\n RTS = 'RTS',\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 APPROVAL_CODE_REPORT,\n TECHNICAL_SUPPORT_CODE_REPORT,\n BILLING_CODE_REPORT,\n} from '../constants/report-codes';\n\n/**\n * Tipo union con todos los códigos de reporte soportados\n */\nexport type ReportCode =\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 | APPROVAL_CODE_REPORT\n | TECHNICAL_SUPPORT_CODE_REPORT\n | BILLING_CODE_REPORT;\n\nexport interface ReportDocumentData {\n codDoc?: string; // Código del documento (puede ser dinámico en dataParams)\n codEstab?: string;\n id?: number;\n serie?: string;\n // Campos adicionales para reportes personalizados\n [key: string]: any;\n}\n\n/**\n * Opciones para construir un reporte\n */\nexport interface BuildReportOptions {\n codeReport: ReportCode | string; // Código del reporte (tipado o string para custom)\n data: ReportDocumentData; // Datos del documento\n format?: 'pdf' | 'excel' | 'word'; // Formato de salida\n}\n\nexport interface ReportParams {\n hasService?: boolean;\n reportParams: string;\n dataParams: string;\n hasIdUsuarioRol?: boolean;\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 hasIdUsuarioRol?: boolean; // Nueva propiedad\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 facturación\n [BILLING_CODE_REPORT.FEG]: {\n codigo: BILLING_CODE_REPORT.FEG,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.NCRG]: {\n codigo: BILLING_CODE_REPORT.NCRG,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.LCRG]: {\n codigo: BILLING_CODE_REPORT.LCRG,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.FCRRG]: {\n codigo: BILLING_CODE_REPORT.FCRRG,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.RGGR]: {\n codigo: BILLING_CODE_REPORT.RGGR,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.RRC]: {\n codigo: BILLING_CODE_REPORT.RRC,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n idField: 'idDocumentoElectronico',\n hasParams: false,\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 [PURCHASE_CODE_REPORT.RRNC]: {\n codigo: PURCHASE_CODE_REPORT.RRNC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [PURCHASE_CODE_REPORT.RRG]: {\n codigo: PURCHASE_CODE_REPORT.RRG,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [PURCHASE_CODE_REPORT.RRND]: {\n codigo: PURCHASE_CODE_REPORT.RRND,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [PURCHASE_CODE_REPORT.RRF]: {\n codigo: PURCHASE_CODE_REPORT.RRF,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [PURCHASE_CODE_REPORT.RCP]: {\n codigo: PURCHASE_CODE_REPORT.RCP,\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 [ACCOUNTING_CODE_REPORT.RMC]: {\n codigo: ACCOUNTING_CODE_REPORT.RMC,\n hasService: true,\n useV1Api: false,\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.RAAM]: {\n codigo: ACCOUNTING_CODE_REPORT.RAAM,\n hasService: true,\n useV1Api: false,\n hasParams: false,\n hasIdUsuarioRol: true,\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 * @param codeReport - Código del reporte (FG, SRR, FV, RCNH, etc.)\n * @param docData - Datos del documento con parámetros adicionales\n * @param format - Formato del reporte: 'pdf' | 'excel' | 'word'\n * @returns Objeto con hasService, reportParams (string JSON) y dataParams (string JSON)\n *\n * @example\n * ```typescript\n * const params = ReportParamsBuilder.buildParams(\n * SALE_CODE_REPORT.FG,\n * { codDoc: '01', tipo: 2, codEstab: '001' },\n * 'pdf'\n * );\n * // Resultado:\n * // {\n * // hasService: true,\n * // reportParams: \"{\\\"codigo\\\":\\\"FG\\\",\\\"format\\\":\\\"pdf\\\",\\\"hasParams\\\":false}\",\n * // dataParams: \"{\\\"codDoc\\\":\\\"01\\\",\\\"tipo\\\":2,\\\"codEstab\\\":\\\"001\\\"}\"\n * // }\n * ```\n */\n static buildParams(\n codeReport: ReportCode | string,\n docData: ReportDocumentData,\n format: 'pdf' | 'excel' | 'word' = 'pdf',\n ): ReportParams {\n const config = this.getReportConfig(codeReport);\n\n const result: ReportParams = {\n hasService: config.hasService,\n reportParams: this.buildReportParams(docData, config, format),\n dataParams: this.buildDataParams(docData, config),\n };\n\n // Agregar hasIdUsuarioRol si está configurado\n if (config.hasIdUsuarioRol !== undefined) {\n result.hasIdUsuarioRol = config.hasIdUsuarioRol;\n }\n\n return result;\n }\n\n /**\n * Determina si debe usar la API v1 o v2 según el código de reporte\n *\n * Algunos reportes (como documentos electrónicos) usan API v1,\n * mientras que otros (reportes de ventas, inventario) usan API v2.\n *\n * @param codeReport - Código del reporte\n * @returns true para API v1, false para API v2\n *\n * @example\n * ```typescript\n * // Documentos electrónicos usan v1\n * const useV1 = ReportParamsBuilder.shouldUseV1Api(ELECTRONIC_DOCUMENT_CODE.FV);\n * console.log(useV1); // true\n *\n * // Reportes de ventas usan v2\n * const useV1Sales = ReportParamsBuilder.shouldUseV1Api(SALE_CODE_REPORT.FG);\n * console.log(useV1Sales); // false\n *\n * // Uso manual (normalmente no necesario, build() lo hace automáticamente)\n * const apiVersion = useV1 ? '/reporte/download' : '/v2/reporte/download';\n * ```\n */\n static shouldUseV1Api(codeReport: ReportCode | string): boolean {\n const config = this.getReportConfig(codeReport);\n return config.useV1Api;\n }\n\n /**\n * Obtiene la configuración para un tipo de documento\n *\n * @param codeReport - Código del reporte (FG, SRR, FV, etc.)\n * @returns Configuración del reporte\n * @throws Error si el tipo de documento no está soportado\n * @private\n */\n private static getReportConfig(codeReport: string): ReportConfig {\n const config = this.reportConfigs[codeReport];\n if (!config) {\n throw new Error(\n `Tipo de reporte no soportado: ${codeReport}. Tipos disponibles: ${Object.keys(this.reportConfigs).join(', ')}`,\n );\n }\n return config;\n }\n\n /**\n * Construye los parámetros del reporte (reportParams)\n *\n * Genera un string JSON con la configuración del reporte:\n * - codigo: Código del reporte\n * - format: Formato de salida (pdf, excel, word)\n * - hasParams: Si el reporte acepta parámetros adicionales\n * - codEstab: Código de establecimiento (si aplica)\n * - aditionalParams: Array vacío para parámetros adicionales (si aplica)\n *\n * @param docData - Datos del documento\n * @param config - Configuración del tipo de reporte\n * @param format - Formato de salida\n * @returns String JSON con los parámetros del reporte\n * @private\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 (dataParams)\n *\n * Genera un string JSON con los datos específicos del reporte.\n * NO incluye hasParams ni configuración, solo datos puros.\n *\n * Incluye automáticamente:\n * - id: ID del documento (si existe)\n * - codEstab: Código de establecimiento (según configuración)\n * - codigo: Código del reporte (según configuración)\n * - Parámetros extra específicos del tipo (extraDataParams)\n * - Todos los parámetros adicionales del docData (excepto codEstab, id, serie)\n *\n * @param docData - Datos del documento con parámetros adicionales\n * @param config - Configuración del tipo de reporte\n * @returns String JSON con los datos del reporte (sin hasParams anidado)\n * @private\n *\n * @example\n * ```typescript\n * // Input:\n * docData = { codDoc: '01', tipo: 2, codEstab: '001', fechaInicio: '2024-01-01' }\n * config = { idField: 'id', includeEstabInData: false, ... }\n *\n * // Output:\n * \"{\\\"codDoc\\\":\\\"01\\\",\\\"tipo\\\":2,\\\"fechaInicio\\\":\\\"2024-01-01\\\"}\"\n * ```\n */\n private static buildDataParams(docData: ReportDocumentData, config: ReportConfig): 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 // 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 (incluyendo codDoc si existe)\n Object.keys(docData).forEach((key) => {\n if (!['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 * @param codeReport - Código del reporte (FG, SRR, FV, RCNH, etc.) - REQUERIDO\n * @param docData - Datos del documento con parámetros adicionales (sin codeReport)\n * @param format - Formato del reporte: 'pdf' | 'excel' | 'word'\n /**\n * Construye las opciones completas para generar un reporte\n *\n * Método principal que acepta un objeto con opciones tipadas.\n * Proporciona IntelliSense y validación de tipos en tiempo de desarrollo.\n *\n * @param options - Opciones del reporte\n * @param options.codeReport - Código del reporte (tipado: SALE_CODE_REPORT, PURCHASE_CODE_REPORT, etc.)\n * @param options.data - Datos del documento (codDoc, tipo, fechas, etc.)\n * @param options.format - Formato de salida: 'pdf' | 'excel' | 'word' (opcional, por defecto 'pdf')\n * @returns Objeto con data, format y useV1Api para enviar a la facade\n *\n * @example\n * ```typescript\n * // Ejemplo 1: Reporte de ventas\n * const options = ReportParamsBuilder.build({\n * codeReport: SALE_CODE_REPORT.FG,\n * data: {\n * tipo: 2,\n * ckFecha: true,\n * codEstab: 'ESTAB-000000216',\n * fechaInicio: '2024-01-01',\n * fechaFin: '2024-12-31',\n * userRoleId: '307'\n * },\n * format: 'pdf'\n * });\n *\n * // Ejemplo 2: Documento electrónico con codDoc variable\n * const options2 = ReportParamsBuilder.build({\n * codeReport: ELECTRONIC_DOCUMENT_CODE.FV,\n * data: {\n * id: 123,\n * codDoc: '01', // ← Variable, va a dataParams\n * codEstab: '001'\n * }\n * // format es opcional, por defecto 'pdf'\n * });\n *\n * // Ejemplo 3: Reporte de inventario\n * const options3 = ReportParamsBuilder.build({\n * codeReport: INVENTORY_CODE_REPORT.ARTICULO_PVP,\n * data: {\n * tipo: 2,\n * stockStatusCode: 1,\n * idTarifa: 3\n * },\n * format: 'excel'\n * });\n *\n * // Usar con facade\n * this.reportFacade.open(options).subscribe();\n * this.reportFacade.download(options2).subscribe();\n * ```\n */\n static build(options: BuildReportOptions) {\n const { codeReport, data, format = 'pdf' } = options;\n\n return {\n data: this.buildParams(codeReport, data, format),\n format,\n useV1Api: this.shouldUseV1Api(codeReport),\n };\n }\n\n /**\n * Obtiene la lista de códigos de reporte soportados\n *\n * Devuelve un array con todos los códigos de reporte configurados\n * en el builder (FV, NE, FG, SRR, RCNH, etc.)\n *\n * @returns Array con todos los códigos de reporte disponibles\n *\n * @example\n * ```typescript\n * const types = ReportParamsBuilder.getSupportedDocumentTypes();\n * console.log(types);\n * // ['FV', 'NE', 'NC', 'ND', 'GR', 'NORMAL', 'SRR', 'SRRC', 'FG',\n * // 'RCNH', 'RLC', 'RCEGR', 'ACEDFP', 'ACELC', 'RCL', 'RK', ...]\n *\n * // Usar para validación\n * if (types.includes(myCode)) {\n * // Código válido\n * }\n * ```\n */\n static getSupportedDocumentTypes(): string[] {\n return Object.keys(this.reportConfigs);\n }\n\n /**\n * Verifica si un código de reporte está soportado\n *\n * Útil para validar códigos antes de generar reportes,\n * especialmente cuando el código viene dinámicamente.\n *\n * @param codeReport - Código del reporte a verificar\n * @returns true si el código está soportado, false en caso contrario\n *\n * @example\n * ```typescript\n * // Validación con enum\n * if (ReportParamsBuilder.isDocumentTypeSupported(SALE_CODE_REPORT.FG)) {\n * console.log('Código FG soportado');\n * }\n *\n * // Validación con string dinámico\n * const dynamicCode = getUserSelectedCode();\n * if (ReportParamsBuilder.isDocumentTypeSupported(dynamicCode)) {\n * const options = ReportParamsBuilder.build({\n * codeReport: dynamicCode,\n * data: {...}\n * });\n * } else {\n * console.error('Código no soportado:', dynamicCode);\n * }\n * ```\n */\n static isDocumentTypeSupported(codeReport: ReportCode | string): boolean {\n return codeReport in this.reportConfigs;\n }\n\n /**\n * Registra un nuevo tipo de reporte dinámicamente\n *\n * Permite agregar soporte para códigos de reporte personalizados\n * sin modificar el código fuente de la librería.\n * Útil para reportes específicos de cada aplicación.\n *\n * @param codeReport - Código único del reporte personalizado\n * @param config - Configuración completa del reporte\n *\n * @example\n * ```typescript\n * // Registrar un reporte personalizado\n * ReportParamsBuilder.registerReportType('MI_REPORTE_CUSTOM', {\n * codigo: 'MI_REPORTE_CUSTOM',\n * hasService: true,\n * useV1Api: false,\n * idField: 'id',\n * hasParams: true,\n * includeEstabInData: true,\n * extraDataParams: {\n * tipoCustom: 'especial',\n * version: 2\n * }\n * });\n *\n * // Ahora se puede usar como cualquier otro reporte\n * const options = ReportParamsBuilder.build({\n * codeReport: 'MI_REPORTE_CUSTOM',\n * data: { id: 123, codEstab: '001' },\n * format: 'pdf'\n * });\n *\n * // Verificar si fue registrado\n * console.log(\n * ReportParamsBuilder.isDocumentTypeSupported('MI_REPORTE_CUSTOM')\n * ); // true\n * ```\n */\n static registerReportType(codeReport: string, config: ReportConfig): void {\n this.reportConfigs[codeReport] = 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 } 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({\n codeReport: docData.codDoc,\n data: docData,\n format: 'pdf',\n });\n\n return this.reportFacade.generate(reportOptions);\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 * REPORTE FACTURA\n */\n RF = 'RF',\n\n /**\n * FACTURA GENERAL\n */\n FG = 'FG',\n\n /**\n * REPORTE NOTA ENTREGA\n */\n RNE = 'RNE',\n\n /**\n * REPORTE NOTA CREDITO\n */\n RNC = 'RNCC',\n\n /**\n * REPORTE PROFORMA\n */\n PR = 'PR',\n\n /**\n * REPORTE RENTABILIDAD\n */\n SRR = 'SRR',\n\n /**\n * REPORTE RENTABILIDAD CUSTOM\n */\n SRRC = 'SRRC',\n}\n\n/**\n * Códigos de reportes de compras\n */\nexport enum PURCHASE_CODE_REPORT {\n /**\n * REPORTE LIQUIDACION COMPRA\n */\n RLC = 'RLC',\n\n /**\n * REPORTE COMPRA DETALLE\n */\n RCD = 'RCD',\n\n /**\n * REPORTE FACTURA COMPRA\n */\n RFC = 'RFC',\n\n /**\n * REPORTE COMPRAS NOTA HIDDEN (No Habitual)\n */\n RCNH = 'RCNH',\n\n /**\n * ORDEN COMPRA\n */\n ROC = 'ROC',\n\n /**\n * REPORTE COMPRAS\n */\n RCP = 'RCP',\n\n /**\n * REPORTE RECEPCION FACTURA\n */\n RRF = 'RRF',\n\n /**\n * RECEPCION NOTA CREDITO\n */\n RRNC = 'RRNC',\n\n /**\n * RECEPCION RETENCION GENERAL\n */\n RRG = 'RRG',\n\n /**\n * REPORTE RECEPCION NOTA DEBITO\n */\n RRND = 'RRND',\n}\n\n/**\n * Códigos de reportes de contabilidad\n */\nexport enum ACCOUNTING_CODE_REPORT {\n /**\n * REPORTE CONTROL CAJA\n */\n RCC = 'RCC',\n\n /**\n * CONTABILIDAD DETALLE CONTROL CAJA\n */\n CDCC = 'CDCC',\n\n /** Reporte Movimiento Caja (Caja / Anticipo) */\n RMC = 'RMC',\n\n /** Comprobante Caja por */\n CCCR = 'CCCR',\n\n /** Comprobante Caja */\n CCR = 'CCR',\n\n /** Reporte Movimiento por ID de Documento (Caja / Anticipo) */\n RMIE = 'RMIE',\n\n /** Resumen Movimiento Contable (Accounting Movement) */\n RAAM = 'RAAM',\n\n /** Reporte Comprobante de Egreso */\n RCEGR = 'RCEGR',\n\n /** Listado Comprobantes de Egreso (Accounting - Comprobante Egreso) */\n ACELC = 'ACELC',\n\n /** Detalles de formas de pago **/\n ACEDFP = 'ACEDFP',\n}\n\n/**\n * Códigos de reportes de clientes y cartera\n */\nexport enum CUSTOMER_CODE_REPORT {\n /**\n * REPORTE CLIENTE LISTADO\n */\n RCL = 'RCL',\n\n /**\n * CUENTA POR COBRAR\n */\n CCR = 'CCR',\n\n /**\n * CONTABILIDAD CARTERA PROVEEDOR\n */\n CCP = 'CCP',\n\n /**\n * CONTABILIDAD CARTERA PROVEEDOR CUOTA\n */\n CCPC = 'CCPC',\n\n /**\n * CONTABILIDAD COBROS POR CUOTAS\n */\n RCXC = 'RCXC',\n\n /**\n * CONTABILIDAD COBROS POR DOCUMENTOS\n */\n RCXD = 'RCXD',\n\n /**\n * CONTABILIDAD COBROS POR PAGOS\n */\n RCXP = 'RCXP',\n\n /**\n * REPORTE ANTICIPO\n */\n RA = 'RA',\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 * Códigos de reporte de Facturación Electrónico\n */\nexport enum BILLING_CODE_REPORT {\n /**\n * FACTURACION ELECTRONICA GENERAL\n */\n FEG = 'FEG',\n\n /**\n * NOTA CREDITO REPORTE GENERAL\n */\n NCRG = 'NCRG',\n\n /**\n * FACTURACION RETENCION REPORTE GENERAL\n */\n FCRRG = 'FCRRG',\n\n /**\n * LIQUIDACION COMPRA REPORTE GENERAL\n */\n LCRG = 'LCRG',\n\n /**\n * REPORTE GUIA REMISION GENERAL\n */\n RGGR = 'RGGR',\n\n /**\n * REPORTE RETENCION\n */\n RRC = 'RRC',\n}\n\n/**\n * Códigos de aprobación de documentos\n */\nexport enum APPROVAL_CODE_REPORT {\n /**\n * APROBACION FACTURA\n */\n PRE_F = 'RAC',\n\n /**\n * APROBACION NOTA ENTREGA\n */\n P_NE = 'P-NE',\n}\n\n/**\n * Formatos de reporte disponibles\n */\nexport enum REPORT_FORMAT {\n PDF = 'pdf',\n EXCEL = 'excel',\n WORD = 'word',\n}\n\n/**\n * Códigos de soporte técnico\n */\nexport enum TECHNICAL_SUPPORT_CODE_REPORT {\n /**\n * REPORTE SOPORTE TECNICO\n */\n RTS = 'RTS',\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 APPROVAL_CODE_REPORT,\n TECHNICAL_SUPPORT_CODE_REPORT,\n BILLING_CODE_REPORT,\n} from '../constants/report-codes';\n\n/**\n * Tipo union con todos los códigos de reporte soportados\n */\nexport type ReportCode =\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 | APPROVAL_CODE_REPORT\n | TECHNICAL_SUPPORT_CODE_REPORT\n | BILLING_CODE_REPORT;\n\nexport interface ReportDocumentData {\n codDoc?: string; // Código del documento (puede ser dinámico en dataParams)\n codEstab?: string;\n id?: number;\n serie?: string;\n // Campos adicionales para reportes personalizados\n [key: string]: any;\n}\n\n/**\n * Opciones para construir un reporte\n */\nexport interface BuildReportOptions {\n codeReport: ReportCode | string; // Código del reporte (tipado o string para custom)\n data: ReportDocumentData; // Datos del documento\n format?: 'pdf' | 'excel' | 'word'; // Formato de salida\n}\n\nexport interface ReportParams {\n hasService?: boolean;\n reportParams: string;\n dataParams: string;\n hasIdUsuarioRol?: boolean;\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 hasIdUsuarioRol?: boolean; // Nueva propiedad\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 facturación\n [BILLING_CODE_REPORT.FEG]: {\n codigo: BILLING_CODE_REPORT.FEG,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.NCRG]: {\n codigo: BILLING_CODE_REPORT.NCRG,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.LCRG]: {\n codigo: BILLING_CODE_REPORT.LCRG,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.FCRRG]: {\n codigo: BILLING_CODE_REPORT.FCRRG,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.RGGR]: {\n codigo: BILLING_CODE_REPORT.RGGR,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n [BILLING_CODE_REPORT.RRC]: {\n codigo: BILLING_CODE_REPORT.RRC,\n hasService: true,\n useV1Api: true, // isOldVersion: true\n idField: 'idDocumentoElectronico',\n hasParams: false,\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 [PURCHASE_CODE_REPORT.RRNC]: {\n codigo: PURCHASE_CODE_REPORT.RRNC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [PURCHASE_CODE_REPORT.RRG]: {\n codigo: PURCHASE_CODE_REPORT.RRG,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [PURCHASE_CODE_REPORT.RRND]: {\n codigo: PURCHASE_CODE_REPORT.RRND,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [PURCHASE_CODE_REPORT.RRF]: {\n codigo: PURCHASE_CODE_REPORT.RRF,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [PURCHASE_CODE_REPORT.RCP]: {\n codigo: PURCHASE_CODE_REPORT.RCP,\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 [ACCOUNTING_CODE_REPORT.RMC]: {\n codigo: ACCOUNTING_CODE_REPORT.RMC,\n hasService: true,\n useV1Api: false,\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.RAAM]: {\n codigo: ACCOUNTING_CODE_REPORT.RAAM,\n hasService: true,\n useV1Api: false,\n hasParams: false,\n hasIdUsuarioRol: true,\n },\n\n [ACCOUNTING_CODE_REPORT.RMIE]: {\n codigo: ACCOUNTING_CODE_REPORT.RMIE,\n hasService: false,\n useV1Api: false,\n },\n [ACCOUNTING_CODE_REPORT.CDCC]: {\n codigo: ACCOUNTING_CODE_REPORT.CDCC,\n hasService: true,\n useV1Api: true,\n idField: 'id',\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: false,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n hasIdUsuarioRol: true,\n },\n [INVENTORY_CODE_REPORT.CDAA]: {\n codigo: INVENTORY_CODE_REPORT.CDAA,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.CDA]: {\n codigo: INVENTORY_CODE_REPORT.CDA,\n hasService: true,\n useV1Api: true,\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: true,\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: true,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RAF]: {\n codigo: INVENTORY_CODE_REPORT.RAF,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RCAA]: {\n codigo: INVENTORY_CODE_REPORT.RCAA,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RASR]: {\n codigo: INVENTORY_CODE_REPORT.RASR,\n hasService: true,\n useV1Api: true,\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 * @param codeReport - Código del reporte (FG, SRR, FV, RCNH, etc.)\n * @param docData - Datos del documento con parámetros adicionales\n * @param format - Formato del reporte: 'pdf' | 'excel' | 'word'\n * @returns Objeto con hasService, reportParams (string JSON) y dataParams (string JSON)\n *\n * @example\n * ```typescript\n * const params = ReportParamsBuilder.buildParams(\n * SALE_CODE_REPORT.FG,\n * { codDoc: '01', tipo: 2, codEstab: '001' },\n * 'pdf'\n * );\n * // Resultado:\n * // {\n * // hasService: true,\n * // reportParams: \"{\\\"codigo\\\":\\\"FG\\\",\\\"format\\\":\\\"pdf\\\",\\\"hasParams\\\":false}\",\n * // dataParams: \"{\\\"codDoc\\\":\\\"01\\\",\\\"tipo\\\":2,\\\"codEstab\\\":\\\"001\\\"}\"\n * // }\n * ```\n */\n static buildParams(\n codeReport: ReportCode | string,\n docData: ReportDocumentData,\n format: 'pdf' | 'excel' | 'word' = 'pdf',\n ): ReportParams {\n const config = this.getReportConfig(codeReport);\n\n const result: ReportParams = {\n hasService: config.hasService,\n reportParams: this.buildReportParams(docData, config, format),\n dataParams: this.buildDataParams(docData, config),\n };\n\n // Agregar hasIdUsuarioRol si está configurado\n if (config.hasIdUsuarioRol !== undefined) {\n result.hasIdUsuarioRol = config.hasIdUsuarioRol;\n }\n\n return result;\n }\n\n /**\n * Determina si debe usar la API v1 o v2 según el código de reporte\n *\n * Algunos reportes (como documentos electrónicos) usan API v1,\n * mientras que otros (reportes de ventas, inventario) usan API v2.\n *\n * @param codeReport - Código del reporte\n * @returns true para API v1, false para API v2\n *\n * @example\n * ```typescript\n * // Documentos electrónicos usan v1\n * const useV1 = ReportParamsBuilder.shouldUseV1Api(ELECTRONIC_DOCUMENT_CODE.FV);\n * console.log(useV1); // true\n *\n * // Reportes de ventas usan v2\n * const useV1Sales = ReportParamsBuilder.shouldUseV1Api(SALE_CODE_REPORT.FG);\n * console.log(useV1Sales); // false\n *\n * // Uso manual (normalmente no necesario, build() lo hace automáticamente)\n * const apiVersion = useV1 ? '/reporte/download' : '/v2/reporte/download';\n * ```\n */\n static shouldUseV1Api(codeReport: ReportCode | string): boolean {\n const config = this.getReportConfig(codeReport);\n return config.useV1Api;\n }\n\n /**\n * Obtiene la configuración para un tipo de documento\n *\n * @param codeReport - Código del reporte (FG, SRR, FV, etc.)\n * @returns Configuración del reporte\n * @throws Error si el tipo de documento no está soportado\n * @private\n */\n private static getReportConfig(codeReport: string): ReportConfig {\n const config = this.reportConfigs[codeReport];\n if (!config) {\n throw new Error(\n `Tipo de reporte no soportado: ${codeReport}. Tipos disponibles: ${Object.keys(this.reportConfigs).join(', ')}`,\n );\n }\n return config;\n }\n\n /**\n * Construye los parámetros del reporte (reportParams)\n *\n * Genera un string JSON con la configuración del reporte:\n * - codigo: Código del reporte\n * - format: Formato de salida (pdf, excel, word)\n * - hasParams: Si el reporte acepta parámetros adicionales\n * - codEstab: Código de establecimiento (si aplica)\n * - aditionalParams: Array vacío para parámetros adicionales (si aplica)\n *\n * @param docData - Datos del documento\n * @param config - Configuración del tipo de reporte\n * @param format - Formato de salida\n * @returns String JSON con los parámetros del reporte\n * @private\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 (dataParams)\n *\n * Genera un string JSON con los datos específicos del reporte.\n * NO incluye hasParams ni configuración, solo datos puros.\n *\n * Incluye automáticamente:\n * - id: ID del documento (si existe)\n * - codEstab: Código de establecimiento (según configuración)\n * - codigo: Código del reporte (según configuración)\n * - Parámetros extra específicos del tipo (extraDataParams)\n * - Todos los parámetros adicionales del docData (excepto codEstab, id, serie)\n *\n * @param docData - Datos del documento con parámetros adicionales\n * @param config - Configuración del tipo de reporte\n * @returns String JSON con los datos del reporte (sin hasParams anidado)\n * @private\n *\n * @example\n * ```typescript\n * // Input:\n * docData = { codDoc: '01', tipo: 2, codEstab: '001', fechaInicio: '2024-01-01' }\n * config = { idField: 'id', includeEstabInData: false, ... }\n *\n * // Output:\n * \"{\\\"codDoc\\\":\\\"01\\\",\\\"tipo\\\":2,\\\"fechaInicio\\\":\\\"2024-01-01\\\"}\"\n * ```\n */\n private static buildDataParams(docData: ReportDocumentData, config: ReportConfig): 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 // 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 (incluyendo codDoc si existe)\n Object.keys(docData).forEach((key) => {\n if (!['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 * @param codeReport - Código del reporte (FG, SRR, FV, RCNH, etc.) - REQUERIDO\n * @param docData - Datos del documento con parámetros adicionales (sin codeReport)\n * @param format - Formato del reporte: 'pdf' | 'excel' | 'word'\n /**\n * Construye las opciones completas para generar un reporte\n *\n * Método principal que acepta un objeto con opciones tipadas.\n * Proporciona IntelliSense y validación de tipos en tiempo de desarrollo.\n *\n * @param options - Opciones del reporte\n * @param options.codeReport - Código del reporte (tipado: SALE_CODE_REPORT, PURCHASE_CODE_REPORT, etc.)\n * @param options.data - Datos del documento (codDoc, tipo, fechas, etc.)\n * @param options.format - Formato de salida: 'pdf' | 'excel' | 'word' (opcional, por defecto 'pdf')\n * @returns Objeto con data, format y useV1Api para enviar a la facade\n *\n * @example\n * ```typescript\n * // Ejemplo 1: Reporte de ventas\n * const options = ReportParamsBuilder.build({\n * codeReport: SALE_CODE_REPORT.FG,\n * data: {\n * tipo: 2,\n * ckFecha: true,\n * codEstab: 'ESTAB-000000216',\n * fechaInicio: '2024-01-01',\n * fechaFin: '2024-12-31',\n * userRoleId: '307'\n * },\n * format: 'pdf'\n * });\n *\n * // Ejemplo 2: Documento electrónico con codDoc variable\n * const options2 = ReportParamsBuilder.build({\n * codeReport: ELECTRONIC_DOCUMENT_CODE.FV,\n * data: {\n * id: 123,\n * codDoc: '01', // ← Variable, va a dataParams\n * codEstab: '001'\n * }\n * // format es opcional, por defecto 'pdf'\n * });\n *\n * // Ejemplo 3: Reporte de inventario\n * const options3 = ReportParamsBuilder.build({\n * codeReport: INVENTORY_CODE_REPORT.ARTICULO_PVP,\n * data: {\n * tipo: 2,\n * stockStatusCode: 1,\n * idTarifa: 3\n * },\n * format: 'excel'\n * });\n *\n * // Usar con facade\n * this.reportFacade.open(options).subscribe();\n * this.reportFacade.download(options2).subscribe();\n * ```\n */\n static build(options: BuildReportOptions) {\n const { codeReport, data, format = 'pdf' } = options;\n\n return {\n data: this.buildParams(codeReport, data, format),\n format,\n useV1Api: this.shouldUseV1Api(codeReport),\n };\n }\n\n /**\n * Obtiene la lista de códigos de reporte soportados\n *\n * Devuelve un array con todos los códigos de reporte configurados\n * en el builder (FV, NE, FG, SRR, RCNH, etc.)\n *\n * @returns Array con todos los códigos de reporte disponibles\n *\n * @example\n * ```typescript\n * const types = ReportParamsBuilder.getSupportedDocumentTypes();\n * console.log(types);\n * // ['FV', 'NE', 'NC', 'ND', 'GR', 'NORMAL', 'SRR', 'SRRC', 'FG',\n * // 'RCNH', 'RLC', 'RCEGR', 'ACEDFP', 'ACELC', 'RCL', 'RK', ...]\n *\n * // Usar para validación\n * if (types.includes(myCode)) {\n * // Código válido\n * }\n * ```\n */\n static getSupportedDocumentTypes(): string[] {\n return Object.keys(this.reportConfigs);\n }\n\n /**\n * Verifica si un código de reporte está soportado\n *\n * Útil para validar códigos antes de generar reportes,\n * especialmente cuando el código viene dinámicamente.\n *\n * @param codeReport - Código del reporte a verificar\n * @returns true si el código está soportado, false en caso contrario\n *\n * @example\n * ```typescript\n * // Validación con enum\n * if (ReportParamsBuilder.isDocumentTypeSupported(SALE_CODE_REPORT.FG)) {\n * console.log('Código FG soportado');\n * }\n *\n * // Validación con string dinámico\n * const dynamicCode = getUserSelectedCode();\n * if (ReportParamsBuilder.isDocumentTypeSupported(dynamicCode)) {\n * const options = ReportParamsBuilder.build({\n * codeReport: dynamicCode,\n * data: {...}\n * });\n * } else {\n * console.error('Código no soportado:', dynamicCode);\n * }\n * ```\n */\n static isDocumentTypeSupported(codeReport: ReportCode | string): boolean {\n return codeReport in this.reportConfigs;\n }\n\n /**\n * Registra un nuevo tipo de reporte dinámicamente\n *\n * Permite agregar soporte para códigos de reporte personalizados\n * sin modificar el código fuente de la librería.\n * Útil para reportes específicos de cada aplicación.\n *\n * @param codeReport - Código único del reporte personalizado\n * @param config - Configuración completa del reporte\n *\n * @example\n * ```typescript\n * // Registrar un reporte personalizado\n * ReportParamsBuilder.registerReportType('MI_REPORTE_CUSTOM', {\n * codigo: 'MI_REPORTE_CUSTOM',\n * hasService: true,\n * useV1Api: false,\n * idField: 'id',\n * hasParams: true,\n * includeEstabInData: true,\n * extraDataParams: {\n * tipoCustom: 'especial',\n * version: 2\n * }\n * });\n *\n * // Ahora se puede usar como cualquier otro reporte\n * const options = ReportParamsBuilder.build({\n * codeReport: 'MI_REPORTE_CUSTOM',\n * data: { id: 123, codEstab: '001' },\n * format: 'pdf'\n * });\n *\n * // Verificar si fue registrado\n * console.log(\n * ReportParamsBuilder.isDocumentTypeSupported('MI_REPORTE_CUSTOM')\n * ); // true\n * ```\n */\n static registerReportType(codeReport: string, config: ReportConfig): void {\n this.reportConfigs[codeReport] = 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 } 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({\n codeReport: docData.codDoc,\n data: docData,\n format: 'pdf',\n });\n\n return this.reportFacade.generate(reportOptions);\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.11",
3
+ "version": "1.0.12",
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",
@@ -49,12 +49,12 @@
49
49
  "author": "Ivan Paz <ifer343@gmail.com>",
50
50
  "license": "MIT",
51
51
  "bugs": {
52
- "url": "https://github.com/Acontplus-S-A-S/acontplus-libs/issues"
52
+ "url": "https://github.com/acontplus/acontplus-libs/issues"
53
53
  },
54
- "homepage": "https://github.com/Acontplus-S-A-S/acontplus-libs#readme",
54
+ "homepage": "https://github.com/acontplus/acontplus-libs#readme",
55
55
  "repository": {
56
56
  "type": "git",
57
- "url": "git+https://github.com/Acontplus-S-A-S/acontplus-libs.git"
57
+ "url": "git+https://github.com/acontplus/acontplus-libs.git"
58
58
  },
59
59
  "release": {
60
60
  "branches": [