@fiado/type-kit 3.260.0 → 3.261.0

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.
Files changed (100) hide show
  1. package/_test_/unit/platformRbac/PasswordPolicyInput.test.ts +58 -0
  2. package/_test_/unit/retailWizard/saleFinancier.test.ts +68 -0
  3. package/bin/benefitCenter/enums/BenefitFlowEnum.d.ts +11 -0
  4. package/bin/benefitCenter/enums/BenefitFlowEnum.js +15 -0
  5. package/bin/loanConfig/enums/ModifiableByRoleEnum.d.ts +11 -0
  6. package/bin/loanConfig/enums/ModifiableByRoleEnum.js +15 -0
  7. package/bin/places/dtos/CashInFeeDto.d.ts +17 -0
  8. package/bin/places/dtos/CashInFeeDto.js +12 -0
  9. package/bin/platformRbac/application/Application.d.ts +17 -0
  10. package/bin/platformRbac/dtos/CreateTenantRequest.d.ts +12 -0
  11. package/bin/platformRbac/dtos/CreateTenantRequest.js +8 -0
  12. package/bin/platformRbac/dtos/PasswordPolicyInput.d.ts +30 -0
  13. package/bin/platformRbac/dtos/PasswordPolicyInput.js +72 -0
  14. package/bin/platformRbac/dtos/ResendOtpRequest.d.ts +22 -0
  15. package/bin/platformRbac/dtos/ResendOtpRequest.js +36 -0
  16. package/bin/platformRbac/dtos/ResendSelfRegisterOtpRequest.d.ts +11 -0
  17. package/bin/platformRbac/dtos/ResendSelfRegisterOtpRequest.js +36 -0
  18. package/bin/platformRbac/index.d.ts +1 -0
  19. package/bin/platformRbac/index.js +3 -0
  20. package/bin/retailWizard/dtos/SaleException.d.ts +54 -0
  21. package/bin/retailWizard/dtos/SaleException.js +2 -0
  22. package/bin/retailWizard/dtos/SaleExceptionEvent.d.ts +18 -0
  23. package/bin/retailWizard/dtos/SaleExceptionEvent.js +2 -0
  24. package/bin/retailWizard/dtos/SaleExceptionPayload.d.ts +19 -0
  25. package/bin/retailWizard/dtos/SaleExceptionPayload.js +2 -0
  26. package/bin/retailWizard/dtos/SaleLogEntry.d.ts +29 -0
  27. package/bin/retailWizard/dtos/SaleLogEntry.js +2 -0
  28. package/bin/retailWizard/dtos/SalesReportDefinition.d.ts +20 -0
  29. package/bin/retailWizard/dtos/SalesReportDefinition.js +2 -0
  30. package/bin/retailWizard/dtos/SalesReportRun.d.ts +39 -0
  31. package/bin/retailWizard/dtos/SalesReportRun.js +2 -0
  32. package/bin/retailWizard/dtos/requests/BackofficeCancelSaleRequest.d.ts +26 -0
  33. package/bin/retailWizard/dtos/requests/BackofficeCancelSaleRequest.js +48 -0
  34. package/bin/retailWizard/dtos/requests/CreateSaleExceptionRequest.d.ts +28 -0
  35. package/bin/retailWizard/dtos/requests/CreateSaleExceptionRequest.js +96 -0
  36. package/bin/retailWizard/dtos/requests/ResolveSaleExceptionRequest.d.ts +15 -0
  37. package/bin/retailWizard/dtos/requests/ResolveSaleExceptionRequest.js +40 -0
  38. package/bin/retailWizard/dtos/requests/RunSalesReportRequest.d.ts +18 -0
  39. package/bin/retailWizard/dtos/requests/RunSalesReportRequest.js +45 -0
  40. package/bin/retailWizard/dtos/responses/BackofficeReportsResponse.d.ts +14 -0
  41. package/bin/retailWizard/dtos/responses/BackofficeReportsResponse.js +2 -0
  42. package/bin/retailWizard/dtos/responses/BackofficeSalesKpisResponse.d.ts +32 -0
  43. package/bin/retailWizard/dtos/responses/BackofficeSalesKpisResponse.js +2 -0
  44. package/bin/retailWizard/dtos/responses/BackofficeSalesStatsResponse.d.ts +26 -0
  45. package/bin/retailWizard/dtos/responses/BackofficeSalesStatsResponse.js +2 -0
  46. package/bin/retailWizard/enums/ReportFormatEnum.d.ts +5 -0
  47. package/bin/retailWizard/enums/ReportFormatEnum.js +9 -0
  48. package/bin/retailWizard/enums/ReportPeriodicityEnum.d.ts +9 -0
  49. package/bin/retailWizard/enums/ReportPeriodicityEnum.js +13 -0
  50. package/bin/retailWizard/enums/ReportRunStatusEnum.d.ts +18 -0
  51. package/bin/retailWizard/enums/ReportRunStatusEnum.js +22 -0
  52. package/bin/retailWizard/enums/SaleExceptionDecisionEnum.d.ts +10 -0
  53. package/bin/retailWizard/enums/SaleExceptionDecisionEnum.js +14 -0
  54. package/bin/retailWizard/enums/SaleExceptionEventKindEnum.d.ts +17 -0
  55. package/bin/retailWizard/enums/SaleExceptionEventKindEnum.js +21 -0
  56. package/bin/retailWizard/enums/SaleExceptionStatusEnum.d.ts +19 -0
  57. package/bin/retailWizard/enums/SaleExceptionStatusEnum.js +23 -0
  58. package/bin/retailWizard/enums/SaleExceptionTypeEnum.d.ts +19 -0
  59. package/bin/retailWizard/enums/SaleExceptionTypeEnum.js +23 -0
  60. package/bin/retailWizard/enums/SaleFinancierEnum.d.ts +18 -0
  61. package/bin/retailWizard/enums/SaleFinancierEnum.js +22 -0
  62. package/bin/retailWizard/enums/SalesReportIdEnum.d.ts +19 -0
  63. package/bin/retailWizard/enums/SalesReportIdEnum.js +23 -0
  64. package/bin/retailWizard/helpers/saleFinancier.d.ts +21 -0
  65. package/bin/retailWizard/helpers/saleFinancier.js +44 -0
  66. package/bin/retailWizard/index.d.ts +23 -0
  67. package/bin/retailWizard/index.js +29 -0
  68. package/package.json +1 -1
  69. package/src/platformRbac/application/Application.ts +17 -0
  70. package/src/platformRbac/dtos/CreateTenantRequest.ts +13 -0
  71. package/src/platformRbac/dtos/PasswordPolicyInput.ts +42 -0
  72. package/src/platformRbac/index.ts +3 -0
  73. package/src/retailWizard/dtos/SaleException.ts +55 -0
  74. package/src/retailWizard/dtos/SaleExceptionEvent.ts +19 -0
  75. package/src/retailWizard/dtos/SaleExceptionPayload.ts +19 -0
  76. package/src/retailWizard/dtos/SaleLogEntry.ts +30 -0
  77. package/src/retailWizard/dtos/SalesReportDefinition.ts +21 -0
  78. package/src/retailWizard/dtos/SalesReportRun.ts +40 -0
  79. package/src/retailWizard/dtos/requests/BackofficeCancelSaleRequest.ts +42 -0
  80. package/src/retailWizard/dtos/requests/CreateSaleExceptionRequest.ts +84 -0
  81. package/src/retailWizard/dtos/requests/ResolveSaleExceptionRequest.ts +25 -0
  82. package/src/retailWizard/dtos/requests/RunSalesReportRequest.ts +31 -0
  83. package/src/retailWizard/dtos/responses/BackofficeReportsResponse.ts +15 -0
  84. package/src/retailWizard/dtos/responses/BackofficeSalesKpisResponse.ts +34 -0
  85. package/src/retailWizard/dtos/responses/BackofficeSalesStatsResponse.ts +26 -0
  86. package/src/retailWizard/enums/ReportFormatEnum.ts +5 -0
  87. package/src/retailWizard/enums/ReportPeriodicityEnum.ts +9 -0
  88. package/src/retailWizard/enums/ReportRunStatusEnum.ts +18 -0
  89. package/src/retailWizard/enums/SaleExceptionDecisionEnum.ts +10 -0
  90. package/src/retailWizard/enums/SaleExceptionEventKindEnum.ts +17 -0
  91. package/src/retailWizard/enums/SaleExceptionStatusEnum.ts +19 -0
  92. package/src/retailWizard/enums/SaleExceptionTypeEnum.ts +19 -0
  93. package/src/retailWizard/enums/SaleFinancierEnum.ts +18 -0
  94. package/src/retailWizard/enums/SalesReportIdEnum.ts +19 -0
  95. package/src/retailWizard/helpers/saleFinancier.ts +48 -0
  96. package/src/retailWizard/index.ts +34 -0
  97. package/bin/loanCredit/dtos/requests/UpdateActivationChecklistRequest.d.ts +0 -11
  98. package/bin/loanCredit/dtos/requests/UpdateActivationChecklistRequest.js +0 -46
  99. package/bin/loanCredit/enums/ClientLevelEnum.d.ts +0 -11
  100. package/bin/loanCredit/enums/ClientLevelEnum.js +0 -15
