@acontplus/ng-common 1.0.6 → 1.0.7
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.
|
@@ -1201,26 +1201,28 @@ class ReportParamsBuilder {
|
|
|
1201
1201
|
/**
|
|
1202
1202
|
* Construye los parámetros de reporte según el tipo de documento
|
|
1203
1203
|
*
|
|
1204
|
-
* @param
|
|
1204
|
+
* @param codeReport - Código del reporte (FG, SRR, FV, RCNH, etc.)
|
|
1205
|
+
* @param docData - Datos del documento con parámetros adicionales
|
|
1205
1206
|
* @param format - Formato del reporte: 'pdf' | 'excel' | 'word'
|
|
1206
1207
|
* @returns Objeto con hasService, reportParams (string JSON) y dataParams (string JSON)
|
|
1207
1208
|
*
|
|
1208
1209
|
* @example
|
|
1209
1210
|
* ```typescript
|
|
1210
1211
|
* const params = ReportParamsBuilder.buildParams(
|
|
1211
|
-
*
|
|
1212
|
+
* SALE_CODE_REPORT.FG,
|
|
1213
|
+
* { codDoc: '01', tipo: 2, codEstab: '001' },
|
|
1212
1214
|
* 'pdf'
|
|
1213
1215
|
* );
|
|
1214
1216
|
* // Resultado:
|
|
1215
1217
|
* // {
|
|
1216
1218
|
* // hasService: true,
|
|
1217
|
-
* // reportParams: "{\"codigo\":\"
|
|
1218
|
-
* // dataParams: "{\"
|
|
1219
|
+
* // reportParams: "{\"codigo\":\"FG\",\"format\":\"pdf\",\"hasParams\":false}",
|
|
1220
|
+
* // dataParams: "{\"codDoc\":\"01\",\"tipo\":2,\"codEstab\":\"001\"}"
|
|
1219
1221
|
* // }
|
|
1220
1222
|
* ```
|
|
1221
1223
|
*/
|
|
1222
|
-
static buildParams(docData, format = 'pdf') {
|
|
1223
|
-
const config = this.getReportConfig(
|
|
1224
|
+
static buildParams(codeReport, docData, format = 'pdf') {
|
|
1225
|
+
const config = this.getReportConfig(codeReport);
|
|
1224
1226
|
return {
|
|
1225
1227
|
hasService: config.hasService,
|
|
1226
1228
|
reportParams: this.buildReportParams(docData, config, format),
|
|
@@ -1228,36 +1230,44 @@ class ReportParamsBuilder {
|
|
|
1228
1230
|
};
|
|
1229
1231
|
}
|
|
1230
1232
|
/**
|
|
1231
|
-
* Determina si debe usar la API v1 según el
|
|
1233
|
+
* Determina si debe usar la API v1 o v2 según el código de reporte
|
|
1234
|
+
*
|
|
1235
|
+
* Algunos reportes (como documentos electrónicos) usan API v1,
|
|
1236
|
+
* mientras que otros (reportes de ventas, inventario) usan API v2.
|
|
1232
1237
|
*
|
|
1233
|
-
* @param
|
|
1234
|
-
* @returns true
|
|
1238
|
+
* @param codeReport - Código del reporte
|
|
1239
|
+
* @returns true para API v1, false para API v2
|
|
1235
1240
|
*
|
|
1236
1241
|
* @example
|
|
1237
1242
|
* ```typescript
|
|
1243
|
+
* // Documentos electrónicos usan v1
|
|
1238
1244
|
* const useV1 = ReportParamsBuilder.shouldUseV1Api(ELECTRONIC_DOCUMENT_CODE.FV);
|
|
1239
|
-
*
|
|
1245
|
+
* console.log(useV1); // true
|
|
1240
1246
|
*
|
|
1247
|
+
* // Reportes de ventas usan v2
|
|
1241
1248
|
* const useV1Sales = ReportParamsBuilder.shouldUseV1Api(SALE_CODE_REPORT.FG);
|
|
1242
|
-
*
|
|
1249
|
+
* console.log(useV1Sales); // false
|
|
1250
|
+
*
|
|
1251
|
+
* // Uso manual (normalmente no necesario, build() lo hace automáticamente)
|
|
1252
|
+
* const apiVersion = useV1 ? '/reporte/download' : '/v2/reporte/download';
|
|
1243
1253
|
* ```
|
|
1244
1254
|
*/
|
|
1245
|
-
static shouldUseV1Api(
|
|
1246
|
-
const config = this.getReportConfig(
|
|
1255
|
+
static shouldUseV1Api(codeReport) {
|
|
1256
|
+
const config = this.getReportConfig(codeReport);
|
|
1247
1257
|
return config.useV1Api;
|
|
1248
1258
|
}
|
|
1249
1259
|
/**
|
|
1250
1260
|
* Obtiene la configuración para un tipo de documento
|
|
1251
1261
|
*
|
|
1252
|
-
* @param
|
|
1262
|
+
* @param codeReport - Código del reporte (FG, SRR, FV, etc.)
|
|
1253
1263
|
* @returns Configuración del reporte
|
|
1254
1264
|
* @throws Error si el tipo de documento no está soportado
|
|
1255
1265
|
* @private
|
|
1256
1266
|
*/
|
|
1257
|
-
static getReportConfig(
|
|
1258
|
-
const config = this.reportConfigs[
|
|
1267
|
+
static getReportConfig(codeReport) {
|
|
1268
|
+
const config = this.reportConfigs[codeReport];
|
|
1259
1269
|
if (!config) {
|
|
1260
|
-
throw new Error(`Tipo de
|
|
1270
|
+
throw new Error(`Tipo de reporte no soportado: ${codeReport}. Tipos disponibles: ${Object.keys(this.reportConfigs).join(', ')}`);
|
|
1261
1271
|
}
|
|
1262
1272
|
return config;
|
|
1263
1273
|
}
|
|
@@ -1307,7 +1317,7 @@ class ReportParamsBuilder {
|
|
|
1307
1317
|
* - codEstab: Código de establecimiento (según configuración)
|
|
1308
1318
|
* - codigo: Código del reporte (según configuración)
|
|
1309
1319
|
* - Parámetros extra específicos del tipo (extraDataParams)
|
|
1310
|
-
* - Todos los parámetros adicionales del docData (excepto
|
|
1320
|
+
* - Todos los parámetros adicionales del docData (excepto codEstab, id, serie)
|
|
1311
1321
|
*
|
|
1312
1322
|
* @param docData - Datos del documento con parámetros adicionales
|
|
1313
1323
|
* @param config - Configuración del tipo de reporte
|
|
@@ -1317,11 +1327,11 @@ class ReportParamsBuilder {
|
|
|
1317
1327
|
* @example
|
|
1318
1328
|
* ```typescript
|
|
1319
1329
|
* // Input:
|
|
1320
|
-
* docData = { codDoc: '
|
|
1330
|
+
* docData = { codDoc: '01', tipo: 2, codEstab: '001', fechaInicio: '2024-01-01' }
|
|
1321
1331
|
* config = { idField: 'id', includeEstabInData: false, ... }
|
|
1322
1332
|
*
|
|
1323
1333
|
* // Output:
|
|
1324
|
-
* "{\"tipo\":2,\"fechaInicio\":\"2024-01-01\"}"
|
|
1334
|
+
* "{\"codDoc\":\"01\",\"tipo\":2,\"fechaInicio\":\"2024-01-01\"}"
|
|
1325
1335
|
* ```
|
|
1326
1336
|
*/
|
|
1327
1337
|
static buildDataParams(docData, config) {
|
|
@@ -1341,9 +1351,9 @@ class ReportParamsBuilder {
|
|
|
1341
1351
|
if (config.extraDataParams) {
|
|
1342
1352
|
Object.assign(params, config.extraDataParams);
|
|
1343
1353
|
}
|
|
1344
|
-
// Agregar cualquier parámetro adicional del docData
|
|
1354
|
+
// Agregar cualquier parámetro adicional del docData (incluyendo codDoc si existe)
|
|
1345
1355
|
Object.keys(docData).forEach((key) => {
|
|
1346
|
-
if (!['
|
|
1356
|
+
if (!['codEstab', 'id', 'serie'].includes(key) && docData[key] !== undefined) {
|
|
1347
1357
|
params[key] = docData[key];
|
|
1348
1358
|
}
|
|
1349
1359
|
});
|
|
@@ -1352,96 +1362,168 @@ class ReportParamsBuilder {
|
|
|
1352
1362
|
/**
|
|
1353
1363
|
* Construye las opciones completas para generar un reporte
|
|
1354
1364
|
*
|
|
1355
|
-
* @param
|
|
1365
|
+
* @param codeReport - Código del reporte (FG, SRR, FV, RCNH, etc.) - REQUERIDO
|
|
1366
|
+
* @param docData - Datos del documento con parámetros adicionales (sin codeReport)
|
|
1356
1367
|
* @param format - Formato del reporte: 'pdf' | 'excel' | 'word'
|
|
1357
|
-
|
|
1368
|
+
/**
|
|
1369
|
+
* Construye las opciones completas para generar un reporte
|
|
1370
|
+
*
|
|
1371
|
+
* Método principal que acepta un objeto con opciones tipadas.
|
|
1372
|
+
* Proporciona IntelliSense y validación de tipos en tiempo de desarrollo.
|
|
1373
|
+
*
|
|
1374
|
+
* @param options - Opciones del reporte
|
|
1375
|
+
* @param options.codeReport - Código del reporte (tipado: SALE_CODE_REPORT, PURCHASE_CODE_REPORT, etc.)
|
|
1376
|
+
* @param options.data - Datos del documento (codDoc, tipo, fechas, etc.)
|
|
1377
|
+
* @param options.format - Formato de salida: 'pdf' | 'excel' | 'word' (opcional, por defecto 'pdf')
|
|
1378
|
+
* @returns Objeto con data, format y useV1Api para enviar a la facade
|
|
1358
1379
|
*
|
|
1359
1380
|
* @example
|
|
1360
1381
|
* ```typescript
|
|
1361
|
-
*
|
|
1362
|
-
*
|
|
1363
|
-
*
|
|
1364
|
-
*
|
|
1365
|
-
*
|
|
1366
|
-
*
|
|
1367
|
-
*
|
|
1368
|
-
*
|
|
1369
|
-
*
|
|
1370
|
-
*
|
|
1382
|
+
* // Ejemplo 1: Reporte de ventas
|
|
1383
|
+
* const options = ReportParamsBuilder.build({
|
|
1384
|
+
* codeReport: SALE_CODE_REPORT.FG,
|
|
1385
|
+
* data: {
|
|
1386
|
+
* tipo: 2,
|
|
1387
|
+
* ckFecha: true,
|
|
1388
|
+
* codEstab: 'ESTAB-000000216',
|
|
1389
|
+
* fechaInicio: '2024-01-01',
|
|
1390
|
+
* fechaFin: '2024-12-31',
|
|
1391
|
+
* userRoleId: '307'
|
|
1392
|
+
* },
|
|
1393
|
+
* format: 'pdf'
|
|
1394
|
+
* });
|
|
1395
|
+
*
|
|
1396
|
+
* // Ejemplo 2: Documento electrónico con codDoc variable
|
|
1397
|
+
* const options2 = ReportParamsBuilder.build({
|
|
1398
|
+
* codeReport: ELECTRONIC_DOCUMENT_CODE.FV,
|
|
1399
|
+
* data: {
|
|
1400
|
+
* id: 123,
|
|
1401
|
+
* codDoc: '01', // ← Variable, va a dataParams
|
|
1402
|
+
* codEstab: '001'
|
|
1403
|
+
* }
|
|
1404
|
+
* // format es opcional, por defecto 'pdf'
|
|
1405
|
+
* });
|
|
1406
|
+
*
|
|
1407
|
+
* // Ejemplo 3: Reporte de inventario
|
|
1408
|
+
* const options3 = ReportParamsBuilder.build({
|
|
1409
|
+
* codeReport: INVENTORY_CODE_REPORT.ARTICULO_PVP,
|
|
1410
|
+
* data: {
|
|
1411
|
+
* tipo: 2,
|
|
1412
|
+
* stockStatusCode: 1,
|
|
1413
|
+
* idTarifa: 3
|
|
1414
|
+
* },
|
|
1415
|
+
* format: 'excel'
|
|
1416
|
+
* });
|
|
1371
1417
|
*
|
|
1372
1418
|
* // Usar con facade
|
|
1373
|
-
* this.reportFacade.
|
|
1419
|
+
* this.reportFacade.open(options).subscribe();
|
|
1420
|
+
* this.reportFacade.download(options2).subscribe();
|
|
1374
1421
|
* ```
|
|
1375
1422
|
*/
|
|
1376
|
-
static build(
|
|
1423
|
+
static build(options) {
|
|
1424
|
+
const { codeReport, data, format = 'pdf' } = options;
|
|
1377
1425
|
return {
|
|
1378
|
-
data: this.buildParams(
|
|
1426
|
+
data: this.buildParams(codeReport, data, format),
|
|
1379
1427
|
format,
|
|
1380
|
-
useV1Api: this.shouldUseV1Api(
|
|
1428
|
+
useV1Api: this.shouldUseV1Api(codeReport),
|
|
1381
1429
|
};
|
|
1382
1430
|
}
|
|
1383
1431
|
/**
|
|
1384
|
-
* Obtiene la lista de
|
|
1432
|
+
* Obtiene la lista de códigos de reporte soportados
|
|
1433
|
+
*
|
|
1434
|
+
* Devuelve un array con todos los códigos de reporte configurados
|
|
1435
|
+
* en el builder (FV, NE, FG, SRR, RCNH, etc.)
|
|
1385
1436
|
*
|
|
1386
|
-
* @returns Array con todos los códigos de
|
|
1437
|
+
* @returns Array con todos los códigos de reporte disponibles
|
|
1387
1438
|
*
|
|
1388
1439
|
* @example
|
|
1389
1440
|
* ```typescript
|
|
1390
1441
|
* const types = ReportParamsBuilder.getSupportedDocumentTypes();
|
|
1391
|
-
*
|
|
1442
|
+
* console.log(types);
|
|
1443
|
+
* // ['FV', 'NE', 'NC', 'ND', 'GR', 'NORMAL', 'SRR', 'SRRC', 'FG',
|
|
1444
|
+
* // 'RCNH', 'RLC', 'RCEGR', 'ACEDFP', 'ACELC', 'RCL', 'RK', ...]
|
|
1445
|
+
*
|
|
1446
|
+
* // Usar para validación
|
|
1447
|
+
* if (types.includes(myCode)) {
|
|
1448
|
+
* // Código válido
|
|
1449
|
+
* }
|
|
1392
1450
|
* ```
|
|
1393
1451
|
*/
|
|
1394
1452
|
static getSupportedDocumentTypes() {
|
|
1395
1453
|
return Object.keys(this.reportConfigs);
|
|
1396
1454
|
}
|
|
1397
1455
|
/**
|
|
1398
|
-
* Verifica si un
|
|
1456
|
+
* Verifica si un código de reporte está soportado
|
|
1399
1457
|
*
|
|
1400
|
-
*
|
|
1401
|
-
*
|
|
1458
|
+
* Útil para validar códigos antes de generar reportes,
|
|
1459
|
+
* especialmente cuando el código viene dinámicamente.
|
|
1460
|
+
*
|
|
1461
|
+
* @param codeReport - Código del reporte a verificar
|
|
1462
|
+
* @returns true si el código está soportado, false en caso contrario
|
|
1402
1463
|
*
|
|
1403
1464
|
* @example
|
|
1404
1465
|
* ```typescript
|
|
1405
|
-
*
|
|
1406
|
-
*
|
|
1466
|
+
* // Validación con enum
|
|
1467
|
+
* if (ReportParamsBuilder.isDocumentTypeSupported(SALE_CODE_REPORT.FG)) {
|
|
1468
|
+
* console.log('Código FG soportado');
|
|
1469
|
+
* }
|
|
1470
|
+
*
|
|
1471
|
+
* // Validación con string dinámico
|
|
1472
|
+
* const dynamicCode = getUserSelectedCode();
|
|
1473
|
+
* if (ReportParamsBuilder.isDocumentTypeSupported(dynamicCode)) {
|
|
1474
|
+
* const options = ReportParamsBuilder.build({
|
|
1475
|
+
* codeReport: dynamicCode,
|
|
1476
|
+
* data: {...}
|
|
1477
|
+
* });
|
|
1407
1478
|
* } else {
|
|
1408
|
-
* console.error('
|
|
1479
|
+
* console.error('Código no soportado:', dynamicCode);
|
|
1409
1480
|
* }
|
|
1410
1481
|
* ```
|
|
1411
1482
|
*/
|
|
1412
|
-
static isDocumentTypeSupported(
|
|
1413
|
-
return
|
|
1483
|
+
static isDocumentTypeSupported(codeReport) {
|
|
1484
|
+
return codeReport in this.reportConfigs;
|
|
1414
1485
|
}
|
|
1415
1486
|
/**
|
|
1416
1487
|
* Registra un nuevo tipo de reporte dinámicamente
|
|
1417
1488
|
*
|
|
1418
|
-
* Permite agregar soporte para
|
|
1489
|
+
* Permite agregar soporte para códigos de reporte personalizados
|
|
1419
1490
|
* sin modificar el código fuente de la librería.
|
|
1491
|
+
* Útil para reportes específicos de cada aplicación.
|
|
1420
1492
|
*
|
|
1421
|
-
* @param
|
|
1493
|
+
* @param codeReport - Código único del reporte personalizado
|
|
1422
1494
|
* @param config - Configuración completa del reporte
|
|
1423
1495
|
*
|
|
1424
1496
|
* @example
|
|
1425
1497
|
* ```typescript
|
|
1426
|
-
* //
|
|
1427
|
-
* ReportParamsBuilder.registerReportType('
|
|
1428
|
-
* codigo: '
|
|
1498
|
+
* // Registrar un reporte personalizado
|
|
1499
|
+
* ReportParamsBuilder.registerReportType('MI_REPORTE_CUSTOM', {
|
|
1500
|
+
* codigo: 'MI_REPORTE_CUSTOM',
|
|
1429
1501
|
* hasService: true,
|
|
1430
1502
|
* useV1Api: false,
|
|
1431
1503
|
* idField: 'id',
|
|
1432
1504
|
* hasParams: true,
|
|
1433
|
-
*
|
|
1505
|
+
* includeEstabInData: true,
|
|
1506
|
+
* extraDataParams: {
|
|
1507
|
+
* tipoCustom: 'especial',
|
|
1508
|
+
* version: 2
|
|
1509
|
+
* }
|
|
1434
1510
|
* });
|
|
1435
1511
|
*
|
|
1436
|
-
* // Ahora se puede usar
|
|
1437
|
-
* const options = ReportParamsBuilder.build(
|
|
1438
|
-
*
|
|
1439
|
-
* '
|
|
1440
|
-
*
|
|
1512
|
+
* // Ahora se puede usar como cualquier otro reporte
|
|
1513
|
+
* const options = ReportParamsBuilder.build({
|
|
1514
|
+
* codeReport: 'MI_REPORTE_CUSTOM',
|
|
1515
|
+
* data: { id: 123, codEstab: '001' },
|
|
1516
|
+
* format: 'pdf'
|
|
1517
|
+
* });
|
|
1518
|
+
*
|
|
1519
|
+
* // Verificar si fue registrado
|
|
1520
|
+
* console.log(
|
|
1521
|
+
* ReportParamsBuilder.isDocumentTypeSupported('MI_REPORTE_CUSTOM')
|
|
1522
|
+
* ); // true
|
|
1441
1523
|
* ```
|
|
1442
1524
|
*/
|
|
1443
|
-
static registerReportType(
|
|
1444
|
-
this.reportConfigs[
|
|
1525
|
+
static registerReportType(codeReport, config) {
|
|
1526
|
+
this.reportConfigs[codeReport] = config;
|
|
1445
1527
|
}
|
|
1446
1528
|
}
|
|
1447
1529
|
|
|
@@ -1567,7 +1649,11 @@ class WhatsAppSender {
|
|
|
1567
1649
|
generateReport() {
|
|
1568
1650
|
const docData = this.config.documentData;
|
|
1569
1651
|
// Construir opciones de reporte
|
|
1570
|
-
const reportOptions = ReportParamsBuilder.build(
|
|
1652
|
+
const reportOptions = ReportParamsBuilder.build({
|
|
1653
|
+
codeReport: docData.codDoc,
|
|
1654
|
+
data: docData,
|
|
1655
|
+
format: 'pdf',
|
|
1656
|
+
});
|
|
1571
1657
|
return this.reportFacade.generate(reportOptions);
|
|
1572
1658
|
}
|
|
1573
1659
|
processReportFile(response) {
|
|
@@ -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 * SALE REPORT RENTABILIDAD\n */\n SRR = 'SRR',\n\n /**\n * SALE REPORT RENTABILIDAD CUSTOM\n */\n SRRC = 'SRRC',\n\n /**\n * SALE REPORT INVOICE GENERAL\n */\n FG = 'FG',\n}\n\n/**\n * Códigos de reportes de compras\n */\nexport enum PURCHASE_CODE_REPORT {\n /**\n * REPORTE COMPRAS NOTA HIDDEN\n */\n RCNH = 'RCNH',\n\n /**\n * REPORTE LIQUIDACION COMPRA\n */\n RLC = 'RLC',\n}\n\n/**\n * Códigos de reportes de contabilidad\n */\nexport enum ACCOUNTING_CODE_REPORT {\n /**\n * REPORTE CONTABLE ESTADO GENERAL RESULTADO\n */\n RCEGR = 'RCEGR',\n\n /**\n * ASIENTO CONTABLE ESTADO DE FLUJO DE PAGO\n */\n ACEDFP = 'ACEDFP',\n\n /**\n * ASIENTO CONTABLE ESTADO LIBRO CAJA\n */\n ACELC = 'ACELC',\n}\n\n/**\n * Códigos de reportes de clientes\n */\nexport enum CUSTOMER_CODE_REPORT {\n /**\n * REPORTE CLIENTE LISTADO\n */\n RCL = 'RCL',\n}\n\n/**\n * Códigos de reportes de inventario\n */\nexport enum INVENTORY_CODE_REPORT {\n /**\n * REPORTE KARDEX\n */\n RK = 'RK',\n\n /**\n * CONSOLIDADO DE ARTICULOS AGRUPADO\n */\n CDAA = 'CDAA',\n\n /**\n * CONSOLIDADO DE ARTICULOS\n */\n CDA = 'CDA',\n\n /**\n * INVENTARIO REPORTE VALORACION\n */\n STOCK_VALORACION = 'INVRV',\n\n /**\n * INVENTARIO ARTICULO TABLA\n */\n ARTICULO_PVP = 'INVAT',\n\n /**\n * REPORTE DE ARTICULOS FRACCIONADOS\n */\n RAF = 'RAF',\n\n /**\n * REPORTE DE CADUCIDAD DE ARTICULOS\n */\n RCAA = 'RCAA',\n\n /**\n * REPORTE DE ARTICULO STOCK VALORACION\n */\n RASR = 'RASR',\n\n /**\n * REPORTE CONSOLIDACION DETALLE\n */\n RCD = 'RCD',\n\n /**\n * REPORTE TRANSFERENCIA BODEGA\n */\n RTB = 'RTB',\n}\n\n/**\n * Códigos de documentos electrónicos\n */\nexport enum ELECTRONIC_DOCUMENT_CODE {\n /**\n * FACTURA\n */\n FV = 'FV',\n\n /**\n * NOTA DE ENTREGA\n */\n NE = 'NE',\n\n /**\n * NOTA DE CREDITO\n */\n NC = 'NC',\n\n /**\n * NOTA DE DEBITO\n */\n ND = 'ND',\n\n /**\n * GUIA DE REMISION\n */\n GR = 'GR',\n\n /**\n * ORDEN DE PEDIDO\n */\n NORMAL = 'NORMAL',\n}\n\n/**\n * Formatos de reporte disponibles\n */\nexport enum REPORT_FORMAT {\n PDF = 'pdf',\n EXCEL = 'excel',\n WORD = 'word',\n}\n","export const API_PATHS = {\n WHATSAPP: 'common/whatsapp-cloud',\n REPORTS: 'reports',\n CONFIG: 'config',\n} as const;\n\nexport const DOCUMENT_TYPES = {\n NORMAL: 'NORMAL',\n FACTURA: 'FACTURA',\n NOTA_ENTREGA: 'NOTA_ENTREGA',\n} as const;\n","import { InjectionToken } from '@angular/core';\nimport { ReportPort } from '../contracts/report.port';\n\nexport const REPORT_PORT = new InjectionToken<ReportPort>('REPORT_PORT');\n","import { InjectionToken } from '@angular/core';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\n\nexport const WHATSAPP_MESSAGING_PORT = new InjectionToken<WhatsAppMessagingPort>(\n 'WHATSAPP_MESSAGING_PORT',\n);\n","import { InjectionToken } from '@angular/core';\nimport { PrinterPort } from '../contracts/printer.port';\n\nexport const PRINTER_PORT = new InjectionToken<PrinterPort>('PRINTER_PORT');\n","/**\n * Utilidades para manejo de archivos y respuestas HTTP\n */\nexport class FileMapperUtil {\n /**\n * Extrae el nombre de archivo desde el header Content-Disposition\n */\n static extractFileName(response: any): string {\n const contentDisposition = response.headers?.get('content-disposition');\n\n if (!contentDisposition) {\n return this.generateDefaultFileName();\n }\n\n // Método más robusto para extraer filename\n const matches = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/.exec(contentDisposition);\n\n if (matches && matches[1]) {\n let fileName = matches[1].replace(/['\"]/g, '');\n // Limpiar caracteres especiales\n fileName = fileName.replaceAll('+', ' ').trim();\n return fileName || this.generateDefaultFileName();\n }\n\n // Fallback: método simple\n const simpleParse = contentDisposition.split('filename=')[1];\n if (simpleParse) {\n return simpleParse.replace(/['\"]/g, '').trim() || this.generateDefaultFileName();\n }\n\n return this.generateDefaultFileName();\n }\n\n /**\n * Crea un objeto File desde una respuesta HTTP\n */\n static fromResponse(response: any): File {\n const fileName = this.extractFileName(response);\n const contentType = response.headers?.get('content-type') || 'application/octet-stream';\n\n return new File([response.body], fileName, { type: contentType });\n }\n\n /**\n * Descarga un archivo usando la API nativa del navegador\n */\n static downloadFile(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Limpiar el objeto URL\n URL.revokeObjectURL(url);\n }\n\n /**\n * Abre un archivo en una nueva ventana (para PDFs)\n */\n static openFile(blob: Blob, fileName: string): void {\n const fileURL = URL.createObjectURL(blob);\n window.open(fileURL, fileName);\n\n // Limpiar URL después de un tiempo\n setTimeout(() => URL.revokeObjectURL(fileURL), 1000);\n }\n\n /**\n * Detecta si es un navegador legacy que requiere descarga forzada\n */\n static isLegacyBrowser(): boolean {\n const userAgent = navigator.userAgent;\n return !!(userAgent.match(/Edge/g) || userAgent.match(/.NET/g) || userAgent.match(/MSIE/g));\n }\n\n private static generateDefaultFileName(): string {\n const timestamp = Date.now();\n return `document_${timestamp}.pdf`;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\nimport { Observable, tap } from 'rxjs';\nimport { REPORT_PORT } from '../tokens/report.token';\nimport { ReportOptions } from '../contracts/report.port';\nimport { FileMapperUtil } from '../utils/file-mapper.util';\n\n/**\n * Facade para generación de reportes\n *\n * Proporciona una API de alto nivel para generar reportes con manejo automático de archivos.\n * Todos los métodos devuelven Observables - el consumidor debe hacer subscribe().\n *\n * @example\n * ```typescript\n * // Control total del blob\n * this.reportFacade.generate(options).subscribe(response => {\n * const blob = response.body;\n * // Procesar blob manualmente\n * });\n *\n * // Descarga automática\n * this.reportFacade.download(options).subscribe();\n *\n * // Abrir PDF automáticamente\n * this.reportFacade.open(options).subscribe();\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportFacade {\n private readonly reportPort = inject(REPORT_PORT);\n\n /**\n * Genera un reporte y devuelve el Observable con el blob\n *\n * Este método proporciona control total sobre el blob generado.\n * No realiza ninguna acción automática (descarga/apertura).\n * Útil cuando necesitas procesar el blob manualmente (enviar por WhatsApp, guardar en servidor, etc.)\n *\n * @template T - Tipo de datos del reporte\n * @param options - Opciones de generación del reporte\n * @param options.data - Datos del reporte (usar ReportParamsBuilder.build())\n * @param options.format - Formato del reporte: 'pdf' | 'excel' | 'word'\n * @param options.useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable con la respuesta HTTP que contiene el blob\n *\n * @example\n * ```typescript\n * const options = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },\n * 'pdf'\n * );\n *\n * this.reportFacade.generate(options).subscribe({\n * next: (response) => {\n * const blob = response.body;\n * const fileName = FileMapperUtil.extractFileName(response);\n * // Procesar blob según necesidad\n * },\n * error: (err) => console.error('Error:', err)\n * });\n * ```\n */\n generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n return this.reportPort.generate(options);\n }\n\n /**\n * Genera un reporte y lo descarga automáticamente\n *\n * Extrae el nombre del archivo desde los headers HTTP y descarga el archivo automáticamente.\n * Funciona para cualquier formato (PDF, Excel, Word).\n * El Observable se completa después de iniciar la descarga.\n *\n * @template T - Tipo de datos del reporte\n * @param options - Opciones de generación del reporte\n * @returns Observable que se completa después de iniciar la descarga\n *\n * @example\n * ```typescript\n * // Con formato dinámico\n * const options = ReportParamsBuilder.build(\n * { codDoc: SALE_CODE_REPORT.FG },\n * this.selectedFormat // 'pdf' | 'excel' | 'word'\n * );\n * this.reportFacade.download(options).subscribe();\n *\n * // Con formato fijo\n * const options = ReportParamsBuilder.build(\n * { codDoc: INVENTORY_CODE_REPORT.RCD },\n * 'excel'\n * );\n * this.reportFacade.download(options).subscribe();\n * ```\n */\n download<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n return this.reportPort.generate(options).pipe(\n tap((response) => {\n const fileName = FileMapperUtil.extractFileName(response);\n if (response.body) {\n FileMapperUtil.downloadFile(response.body, fileName);\n }\n }),\n );\n }\n\n /**\n * Genera un reporte y lo abre en nueva ventana (o descarga en navegadores legacy)\n *\n * Comportamiento inteligente según el navegador:\n * - Navegadores modernos: Abre el archivo en nueva ventana/pestaña\n * - Navegadores legacy (IE, Edge antiguo): Descarga el archivo\n *\n * Ideal para PDFs que el usuario quiere visualizar inmediatamente.\n * También funciona con Excel/Word pero la experiencia puede variar según el navegador.\n *\n * @template T - Tipo de datos del reporte\n * @param options - Opciones de generación del reporte\n * @returns Observable que se completa después de abrir/descargar el archivo\n *\n * @example\n * ```typescript\n * // Abrir PDF\n * const options = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },\n * 'pdf'\n * );\n * this.reportFacade.open(options).subscribe();\n *\n * // Con formato dinámico\n * const format = this.isPDF ? 'pdf' : 'excel';\n * const options = ReportParamsBuilder.build({ codDoc: code }, format);\n * this.reportFacade.open(options).subscribe();\n * ```\n */\n open<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n return this.reportPort.generate(options).pipe(\n tap((response) => {\n const fileName = FileMapperUtil.extractFileName(response);\n if (response.body) {\n if (FileMapperUtil.isLegacyBrowser()) {\n FileMapperUtil.downloadFile(response.body, fileName);\n } else {\n FileMapperUtil.openFile(response.body, fileName);\n }\n }\n }),\n );\n }\n\n /**\n * Genera un PDF y lo abre automáticamente (shortcut)\n *\n * Método de conveniencia para el caso común de generar y abrir PDFs.\n * Equivalente a llamar open() con format: 'pdf'.\n *\n * @template T - Tipo de datos del reporte\n * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)\n * @param useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable que se completa después de abrir el PDF\n *\n * @example\n * ```typescript\n * const reportOptions = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },\n * 'pdf'\n * );\n *\n * // Forma corta\n * this.reportFacade.openPDF(\n * reportOptions.data,\n * reportOptions.useV1Api\n * ).subscribe();\n * ```\n */\n openPDF<T>(data: T, useV1Api = false): Observable<HttpResponse<Blob>> {\n return this.open({\n data,\n format: 'pdf',\n useV1Api,\n });\n }\n\n /**\n * Genera un Excel y lo descarga automáticamente (shortcut)\n *\n * Método de conveniencia para el caso común de generar y descargar archivos Excel.\n * Equivalente a llamar download() con format: 'excel'.\n *\n * @template T - Tipo de datos del reporte\n * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)\n * @param useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable que se completa después de iniciar la descarga\n *\n * @example\n * ```typescript\n * const reportOptions = ReportParamsBuilder.build(\n * { codDoc: SALE_CODE_REPORT.FG, fechaInicio: '2024-01-01' },\n * 'excel'\n * );\n *\n * // Forma corta\n * this.reportFacade.downloadExcel(\n * reportOptions.data,\n * reportOptions.useV1Api\n * ).subscribe();\n * ```\n */\n downloadExcel<T>(data: T, useV1Api = false): Observable<HttpResponse<Blob>> {\n return this.download({\n data,\n format: 'excel',\n useV1Api,\n });\n }\n\n /**\n * Genera un Word y lo descarga automáticamente (shortcut)\n *\n * Método de conveniencia para el caso común de generar y descargar archivos Word.\n * Equivalente a llamar download() con format: 'word'.\n *\n * @template T - Tipo de datos del reporte\n * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)\n * @param useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable que se completa después de iniciar la descarga\n *\n * @example\n * ```typescript\n * const reportOptions = ReportParamsBuilder.build(\n * { codDoc: CUSTOMER_CODE_REPORT.RCL },\n * 'word'\n * );\n *\n * // Forma corta\n * this.reportFacade.downloadWord(\n * reportOptions.data,\n * reportOptions.useV1Api\n * ).subscribe();\n * ```\n */\n downloadWord<T>(data: T, useV1Api = false): Observable<HttpResponse<Blob>> {\n return this.download({\n data,\n format: 'word',\n useV1Api,\n });\n }\n}\n","export interface DocumentDeliveryData {\n comprador: string;\n establecimiento: string;\n serie: string;\n tipo: string;\n}\n\nexport interface WhatsAppMessages {\n main: string;\n promo: string;\n}\n\n/**\n * Builder para construir mensajes de WhatsApp\n * Clase utilitaria con métodos estáticos\n */\nexport class WhatsAppMessageBuilder {\n static buildDocumentDeliveryMessages(data: DocumentDeliveryData): WhatsAppMessages {\n const main = this.buildMainMessage(data);\n const promo = this.buildPromoMessage(data.establecimiento);\n\n return { main, promo };\n }\n\n static buildWelcomeMessage(customerName: string, establishmentName: string): string {\n return `¡Hola *${customerName}*! 👋\\n\\nBienvenido a *${establishmentName}*. Estamos aquí para ayudarte.`;\n }\n\n static buildOrderConfirmationMessage(orderNumber: string, customerName: string): string {\n return `Estimado(a) *${customerName}*,\\n\\n✅ Tu pedido #${orderNumber} ha sido confirmado.\\n\\nTe notificaremos cuando esté listo.`;\n }\n\n static buildPaymentReminderMessage(\n customerName: string,\n amount: number,\n dueDate: string,\n ): string {\n return `Estimado(a) *${customerName}*,\\n\\n💰 Recordatorio de pago:\\nMonto: ${amount}\\nVencimiento: ${dueDate}\\n\\nGracias por tu preferencia.`;\n }\n\n private static buildMainMessage(data: DocumentDeliveryData): string {\n const documentTypeDisplay = this.getDocumentTypeDisplay(data.tipo);\n\n return (\n `Estimado(a) *${data.comprador}*,\\n\\n` +\n `📄 Su ${documentTypeDisplay} ha sido generado exitosamente.\\n\\n` +\n `🏪 Establecimiento: *${data.establecimiento}*\\n` +\n `📋 Serie: ${data.serie}\\n\\n` +\n `Adjunto encontrará el documento solicitado.`\n );\n }\n\n private static buildPromoMessage(establishmentName: string): string {\n return (\n `📱 Documento enviado por *${establishmentName}*\\n` +\n `Powered by *Acontplus* 🚀\\n\\n` +\n `¿Necesita ayuda? Contáctenos.`\n );\n }\n\n private static getDocumentTypeDisplay(tipo: string): string {\n const types: Record<string, string> = {\n FACTURA: 'factura electrónica',\n NOTA_ENTREGA: 'nota de entrega',\n PROFORMA: 'proforma',\n COTIZACION: 'cotización',\n RECIBO: 'recibo',\n };\n\n return types[tipo] || 'documento';\n }\n}\n","export interface PhoneValidationResult {\n isValid: boolean;\n cleanPhone: string;\n errorMessage?: string;\n}\n\n/**\n * Utilidades para formateo y validación de números telefónicos\n */\nexport class PhoneFormatterUtil {\n /**\n * Limpia el teléfono removiendo todos los caracteres no numéricos\n */\n static cleanPhone(phone: string): string {\n return phone.replace(/\\D/g, '');\n }\n\n /**\n * Valida si un teléfono ecuatoriano es válido\n */\n static validateEcuadorianPhone(phone: string): PhoneValidationResult {\n const cleanPhone = this.cleanPhone(phone);\n\n if (!cleanPhone) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede estar vacío',\n };\n }\n\n if (cleanPhone.length < 10) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede ser menor a diez dígitos',\n };\n }\n\n if (cleanPhone.length > 10) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede ser mayor a diez dígitos',\n };\n }\n\n // Validar formato ecuatoriano (09xxxxxxxx) o internacional (593xxxxxxxxx)\n const isValidEcuadorian = /^09\\d{8}$/.test(cleanPhone);\n const isValidInternational = /^593\\d{9}$/.test(cleanPhone);\n\n if (!isValidEcuadorian && !isValidInternational) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'Formato inválido. Use: 09xxxxxxxx',\n };\n }\n\n return {\n isValid: true,\n cleanPhone,\n };\n }\n\n /**\n * Convierte número local ecuatoriano a formato internacional\n */\n static toInternationalFormat(phone: string): string {\n let cleanPhone = this.cleanPhone(phone);\n\n // Si empieza con 0, convertir a formato internacional ecuatoriano\n if (cleanPhone.startsWith('0')) {\n cleanPhone = '593' + cleanPhone.slice(1);\n }\n\n return cleanPhone;\n }\n\n /**\n * Formatea teléfono para la API de WhatsApp Business (con @c.us)\n */\n static formatForWhatsAppApi(phone: string): string {\n const internationalPhone = this.toInternationalFormat(phone);\n\n if (!internationalPhone.endsWith('@c.us')) {\n return `${internationalPhone}@c.us`;\n }\n\n return internationalPhone;\n }\n\n /**\n * Formatea teléfono para WhatsApp Web (sin @c.us)\n */\n static formatForWhatsAppWeb(phone: string): string {\n return this.toInternationalFormat(phone);\n }\n\n /**\n * Formatea teléfono para mostrar al usuario (con espacios y +)\n */\n static formatForDisplay(phone: string): string {\n const cleanPhone = this.cleanPhone(phone);\n\n if (!cleanPhone) return '';\n\n // Si es número local ecuatoriano (09xxxxxxxx)\n if (/^09\\d{8}$/.test(cleanPhone)) {\n return `+593 ${cleanPhone.slice(1, 3)} ${cleanPhone.slice(3, 6)} ${cleanPhone.slice(6)}`;\n }\n\n // Si ya tiene formato internacional (593xxxxxxxxx)\n if (/^593\\d{9}$/.test(cleanPhone)) {\n return `+593 ${cleanPhone.slice(3, 5)} ${cleanPhone.slice(5, 8)} ${cleanPhone.slice(8)}`;\n }\n\n // Para otros formatos internacionales\n if (cleanPhone.length > 10) {\n return `+${cleanPhone}`;\n }\n\n return phone;\n }\n\n /**\n * Validación general para teléfonos internacionales\n */\n static isValidInternationalPhone(phone: string): boolean {\n const cleanPhone = this.cleanPhone(phone);\n return /^\\+?[1-9]\\d{1,14}$/.test(cleanPhone);\n }\n\n /**\n * Genera el hint apropiado según el estado del teléfono\n */\n static getPhoneHint(phone: string): string {\n if (!phone) {\n return 'Ingrese número ecuatoriano (09xxxxxxxx)';\n }\n\n const validation = this.validateEcuadorianPhone(phone);\n\n if (validation.isValid) {\n return `Se enviará a: ${this.formatForDisplay(phone)}`;\n }\n\n return 'Formato: 09xxxxxxxx';\n }\n\n /**\n * Obtiene el placeholder para el campo de teléfono\n */\n static getPhonePlaceholder(): string {\n return 'Ej: 0987654321';\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WHATSAPP_MESSAGING_PORT } from '../tokens/whatsapp.token';\nimport { WhatsAppResponse, DocumentDeliveryParams } from '../models/whatsapp.model';\nimport { WhatsAppMessageBuilder } from '../builders/whatsapp-message.builder';\nimport { PhoneFormatterUtil } from '../utils/phone-formatter.util';\n\n@Injectable({ providedIn: 'root' })\nexport class WhatsAppMessagingFacade {\n private readonly messagingPort = inject(WHATSAPP_MESSAGING_PORT);\n\n // Métodos de alto nivel con lógica de negocio\n sendSimpleText(to: string, message: string, previewUrl = true): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendText({\n to: formattedPhone,\n message,\n previewUrl,\n });\n }\n\n sendTemplateText(\n to: string,\n templateName: string,\n params?: string[],\n languageCode = 'es_EC',\n ): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendTextTemplate({\n to: formattedPhone,\n templateName,\n languageCode,\n bodyParams: params,\n });\n }\n\n sendDocument(\n to: string,\n documentUrl: string,\n caption?: string,\n filename?: string,\n ): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendDocument({\n to: formattedPhone,\n documentUrl,\n caption,\n filename,\n });\n }\n\n // Caso de uso específico: Entrega de documentos\n deliverDocument(params: DocumentDeliveryParams): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(params.phone);\n const messages = WhatsAppMessageBuilder.buildDocumentDeliveryMessages({\n comprador: params.customerName,\n establecimiento: params.establishmentName,\n serie: params.documentSeries,\n tipo: params.documentType,\n });\n\n return this.messagingPort.sendDocumentTemplate({\n to: formattedPhone,\n file: params.file,\n templateName: 'notificacion_documento',\n languageCode: 'es_EC',\n bodyParams: [messages.main, messages.promo],\n });\n }\n\n // Método mejorado para envío de documentos con template\n sendDocumentWithTemplate(params: {\n phone: string;\n file: File;\n templateName: string;\n bodyParams?: string[];\n languageCode?: string;\n filename?: string;\n }): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(params.phone);\n\n return this.messagingPort.sendDocumentTemplate({\n to: formattedPhone,\n file: params.file,\n templateName: params.templateName,\n languageCode: params.languageCode || 'es_EC',\n bodyParams: params.bodyParams,\n filename: params.filename,\n });\n }\n\n // Método legacy para compatibilidad (pero mejorado)\n sendDocumentWithMessages(params: {\n phone: string;\n file: File;\n messages: { main: string; promo: string };\n }): Observable<WhatsAppResponse> {\n return this.sendDocumentWithTemplate({\n phone: params.phone,\n file: params.file,\n templateName: 'documento_generico',\n bodyParams: [params.messages.main, params.messages.promo],\n });\n }\n\n getProviderStatus(): Observable<any> {\n return this.messagingPort.getStatus();\n }\n\n // Métodos públicos que delegan a las utilidades estáticas\n isValidPhone(phone: string): boolean {\n return PhoneFormatterUtil.isValidInternationalPhone(phone);\n }\n\n toDisplayFormat(phone: string): string {\n return PhoneFormatterUtil.formatForDisplay(phone);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { PRINTER_PORT } from '../tokens/printer.token';\nimport { PrintParams } from '../contracts/printer.port';\n\n@Injectable({ providedIn: 'root' })\nexport class PrinterFacade {\n private readonly printerPort = inject(PRINTER_PORT);\n\n // Métodos de impresión\n askToPrint(params: PrintParams): void {\n this.printerPort.askToPrint(params);\n }\n\n printOrder(id: number): void {\n this.printerPort.createPrintOrder(id);\n }\n\n printCommanda(id: number): void {\n this.printerPort.createPrintCommanda(id);\n }\n\n printOrderWithCommanda(id: number): void {\n this.printerPort.createPrintOrderWithCommanda(id);\n }\n\n printInvoice(id: number, documentoId: number): void {\n this.printerPort.createInvoicePrint(id, documentoId);\n }\n\n printNotaEntrega(id: number, documentoId: number): void {\n this.printerPort.createNotaEntregaPrint(id, documentoId);\n }\n\n // Método para configurar automáticamente la impresión\n autoPrint(\n data: { printerAutomatic: boolean; orderId: number; idDocumento: number },\n codDoc: string,\n ): void {\n if (data.printerAutomatic) {\n if (codDoc === 'FACTURA') {\n this.printInvoice(data.orderId, data.idDocumento);\n }\n if (codDoc === 'NOTA_ENTREGA') {\n this.printNotaEntrega(data.orderId, data.idDocumento);\n }\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\nimport {\n WhatsAppTextRequest,\n WhatsAppTextTemplateRequest,\n WhatsAppDocumentRequest,\n WhatsAppDocumentTemplateRequest,\n WhatsAppResponse,\n WhatsAppStatusResponse,\n} from '../models/whatsapp.model';\nimport { API_PATHS } from '../constants/api-paths';\n\n@Injectable()\nexport class MetaWhatsAppAdapter implements WhatsAppMessagingPort {\n private readonly http = inject(HttpClient);\n\n // 1. Texto directo (requiere ventana 24h)\n sendText(request: WhatsAppTextRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/text`, request);\n }\n\n // 2. Texto con template (funciona siempre)\n sendTextTemplate(request: WhatsAppTextTemplateRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/text-template`, request);\n }\n\n // 3. Documento directo via URL (requiere ventana 24h)\n sendDocument(request: WhatsAppDocumentRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/document`, request);\n }\n\n // 4. Documento con template (funciona siempre)\n sendDocumentTemplate(request: WhatsAppDocumentTemplateRequest): Observable<WhatsAppResponse> {\n const formData = new FormData();\n\n // Usar nombres de campos que espera tu API (con mayúsculas)\n formData.append('To', request.to);\n formData.append('File', request.file);\n\n if (request.templateName) formData.append('TemplateName', request.templateName);\n if (request.languageCode) formData.append('LanguageCode', request.languageCode);\n if (request.filename) formData.append('Filename', request.filename);\n\n // Enviar bodyParams como array (formato que espera tu API)\n if (request.bodyParams && request.bodyParams.length > 0) {\n request.bodyParams.forEach((param, index) => {\n formData.append(`BodyParams[${index}]`, param);\n });\n }\n\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/document-template`, formData);\n }\n\n getStatus(): Observable<WhatsAppStatusResponse> {\n return this.http.get<WhatsAppStatusResponse>(`${API_PATHS.WHATSAPP}/status`);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\nimport {\n WhatsAppTextRequest,\n WhatsAppTextTemplateRequest,\n WhatsAppDocumentRequest,\n WhatsAppDocumentTemplateRequest,\n WhatsAppResponse,\n WhatsAppStatusResponse,\n} from '../models/whatsapp.model';\n\n/**\n * Adaptador para Green API (legacy)\n * Implementa la interfaz WhatsApp usando Green API\n */\n@Injectable()\nexport class GreenWhatsAppAdapter implements WhatsAppMessagingPort {\n private readonly http = inject(HttpClient);\n\n // Implementación para Green API - mapea los métodos de WhatsApp a Green\n sendText(request: WhatsAppTextRequest): Observable<WhatsAppResponse> {\n // Mapear a Green API call\n return this.http.post<WhatsAppResponse>('/api/green/send-text', {\n chatId: request.to,\n message: request.message,\n });\n }\n\n sendTextTemplate(request: WhatsAppTextTemplateRequest): Observable<WhatsAppResponse> {\n // Green API no soporta templates, enviar como texto simple\n return this.http.post<WhatsAppResponse>('/api/green/send-text', {\n chatId: request.to,\n message: `Template: ${request.templateName}`,\n });\n }\n\n sendDocument(request: WhatsAppDocumentRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>('/api/green/send-file', {\n chatId: request.to,\n fileUrl: request.documentUrl,\n caption: request.caption,\n });\n }\n\n sendDocumentTemplate(request: WhatsAppDocumentTemplateRequest): Observable<WhatsAppResponse> {\n // Green API - enviar archivo con template como caption\n const formData = new FormData();\n formData.append('chatId', request.to);\n formData.append('file', request.file);\n formData.append('caption', `Template: ${request.templateName}`);\n\n return this.http.post<WhatsAppResponse>('/api/green/send-file-upload', formData);\n }\n\n getStatus(): Observable<WhatsAppStatusResponse> {\n return this.http.get<WhatsAppStatusResponse>('/api/green/status');\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ReportPort, ReportOptions } from '../contracts/report.port';\nimport { API_PATHS } from '../constants/api-paths';\n\n/**\n * Adapter para generación de reportes\n * Siempre devuelve Observable - el consumidor decide qué hacer con el blob\n */\n@Injectable()\nexport class ReportAdapter implements ReportPort {\n private readonly http = inject(HttpClient);\n\n generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n const { data, useV1Api = false } = options;\n\n const reportVersionPath = useV1Api ? '/reporte/download' : '/v2/reporte/download';\n const fullPath = `${API_PATHS.REPORTS}${reportVersionPath}`;\n\n return this.http.post<Blob>(fullPath, data, {\n observe: 'response',\n responseType: 'blob' as 'json',\n });\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { PrinterPort, PrintParams, ApiResponse } from '../contracts/printer.port';\nimport { API_PATHS, DOCUMENT_TYPES } from '../constants/api-paths';\n\n@Injectable()\nexport class PrinterAdapter implements PrinterPort {\n private readonly http = inject(HttpClient);\n\n askToPrint(obj: PrintParams): void {\n if (typeof window !== 'undefined') {\n const confirmed = window.confirm('¿Desea Imprimir este comprobante?');\n if (confirmed) {\n this.getPrintConfig(obj).subscribe();\n }\n }\n }\n\n getPrintConfig(obj: PrintParams): Observable<ApiResponse> {\n const json = JSON.stringify({\n codDoc: obj.codDoc,\n getUrlPrintServer: true,\n id: obj.id,\n codEstab: obj.codEstab,\n });\n\n return new Observable((observer) => {\n const url = `${API_PATHS.CONFIG}Print/?json=${json}`;\n this.http.get<ApiResponse>(url).subscribe({\n next: (response) => {\n if (response.code === '0') {\n console.warn(response.message);\n }\n if (response.code === '1') {\n this.print(response.payload as string, obj).subscribe();\n }\n observer.next(response);\n observer.complete();\n },\n error: (err) => {\n console.error(err);\n observer.error(err);\n },\n });\n });\n }\n\n print(urlPrinter: string, paramsToPrint: PrintParams): Observable<ApiResponse> {\n return new Observable((observer) => {\n this.http.post<ApiResponse>(`${urlPrinter}/Print`, paramsToPrint).subscribe({\n next: (response) => {\n console.log({\n type: response.code === '1' ? 'success' : 'warning',\n message: response.message,\n });\n observer.next(response);\n observer.complete();\n },\n error: (err) => {\n console.error(err);\n observer.error(err);\n },\n });\n });\n }\n\n createPrintOrder(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 5,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createPrintCommanda(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 6,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createPrintOrderWithCommanda(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 2,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createInvoicePrint(id: number, documentoId: number): void {\n this.getPrintConfig({\n id,\n documentoId,\n tipo: 3,\n codDoc: DOCUMENT_TYPES.FACTURA,\n }).subscribe();\n }\n\n createNotaEntregaPrint(id: number, documentoId: number): void {\n this.getPrintConfig({\n id,\n documentoId,\n tipo: 4,\n codDoc: DOCUMENT_TYPES.NOTA_ENTREGA,\n }).subscribe();\n }\n}\n","import {\n SALE_CODE_REPORT,\n PURCHASE_CODE_REPORT,\n ACCOUNTING_CODE_REPORT,\n CUSTOMER_CODE_REPORT,\n INVENTORY_CODE_REPORT,\n ELECTRONIC_DOCUMENT_CODE,\n} from '../constants/report-codes';\n\nexport interface ReportDocumentData {\n codDoc: string;\n codEstab?: string;\n id?: number;\n serie?: string;\n // Campos adicionales para reportes personalizados\n [key: string]: any;\n}\n\nexport interface ReportParams {\n hasService?: boolean;\n reportParams: string;\n dataParams: string;\n}\n\ninterface ReportConfig {\n codigo: string;\n hasService: boolean;\n useV1Api: boolean;\n idField: string;\n extraDataParams?: Record<string, any>;\n includeEstabInData?: boolean;\n includeCodigoInData?: boolean;\n hasParams?: boolean;\n}\n\n/**\n * Builder para construir parámetros de reportes\n * Clase utilitaria con métodos estáticos\n */\nexport class ReportParamsBuilder {\n private static readonly reportConfigs: Record<string, ReportConfig> = {\n // Documentos electrónicos\n [ELECTRONIC_DOCUMENT_CODE.FV]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.FV,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n includeCodigoInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.NE]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.NE,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n extraDataParams: { tipo: 1 },\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.NORMAL]: {\n codigo: 'OR',\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ELECTRONIC_DOCUMENT_CODE.NC]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.NC,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.ND]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.ND,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.GR]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.GR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n\n // Reportes de ventas\n [SALE_CODE_REPORT.SRR]: {\n codigo: SALE_CODE_REPORT.SRR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [SALE_CODE_REPORT.SRRC]: {\n codigo: SALE_CODE_REPORT.SRRC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [SALE_CODE_REPORT.FG]: {\n codigo: SALE_CODE_REPORT.FG,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de compras\n [PURCHASE_CODE_REPORT.RCNH]: {\n codigo: PURCHASE_CODE_REPORT.RCNH,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [PURCHASE_CODE_REPORT.RLC]: {\n codigo: PURCHASE_CODE_REPORT.RLC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de contabilidad\n [ACCOUNTING_CODE_REPORT.RCEGR]: {\n codigo: ACCOUNTING_CODE_REPORT.RCEGR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.ACEDFP]: {\n codigo: ACCOUNTING_CODE_REPORT.ACEDFP,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.ACELC]: {\n codigo: ACCOUNTING_CODE_REPORT.ACELC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de clientes\n [CUSTOMER_CODE_REPORT.RCL]: {\n codigo: CUSTOMER_CODE_REPORT.RCL,\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de inventario\n [INVENTORY_CODE_REPORT.RK]: {\n codigo: INVENTORY_CODE_REPORT.RK,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [INVENTORY_CODE_REPORT.CDAA]: {\n codigo: INVENTORY_CODE_REPORT.CDAA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.CDA]: {\n codigo: INVENTORY_CODE_REPORT.CDA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.STOCK_VALORACION]: {\n codigo: INVENTORY_CODE_REPORT.STOCK_VALORACION,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.ARTICULO_PVP]: {\n codigo: INVENTORY_CODE_REPORT.ARTICULO_PVP,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RAF]: {\n codigo: INVENTORY_CODE_REPORT.RAF,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RCAA]: {\n codigo: INVENTORY_CODE_REPORT.RCAA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RASR]: {\n codigo: INVENTORY_CODE_REPORT.RASR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RCD]: {\n codigo: INVENTORY_CODE_REPORT.RCD,\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [INVENTORY_CODE_REPORT.RTB]: {\n codigo: INVENTORY_CODE_REPORT.RTB,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n };\n\n /**\n * Construye los parámetros de reporte según el tipo de documento\n *\n * @param docData - Datos del documento con codDoc y 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 * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123, codEstab: '001' },\n * 'pdf'\n * );\n * // Resultado:\n * // {\n * // hasService: true,\n * // reportParams: \"{\\\"codigo\\\":\\\"FV\\\",\\\"format\\\":\\\"pdf\\\",\\\"hasParams\\\":true,...}\",\n * // dataParams: \"{\\\"id\\\":123,\\\"codEstab\\\":\\\"001\\\",\\\"codigo\\\":\\\"FV\\\"}\"\n * // }\n * ```\n */\n static buildParams(\n docData: ReportDocumentData,\n format: 'pdf' | 'excel' | 'word' = 'pdf',\n ): ReportParams {\n const config = this.getReportConfig(docData.codDoc);\n\n return {\n hasService: config.hasService,\n reportParams: this.buildReportParams(docData, config, format),\n dataParams: this.buildDataParams(docData, config),\n };\n }\n\n /**\n * Determina si debe usar la API v1 según el tipo de documento\n *\n * @param codDoc - Código del documento (FV, NE, NC, etc.)\n * @returns true si debe usar API v1, false para API v2\n *\n * @example\n * ```typescript\n * const useV1 = ReportParamsBuilder.shouldUseV1Api(ELECTRONIC_DOCUMENT_CODE.FV);\n * // useV1 = true (documentos electrónicos usan v1)\n *\n * const useV1Sales = ReportParamsBuilder.shouldUseV1Api(SALE_CODE_REPORT.FG);\n * // useV1Sales = false (reportes de ventas usan v2)\n * ```\n */\n static shouldUseV1Api(codDoc: string): boolean {\n const config = this.getReportConfig(codDoc);\n return config.useV1Api;\n }\n\n /**\n * Obtiene la configuración para un tipo de documento\n *\n * @param codDoc - Código del documento\n * @returns Configuración del reporte\n * @throws Error si el tipo de documento no está soportado\n * @private\n */\n private static getReportConfig(codDoc: string): ReportConfig {\n const config = this.reportConfigs[codDoc];\n if (!config) {\n throw new Error(\n `Tipo de documento no soportado: ${codDoc}. Tipos disponibles: ${Object.keys(this.reportConfigs).join(', ')}`,\n );\n }\n return config;\n }\n\n /**\n * Construye los parámetros del reporte (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 codDoc, 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: 'FG', tipo: 2, codEstab: '001', fechaInicio: '2024-01-01' }\n * config = { idField: 'id', includeEstabInData: false, ... }\n *\n * // Output:\n * \"{\\\"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\n Object.keys(docData).forEach((key) => {\n if (!['codDoc', 'codEstab', 'id', 'serie'].includes(key) && docData[key] !== undefined) {\n params[key] = docData[key];\n }\n });\n\n return JSON.stringify(params);\n }\n\n /**\n * Construye las opciones completas para generar un reporte\n *\n * @param docData - Datos del documento con codDoc y parámetros adicionales\n * @param format - Formato del reporte: 'pdf' | 'excel' | 'word'\n * @returns Objeto con data (para enviar al backend), format y useV1Api\n *\n * @example\n * ```typescript\n * const options = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123, codEstab: '001' },\n * 'pdf'\n * );\n * // Resultado:\n * // {\n * // data: { hasService: true, reportParams: \"{...}\", dataParams: \"{...}\" },\n * // format: 'pdf',\n * // useV1Api: true\n * // }\n *\n * // Usar con facade\n * this.reportFacade.generate(options).subscribe();\n * ```\n */\n static build(docData: ReportDocumentData, format: 'pdf' | 'excel' | 'word' = 'pdf') {\n return {\n data: this.buildParams(docData, format),\n format,\n useV1Api: this.shouldUseV1Api(docData.codDoc),\n };\n }\n\n /**\n * Obtiene la lista de tipos de documento soportados\n *\n * @returns Array con todos los códigos de documento soportados\n *\n * @example\n * ```typescript\n * const types = ReportParamsBuilder.getSupportedDocumentTypes();\n * // ['FV', 'NE', 'NC', 'ND', 'GR', 'SRR', 'SRRC', 'FG', ...]\n * ```\n */\n static getSupportedDocumentTypes(): string[] {\n return Object.keys(this.reportConfigs);\n }\n\n /**\n * Verifica si un tipo de documento está soportado\n *\n * @param codDoc - Código del documento a verificar\n * @returns true si el documento está soportado, false en caso contrario\n *\n * @example\n * ```typescript\n * if (ReportParamsBuilder.isDocumentTypeSupported('FV')) {\n * // Generar reporte\n * } else {\n * console.error('Tipo de documento no soportado');\n * }\n * ```\n */\n static isDocumentTypeSupported(codDoc: string): boolean {\n return codDoc in this.reportConfigs;\n }\n\n /**\n * Registra un nuevo tipo de reporte dinámicamente\n *\n * Permite agregar soporte para nuevos tipos de reportes en runtime\n * sin modificar el código fuente de la librería.\n *\n * @param codDoc - Código único del documento\n * @param config - Configuración completa del reporte\n *\n * @example\n * ```typescript\n * // Agregar un nuevo tipo de reporte personalizado\n * ReportParamsBuilder.registerReportType('CUSTOM_REPORT', {\n * codigo: 'CUSTOM_REPORT',\n * hasService: true,\n * useV1Api: false,\n * idField: 'id',\n * hasParams: true,\n * extraDataParams: { customField: 'value' }\n * });\n *\n * // Ahora se puede usar\n * const options = ReportParamsBuilder.build(\n * { codDoc: 'CUSTOM_REPORT', id: 123 },\n * 'pdf'\n * );\n * ```\n */\n static registerReportType(codDoc: string, config: ReportConfig): void {\n this.reportConfigs[codDoc] = config;\n }\n}\n","import { Component, OnInit, inject, Input, signal } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { Observable } from 'rxjs';\nimport { WhatsAppMessagingFacade } from '../../facades/whatsapp.facade';\nimport { ReportFacade } from '../../facades/report.facade';\nimport { ReportParamsBuilder } from '../../builders/report-params.builder';\nimport { PhoneFormatterUtil } from '../../utils/phone-formatter.util';\nimport { FileMapperUtil } from '../../utils/file-mapper.util';\n\nexport interface DocumentData {\n idDocumentoElectronico?: number;\n documentoId?: number;\n codDoc: string;\n docType?: string;\n codEstab?: string;\n id?: number;\n serie?: string;\n}\n\nexport interface WhatsAppSendConfig {\n documentData?: DocumentData;\n phoneNumbers?: string[];\n defaultMessage?: string;\n establishmentPhone?: string;\n establishmentName?: string;\n customerName?: string;\n}\n\n@Component({\n selector: 'acp-whatsapp-sender',\n templateUrl: './whatsapp-sender.html',\n styleUrls: ['./whatsapp-sender.scss'],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCardModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatSelectModule,\n ],\n})\nexport class WhatsAppSender implements OnInit {\n @Input() config?: WhatsAppSendConfig;\n\n private readonly fb = inject(FormBuilder);\n private readonly whatsappFacade = inject(WhatsAppMessagingFacade);\n private readonly reportFacade = inject(ReportFacade);\n private readonly snackBar = inject(MatSnackBar);\n\n whatsappForm!: FormGroup;\n isLoading = signal(false);\n messageLength = 0;\n phoneNumbers = signal<string[]>([]);\n showWhatsAppWebLink = signal(false);\n whatsAppWebUrl = signal('');\n\n // Datos del documento y establecimiento\n establishmentPhone = '';\n establishmentName = '';\n customerName = '';\n\n ngOnInit(): void {\n this.initializeForm();\n this.setupMessageLengthCounter();\n this.loadConfigData();\n }\n\n private loadConfigData(): void {\n if (this.config) {\n if (this.config.phoneNumbers) {\n this.phoneNumbers.set(this.config.phoneNumbers);\n if (this.config.phoneNumbers.length > 0) {\n this.whatsappForm.patchValue({ phoneNumber: this.config.phoneNumbers[0] });\n }\n }\n\n if (this.config.defaultMessage) {\n this.whatsappForm.patchValue({ message: this.config.defaultMessage });\n }\n\n this.establishmentPhone = this.config.establishmentPhone || '';\n this.establishmentName = this.config.establishmentName || '';\n this.customerName = this.config.customerName || '';\n }\n }\n\n private initializeForm(): void {\n this.whatsappForm = this.fb.group({\n phoneNumber: ['', [Validators.required, this.ecuadorianPhoneValidator.bind(this)]],\n message: ['', [Validators.required, Validators.maxLength(500)]],\n });\n }\n\n // Validador personalizado para números ecuatorianos\n private ecuadorianPhoneValidator(control: any) {\n if (!control.value) return null;\n\n const validation = PhoneFormatterUtil.validateEcuadorianPhone(control.value);\n\n return validation.isValid ? null : { invalidPhone: true };\n }\n\n private setupMessageLengthCounter(): void {\n this.whatsappForm.get('message')?.valueChanges.subscribe((value) => {\n this.messageLength = value ? value.length : 0;\n });\n }\n\n sendWhatsApp(): void {\n if (this.whatsappForm.valid) {\n if (!this.validatePhoneNumber()) return;\n\n const { phoneNumber, message } = this.whatsappForm.value;\n\n // Si hay configuración de documento, generar y enviar archivo\n if (this.config?.documentData) {\n this.sendWithDocument(phoneNumber, message);\n } else {\n // Envío simple de texto\n this.sendSimpleMessage(phoneNumber, message);\n }\n }\n }\n\n private validatePhoneNumber(): boolean {\n const phoneNumber = this.whatsappForm.get('phoneNumber')?.value;\n const validation = PhoneFormatterUtil.validateEcuadorianPhone(phoneNumber);\n\n if (!validation.isValid) {\n this.showError(validation.errorMessage || 'Número de teléfono inválido');\n return false;\n }\n\n return true;\n }\n\n private sendSimpleMessage(phoneNumber: string, message: string): void {\n this.isLoading.set(true);\n\n this.whatsappFacade.sendSimpleText(phoneNumber, message).subscribe({\n next: (response) => {\n this.isLoading.set(false);\n if (response.success) {\n this.showSuccess('Mensaje enviado exitosamente');\n this.clearForm();\n } else {\n this.showError(response.error?.message || 'Error al enviar mensaje');\n this.prepareWhatsAppWebLink(phoneNumber, message);\n }\n },\n error: (_error) => {\n this.isLoading.set(false);\n this.showError('Error de conexión');\n this.prepareWhatsAppWebLink(phoneNumber, message);\n },\n });\n }\n\n private sendWithDocument(phoneNumber: string, message: string): void {\n if (!this.config?.documentData) return;\n\n this.isLoading.set(true);\n\n // Generar el reporte primero\n this.generateReport().subscribe({\n next: (reportResponse) => {\n if (reportResponse) {\n const { file, fileName } = this.processReportFile(reportResponse);\n this.sendMediaWithMessages(phoneNumber, message, file, fileName);\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error generando reporte:', error);\n this.showError('Error al generar el documento');\n },\n });\n }\n\n private generateReport(): Observable<any> {\n const docData = this.config!.documentData!;\n\n // Construir opciones de reporte\n const reportOptions = ReportParamsBuilder.build(docData, 'pdf');\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 * SALE REPORT RENTABILIDAD\n */\n SRR = 'SRR',\n\n /**\n * SALE REPORT RENTABILIDAD CUSTOM\n */\n SRRC = 'SRRC',\n\n /**\n * SALE REPORT INVOICE GENERAL\n */\n FG = 'FG',\n}\n\n/**\n * Códigos de reportes de compras\n */\nexport enum PURCHASE_CODE_REPORT {\n /**\n * REPORTE COMPRAS NOTA HIDDEN\n */\n RCNH = 'RCNH',\n\n /**\n * REPORTE LIQUIDACION COMPRA\n */\n RLC = 'RLC',\n}\n\n/**\n * Códigos de reportes de contabilidad\n */\nexport enum ACCOUNTING_CODE_REPORT {\n /**\n * REPORTE CONTABLE ESTADO GENERAL RESULTADO\n */\n RCEGR = 'RCEGR',\n\n /**\n * ASIENTO CONTABLE ESTADO DE FLUJO DE PAGO\n */\n ACEDFP = 'ACEDFP',\n\n /**\n * ASIENTO CONTABLE ESTADO LIBRO CAJA\n */\n ACELC = 'ACELC',\n}\n\n/**\n * Códigos de reportes de clientes\n */\nexport enum CUSTOMER_CODE_REPORT {\n /**\n * REPORTE CLIENTE LISTADO\n */\n RCL = 'RCL',\n}\n\n/**\n * Códigos de reportes de inventario\n */\nexport enum INVENTORY_CODE_REPORT {\n /**\n * REPORTE KARDEX\n */\n RK = 'RK',\n\n /**\n * CONSOLIDADO DE ARTICULOS AGRUPADO\n */\n CDAA = 'CDAA',\n\n /**\n * CONSOLIDADO DE ARTICULOS\n */\n CDA = 'CDA',\n\n /**\n * INVENTARIO REPORTE VALORACION\n */\n STOCK_VALORACION = 'INVRV',\n\n /**\n * INVENTARIO ARTICULO TABLA\n */\n ARTICULO_PVP = 'INVAT',\n\n /**\n * REPORTE DE ARTICULOS FRACCIONADOS\n */\n RAF = 'RAF',\n\n /**\n * REPORTE DE CADUCIDAD DE ARTICULOS\n */\n RCAA = 'RCAA',\n\n /**\n * REPORTE DE ARTICULO STOCK VALORACION\n */\n RASR = 'RASR',\n\n /**\n * REPORTE CONSOLIDACION DETALLE\n */\n RCD = 'RCD',\n\n /**\n * REPORTE TRANSFERENCIA BODEGA\n */\n RTB = 'RTB',\n}\n\n/**\n * Códigos de documentos electrónicos\n */\nexport enum ELECTRONIC_DOCUMENT_CODE {\n /**\n * FACTURA\n */\n FV = 'FV',\n\n /**\n * NOTA DE ENTREGA\n */\n NE = 'NE',\n\n /**\n * NOTA DE CREDITO\n */\n NC = 'NC',\n\n /**\n * NOTA DE DEBITO\n */\n ND = 'ND',\n\n /**\n * GUIA DE REMISION\n */\n GR = 'GR',\n\n /**\n * ORDEN DE PEDIDO\n */\n NORMAL = 'NORMAL',\n}\n\n/**\n * Formatos de reporte disponibles\n */\nexport enum REPORT_FORMAT {\n PDF = 'pdf',\n EXCEL = 'excel',\n WORD = 'word',\n}\n","export const API_PATHS = {\n WHATSAPP: 'common/whatsapp-cloud',\n REPORTS: 'reports',\n CONFIG: 'config',\n} as const;\n\nexport const DOCUMENT_TYPES = {\n NORMAL: 'NORMAL',\n FACTURA: 'FACTURA',\n NOTA_ENTREGA: 'NOTA_ENTREGA',\n} as const;\n","import { InjectionToken } from '@angular/core';\nimport { ReportPort } from '../contracts/report.port';\n\nexport const REPORT_PORT = new InjectionToken<ReportPort>('REPORT_PORT');\n","import { InjectionToken } from '@angular/core';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\n\nexport const WHATSAPP_MESSAGING_PORT = new InjectionToken<WhatsAppMessagingPort>(\n 'WHATSAPP_MESSAGING_PORT',\n);\n","import { InjectionToken } from '@angular/core';\nimport { PrinterPort } from '../contracts/printer.port';\n\nexport const PRINTER_PORT = new InjectionToken<PrinterPort>('PRINTER_PORT');\n","/**\n * Utilidades para manejo de archivos y respuestas HTTP\n */\nexport class FileMapperUtil {\n /**\n * Extrae el nombre de archivo desde el header Content-Disposition\n */\n static extractFileName(response: any): string {\n const contentDisposition = response.headers?.get('content-disposition');\n\n if (!contentDisposition) {\n return this.generateDefaultFileName();\n }\n\n // Método más robusto para extraer filename\n const matches = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/.exec(contentDisposition);\n\n if (matches && matches[1]) {\n let fileName = matches[1].replace(/['\"]/g, '');\n // Limpiar caracteres especiales\n fileName = fileName.replaceAll('+', ' ').trim();\n return fileName || this.generateDefaultFileName();\n }\n\n // Fallback: método simple\n const simpleParse = contentDisposition.split('filename=')[1];\n if (simpleParse) {\n return simpleParse.replace(/['\"]/g, '').trim() || this.generateDefaultFileName();\n }\n\n return this.generateDefaultFileName();\n }\n\n /**\n * Crea un objeto File desde una respuesta HTTP\n */\n static fromResponse(response: any): File {\n const fileName = this.extractFileName(response);\n const contentType = response.headers?.get('content-type') || 'application/octet-stream';\n\n return new File([response.body], fileName, { type: contentType });\n }\n\n /**\n * Descarga un archivo usando la API nativa del navegador\n */\n static downloadFile(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Limpiar el objeto URL\n URL.revokeObjectURL(url);\n }\n\n /**\n * Abre un archivo en una nueva ventana (para PDFs)\n */\n static openFile(blob: Blob, fileName: string): void {\n const fileURL = URL.createObjectURL(blob);\n window.open(fileURL, fileName);\n\n // Limpiar URL después de un tiempo\n setTimeout(() => URL.revokeObjectURL(fileURL), 1000);\n }\n\n /**\n * Detecta si es un navegador legacy que requiere descarga forzada\n */\n static isLegacyBrowser(): boolean {\n const userAgent = navigator.userAgent;\n return !!(userAgent.match(/Edge/g) || userAgent.match(/.NET/g) || userAgent.match(/MSIE/g));\n }\n\n private static generateDefaultFileName(): string {\n const timestamp = Date.now();\n return `document_${timestamp}.pdf`;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\nimport { Observable, tap } from 'rxjs';\nimport { REPORT_PORT } from '../tokens/report.token';\nimport { ReportOptions } from '../contracts/report.port';\nimport { FileMapperUtil } from '../utils/file-mapper.util';\n\n/**\n * Facade para generación de reportes\n *\n * Proporciona una API de alto nivel para generar reportes con manejo automático de archivos.\n * Todos los métodos devuelven Observables - el consumidor debe hacer subscribe().\n *\n * @example\n * ```typescript\n * // Control total del blob\n * this.reportFacade.generate(options).subscribe(response => {\n * const blob = response.body;\n * // Procesar blob manualmente\n * });\n *\n * // Descarga automática\n * this.reportFacade.download(options).subscribe();\n *\n * // Abrir PDF automáticamente\n * this.reportFacade.open(options).subscribe();\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportFacade {\n private readonly reportPort = inject(REPORT_PORT);\n\n /**\n * Genera un reporte y devuelve el Observable con el blob\n *\n * Este método proporciona control total sobre el blob generado.\n * No realiza ninguna acción automática (descarga/apertura).\n * Útil cuando necesitas procesar el blob manualmente (enviar por WhatsApp, guardar en servidor, etc.)\n *\n * @template T - Tipo de datos del reporte\n * @param options - Opciones de generación del reporte\n * @param options.data - Datos del reporte (usar ReportParamsBuilder.build())\n * @param options.format - Formato del reporte: 'pdf' | 'excel' | 'word'\n * @param options.useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable con la respuesta HTTP que contiene el blob\n *\n * @example\n * ```typescript\n * const options = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },\n * 'pdf'\n * );\n *\n * this.reportFacade.generate(options).subscribe({\n * next: (response) => {\n * const blob = response.body;\n * const fileName = FileMapperUtil.extractFileName(response);\n * // Procesar blob según necesidad\n * },\n * error: (err) => console.error('Error:', err)\n * });\n * ```\n */\n generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n return this.reportPort.generate(options);\n }\n\n /**\n * Genera un reporte y lo descarga automáticamente\n *\n * Extrae el nombre del archivo desde los headers HTTP y descarga el archivo automáticamente.\n * Funciona para cualquier formato (PDF, Excel, Word).\n * El Observable se completa después de iniciar la descarga.\n *\n * @template T - Tipo de datos del reporte\n * @param options - Opciones de generación del reporte\n * @returns Observable que se completa después de iniciar la descarga\n *\n * @example\n * ```typescript\n * // Con formato dinámico\n * const options = ReportParamsBuilder.build(\n * { codDoc: SALE_CODE_REPORT.FG },\n * this.selectedFormat // 'pdf' | 'excel' | 'word'\n * );\n * this.reportFacade.download(options).subscribe();\n *\n * // Con formato fijo\n * const options = ReportParamsBuilder.build(\n * { codDoc: INVENTORY_CODE_REPORT.RCD },\n * 'excel'\n * );\n * this.reportFacade.download(options).subscribe();\n * ```\n */\n download<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n return this.reportPort.generate(options).pipe(\n tap((response) => {\n const fileName = FileMapperUtil.extractFileName(response);\n if (response.body) {\n FileMapperUtil.downloadFile(response.body, fileName);\n }\n }),\n );\n }\n\n /**\n * Genera un reporte y lo abre en nueva ventana (o descarga en navegadores legacy)\n *\n * Comportamiento inteligente según el navegador:\n * - Navegadores modernos: Abre el archivo en nueva ventana/pestaña\n * - Navegadores legacy (IE, Edge antiguo): Descarga el archivo\n *\n * Ideal para PDFs que el usuario quiere visualizar inmediatamente.\n * También funciona con Excel/Word pero la experiencia puede variar según el navegador.\n *\n * @template T - Tipo de datos del reporte\n * @param options - Opciones de generación del reporte\n * @returns Observable que se completa después de abrir/descargar el archivo\n *\n * @example\n * ```typescript\n * // Abrir PDF\n * const options = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },\n * 'pdf'\n * );\n * this.reportFacade.open(options).subscribe();\n *\n * // Con formato dinámico\n * const format = this.isPDF ? 'pdf' : 'excel';\n * const options = ReportParamsBuilder.build({ codDoc: code }, format);\n * this.reportFacade.open(options).subscribe();\n * ```\n */\n open<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n return this.reportPort.generate(options).pipe(\n tap((response) => {\n const fileName = FileMapperUtil.extractFileName(response);\n if (response.body) {\n if (FileMapperUtil.isLegacyBrowser()) {\n FileMapperUtil.downloadFile(response.body, fileName);\n } else {\n FileMapperUtil.openFile(response.body, fileName);\n }\n }\n }),\n );\n }\n\n /**\n * Genera un PDF y lo abre automáticamente (shortcut)\n *\n * Método de conveniencia para el caso común de generar y abrir PDFs.\n * Equivalente a llamar open() con format: 'pdf'.\n *\n * @template T - Tipo de datos del reporte\n * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)\n * @param useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable que se completa después de abrir el PDF\n *\n * @example\n * ```typescript\n * const reportOptions = ReportParamsBuilder.build(\n * { codDoc: ELECTRONIC_DOCUMENT_CODE.FV, id: 123 },\n * 'pdf'\n * );\n *\n * // Forma corta\n * this.reportFacade.openPDF(\n * reportOptions.data,\n * reportOptions.useV1Api\n * ).subscribe();\n * ```\n */\n openPDF<T>(data: T, useV1Api = false): Observable<HttpResponse<Blob>> {\n return this.open({\n data,\n format: 'pdf',\n useV1Api,\n });\n }\n\n /**\n * Genera un Excel y lo descarga automáticamente (shortcut)\n *\n * Método de conveniencia para el caso común de generar y descargar archivos Excel.\n * Equivalente a llamar download() con format: 'excel'.\n *\n * @template T - Tipo de datos del reporte\n * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)\n * @param useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable que se completa después de iniciar la descarga\n *\n * @example\n * ```typescript\n * const reportOptions = ReportParamsBuilder.build(\n * { codDoc: SALE_CODE_REPORT.FG, fechaInicio: '2024-01-01' },\n * 'excel'\n * );\n *\n * // Forma corta\n * this.reportFacade.downloadExcel(\n * reportOptions.data,\n * reportOptions.useV1Api\n * ).subscribe();\n * ```\n */\n downloadExcel<T>(data: T, useV1Api = false): Observable<HttpResponse<Blob>> {\n return this.download({\n data,\n format: 'excel',\n useV1Api,\n });\n }\n\n /**\n * Genera un Word y lo descarga automáticamente (shortcut)\n *\n * Método de conveniencia para el caso común de generar y descargar archivos Word.\n * Equivalente a llamar download() con format: 'word'.\n *\n * @template T - Tipo de datos del reporte\n * @param data - Datos del reporte (resultado de ReportParamsBuilder.build().data)\n * @param useV1Api - Si debe usar la API v1 (por defecto false)\n * @returns Observable que se completa después de iniciar la descarga\n *\n * @example\n * ```typescript\n * const reportOptions = ReportParamsBuilder.build(\n * { codDoc: CUSTOMER_CODE_REPORT.RCL },\n * 'word'\n * );\n *\n * // Forma corta\n * this.reportFacade.downloadWord(\n * reportOptions.data,\n * reportOptions.useV1Api\n * ).subscribe();\n * ```\n */\n downloadWord<T>(data: T, useV1Api = false): Observable<HttpResponse<Blob>> {\n return this.download({\n data,\n format: 'word',\n useV1Api,\n });\n }\n}\n","export interface DocumentDeliveryData {\n comprador: string;\n establecimiento: string;\n serie: string;\n tipo: string;\n}\n\nexport interface WhatsAppMessages {\n main: string;\n promo: string;\n}\n\n/**\n * Builder para construir mensajes de WhatsApp\n * Clase utilitaria con métodos estáticos\n */\nexport class WhatsAppMessageBuilder {\n static buildDocumentDeliveryMessages(data: DocumentDeliveryData): WhatsAppMessages {\n const main = this.buildMainMessage(data);\n const promo = this.buildPromoMessage(data.establecimiento);\n\n return { main, promo };\n }\n\n static buildWelcomeMessage(customerName: string, establishmentName: string): string {\n return `¡Hola *${customerName}*! 👋\\n\\nBienvenido a *${establishmentName}*. Estamos aquí para ayudarte.`;\n }\n\n static buildOrderConfirmationMessage(orderNumber: string, customerName: string): string {\n return `Estimado(a) *${customerName}*,\\n\\n✅ Tu pedido #${orderNumber} ha sido confirmado.\\n\\nTe notificaremos cuando esté listo.`;\n }\n\n static buildPaymentReminderMessage(\n customerName: string,\n amount: number,\n dueDate: string,\n ): string {\n return `Estimado(a) *${customerName}*,\\n\\n💰 Recordatorio de pago:\\nMonto: ${amount}\\nVencimiento: ${dueDate}\\n\\nGracias por tu preferencia.`;\n }\n\n private static buildMainMessage(data: DocumentDeliveryData): string {\n const documentTypeDisplay = this.getDocumentTypeDisplay(data.tipo);\n\n return (\n `Estimado(a) *${data.comprador}*,\\n\\n` +\n `📄 Su ${documentTypeDisplay} ha sido generado exitosamente.\\n\\n` +\n `🏪 Establecimiento: *${data.establecimiento}*\\n` +\n `📋 Serie: ${data.serie}\\n\\n` +\n `Adjunto encontrará el documento solicitado.`\n );\n }\n\n private static buildPromoMessage(establishmentName: string): string {\n return (\n `📱 Documento enviado por *${establishmentName}*\\n` +\n `Powered by *Acontplus* 🚀\\n\\n` +\n `¿Necesita ayuda? Contáctenos.`\n );\n }\n\n private static getDocumentTypeDisplay(tipo: string): string {\n const types: Record<string, string> = {\n FACTURA: 'factura electrónica',\n NOTA_ENTREGA: 'nota de entrega',\n PROFORMA: 'proforma',\n COTIZACION: 'cotización',\n RECIBO: 'recibo',\n };\n\n return types[tipo] || 'documento';\n }\n}\n","export interface PhoneValidationResult {\n isValid: boolean;\n cleanPhone: string;\n errorMessage?: string;\n}\n\n/**\n * Utilidades para formateo y validación de números telefónicos\n */\nexport class PhoneFormatterUtil {\n /**\n * Limpia el teléfono removiendo todos los caracteres no numéricos\n */\n static cleanPhone(phone: string): string {\n return phone.replace(/\\D/g, '');\n }\n\n /**\n * Valida si un teléfono ecuatoriano es válido\n */\n static validateEcuadorianPhone(phone: string): PhoneValidationResult {\n const cleanPhone = this.cleanPhone(phone);\n\n if (!cleanPhone) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede estar vacío',\n };\n }\n\n if (cleanPhone.length < 10) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede ser menor a diez dígitos',\n };\n }\n\n if (cleanPhone.length > 10) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'El número de celular no puede ser mayor a diez dígitos',\n };\n }\n\n // Validar formato ecuatoriano (09xxxxxxxx) o internacional (593xxxxxxxxx)\n const isValidEcuadorian = /^09\\d{8}$/.test(cleanPhone);\n const isValidInternational = /^593\\d{9}$/.test(cleanPhone);\n\n if (!isValidEcuadorian && !isValidInternational) {\n return {\n isValid: false,\n cleanPhone,\n errorMessage: 'Formato inválido. Use: 09xxxxxxxx',\n };\n }\n\n return {\n isValid: true,\n cleanPhone,\n };\n }\n\n /**\n * Convierte número local ecuatoriano a formato internacional\n */\n static toInternationalFormat(phone: string): string {\n let cleanPhone = this.cleanPhone(phone);\n\n // Si empieza con 0, convertir a formato internacional ecuatoriano\n if (cleanPhone.startsWith('0')) {\n cleanPhone = '593' + cleanPhone.slice(1);\n }\n\n return cleanPhone;\n }\n\n /**\n * Formatea teléfono para la API de WhatsApp Business (con @c.us)\n */\n static formatForWhatsAppApi(phone: string): string {\n const internationalPhone = this.toInternationalFormat(phone);\n\n if (!internationalPhone.endsWith('@c.us')) {\n return `${internationalPhone}@c.us`;\n }\n\n return internationalPhone;\n }\n\n /**\n * Formatea teléfono para WhatsApp Web (sin @c.us)\n */\n static formatForWhatsAppWeb(phone: string): string {\n return this.toInternationalFormat(phone);\n }\n\n /**\n * Formatea teléfono para mostrar al usuario (con espacios y +)\n */\n static formatForDisplay(phone: string): string {\n const cleanPhone = this.cleanPhone(phone);\n\n if (!cleanPhone) return '';\n\n // Si es número local ecuatoriano (09xxxxxxxx)\n if (/^09\\d{8}$/.test(cleanPhone)) {\n return `+593 ${cleanPhone.slice(1, 3)} ${cleanPhone.slice(3, 6)} ${cleanPhone.slice(6)}`;\n }\n\n // Si ya tiene formato internacional (593xxxxxxxxx)\n if (/^593\\d{9}$/.test(cleanPhone)) {\n return `+593 ${cleanPhone.slice(3, 5)} ${cleanPhone.slice(5, 8)} ${cleanPhone.slice(8)}`;\n }\n\n // Para otros formatos internacionales\n if (cleanPhone.length > 10) {\n return `+${cleanPhone}`;\n }\n\n return phone;\n }\n\n /**\n * Validación general para teléfonos internacionales\n */\n static isValidInternationalPhone(phone: string): boolean {\n const cleanPhone = this.cleanPhone(phone);\n return /^\\+?[1-9]\\d{1,14}$/.test(cleanPhone);\n }\n\n /**\n * Genera el hint apropiado según el estado del teléfono\n */\n static getPhoneHint(phone: string): string {\n if (!phone) {\n return 'Ingrese número ecuatoriano (09xxxxxxxx)';\n }\n\n const validation = this.validateEcuadorianPhone(phone);\n\n if (validation.isValid) {\n return `Se enviará a: ${this.formatForDisplay(phone)}`;\n }\n\n return 'Formato: 09xxxxxxxx';\n }\n\n /**\n * Obtiene el placeholder para el campo de teléfono\n */\n static getPhonePlaceholder(): string {\n return 'Ej: 0987654321';\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WHATSAPP_MESSAGING_PORT } from '../tokens/whatsapp.token';\nimport { WhatsAppResponse, DocumentDeliveryParams } from '../models/whatsapp.model';\nimport { WhatsAppMessageBuilder } from '../builders/whatsapp-message.builder';\nimport { PhoneFormatterUtil } from '../utils/phone-formatter.util';\n\n@Injectable({ providedIn: 'root' })\nexport class WhatsAppMessagingFacade {\n private readonly messagingPort = inject(WHATSAPP_MESSAGING_PORT);\n\n // Métodos de alto nivel con lógica de negocio\n sendSimpleText(to: string, message: string, previewUrl = true): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendText({\n to: formattedPhone,\n message,\n previewUrl,\n });\n }\n\n sendTemplateText(\n to: string,\n templateName: string,\n params?: string[],\n languageCode = 'es_EC',\n ): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendTextTemplate({\n to: formattedPhone,\n templateName,\n languageCode,\n bodyParams: params,\n });\n }\n\n sendDocument(\n to: string,\n documentUrl: string,\n caption?: string,\n filename?: string,\n ): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(to);\n return this.messagingPort.sendDocument({\n to: formattedPhone,\n documentUrl,\n caption,\n filename,\n });\n }\n\n // Caso de uso específico: Entrega de documentos\n deliverDocument(params: DocumentDeliveryParams): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(params.phone);\n const messages = WhatsAppMessageBuilder.buildDocumentDeliveryMessages({\n comprador: params.customerName,\n establecimiento: params.establishmentName,\n serie: params.documentSeries,\n tipo: params.documentType,\n });\n\n return this.messagingPort.sendDocumentTemplate({\n to: formattedPhone,\n file: params.file,\n templateName: 'notificacion_documento',\n languageCode: 'es_EC',\n bodyParams: [messages.main, messages.promo],\n });\n }\n\n // Método mejorado para envío de documentos con template\n sendDocumentWithTemplate(params: {\n phone: string;\n file: File;\n templateName: string;\n bodyParams?: string[];\n languageCode?: string;\n filename?: string;\n }): Observable<WhatsAppResponse> {\n const formattedPhone = PhoneFormatterUtil.formatForWhatsAppApi(params.phone);\n\n return this.messagingPort.sendDocumentTemplate({\n to: formattedPhone,\n file: params.file,\n templateName: params.templateName,\n languageCode: params.languageCode || 'es_EC',\n bodyParams: params.bodyParams,\n filename: params.filename,\n });\n }\n\n // Método legacy para compatibilidad (pero mejorado)\n sendDocumentWithMessages(params: {\n phone: string;\n file: File;\n messages: { main: string; promo: string };\n }): Observable<WhatsAppResponse> {\n return this.sendDocumentWithTemplate({\n phone: params.phone,\n file: params.file,\n templateName: 'documento_generico',\n bodyParams: [params.messages.main, params.messages.promo],\n });\n }\n\n getProviderStatus(): Observable<any> {\n return this.messagingPort.getStatus();\n }\n\n // Métodos públicos que delegan a las utilidades estáticas\n isValidPhone(phone: string): boolean {\n return PhoneFormatterUtil.isValidInternationalPhone(phone);\n }\n\n toDisplayFormat(phone: string): string {\n return PhoneFormatterUtil.formatForDisplay(phone);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { PRINTER_PORT } from '../tokens/printer.token';\nimport { PrintParams } from '../contracts/printer.port';\n\n@Injectable({ providedIn: 'root' })\nexport class PrinterFacade {\n private readonly printerPort = inject(PRINTER_PORT);\n\n // Métodos de impresión\n askToPrint(params: PrintParams): void {\n this.printerPort.askToPrint(params);\n }\n\n printOrder(id: number): void {\n this.printerPort.createPrintOrder(id);\n }\n\n printCommanda(id: number): void {\n this.printerPort.createPrintCommanda(id);\n }\n\n printOrderWithCommanda(id: number): void {\n this.printerPort.createPrintOrderWithCommanda(id);\n }\n\n printInvoice(id: number, documentoId: number): void {\n this.printerPort.createInvoicePrint(id, documentoId);\n }\n\n printNotaEntrega(id: number, documentoId: number): void {\n this.printerPort.createNotaEntregaPrint(id, documentoId);\n }\n\n // Método para configurar automáticamente la impresión\n autoPrint(\n data: { printerAutomatic: boolean; orderId: number; idDocumento: number },\n codDoc: string,\n ): void {\n if (data.printerAutomatic) {\n if (codDoc === 'FACTURA') {\n this.printInvoice(data.orderId, data.idDocumento);\n }\n if (codDoc === 'NOTA_ENTREGA') {\n this.printNotaEntrega(data.orderId, data.idDocumento);\n }\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\nimport {\n WhatsAppTextRequest,\n WhatsAppTextTemplateRequest,\n WhatsAppDocumentRequest,\n WhatsAppDocumentTemplateRequest,\n WhatsAppResponse,\n WhatsAppStatusResponse,\n} from '../models/whatsapp.model';\nimport { API_PATHS } from '../constants/api-paths';\n\n@Injectable()\nexport class MetaWhatsAppAdapter implements WhatsAppMessagingPort {\n private readonly http = inject(HttpClient);\n\n // 1. Texto directo (requiere ventana 24h)\n sendText(request: WhatsAppTextRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/text`, request);\n }\n\n // 2. Texto con template (funciona siempre)\n sendTextTemplate(request: WhatsAppTextTemplateRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/text-template`, request);\n }\n\n // 3. Documento directo via URL (requiere ventana 24h)\n sendDocument(request: WhatsAppDocumentRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/document`, request);\n }\n\n // 4. Documento con template (funciona siempre)\n sendDocumentTemplate(request: WhatsAppDocumentTemplateRequest): Observable<WhatsAppResponse> {\n const formData = new FormData();\n\n // Usar nombres de campos que espera tu API (con mayúsculas)\n formData.append('To', request.to);\n formData.append('File', request.file);\n\n if (request.templateName) formData.append('TemplateName', request.templateName);\n if (request.languageCode) formData.append('LanguageCode', request.languageCode);\n if (request.filename) formData.append('Filename', request.filename);\n\n // Enviar bodyParams como array (formato que espera tu API)\n if (request.bodyParams && request.bodyParams.length > 0) {\n request.bodyParams.forEach((param, index) => {\n formData.append(`BodyParams[${index}]`, param);\n });\n }\n\n return this.http.post<WhatsAppResponse>(`${API_PATHS.WHATSAPP}/document-template`, formData);\n }\n\n getStatus(): Observable<WhatsAppStatusResponse> {\n return this.http.get<WhatsAppStatusResponse>(`${API_PATHS.WHATSAPP}/status`);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { WhatsAppMessagingPort } from '../contracts/whatsapp.port';\nimport {\n WhatsAppTextRequest,\n WhatsAppTextTemplateRequest,\n WhatsAppDocumentRequest,\n WhatsAppDocumentTemplateRequest,\n WhatsAppResponse,\n WhatsAppStatusResponse,\n} from '../models/whatsapp.model';\n\n/**\n * Adaptador para Green API (legacy)\n * Implementa la interfaz WhatsApp usando Green API\n */\n@Injectable()\nexport class GreenWhatsAppAdapter implements WhatsAppMessagingPort {\n private readonly http = inject(HttpClient);\n\n // Implementación para Green API - mapea los métodos de WhatsApp a Green\n sendText(request: WhatsAppTextRequest): Observable<WhatsAppResponse> {\n // Mapear a Green API call\n return this.http.post<WhatsAppResponse>('/api/green/send-text', {\n chatId: request.to,\n message: request.message,\n });\n }\n\n sendTextTemplate(request: WhatsAppTextTemplateRequest): Observable<WhatsAppResponse> {\n // Green API no soporta templates, enviar como texto simple\n return this.http.post<WhatsAppResponse>('/api/green/send-text', {\n chatId: request.to,\n message: `Template: ${request.templateName}`,\n });\n }\n\n sendDocument(request: WhatsAppDocumentRequest): Observable<WhatsAppResponse> {\n return this.http.post<WhatsAppResponse>('/api/green/send-file', {\n chatId: request.to,\n fileUrl: request.documentUrl,\n caption: request.caption,\n });\n }\n\n sendDocumentTemplate(request: WhatsAppDocumentTemplateRequest): Observable<WhatsAppResponse> {\n // Green API - enviar archivo con template como caption\n const formData = new FormData();\n formData.append('chatId', request.to);\n formData.append('file', request.file);\n formData.append('caption', `Template: ${request.templateName}`);\n\n return this.http.post<WhatsAppResponse>('/api/green/send-file-upload', formData);\n }\n\n getStatus(): Observable<WhatsAppStatusResponse> {\n return this.http.get<WhatsAppStatusResponse>('/api/green/status');\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ReportPort, ReportOptions } from '../contracts/report.port';\nimport { API_PATHS } from '../constants/api-paths';\n\n/**\n * Adapter para generación de reportes\n * Siempre devuelve Observable - el consumidor decide qué hacer con el blob\n */\n@Injectable()\nexport class ReportAdapter implements ReportPort {\n private readonly http = inject(HttpClient);\n\n generate<T>(options: ReportOptions<T>): Observable<HttpResponse<Blob>> {\n const { data, useV1Api = false } = options;\n\n const reportVersionPath = useV1Api ? '/reporte/download' : '/v2/reporte/download';\n const fullPath = `${API_PATHS.REPORTS}${reportVersionPath}`;\n\n return this.http.post<Blob>(fullPath, data, {\n observe: 'response',\n responseType: 'blob' as 'json',\n });\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { PrinterPort, PrintParams, ApiResponse } from '../contracts/printer.port';\nimport { API_PATHS, DOCUMENT_TYPES } from '../constants/api-paths';\n\n@Injectable()\nexport class PrinterAdapter implements PrinterPort {\n private readonly http = inject(HttpClient);\n\n askToPrint(obj: PrintParams): void {\n if (typeof window !== 'undefined') {\n const confirmed = window.confirm('¿Desea Imprimir este comprobante?');\n if (confirmed) {\n this.getPrintConfig(obj).subscribe();\n }\n }\n }\n\n getPrintConfig(obj: PrintParams): Observable<ApiResponse> {\n const json = JSON.stringify({\n codDoc: obj.codDoc,\n getUrlPrintServer: true,\n id: obj.id,\n codEstab: obj.codEstab,\n });\n\n return new Observable((observer) => {\n const url = `${API_PATHS.CONFIG}Print/?json=${json}`;\n this.http.get<ApiResponse>(url).subscribe({\n next: (response) => {\n if (response.code === '0') {\n console.warn(response.message);\n }\n if (response.code === '1') {\n this.print(response.payload as string, obj).subscribe();\n }\n observer.next(response);\n observer.complete();\n },\n error: (err) => {\n console.error(err);\n observer.error(err);\n },\n });\n });\n }\n\n print(urlPrinter: string, paramsToPrint: PrintParams): Observable<ApiResponse> {\n return new Observable((observer) => {\n this.http.post<ApiResponse>(`${urlPrinter}/Print`, paramsToPrint).subscribe({\n next: (response) => {\n console.log({\n type: response.code === '1' ? 'success' : 'warning',\n message: response.message,\n });\n observer.next(response);\n observer.complete();\n },\n error: (err) => {\n console.error(err);\n observer.error(err);\n },\n });\n });\n }\n\n createPrintOrder(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 5,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createPrintCommanda(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 6,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createPrintOrderWithCommanda(id: number): void {\n this.getPrintConfig({\n id,\n documentoId: 0,\n tipo: 2,\n codDoc: DOCUMENT_TYPES.NORMAL,\n }).subscribe();\n }\n\n createInvoicePrint(id: number, documentoId: number): void {\n this.getPrintConfig({\n id,\n documentoId,\n tipo: 3,\n codDoc: DOCUMENT_TYPES.FACTURA,\n }).subscribe();\n }\n\n createNotaEntregaPrint(id: number, documentoId: number): void {\n this.getPrintConfig({\n id,\n documentoId,\n tipo: 4,\n codDoc: DOCUMENT_TYPES.NOTA_ENTREGA,\n }).subscribe();\n }\n}\n","import {\n SALE_CODE_REPORT,\n PURCHASE_CODE_REPORT,\n ACCOUNTING_CODE_REPORT,\n CUSTOMER_CODE_REPORT,\n INVENTORY_CODE_REPORT,\n ELECTRONIC_DOCUMENT_CODE,\n} from '../constants/report-codes';\n\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\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}\n\ninterface ReportConfig {\n codigo: string;\n hasService: boolean;\n useV1Api: boolean;\n idField: string;\n extraDataParams?: Record<string, any>;\n includeEstabInData?: boolean;\n includeCodigoInData?: boolean;\n hasParams?: boolean;\n}\n\n/**\n * Builder para construir parámetros de reportes\n * Clase utilitaria con métodos estáticos\n */\nexport class ReportParamsBuilder {\n private static readonly reportConfigs: Record<string, ReportConfig> = {\n // Documentos electrónicos\n [ELECTRONIC_DOCUMENT_CODE.FV]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.FV,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n includeCodigoInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.NE]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.NE,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n extraDataParams: { tipo: 1 },\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.NORMAL]: {\n codigo: 'OR',\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ELECTRONIC_DOCUMENT_CODE.NC]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.NC,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.ND]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.ND,\n hasService: true,\n useV1Api: true,\n idField: 'id',\n includeEstabInData: true,\n hasParams: true,\n },\n [ELECTRONIC_DOCUMENT_CODE.GR]: {\n codigo: ELECTRONIC_DOCUMENT_CODE.GR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n\n // Reportes de ventas\n [SALE_CODE_REPORT.SRR]: {\n codigo: SALE_CODE_REPORT.SRR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [SALE_CODE_REPORT.SRRC]: {\n codigo: SALE_CODE_REPORT.SRRC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [SALE_CODE_REPORT.FG]: {\n codigo: SALE_CODE_REPORT.FG,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de compras\n [PURCHASE_CODE_REPORT.RCNH]: {\n codigo: PURCHASE_CODE_REPORT.RCNH,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [PURCHASE_CODE_REPORT.RLC]: {\n codigo: PURCHASE_CODE_REPORT.RLC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de contabilidad\n [ACCOUNTING_CODE_REPORT.RCEGR]: {\n codigo: ACCOUNTING_CODE_REPORT.RCEGR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.ACEDFP]: {\n codigo: ACCOUNTING_CODE_REPORT.ACEDFP,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [ACCOUNTING_CODE_REPORT.ACELC]: {\n codigo: ACCOUNTING_CODE_REPORT.ACELC,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de clientes\n [CUSTOMER_CODE_REPORT.RCL]: {\n codigo: CUSTOMER_CODE_REPORT.RCL,\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n\n // Reportes de inventario\n [INVENTORY_CODE_REPORT.RK]: {\n codigo: INVENTORY_CODE_REPORT.RK,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [INVENTORY_CODE_REPORT.CDAA]: {\n codigo: INVENTORY_CODE_REPORT.CDAA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.CDA]: {\n codigo: INVENTORY_CODE_REPORT.CDA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.STOCK_VALORACION]: {\n codigo: INVENTORY_CODE_REPORT.STOCK_VALORACION,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.ARTICULO_PVP]: {\n codigo: INVENTORY_CODE_REPORT.ARTICULO_PVP,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RAF]: {\n codigo: INVENTORY_CODE_REPORT.RAF,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RCAA]: {\n codigo: INVENTORY_CODE_REPORT.RCAA,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RASR]: {\n codigo: INVENTORY_CODE_REPORT.RASR,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: false,\n },\n [INVENTORY_CODE_REPORT.RCD]: {\n codigo: INVENTORY_CODE_REPORT.RCD,\n hasService: false,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n [INVENTORY_CODE_REPORT.RTB]: {\n codigo: INVENTORY_CODE_REPORT.RTB,\n hasService: true,\n useV1Api: false,\n idField: 'id',\n hasParams: true,\n },\n };\n\n /**\n * Construye los parámetros de reporte según el tipo de documento\n *\n * @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 return {\n hasService: config.hasService,\n reportParams: this.buildReportParams(docData, config, format),\n dataParams: this.buildDataParams(docData, config),\n };\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.
|
|
3
|
+
"version": "1.0.7",
|
|
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",
|
|
@@ -568,13 +568,25 @@ declare class PrinterAdapter implements PrinterPort {
|
|
|
568
568
|
static ɵprov: i0.ɵɵInjectableDeclaration<PrinterAdapter>;
|
|
569
569
|
}
|
|
570
570
|
|
|
571
|
+
/**
|
|
572
|
+
* Tipo union con todos los códigos de reporte soportados
|
|
573
|
+
*/
|
|
574
|
+
type ReportCode = SALE_CODE_REPORT | PURCHASE_CODE_REPORT | ACCOUNTING_CODE_REPORT | CUSTOMER_CODE_REPORT | INVENTORY_CODE_REPORT | ELECTRONIC_DOCUMENT_CODE;
|
|
571
575
|
interface ReportDocumentData {
|
|
572
|
-
codDoc
|
|
576
|
+
codDoc?: string;
|
|
573
577
|
codEstab?: string;
|
|
574
578
|
id?: number;
|
|
575
579
|
serie?: string;
|
|
576
580
|
[key: string]: any;
|
|
577
581
|
}
|
|
582
|
+
/**
|
|
583
|
+
* Opciones para construir un reporte
|
|
584
|
+
*/
|
|
585
|
+
interface BuildReportOptions {
|
|
586
|
+
codeReport: ReportCode | string;
|
|
587
|
+
data: ReportDocumentData;
|
|
588
|
+
format?: 'pdf' | 'excel' | 'word';
|
|
589
|
+
}
|
|
578
590
|
interface ReportParams {
|
|
579
591
|
hasService?: boolean;
|
|
580
592
|
reportParams: string;
|
|
@@ -599,45 +611,55 @@ declare class ReportParamsBuilder {
|
|
|
599
611
|
/**
|
|
600
612
|
* Construye los parámetros de reporte según el tipo de documento
|
|
601
613
|
*
|
|
602
|
-
* @param
|
|
614
|
+
* @param codeReport - Código del reporte (FG, SRR, FV, RCNH, etc.)
|
|
615
|
+
* @param docData - Datos del documento con parámetros adicionales
|
|
603
616
|
* @param format - Formato del reporte: 'pdf' | 'excel' | 'word'
|
|
604
617
|
* @returns Objeto con hasService, reportParams (string JSON) y dataParams (string JSON)
|
|
605
618
|
*
|
|
606
619
|
* @example
|
|
607
620
|
* ```typescript
|
|
608
621
|
* const params = ReportParamsBuilder.buildParams(
|
|
609
|
-
*
|
|
622
|
+
* SALE_CODE_REPORT.FG,
|
|
623
|
+
* { codDoc: '01', tipo: 2, codEstab: '001' },
|
|
610
624
|
* 'pdf'
|
|
611
625
|
* );
|
|
612
626
|
* // Resultado:
|
|
613
627
|
* // {
|
|
614
628
|
* // hasService: true,
|
|
615
|
-
* // reportParams: "{\"codigo\":\"
|
|
616
|
-
* // dataParams: "{\"
|
|
629
|
+
* // reportParams: "{\"codigo\":\"FG\",\"format\":\"pdf\",\"hasParams\":false}",
|
|
630
|
+
* // dataParams: "{\"codDoc\":\"01\",\"tipo\":2,\"codEstab\":\"001\"}"
|
|
617
631
|
* // }
|
|
618
632
|
* ```
|
|
619
633
|
*/
|
|
620
|
-
static buildParams(docData: ReportDocumentData, format?: 'pdf' | 'excel' | 'word'): ReportParams;
|
|
634
|
+
static buildParams(codeReport: ReportCode | string, docData: ReportDocumentData, format?: 'pdf' | 'excel' | 'word'): ReportParams;
|
|
621
635
|
/**
|
|
622
|
-
* Determina si debe usar la API v1 según el
|
|
636
|
+
* Determina si debe usar la API v1 o v2 según el código de reporte
|
|
623
637
|
*
|
|
624
|
-
*
|
|
625
|
-
*
|
|
638
|
+
* Algunos reportes (como documentos electrónicos) usan API v1,
|
|
639
|
+
* mientras que otros (reportes de ventas, inventario) usan API v2.
|
|
640
|
+
*
|
|
641
|
+
* @param codeReport - Código del reporte
|
|
642
|
+
* @returns true para API v1, false para API v2
|
|
626
643
|
*
|
|
627
644
|
* @example
|
|
628
645
|
* ```typescript
|
|
646
|
+
* // Documentos electrónicos usan v1
|
|
629
647
|
* const useV1 = ReportParamsBuilder.shouldUseV1Api(ELECTRONIC_DOCUMENT_CODE.FV);
|
|
630
|
-
*
|
|
648
|
+
* console.log(useV1); // true
|
|
631
649
|
*
|
|
650
|
+
* // Reportes de ventas usan v2
|
|
632
651
|
* const useV1Sales = ReportParamsBuilder.shouldUseV1Api(SALE_CODE_REPORT.FG);
|
|
633
|
-
*
|
|
652
|
+
* console.log(useV1Sales); // false
|
|
653
|
+
*
|
|
654
|
+
* // Uso manual (normalmente no necesario, build() lo hace automáticamente)
|
|
655
|
+
* const apiVersion = useV1 ? '/reporte/download' : '/v2/reporte/download';
|
|
634
656
|
* ```
|
|
635
657
|
*/
|
|
636
|
-
static shouldUseV1Api(
|
|
658
|
+
static shouldUseV1Api(codeReport: ReportCode | string): boolean;
|
|
637
659
|
/**
|
|
638
660
|
* Obtiene la configuración para un tipo de documento
|
|
639
661
|
*
|
|
640
|
-
* @param
|
|
662
|
+
* @param codeReport - Código del reporte (FG, SRR, FV, etc.)
|
|
641
663
|
* @returns Configuración del reporte
|
|
642
664
|
* @throws Error si el tipo de documento no está soportado
|
|
643
665
|
* @private
|
|
@@ -671,7 +693,7 @@ declare class ReportParamsBuilder {
|
|
|
671
693
|
* - codEstab: Código de establecimiento (según configuración)
|
|
672
694
|
* - codigo: Código del reporte (según configuración)
|
|
673
695
|
* - Parámetros extra específicos del tipo (extraDataParams)
|
|
674
|
-
* - Todos los parámetros adicionales del docData (excepto
|
|
696
|
+
* - Todos los parámetros adicionales del docData (excepto codEstab, id, serie)
|
|
675
697
|
*
|
|
676
698
|
* @param docData - Datos del documento con parámetros adicionales
|
|
677
699
|
* @param config - Configuración del tipo de reporte
|
|
@@ -681,100 +703,171 @@ declare class ReportParamsBuilder {
|
|
|
681
703
|
* @example
|
|
682
704
|
* ```typescript
|
|
683
705
|
* // Input:
|
|
684
|
-
* docData = { codDoc: '
|
|
706
|
+
* docData = { codDoc: '01', tipo: 2, codEstab: '001', fechaInicio: '2024-01-01' }
|
|
685
707
|
* config = { idField: 'id', includeEstabInData: false, ... }
|
|
686
708
|
*
|
|
687
709
|
* // Output:
|
|
688
|
-
* "{\"tipo\":2,\"fechaInicio\":\"2024-01-01\"}"
|
|
710
|
+
* "{\"codDoc\":\"01\",\"tipo\":2,\"fechaInicio\":\"2024-01-01\"}"
|
|
689
711
|
* ```
|
|
690
712
|
*/
|
|
691
713
|
private static buildDataParams;
|
|
692
714
|
/**
|
|
693
715
|
* Construye las opciones completas para generar un reporte
|
|
694
716
|
*
|
|
695
|
-
* @param
|
|
717
|
+
* @param codeReport - Código del reporte (FG, SRR, FV, RCNH, etc.) - REQUERIDO
|
|
718
|
+
* @param docData - Datos del documento con parámetros adicionales (sin codeReport)
|
|
696
719
|
* @param format - Formato del reporte: 'pdf' | 'excel' | 'word'
|
|
697
|
-
|
|
720
|
+
/**
|
|
721
|
+
* Construye las opciones completas para generar un reporte
|
|
722
|
+
*
|
|
723
|
+
* Método principal que acepta un objeto con opciones tipadas.
|
|
724
|
+
* Proporciona IntelliSense y validación de tipos en tiempo de desarrollo.
|
|
725
|
+
*
|
|
726
|
+
* @param options - Opciones del reporte
|
|
727
|
+
* @param options.codeReport - Código del reporte (tipado: SALE_CODE_REPORT, PURCHASE_CODE_REPORT, etc.)
|
|
728
|
+
* @param options.data - Datos del documento (codDoc, tipo, fechas, etc.)
|
|
729
|
+
* @param options.format - Formato de salida: 'pdf' | 'excel' | 'word' (opcional, por defecto 'pdf')
|
|
730
|
+
* @returns Objeto con data, format y useV1Api para enviar a la facade
|
|
698
731
|
*
|
|
699
732
|
* @example
|
|
700
733
|
* ```typescript
|
|
701
|
-
*
|
|
702
|
-
*
|
|
703
|
-
*
|
|
704
|
-
*
|
|
705
|
-
*
|
|
706
|
-
*
|
|
707
|
-
*
|
|
708
|
-
*
|
|
709
|
-
*
|
|
710
|
-
*
|
|
734
|
+
* // Ejemplo 1: Reporte de ventas
|
|
735
|
+
* const options = ReportParamsBuilder.build({
|
|
736
|
+
* codeReport: SALE_CODE_REPORT.FG,
|
|
737
|
+
* data: {
|
|
738
|
+
* tipo: 2,
|
|
739
|
+
* ckFecha: true,
|
|
740
|
+
* codEstab: 'ESTAB-000000216',
|
|
741
|
+
* fechaInicio: '2024-01-01',
|
|
742
|
+
* fechaFin: '2024-12-31',
|
|
743
|
+
* userRoleId: '307'
|
|
744
|
+
* },
|
|
745
|
+
* format: 'pdf'
|
|
746
|
+
* });
|
|
747
|
+
*
|
|
748
|
+
* // Ejemplo 2: Documento electrónico con codDoc variable
|
|
749
|
+
* const options2 = ReportParamsBuilder.build({
|
|
750
|
+
* codeReport: ELECTRONIC_DOCUMENT_CODE.FV,
|
|
751
|
+
* data: {
|
|
752
|
+
* id: 123,
|
|
753
|
+
* codDoc: '01', // ← Variable, va a dataParams
|
|
754
|
+
* codEstab: '001'
|
|
755
|
+
* }
|
|
756
|
+
* // format es opcional, por defecto 'pdf'
|
|
757
|
+
* });
|
|
758
|
+
*
|
|
759
|
+
* // Ejemplo 3: Reporte de inventario
|
|
760
|
+
* const options3 = ReportParamsBuilder.build({
|
|
761
|
+
* codeReport: INVENTORY_CODE_REPORT.ARTICULO_PVP,
|
|
762
|
+
* data: {
|
|
763
|
+
* tipo: 2,
|
|
764
|
+
* stockStatusCode: 1,
|
|
765
|
+
* idTarifa: 3
|
|
766
|
+
* },
|
|
767
|
+
* format: 'excel'
|
|
768
|
+
* });
|
|
711
769
|
*
|
|
712
770
|
* // Usar con facade
|
|
713
|
-
* this.reportFacade.
|
|
771
|
+
* this.reportFacade.open(options).subscribe();
|
|
772
|
+
* this.reportFacade.download(options2).subscribe();
|
|
714
773
|
* ```
|
|
715
774
|
*/
|
|
716
|
-
static build(
|
|
775
|
+
static build(options: BuildReportOptions): {
|
|
717
776
|
data: ReportParams;
|
|
718
777
|
format: "pdf" | "excel" | "word";
|
|
719
778
|
useV1Api: boolean;
|
|
720
779
|
};
|
|
721
780
|
/**
|
|
722
|
-
* Obtiene la lista de
|
|
781
|
+
* Obtiene la lista de códigos de reporte soportados
|
|
723
782
|
*
|
|
724
|
-
*
|
|
783
|
+
* Devuelve un array con todos los códigos de reporte configurados
|
|
784
|
+
* en el builder (FV, NE, FG, SRR, RCNH, etc.)
|
|
785
|
+
*
|
|
786
|
+
* @returns Array con todos los códigos de reporte disponibles
|
|
725
787
|
*
|
|
726
788
|
* @example
|
|
727
789
|
* ```typescript
|
|
728
790
|
* const types = ReportParamsBuilder.getSupportedDocumentTypes();
|
|
729
|
-
*
|
|
791
|
+
* console.log(types);
|
|
792
|
+
* // ['FV', 'NE', 'NC', 'ND', 'GR', 'NORMAL', 'SRR', 'SRRC', 'FG',
|
|
793
|
+
* // 'RCNH', 'RLC', 'RCEGR', 'ACEDFP', 'ACELC', 'RCL', 'RK', ...]
|
|
794
|
+
*
|
|
795
|
+
* // Usar para validación
|
|
796
|
+
* if (types.includes(myCode)) {
|
|
797
|
+
* // Código válido
|
|
798
|
+
* }
|
|
730
799
|
* ```
|
|
731
800
|
*/
|
|
732
801
|
static getSupportedDocumentTypes(): string[];
|
|
733
802
|
/**
|
|
734
|
-
* Verifica si un
|
|
803
|
+
* Verifica si un código de reporte está soportado
|
|
804
|
+
*
|
|
805
|
+
* Útil para validar códigos antes de generar reportes,
|
|
806
|
+
* especialmente cuando el código viene dinámicamente.
|
|
735
807
|
*
|
|
736
|
-
* @param
|
|
737
|
-
* @returns true si el
|
|
808
|
+
* @param codeReport - Código del reporte a verificar
|
|
809
|
+
* @returns true si el código está soportado, false en caso contrario
|
|
738
810
|
*
|
|
739
811
|
* @example
|
|
740
812
|
* ```typescript
|
|
741
|
-
*
|
|
742
|
-
*
|
|
813
|
+
* // Validación con enum
|
|
814
|
+
* if (ReportParamsBuilder.isDocumentTypeSupported(SALE_CODE_REPORT.FG)) {
|
|
815
|
+
* console.log('Código FG soportado');
|
|
816
|
+
* }
|
|
817
|
+
*
|
|
818
|
+
* // Validación con string dinámico
|
|
819
|
+
* const dynamicCode = getUserSelectedCode();
|
|
820
|
+
* if (ReportParamsBuilder.isDocumentTypeSupported(dynamicCode)) {
|
|
821
|
+
* const options = ReportParamsBuilder.build({
|
|
822
|
+
* codeReport: dynamicCode,
|
|
823
|
+
* data: {...}
|
|
824
|
+
* });
|
|
743
825
|
* } else {
|
|
744
|
-
* console.error('
|
|
826
|
+
* console.error('Código no soportado:', dynamicCode);
|
|
745
827
|
* }
|
|
746
828
|
* ```
|
|
747
829
|
*/
|
|
748
|
-
static isDocumentTypeSupported(
|
|
830
|
+
static isDocumentTypeSupported(codeReport: ReportCode | string): boolean;
|
|
749
831
|
/**
|
|
750
832
|
* Registra un nuevo tipo de reporte dinámicamente
|
|
751
833
|
*
|
|
752
|
-
* Permite agregar soporte para
|
|
834
|
+
* Permite agregar soporte para códigos de reporte personalizados
|
|
753
835
|
* sin modificar el código fuente de la librería.
|
|
836
|
+
* Útil para reportes específicos de cada aplicación.
|
|
754
837
|
*
|
|
755
|
-
* @param
|
|
838
|
+
* @param codeReport - Código único del reporte personalizado
|
|
756
839
|
* @param config - Configuración completa del reporte
|
|
757
840
|
*
|
|
758
841
|
* @example
|
|
759
842
|
* ```typescript
|
|
760
|
-
* //
|
|
761
|
-
* ReportParamsBuilder.registerReportType('
|
|
762
|
-
* codigo: '
|
|
843
|
+
* // Registrar un reporte personalizado
|
|
844
|
+
* ReportParamsBuilder.registerReportType('MI_REPORTE_CUSTOM', {
|
|
845
|
+
* codigo: 'MI_REPORTE_CUSTOM',
|
|
763
846
|
* hasService: true,
|
|
764
847
|
* useV1Api: false,
|
|
765
848
|
* idField: 'id',
|
|
766
849
|
* hasParams: true,
|
|
767
|
-
*
|
|
850
|
+
* includeEstabInData: true,
|
|
851
|
+
* extraDataParams: {
|
|
852
|
+
* tipoCustom: 'especial',
|
|
853
|
+
* version: 2
|
|
854
|
+
* }
|
|
768
855
|
* });
|
|
769
856
|
*
|
|
770
|
-
* // Ahora se puede usar
|
|
771
|
-
* const options = ReportParamsBuilder.build(
|
|
772
|
-
*
|
|
773
|
-
* '
|
|
774
|
-
*
|
|
857
|
+
* // Ahora se puede usar como cualquier otro reporte
|
|
858
|
+
* const options = ReportParamsBuilder.build({
|
|
859
|
+
* codeReport: 'MI_REPORTE_CUSTOM',
|
|
860
|
+
* data: { id: 123, codEstab: '001' },
|
|
861
|
+
* format: 'pdf'
|
|
862
|
+
* });
|
|
863
|
+
*
|
|
864
|
+
* // Verificar si fue registrado
|
|
865
|
+
* console.log(
|
|
866
|
+
* ReportParamsBuilder.isDocumentTypeSupported('MI_REPORTE_CUSTOM')
|
|
867
|
+
* ); // true
|
|
775
868
|
* ```
|
|
776
869
|
*/
|
|
777
|
-
static registerReportType(
|
|
870
|
+
static registerReportType(codeReport: string, config: ReportConfig): void;
|
|
778
871
|
}
|
|
779
872
|
|
|
780
873
|
interface DocumentDeliveryData {
|
|
@@ -933,4 +1026,4 @@ declare class WhatsAppSender implements OnInit {
|
|
|
933
1026
|
}
|
|
934
1027
|
|
|
935
1028
|
export { ACCOUNTING_CODE_REPORT, API_PATHS, CUSTOMER_CODE_REPORT, DOCUMENT_TYPES, ELECTRONIC_DOCUMENT_CODE, FileMapperUtil, GreenWhatsAppAdapter, INVENTORY_CODE_REPORT, MetaWhatsAppAdapter, PRINTER_PORT, PURCHASE_CODE_REPORT, PhoneFormatterUtil, PrinterAdapter, PrinterFacade, REPORT_FORMAT, REPORT_PORT, ReportAdapter, ReportFacade, ReportParamsBuilder, SALE_CODE_REPORT, WHATSAPP_MESSAGING_PORT, WhatsAppMessageBuilder, WhatsAppMessagingFacade, WhatsAppSender };
|
|
936
|
-
export type { ApiResponse, DocumentData, DocumentDeliveryData, DocumentDeliveryParams, PhoneValidationResult, PrintConfig, PrintParams, PrinterPort, ReportDocumentData, ReportOptions, ReportParams, ReportPort, WhatsAppDocumentMessage, WhatsAppDocumentRequest, WhatsAppDocumentTemplateMessage, WhatsAppDocumentTemplateRequest, WhatsAppMessageResponse, WhatsAppMessages, WhatsAppMessagingPort, WhatsAppProviderStatus, WhatsAppResponse, WhatsAppSendConfig, WhatsAppStatusResponse, WhatsAppTemplateMessage, WhatsAppTextMessage, WhatsAppTextRequest, WhatsAppTextTemplateRequest };
|
|
1029
|
+
export type { ApiResponse, BuildReportOptions, DocumentData, DocumentDeliveryData, DocumentDeliveryParams, PhoneValidationResult, PrintConfig, PrintParams, PrinterPort, ReportCode, ReportDocumentData, ReportOptions, ReportParams, ReportPort, WhatsAppDocumentMessage, WhatsAppDocumentRequest, WhatsAppDocumentTemplateMessage, WhatsAppDocumentTemplateRequest, WhatsAppMessageResponse, WhatsAppMessages, WhatsAppMessagingPort, WhatsAppProviderStatus, WhatsAppResponse, WhatsAppSendConfig, WhatsAppStatusResponse, WhatsAppTemplateMessage, WhatsAppTextMessage, WhatsAppTextRequest, WhatsAppTextTemplateRequest };
|