@@ -0,0 +1,29 @@
1
+ /** Un campo que cambió en una acción auditada. `from` ausente en un alta. */
2
+ export interface SaleLogChange {
3
+ field: string;
4
+ from: string | null;
5
+ to: string | null;
6
+ }
7
+ /**
8
+ * Una entrada del tab «Bitácora» del drawer de una venta. Proyección de `SharedAuditTrail_GT`
9
+ * (`pk = ENTITY#SALE#<saleId>`, `sk = TS#<iso>#<ulid>`, orden cronológico nativo).
10
+ * SureKeep Fase 3 — pista Retail.
11
+ *
12
+ * El diff viaja APLANADO en `changes` y no como los objetos `old`/`new` crudos de la tabla: la
13
+ * pantalla dibuja una lista de «campo: antes → después», y un objeto libre en el contrato obligaría al
14
+ * front a adivinar la forma. Los valores se serializan a string por eso mismo.
15
+ *
16
+ * ⚠️ `changes` NUNCA lleva PII: la tabla de auditoría solo guarda identificadores y valores
17
+ * operacionales (status, storeId, type…). Ver `fiado-logging`.
18
+ */
19
+ export interface SaleLogEntry {
20
+ /** ISO-8601 del momento de la acción (sale del `sk`). */
21
+ at: string;
22
+ /** Acción auditada: `SALE_COMPLETE`, `SALE_CANCEL`, `PAYMENT_REGISTERED`… */
23
+ action: string;
24
+ /** Actor: userId del AuthContext, o `system` si la disparó un proceso interno. */
25
+ performedBy: string;
26
+ /** Motivo, cuando la acción lo exige (cancelación, excepción aplicada). */
27
+ reason: string | null;
28
+ changes: SaleLogChange[];
29
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,20 @@
1
+ import type { SalesReportIdEnum } from '../enums/SalesReportIdEnum';
2
+ import type { ReportPeriodicityEnum } from '../enums/ReportPeriodicityEnum';
3
+ import type { ReportFormatEnum } from '../enums/ReportFormatEnum';
4
+ /**
5
+ * Un reporte del catálogo del Admin VL (M6 §5.1). Es CONFIGURACIÓN, no una fila de tabla: el catálogo
6
+ * de los 5 reportes vive en código y no se persiste — cambia con un deploy, no con un write.
7
+ * SureKeep Fase 3 — pista Retail.
8
+ */
9
+ export interface SalesReportDefinition {
10
+ reportId: SalesReportIdEnum;
11
+ /** Nombre para mostrar, en español mexicano. */
12
+ name: string;
13
+ description: string;
14
+ periodicity: ReportPeriodicityEnum;
15
+ formats: ReportFormatEnum[];
16
+ /** Referencia al documento de negocio que lo define (ej. `M6 §5.1`). */
17
+ reference: string;
18
+ /** ISO-8601 de la última corrida conocida; `null` si nunca corrió. */
19
+ lastRunAt: string | null;
20
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,39 @@
1
+ import type { SalesReportIdEnum } from '../enums/SalesReportIdEnum';
2
+ import type { ReportFormatEnum } from '../enums/ReportFormatEnum';
3
+ import type { ReportRunStatusEnum } from '../enums/ReportRunStatusEnum';
4
+ /**
5
+ * Una corrida de reporte (`<T>RetailReportRun_GT`, pk `RETAILER#<retailerId>` ·
6
+ * sk `RUN#<requestedAt>#<runId>`, CERO GSIs). Es el log de la sección 3 de la pantalla de Reportes.
7
+ * SureKeep Fase 3 — pista Retail.
8
+ *
9
+ * La generación es ASÍNCRONA: el `POST .../run` persiste la corrida en `QUEUED` y devuelve el `runId`;
10
+ * el front poletea `GET /backoffice/reports`. API Gateway corta a los 29 s y un reporte de red
11
+ * completa no entra en una respuesta síncrona.
12
+ */
13
+ export interface SalesReportRun {
14
+ runId: string;
15
+ retailerId: string;
16
+ reportId: SalesReportIdEnum;
17
+ format: ReportFormatEnum;
18
+ status: ReportRunStatusEnum;
19
+ /** userId de quien la disparó; `system` si la lanzó el cron. */
20
+ requestedBy: string;
21
+ requestedByName: string | null;
22
+ /** ISO-8601. Es parte del sort key: ordena el log de corridas. */
23
+ requestedAt: string;
24
+ /** ISO-8601 del fin de la generación. `null` mientras no termine. */
25
+ completedAt: string | null;
26
+ /** Ventana de datos del reporte, ISO-8601. */
27
+ periodFrom: string | null;
28
+ periodTo: string | null;
29
+ /** Filas generadas. `null` mientras no termine. */
30
+ rowCount: number | null;
31
+ /** URL prefirmada de descarga. Solo con `status: READY`; `null` en cualquier otro estado. */
32
+ downloadUrl: string | null;
33
+ /** Por qué falló. Solo con `status: FAILED`. */
34
+ failureReason: string | null;
35
+ createdBy: string;
36
+ updatedBy: string;
37
+ createdAt: number;
38
+ updatedAt: number;
39
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,26 @@
1
+ /**
2
+ * POST /backoffice/sales/:saleId/cancel — cancelación del Admin VL. SureKeep Fase 3 — pista Retail.
3
+ *
4
+ * Es un endpoint SEPARADO de `POST /sales/:saleId/cancel` (el del vendedor), no una rama del mismo, y
5
+ * por eso lleva su propio DTO. Son dos reglas de negocio distintas: la del vendedor está acotada a su
6
+ * propia venta y a la ventana de 7 días; la del admin puede cancelar FUERA de ventana — que es justo
7
+ * lo que habilita la excepción `LATE_CANCEL`. Mezclarlas en un handler enredaría las dos.
8
+ *
9
+ * `outOfWindowExceptionId` es el puente entre las dos piezas: cancelar fuera de ventana exige una
10
+ * excepción `LATE_CANCEL` ya aprobada. Sin ella el manager rechaza, aunque el actor tenga el permiso.
11
+ */
12
+ export declare class BackofficeCancelSaleRequest {
13
+ reason: string;
14
+ /**
15
+ * Confirmación de que el equipo se verificó físicamente en tienda. Ausente y `false` se tratan
16
+ * igual (fail-closed): el manager responde `412 IMEI_NOT_RETURNABLE`, que es la respuesta
17
+ * semánticamente correcta y no un error de forma. `@IsBoolean()` estricto — el string `"false"` se
18
+ * rechaza en vez de colarse como truthy.
19
+ */
20
+ equipmentVerified?: boolean;
21
+ /**
22
+ * Excepción `LATE_CANCEL` aprobada que autoriza cancelar fuera de la ventana. Solo se exige cuando
23
+ * la venta YA está fuera de ventana; dentro de ventana se ignora.
24
+ */
25
+ outOfWindowExceptionId?: string;
26
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BackofficeCancelSaleRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * POST /backoffice/sales/:saleId/cancel — cancelación del Admin VL. SureKeep Fase 3 — pista Retail.
17
+ *
18
+ * Es un endpoint SEPARADO de `POST /sales/:saleId/cancel` (el del vendedor), no una rama del mismo, y
19
+ * por eso lleva su propio DTO. Son dos reglas de negocio distintas: la del vendedor está acotada a su
20
+ * propia venta y a la ventana de 7 días; la del admin puede cancelar FUERA de ventana — que es justo
21
+ * lo que habilita la excepción `LATE_CANCEL`. Mezclarlas en un handler enredaría las dos.
22
+ *
23
+ * `outOfWindowExceptionId` es el puente entre las dos piezas: cancelar fuera de ventana exige una
24
+ * excepción `LATE_CANCEL` ya aprobada. Sin ella el manager rechaza, aunque el actor tenga el permiso.
25
+ */
26
+ class BackofficeCancelSaleRequest {
27
+ }
28
+ exports.BackofficeCancelSaleRequest = BackofficeCancelSaleRequest;
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ (0, class_validator_1.IsString)(),
32
+ (0, class_validator_1.MinLength)(10),
33
+ (0, class_validator_1.MaxLength)(200),
34
+ __metadata("design:type", String)
35
+ ], BackofficeCancelSaleRequest.prototype, "reason", void 0);
36
+ __decorate([
37
+ (0, class_transformer_1.Expose)(),
38
+ (0, class_validator_1.IsOptional)(),
39
+ (0, class_validator_1.IsBoolean)(),
40
+ __metadata("design:type", Boolean)
41
+ ], BackofficeCancelSaleRequest.prototype, "equipmentVerified", void 0);
42
+ __decorate([
43
+ (0, class_transformer_1.Expose)(),
44
+ (0, class_validator_1.IsOptional)(),
45
+ (0, class_validator_1.IsString)(),
46
+ (0, class_validator_1.MaxLength)(64),
47
+ __metadata("design:type", String)
48
+ ], BackofficeCancelSaleRequest.prototype, "outOfWindowExceptionId", void 0);
@@ -0,0 +1,28 @@
1
+ import { SaleExceptionTypeEnum } from '../../enums/SaleExceptionTypeEnum';
2
+ /** Lo que la excepción pide cambiar. Cada tipo usa los campos que le tocan; todos son opcionales. */
3
+ export declare class SaleExceptionPayloadInput {
4
+ sku?: string;
5
+ amountCents?: number;
6
+ soldAt?: string;
7
+ imei?: string;
8
+ }
9
+ /**
10
+ * POST /backoffice/exceptions — levanta una excepción sobre una venta. SureKeep Fase 3 — pista Retail.
11
+ *
12
+ * La `justification` es OBLIGATORIA y con mínimo real: es lo único que vuelve auditable la excepción,
13
+ * y un campo libre que acepta `"x"` no audita nada. Escribe `RetailSaleException_GT` +
14
+ * `SharedAuditTrail_GT` en la MISMA `TransactWriteItems`.
15
+ *
16
+ * El `retailerId` NO viaja en el request: sale del token (`scopeFromRetailer`).
17
+ */
18
+ export declare class CreateSaleExceptionRequest {
19
+ type: SaleExceptionTypeEnum;
20
+ /** `null`/ausente en las excepciones generales, que no cuelgan de una venta puntual. */
21
+ saleId?: string;
22
+ /** Obligatorio cuando NO hay `saleId`; si hay venta, se toma el de la venta. */
23
+ storeId?: string;
24
+ justification: string;
25
+ /** Impacto económico con signo, en centavos. Negativo si la excepción resta (descuento). */
26
+ impactCents?: number;
27
+ payload?: SaleExceptionPayloadInput;
28
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CreateSaleExceptionRequest = exports.SaleExceptionPayloadInput = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const SaleExceptionTypeEnum_1 = require("../../enums/SaleExceptionTypeEnum");
16
+ /** Lo que la excepción pide cambiar. Cada tipo usa los campos que le tocan; todos son opcionales. */
17
+ class SaleExceptionPayloadInput {
18
+ }
19
+ exports.SaleExceptionPayloadInput = SaleExceptionPayloadInput;
20
+ __decorate([
21
+ (0, class_transformer_1.Expose)(),
22
+ (0, class_validator_1.IsOptional)(),
23
+ (0, class_validator_1.IsString)(),
24
+ (0, class_validator_1.MaxLength)(64),
25
+ __metadata("design:type", String)
26
+ ], SaleExceptionPayloadInput.prototype, "sku", void 0);
27
+ __decorate([
28
+ (0, class_transformer_1.Expose)(),
29
+ (0, class_validator_1.IsOptional)(),
30
+ (0, class_validator_1.IsInt)(),
31
+ __metadata("design:type", Number)
32
+ ], SaleExceptionPayloadInput.prototype, "amountCents", void 0);
33
+ __decorate([
34
+ (0, class_transformer_1.Expose)(),
35
+ (0, class_validator_1.IsOptional)(),
36
+ (0, class_validator_1.IsISO8601)(),
37
+ __metadata("design:type", String)
38
+ ], SaleExceptionPayloadInput.prototype, "soldAt", void 0);
39
+ __decorate([
40
+ (0, class_transformer_1.Expose)(),
41
+ (0, class_validator_1.IsOptional)(),
42
+ (0, class_validator_1.IsString)(),
43
+ (0, class_validator_1.MaxLength)(20),
44
+ __metadata("design:type", String)
45
+ ], SaleExceptionPayloadInput.prototype, "imei", void 0);
46
+ /**
47
+ * POST /backoffice/exceptions — levanta una excepción sobre una venta. SureKeep Fase 3 — pista Retail.
48
+ *
49
+ * La `justification` es OBLIGATORIA y con mínimo real: es lo único que vuelve auditable la excepción,
50
+ * y un campo libre que acepta `"x"` no audita nada. Escribe `RetailSaleException_GT` +
51
+ * `SharedAuditTrail_GT` en la MISMA `TransactWriteItems`.
52
+ *
53
+ * El `retailerId` NO viaja en el request: sale del token (`scopeFromRetailer`).
54
+ */
55
+ class CreateSaleExceptionRequest {
56
+ }
57
+ exports.CreateSaleExceptionRequest = CreateSaleExceptionRequest;
58
+ __decorate([
59
+ (0, class_transformer_1.Expose)(),
60
+ (0, class_validator_1.IsEnum)(SaleExceptionTypeEnum_1.SaleExceptionTypeEnum),
61
+ __metadata("design:type", String)
62
+ ], CreateSaleExceptionRequest.prototype, "type", void 0);
63
+ __decorate([
64
+ (0, class_transformer_1.Expose)(),
65
+ (0, class_validator_1.IsOptional)(),
66
+ (0, class_validator_1.IsString)(),
67
+ (0, class_validator_1.MaxLength)(64),
68
+ __metadata("design:type", String)
69
+ ], CreateSaleExceptionRequest.prototype, "saleId", void 0);
70
+ __decorate([
71
+ (0, class_transformer_1.Expose)(),
72
+ (0, class_validator_1.IsOptional)(),
73
+ (0, class_validator_1.IsString)(),
74
+ (0, class_validator_1.MaxLength)(64),
75
+ __metadata("design:type", String)
76
+ ], CreateSaleExceptionRequest.prototype, "storeId", void 0);
77
+ __decorate([
78
+ (0, class_transformer_1.Expose)(),
79
+ (0, class_validator_1.IsString)(),
80
+ (0, class_validator_1.MinLength)(20),
81
+ (0, class_validator_1.MaxLength)(1000),
82
+ __metadata("design:type", String)
83
+ ], CreateSaleExceptionRequest.prototype, "justification", void 0);
84
+ __decorate([
85
+ (0, class_transformer_1.Expose)(),
86
+ (0, class_validator_1.IsOptional)(),
87
+ (0, class_validator_1.IsInt)(),
88
+ __metadata("design:type", Number)
89
+ ], CreateSaleExceptionRequest.prototype, "impactCents", void 0);
90
+ __decorate([
91
+ (0, class_transformer_1.Expose)(),
92
+ (0, class_validator_1.IsOptional)(),
93
+ (0, class_validator_1.ValidateNested)(),
94
+ (0, class_transformer_1.Type)(() => SaleExceptionPayloadInput),
95
+ __metadata("design:type", SaleExceptionPayloadInput)
96
+ ], CreateSaleExceptionRequest.prototype, "payload", void 0);
@@ -0,0 +1,15 @@
1
+ import { SaleExceptionDecisionEnum } from '../../enums/SaleExceptionDecisionEnum';
2
+ /**
3
+ * POST /backoffice/exceptions/:exceptionId/resolve — aprueba o rechaza una excepción.
4
+ * SureKeep Fase 3 — pista Retail.
5
+ *
6
+ * La `resolution` es OBLIGATORIA en los dos veredictos, no solo al rechazar: un «aprobada» sin motivo
7
+ * escrito es exactamente el registro que después nadie puede defender ante una auditoría.
8
+ *
9
+ * **Idempotente** con el guard local (`IIdempotencyGuard` + `SureKeepSharedIdempotency_GT`): un doble
10
+ * click no puede resolver dos veces. ⚠️ El decorador `@Idempotent` NO existe en el gateway-adapter.
11
+ */
12
+ export declare class ResolveSaleExceptionRequest {
13
+ decision: SaleExceptionDecisionEnum;
14
+ resolution: string;
15
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ResolveSaleExceptionRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const SaleExceptionDecisionEnum_1 = require("../../enums/SaleExceptionDecisionEnum");
16
+ /**
17
+ * POST /backoffice/exceptions/:exceptionId/resolve — aprueba o rechaza una excepción.
18
+ * SureKeep Fase 3 — pista Retail.
19
+ *
20
+ * La `resolution` es OBLIGATORIA en los dos veredictos, no solo al rechazar: un «aprobada» sin motivo
21
+ * escrito es exactamente el registro que después nadie puede defender ante una auditoría.
22
+ *
23
+ * **Idempotente** con el guard local (`IIdempotencyGuard` + `SureKeepSharedIdempotency_GT`): un doble
24
+ * click no puede resolver dos veces. ⚠️ El decorador `@Idempotent` NO existe en el gateway-adapter.
25
+ */
26
+ class ResolveSaleExceptionRequest {
27
+ }
28
+ exports.ResolveSaleExceptionRequest = ResolveSaleExceptionRequest;
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ (0, class_validator_1.IsEnum)(SaleExceptionDecisionEnum_1.SaleExceptionDecisionEnum),
32
+ __metadata("design:type", String)
33
+ ], ResolveSaleExceptionRequest.prototype, "decision", void 0);
34
+ __decorate([
35
+ (0, class_transformer_1.Expose)(),
36
+ (0, class_validator_1.IsString)(),
37
+ (0, class_validator_1.MinLength)(10),
38
+ (0, class_validator_1.MaxLength)(1000),
39
+ __metadata("design:type", String)
40
+ ], ResolveSaleExceptionRequest.prototype, "resolution", void 0);
@@ -0,0 +1,18 @@
1
+ import { ReportFormatEnum } from '../../enums/ReportFormatEnum';
2
+ /**
3
+ * POST /backoffice/reports/:reportId/run — encola la generación de un reporte.
4
+ * SureKeep Fase 3 — pista Retail.
5
+ *
6
+ * Devuelve el `SalesReportRun` en `QUEUED`, NO el archivo: la generación es asíncrona por el límite de
7
+ * 29 s de API Gateway. El front poletea `GET /backoffice/reports` hasta ver `READY` y ahí usa el
8
+ * `downloadUrl`.
9
+ *
10
+ * El `reportId` viaja en el path, no acá. El `retailerId` sale del token.
11
+ */
12
+ export declare class RunSalesReportRequest {
13
+ format: ReportFormatEnum;
14
+ /** Inicio de la ventana de datos, ISO-8601. Si falta, la resuelve la periodicidad del reporte. */
15
+ periodFrom?: string;
16
+ /** Fin de la ventana de datos, ISO-8601. Si falta, la resuelve la periodicidad del reporte. */
17
+ periodTo?: string;
18
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RunSalesReportRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const ReportFormatEnum_1 = require("../../enums/ReportFormatEnum");
16
+ /**
17
+ * POST /backoffice/reports/:reportId/run — encola la generación de un reporte.
18
+ * SureKeep Fase 3 — pista Retail.
19
+ *
20
+ * Devuelve el `SalesReportRun` en `QUEUED`, NO el archivo: la generación es asíncrona por el límite de
21
+ * 29 s de API Gateway. El front poletea `GET /backoffice/reports` hasta ver `READY` y ahí usa el
22
+ * `downloadUrl`.
23
+ *
24
+ * El `reportId` viaja en el path, no acá. El `retailerId` sale del token.
25
+ */
26
+ class RunSalesReportRequest {
27
+ }
28
+ exports.RunSalesReportRequest = RunSalesReportRequest;
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ (0, class_validator_1.IsEnum)(ReportFormatEnum_1.ReportFormatEnum),
32
+ __metadata("design:type", String)
33
+ ], RunSalesReportRequest.prototype, "format", void 0);
34
+ __decorate([
35
+ (0, class_transformer_1.Expose)(),
36
+ (0, class_validator_1.IsOptional)(),
37
+ (0, class_validator_1.IsISO8601)(),
38
+ __metadata("design:type", String)
39
+ ], RunSalesReportRequest.prototype, "periodFrom", void 0);
40
+ __decorate([
41
+ (0, class_transformer_1.Expose)(),
42
+ (0, class_validator_1.IsOptional)(),
43
+ (0, class_validator_1.IsISO8601)(),
44
+ __metadata("design:type", String)
45
+ ], RunSalesReportRequest.prototype, "periodTo", void 0);
@@ -0,0 +1,14 @@
1
+ import type { SalesReportDefinition } from '../SalesReportDefinition';
2
+ import type { SalesReportRun } from '../SalesReportRun';
3
+ /**
4
+ * GET /backoffice/reports — el catálogo de los 5 reportes de ventas MÁS el log de corridas recientes,
5
+ * que es exactamente lo que la pantalla dibuja en sus dos secciones. SureKeep Fase 3 — pista Retail.
6
+ *
7
+ * Van juntos en una sola respuesta y no en dos endpoints porque la pantalla siempre necesita los dos,
8
+ * y el catálogo son 5 ítems de configuración en código: partirlo costaría un round-trip para nada.
9
+ */
10
+ export interface BackofficeReportsResponse {
11
+ definitions: SalesReportDefinition[];
12
+ /** Últimas corridas del retailer, más recientes primero. */
13
+ runs: SalesReportRun[];
14
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,32 @@
1
+ import type { SaleFinancierEnum } from '../../enums/SaleFinancierEnum';
2
+ /** Un tramo del mix por financiera del Home del Admin VL. */
3
+ export interface SalesFinancierMixEntry {
4
+ financier: SaleFinancierEnum;
5
+ count: number;
6
+ amountCents: number;
7
+ }
8
+ /**
9
+ * GET /backoffice/sales/kpis — los KPIs del Home del Admin VL. SureKeep Fase 3 — pista Retail.
10
+ *
11
+ * 🟡 **Incompleto por diseño:** el panel «Meta del día» necesita las metas por tienda, que viven en
12
+ * `retail-org-business` y **todavía no existen**. `goal` viaja `null` hasta entonces; todo lo demás
13
+ * son datos reales. El front debe tratar `null` como «sin meta configurada», no como cero.
14
+ *
15
+ * Las llaves van en inglés (el diseño no fija un payload literal acá, a diferencia de
16
+ * `BackofficeSalesStatsResponse`).
17
+ */
18
+ export interface BackofficeSalesKpisResponse {
19
+ /** Monto colocado hoy, en centavos. Mide precio del equipo, no lo cobrado en caja (DEC-032). */
20
+ soldTodayCents: number;
21
+ /** Piezas vendidas hoy. */
22
+ unitsToday: number;
23
+ /** Ticket promedio de hoy, en centavos. 0 si no hubo ventas. */
24
+ averageTicketCents: number;
25
+ /** Delta porcentual del monto de hoy contra ayer. `null` si ayer no hubo ventas (no se divide por cero). */
26
+ deltaVsYesterdayPct: number | null;
27
+ /** Monto del MISMO día de la semana pasada, en centavos — el baseline honesto contra la estacionalidad. */
28
+ baselineSameWeekdayCents: number;
29
+ mix: SalesFinancierMixEntry[];
30
+ /** Meta del día del retailer, en centavos. `null` mientras no exista la tabla de metas. */
31
+ goalCents: number | null;
32
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,26 @@
1
+ /**
2
+ * GET /backoffice/sales/stats — los pills de conteo arriba de la tabla de Ventas del Admin VL.
3
+ * SureKeep Fase 3 — pista Retail.
4
+ *
5
+ * ⚠️ **Las llaves van en ESPAÑOL, a propósito y como única excepción del dominio.** Es el contrato
6
+ * literal que fija el diseño de F3 (`03_backoffice_ventasluga/lambdas/retail-wizard-business.md`) y
7
+ * contra el que el front ya mockeó la pantalla. Cambiarlas a inglés por consistencia rompería una
8
+ * pantalla ya construida sin ganar nada. Decisión de Andrés, 2026-08-03.
9
+ *
10
+ * `contado` + `credito` == `total`. `surekeep` + `externas` == `credito`: las dos particiones son
11
+ * completas y NO se solapan (ver `helpers/saleFinancier`).
12
+ */
13
+ export interface BackofficeSalesStatsResponse {
14
+ /** Ventas del retailer en la ventana consultada. */
15
+ total: number;
16
+ /** Subconjunto de `total` con `soldAt` en el día de hoy. */
17
+ hoy: number;
18
+ /** `type: CASH`. */
19
+ contado: number;
20
+ /** `type: CREDIT` o `EXTERNAL_REFERRAL` — todo lo que no es contado. */
21
+ credito: number;
22
+ /** Financiadas por la SOFOM (`type: CREDIT`). */
23
+ surekeep: number;
24
+ /** Financiadas por un tercero (`EXTERNAL_REFERRAL` con proveedor). */
25
+ externas: number;
26
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ /** Formato de salida de un reporte del Admin VL. SureKeep Fase 3 — pista Retail. */
2
+ export declare enum ReportFormatEnum {
3
+ CSV = "CSV",
4
+ PDF = "PDF"
5
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReportFormatEnum = void 0;
4
+ /** Formato de salida de un reporte del Admin VL. SureKeep Fase 3 — pista Retail. */
5
+ var ReportFormatEnum;
6
+ (function (ReportFormatEnum) {
7
+ ReportFormatEnum["CSV"] = "CSV";
8
+ ReportFormatEnum["PDF"] = "PDF";
9
+ })(ReportFormatEnum || (exports.ReportFormatEnum = ReportFormatEnum = {}));
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Periodicidad de un reporte del Admin VL. Los diarios y semanales corren por cron; los mensuales
3
+ * requieren corrida manual (M6 §5.1). SureKeep Fase 3 — pista Retail.
4
+ */
5
+ export declare enum ReportPeriodicityEnum {
6
+ DAILY = "DAILY",
7
+ WEEKLY = "WEEKLY",
8
+ MONTHLY = "MONTHLY"
9
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReportPeriodicityEnum = void 0;
4
+ /**
5
+ * Periodicidad de un reporte del Admin VL. Los diarios y semanales corren por cron; los mensuales
6
+ * requieren corrida manual (M6 §5.1). SureKeep Fase 3 — pista Retail.
7
+ */
8
+ var ReportPeriodicityEnum;
9
+ (function (ReportPeriodicityEnum) {
10
+ ReportPeriodicityEnum["DAILY"] = "DAILY";
11
+ ReportPeriodicityEnum["WEEKLY"] = "WEEKLY";
12
+ ReportPeriodicityEnum["MONTHLY"] = "MONTHLY";
13
+ })(ReportPeriodicityEnum || (exports.ReportPeriodicityEnum = ReportPeriodicityEnum = {}));
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Estado de una corrida de reporte. La generación es ASÍNCRONA: el `POST .../run` devuelve `QUEUED` y
3
+ * el front poletea el listado. SureKeep Fase 3 — pista Retail.
4
+ *
5
+ * Es async desde el día uno por el límite de 29 s de API Gateway: un reporte de red completa no entra
6
+ * en una respuesta síncrona. Mismo error que ya se corrigió en el cierre de corte de comisiones.
7
+ *
8
+ * QUEUED - Encolada, sin arrancar.
9
+ * RUNNING - Generándose.
10
+ * READY - Lista para descargar (`downloadUrl` presente).
11
+ * FAILED - Falló; `failureReason` explica por qué.
12
+ */
13
+ export declare enum ReportRunStatusEnum {
14
+ QUEUED = "QUEUED",
15
+ RUNNING = "RUNNING",
16
+ READY = "READY",
17
+ FAILED = "FAILED"
18
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReportRunStatusEnum = void 0;
4
+ /**
5
+ * Estado de una corrida de reporte. La generación es ASÍNCRONA: el `POST .../run` devuelve `QUEUED` y
6
+ * el front poletea el listado. SureKeep Fase 3 — pista Retail.
7
+ *
8
+ * Es async desde el día uno por el límite de 29 s de API Gateway: un reporte de red completa no entra
9
+ * en una respuesta síncrona. Mismo error que ya se corrigió en el cierre de corte de comisiones.
10
+ *
11
+ * QUEUED - Encolada, sin arrancar.
12
+ * RUNNING - Generándose.
13
+ * READY - Lista para descargar (`downloadUrl` presente).
14
+ * FAILED - Falló; `failureReason` explica por qué.
15
+ */
16
+ var ReportRunStatusEnum;
17
+ (function (ReportRunStatusEnum) {
18
+ ReportRunStatusEnum["QUEUED"] = "QUEUED";
19
+ ReportRunStatusEnum["RUNNING"] = "RUNNING";
20
+ ReportRunStatusEnum["READY"] = "READY";
21
+ ReportRunStatusEnum["FAILED"] = "FAILED";
22
+ })(ReportRunStatusEnum || (exports.ReportRunStatusEnum = ReportRunStatusEnum = {}));
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Veredicto del Admin VL al resolver una excepción. Es un enum PROPIO y no un subconjunto de
3
+ * `SaleExceptionStatusEnum`: el request expresa una DECISIÓN («apruébala»), no un estado destino, y
4
+ * mezclarlos dejaría al caller mandar `APPLIED` o `NEW` en un endpoint que no los admite.
5
+ * SureKeep Fase 3 — pista Retail.
6
+ */
7
+ export declare enum SaleExceptionDecisionEnum {
8
+ APPROVE = "APPROVE",
9
+ REJECT = "REJECT"
10
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SaleExceptionDecisionEnum = void 0;
4
+ /**
5
+ * Veredicto del Admin VL al resolver una excepción. Es un enum PROPIO y no un subconjunto de
6
+ * `SaleExceptionStatusEnum`: el request expresa una DECISIÓN («apruébala»), no un estado destino, y
7
+ * mezclarlos dejaría al caller mandar `APPLIED` o `NEW` en un endpoint que no los admite.
8
+ * SureKeep Fase 3 — pista Retail.
9
+ */
10
+ var SaleExceptionDecisionEnum;
11
+ (function (SaleExceptionDecisionEnum) {
12
+ SaleExceptionDecisionEnum["APPROVE"] = "APPROVE";
13
+ SaleExceptionDecisionEnum["REJECT"] = "REJECT";
14
+ })(SaleExceptionDecisionEnum || (exports.SaleExceptionDecisionEnum = SaleExceptionDecisionEnum = {}));