@fiado/type-kit 3.282.0 → 3.284.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 (32) hide show
  1. package/bin/benefitCenter/enums/BenefitFlowEnum.d.ts +11 -0
  2. package/bin/benefitCenter/enums/BenefitFlowEnum.js +15 -0
  3. package/bin/loanConfig/enums/ModifiableByRoleEnum.d.ts +11 -0
  4. package/bin/loanConfig/enums/ModifiableByRoleEnum.js +15 -0
  5. package/bin/phoneSales/DeviceVariantResponseDto.d.ts +9 -0
  6. package/bin/places/dtos/CashInFeeDto.d.ts +17 -0
  7. package/bin/places/dtos/CashInFeeDto.js +12 -0
  8. package/bin/platformRbac/dtos/ResendOtpRequest.d.ts +22 -0
  9. package/bin/platformRbac/dtos/ResendOtpRequest.js +36 -0
  10. package/bin/platformRbac/dtos/ResendSelfRegisterOtpRequest.d.ts +11 -0
  11. package/bin/platformRbac/dtos/ResendSelfRegisterOtpRequest.js +36 -0
  12. package/bin/retailWizard/dtos/requests/AddSaleExceptionNoteRequest.d.ts +16 -0
  13. package/bin/retailWizard/dtos/requests/AddSaleExceptionNoteRequest.js +37 -0
  14. package/bin/retailWizard/dtos/requests/ApplySaleExceptionRequest.d.ts +16 -0
  15. package/bin/retailWizard/dtos/requests/ApplySaleExceptionRequest.js +38 -0
  16. package/bin/retailWizard/dtos/requests/ReviewSaleExceptionRequest.d.ts +14 -0
  17. package/bin/retailWizard/dtos/requests/ReviewSaleExceptionRequest.js +36 -0
  18. package/bin/retailWizard/dtos/responses/BackofficeSalesKpisResponse.d.ts +8 -0
  19. package/bin/retailWizard/enums/SaleExceptionEventKindEnum.d.ts +2 -0
  20. package/bin/retailWizard/enums/SaleExceptionEventKindEnum.js +2 -0
  21. package/bin/retailWizard/index.d.ts +3 -0
  22. package/bin/retailWizard/index.js +3 -0
  23. package/package.json +1 -1
  24. package/src/phoneSales/DeviceVariantResponseDto.ts +9 -0
  25. package/src/retailWizard/dtos/requests/AddSaleExceptionNoteRequest.ts +23 -0
  26. package/src/retailWizard/dtos/requests/ApplySaleExceptionRequest.ts +24 -0
  27. package/src/retailWizard/dtos/requests/ReviewSaleExceptionRequest.ts +22 -0
  28. package/src/retailWizard/dtos/responses/BackofficeSalesKpisResponse.ts +8 -0
  29. package/src/retailWizard/enums/SaleExceptionEventKindEnum.ts +2 -0
  30. package/src/retailWizard/index.ts +3 -0
  31. package/bin/identity/enums/SelfieSourceEnum.d.ts +0 -10
  32. package/bin/identity/enums/SelfieSourceEnum.js +0 -14
@@ -0,0 +1,11 @@
1
+ export declare enum BenefitFlowEnum {
2
+ TOPUPS = "TOPUPS",
3
+ BILL_PAYMENT = "BILL_PAYMENT",
4
+ CREDIT = "CREDIT",
5
+ INSURANCE = "INSURANCE",
6
+ DONATION = "DONATION",
7
+ PHARMACY = "PHARMACY",
8
+ REMITTANCE = "REMITTANCE",
9
+ /** Fondeo de wallet PCF con efectivo via provider externo (Equality/Passport, OpenPay, …) — spec 13. */
10
+ WALLET_FUNDING = "WALLET_FUNDING"
11
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BenefitFlowEnum = void 0;
4
+ var BenefitFlowEnum;
5
+ (function (BenefitFlowEnum) {
6
+ BenefitFlowEnum["TOPUPS"] = "TOPUPS";
7
+ BenefitFlowEnum["BILL_PAYMENT"] = "BILL_PAYMENT";
8
+ BenefitFlowEnum["CREDIT"] = "CREDIT";
9
+ BenefitFlowEnum["INSURANCE"] = "INSURANCE";
10
+ BenefitFlowEnum["DONATION"] = "DONATION";
11
+ BenefitFlowEnum["PHARMACY"] = "PHARMACY";
12
+ BenefitFlowEnum["REMITTANCE"] = "REMITTANCE";
13
+ /** Fondeo de wallet PCF con efectivo via provider externo (Equality/Passport, OpenPay, …) — spec 13. */
14
+ BenefitFlowEnum["WALLET_FUNDING"] = "WALLET_FUNDING";
15
+ })(BenefitFlowEnum || (exports.BenefitFlowEnum = BenefitFlowEnum = {}));
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Rol RBAC mínimo que puede modificar un parámetro (RBAC a nivel de parámetro, modelo-datos §8).
3
+ * `retailer_admin` = "Admin VentasLuga" de M6 §8. Valores = identificadores de rol de RBAC F0.
4
+ * TD-004: confirmar mapeo super_admin ↔ platform_super_admin con el naming real de F0.
5
+ * @enum {string}
6
+ */
7
+ export declare enum ModifiableByRoleEnum {
8
+ SUPER_ADMIN = "super_admin",
9
+ SOFOM_ADMIN = "sofom_admin",
10
+ RETAILER_ADMIN = "retailer_admin"
11
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModifiableByRoleEnum = void 0;
4
+ /**
5
+ * Rol RBAC mínimo que puede modificar un parámetro (RBAC a nivel de parámetro, modelo-datos §8).
6
+ * `retailer_admin` = "Admin VentasLuga" de M6 §8. Valores = identificadores de rol de RBAC F0.
7
+ * TD-004: confirmar mapeo super_admin ↔ platform_super_admin con el naming real de F0.
8
+ * @enum {string}
9
+ */
10
+ var ModifiableByRoleEnum;
11
+ (function (ModifiableByRoleEnum) {
12
+ ModifiableByRoleEnum["SUPER_ADMIN"] = "super_admin";
13
+ ModifiableByRoleEnum["SOFOM_ADMIN"] = "sofom_admin";
14
+ ModifiableByRoleEnum["RETAILER_ADMIN"] = "retailer_admin";
15
+ })(ModifiableByRoleEnum || (exports.ModifiableByRoleEnum = ModifiableByRoleEnum = {}));
@@ -1,10 +1,19 @@
1
1
  import { DeviceVariantStatusEnum } from './enums/DeviceVariantStatusEnum';
2
+ import { CurrencyId } from '../currency';
2
3
  export declare class DeviceVariantResponseDto {
3
4
  id: string;
4
5
  model: string;
5
6
  color: string;
6
7
  storage: string;
7
8
  price: number;
9
+ /**
10
+ * Multi-moneda (DEC-011): moneda en la que viene expresado `price` — resuelta server-side del
11
+ * scope del comprador, NUNCA la elige el front. Optional: el catálogo de backoffice (que
12
+ * muestra TODAS las variantes sin resolver una sola moneda) no lo setea; el catálogo público sí,
13
+ * siempre. El front de la app DEBE mostrarlo junto al precio y usarlo para validar saldo antes
14
+ * de dejar avanzar al checkout (evita que el usuario llegue al pago y falle recién ahí).
15
+ */
16
+ currencyId?: CurrencyId;
8
17
  stock: number;
9
18
  /**
10
19
  * Presigned GET URL (S3, expira en 1h) — nunca la URL directa del bucket.
@@ -0,0 +1,17 @@
1
+ import { CurrencyId } from '../../currency/enums/CurrencyId';
2
+ /**
3
+ * Comisión que cobra un punto de cash-in (lo que el lambda MUESTRA, no cobra).
4
+ * - GreenDot (US): representativo por cadena → `fixed` + `cap` (cada tienda cobra hasta el tope).
5
+ * - Passport (MX): por red → `fixed` + `percentage`.
6
+ * Response DTO — sin decoradores de validación.
7
+ */
8
+ export declare class CashInFeeDto {
9
+ /** Comisión fija, en la moneda del país. */
10
+ fixed?: number;
11
+ /** Porcentaje del monto depositado (0–100). */
12
+ percentage?: number;
13
+ /** Tope máximo de comisión (GreenDot: el asociado cobra hasta este cap). */
14
+ cap?: number;
15
+ /** Moneda del fee: USD (GreenDot) | MXN (Passport). */
16
+ currency: CurrencyId;
17
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CashInFeeDto = void 0;
4
+ /**
5
+ * Comisión que cobra un punto de cash-in (lo que el lambda MUESTRA, no cobra).
6
+ * - GreenDot (US): representativo por cadena → `fixed` + `cap` (cada tienda cobra hasta el tope).
7
+ * - Passport (MX): por red → `fixed` + `percentage`.
8
+ * Response DTO — sin decoradores de validación.
9
+ */
10
+ class CashInFeeDto {
11
+ }
12
+ exports.CashInFeeDto = CashInFeeDto;
@@ -0,0 +1,22 @@
1
+ import { MfaMethodEnum } from '../enums/MfaMethodEnum';
2
+ /**
3
+ * Body del POST /auth/resend-otp (público, anónimo). DEC-RBAC-054.
4
+ * Reenvía el OTP del login re-disparando el challenge real CUSTOM_AUTH (EMAIL_OTP) para la
5
+ * identidad SIN password. `tenantId` obligatorio (DEC-064 — el picker ya lo resolvió, NO "solo email").
6
+ * El email se normaliza lowercase server-side. Postura anti-enumeración: respuesta 200 genérica
7
+ * siempre, sin filtrar existencia (ver AuthLoginManager.resendChallengeOtp).
8
+ */
9
+ export declare class ResendOtpRequest {
10
+ email: string;
11
+ tenantId: string;
12
+ }
13
+ /**
14
+ * Respuesta del resend-otp. `session`/`mfaMethod` frescos del nuevo challenge CUSTOM_AUTH.
15
+ * Plain sin validators (no validamos lo que mandamos al cliente — fiado-validation-and-dtos § 7).
16
+ * Ambos opcionales: en los caminos de rechazo silencioso (anti-enumeración) o ramas sin CUSTOM_AUTH
17
+ * el server responde 200 genérico sin session ni método.
18
+ */
19
+ export interface ResendOtpResponse {
20
+ session?: string;
21
+ mfaMethod?: MfaMethodEnum;
22
+ }
@@ -0,0 +1,36 @@
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.ResendOtpRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * Body del POST /auth/resend-otp (público, anónimo). DEC-RBAC-054.
17
+ * Reenvía el OTP del login re-disparando el challenge real CUSTOM_AUTH (EMAIL_OTP) para la
18
+ * identidad SIN password. `tenantId` obligatorio (DEC-064 — el picker ya lo resolvió, NO "solo email").
19
+ * El email se normaliza lowercase server-side. Postura anti-enumeración: respuesta 200 genérica
20
+ * siempre, sin filtrar existencia (ver AuthLoginManager.resendChallengeOtp).
21
+ */
22
+ class ResendOtpRequest {
23
+ }
24
+ exports.ResendOtpRequest = ResendOtpRequest;
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.IsEmail)(),
28
+ (0, class_validator_1.IsNotEmpty)(),
29
+ __metadata("design:type", String)
30
+ ], ResendOtpRequest.prototype, "email", void 0);
31
+ __decorate([
32
+ (0, class_transformer_1.Expose)(),
33
+ (0, class_validator_1.IsString)(),
34
+ (0, class_validator_1.IsNotEmpty)(),
35
+ __metadata("design:type", String)
36
+ ], ResendOtpRequest.prototype, "tenantId", void 0);
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Body del POST /self-register/resend-otp (público, anónimo). DEC-RBAC-054.
3
+ * Re-envía el OTP del autoregistro (mecanismo messages-business, NO Cognito) tras validar un
4
+ * `pending` existente. Misma postura anti-enumeración del start. El email se normaliza lowercase
5
+ * server-side. DTO propio por endpoint (NO reusa SelfRegisterStartRequest, que exige roleId/scope/
6
+ * scopeRef, ni SelfRegisterVerifyOtpRequest, que exige otp).
7
+ */
8
+ export declare class ResendSelfRegisterOtpRequest {
9
+ tenantId: string;
10
+ email: string;
11
+ }
@@ -0,0 +1,36 @@
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.ResendSelfRegisterOtpRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * Body del POST /self-register/resend-otp (público, anónimo). DEC-RBAC-054.
17
+ * Re-envía el OTP del autoregistro (mecanismo messages-business, NO Cognito) tras validar un
18
+ * `pending` existente. Misma postura anti-enumeración del start. El email se normaliza lowercase
19
+ * server-side. DTO propio por endpoint (NO reusa SelfRegisterStartRequest, que exige roleId/scope/
20
+ * scopeRef, ni SelfRegisterVerifyOtpRequest, que exige otp).
21
+ */
22
+ class ResendSelfRegisterOtpRequest {
23
+ }
24
+ exports.ResendSelfRegisterOtpRequest = ResendSelfRegisterOtpRequest;
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.IsString)(),
28
+ (0, class_validator_1.IsNotEmpty)(),
29
+ __metadata("design:type", String)
30
+ ], ResendSelfRegisterOtpRequest.prototype, "tenantId", void 0);
31
+ __decorate([
32
+ (0, class_transformer_1.Expose)(),
33
+ (0, class_validator_1.IsEmail)(),
34
+ (0, class_validator_1.IsNotEmpty)(),
35
+ __metadata("design:type", String)
36
+ ], ResendSelfRegisterOtpRequest.prototype, "email", void 0);
@@ -0,0 +1,16 @@
1
+ /**
2
+ * POST /backoffice/exceptions/:exceptionId/notes — agrega una nota a la bitácora de la excepción.
3
+ * SureKeep Fase 3 — pista Retail.
4
+ *
5
+ * Es la conversación de seguimiento que la pantalla dibuja bajo la ficha: pedir evidencia, dejar
6
+ * contexto, registrar lo que se habló por fuera. **No cambia el estado** — para eso están `/review`,
7
+ * `/resolve` y `/apply`.
8
+ *
9
+ * El `body` es OBLIGATORIO: una nota vacía no es una nota, es ruido en un registro auditable.
10
+ *
11
+ * A diferencia de las demás mutaciones de la excepción, esta se puede agregar en CUALQUIER estado,
12
+ * incluso después de resuelta: cerrar el caso no cierra la conversación sobre él.
13
+ */
14
+ export declare class AddSaleExceptionNoteRequest {
15
+ body: string;
16
+ }
@@ -0,0 +1,37 @@
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.AddSaleExceptionNoteRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * POST /backoffice/exceptions/:exceptionId/notes — agrega una nota a la bitácora de la excepción.
17
+ * SureKeep Fase 3 — pista Retail.
18
+ *
19
+ * Es la conversación de seguimiento que la pantalla dibuja bajo la ficha: pedir evidencia, dejar
20
+ * contexto, registrar lo que se habló por fuera. **No cambia el estado** — para eso están `/review`,
21
+ * `/resolve` y `/apply`.
22
+ *
23
+ * El `body` es OBLIGATORIO: una nota vacía no es una nota, es ruido en un registro auditable.
24
+ *
25
+ * A diferencia de las demás mutaciones de la excepción, esta se puede agregar en CUALQUIER estado,
26
+ * incluso después de resuelta: cerrar el caso no cierra la conversación sobre él.
27
+ */
28
+ class AddSaleExceptionNoteRequest {
29
+ }
30
+ exports.AddSaleExceptionNoteRequest = AddSaleExceptionNoteRequest;
31
+ __decorate([
32
+ (0, class_transformer_1.Expose)(),
33
+ (0, class_validator_1.IsString)(),
34
+ (0, class_validator_1.MinLength)(3),
35
+ (0, class_validator_1.MaxLength)(1000),
36
+ __metadata("design:type", String)
37
+ ], AddSaleExceptionNoteRequest.prototype, "body", void 0);
@@ -0,0 +1,16 @@
1
+ /**
2
+ * POST /backoffice/exceptions/:exceptionId/apply — marca la excepción como APLICADA
3
+ * (`APPROVED → APPLIED`). SureKeep Fase 3 — pista Retail.
4
+ *
5
+ * 🔴 **DEC-034 — esto NO muta la venta ni re-liquida comisión.** Es marca de estado + entrada de
6
+ * bitácora, nada más. `APPROVED` significa «el Admin VL lo autorizó» y `APPLIED` «alguien ya lo
7
+ * ejecutó por fuera»: el cierre del circuito es manual hasta que exista `SaleAmendedV1` (F4). Sin este
8
+ * endpoint, toda excepción aprobada queda para siempre en `APPROVED` y la bandeja no distingue lo
9
+ * pendiente de lo hecho.
10
+ *
11
+ * La `note` es OPCIONAL: describe CÓMO se aplicó (folio de la nota de crédito, ticket del ajuste).
12
+ * Cuando viene, entra al timeline como evento `APPLIED`.
13
+ */
14
+ export declare class ApplySaleExceptionRequest {
15
+ note?: string;
16
+ }
@@ -0,0 +1,38 @@
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.ApplySaleExceptionRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * POST /backoffice/exceptions/:exceptionId/apply — marca la excepción como APLICADA
17
+ * (`APPROVED → APPLIED`). SureKeep Fase 3 — pista Retail.
18
+ *
19
+ * 🔴 **DEC-034 — esto NO muta la venta ni re-liquida comisión.** Es marca de estado + entrada de
20
+ * bitácora, nada más. `APPROVED` significa «el Admin VL lo autorizó» y `APPLIED` «alguien ya lo
21
+ * ejecutó por fuera»: el cierre del circuito es manual hasta que exista `SaleAmendedV1` (F4). Sin este
22
+ * endpoint, toda excepción aprobada queda para siempre en `APPROVED` y la bandeja no distingue lo
23
+ * pendiente de lo hecho.
24
+ *
25
+ * La `note` es OPCIONAL: describe CÓMO se aplicó (folio de la nota de crédito, ticket del ajuste).
26
+ * Cuando viene, entra al timeline como evento `APPLIED`.
27
+ */
28
+ class ApplySaleExceptionRequest {
29
+ }
30
+ exports.ApplySaleExceptionRequest = ApplySaleExceptionRequest;
31
+ __decorate([
32
+ (0, class_transformer_1.Expose)(),
33
+ (0, class_validator_1.IsOptional)(),
34
+ (0, class_validator_1.IsString)(),
35
+ (0, class_validator_1.MinLength)(3),
36
+ (0, class_validator_1.MaxLength)(1000),
37
+ __metadata("design:type", String)
38
+ ], ApplySaleExceptionRequest.prototype, "note", void 0);
@@ -0,0 +1,14 @@
1
+ /**
2
+ * POST /backoffice/exceptions/:exceptionId/review — el Admin VL TOMA la excepción (`NEW → IN_REVIEW`).
3
+ * SureKeep Fase 3 — pista Retail.
4
+ *
5
+ * No es un veredicto: solo marca que alguien se hizo cargo, para que dos Admin VL no trabajen el
6
+ * mismo caso. La `note` es OPCIONAL — tomar un caso no exige explicar nada; obligarlo solo agregaría
7
+ * fricción a un click de bandeja. Cuando viene, entra al timeline como evento `REVIEW`.
8
+ *
9
+ * **Idempotente** con el guard local (`IIdempotencyGuard` + `SureKeepSharedIdempotency_GT`) y, además,
10
+ * la transición solo sale de `NEW`: un doble click devuelve `409`.
11
+ */
12
+ export declare class ReviewSaleExceptionRequest {
13
+ note?: string;
14
+ }
@@ -0,0 +1,36 @@
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.ReviewSaleExceptionRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * POST /backoffice/exceptions/:exceptionId/review — el Admin VL TOMA la excepción (`NEW → IN_REVIEW`).
17
+ * SureKeep Fase 3 — pista Retail.
18
+ *
19
+ * No es un veredicto: solo marca que alguien se hizo cargo, para que dos Admin VL no trabajen el
20
+ * mismo caso. La `note` es OPCIONAL — tomar un caso no exige explicar nada; obligarlo solo agregaría
21
+ * fricción a un click de bandeja. Cuando viene, entra al timeline como evento `REVIEW`.
22
+ *
23
+ * **Idempotente** con el guard local (`IIdempotencyGuard` + `SureKeepSharedIdempotency_GT`) y, además,
24
+ * la transición solo sale de `NEW`: un doble click devuelve `409`.
25
+ */
26
+ class ReviewSaleExceptionRequest {
27
+ }
28
+ exports.ReviewSaleExceptionRequest = ReviewSaleExceptionRequest;
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ (0, class_validator_1.IsOptional)(),
32
+ (0, class_validator_1.IsString)(),
33
+ (0, class_validator_1.MinLength)(3),
34
+ (0, class_validator_1.MaxLength)(1000),
35
+ __metadata("design:type", String)
36
+ ], ReviewSaleExceptionRequest.prototype, "note", void 0);
@@ -26,6 +26,14 @@ export interface BackofficeSalesKpisResponse {
26
26
  deltaVsYesterdayPct: number | null;
27
27
  /** Monto del MISMO día de la semana pasada, en centavos — el baseline honesto contra la estacionalidad. */
28
28
  baselineSameWeekdayCents: number;
29
+ /**
30
+ * Piezas del MISMO día de la semana pasada — la otra mitad del baseline.
31
+ *
32
+ * 🔴 Sin esto el ticket promedio de hace 7 días es **inderivable**: el monto solo no alcanza, y el
33
+ * Home lo necesita para su delta de ticket. Es el mismo par que `soldTodayCents` / `unitsToday`
34
+ * forman para hoy.
35
+ */
36
+ baselineSameWeekdayUnits: number;
29
37
  mix: SalesFinancierMixEntry[];
30
38
  /** Meta del día del retailer, en centavos. `null` mientras no exista la tabla de metas. */
31
39
  goalCents: number | null;
@@ -3,6 +3,7 @@
3
3
  * dibuja bajo la ficha). SureKeep Fase 3 — pista Retail.
4
4
  *
5
5
  * REQUEST - El alta: quién la levantó y por qué.
6
+ * REVIEW - Un Admin VL la TOMÓ para revisarla (`NEW → IN_REVIEW`). No es un veredicto.
6
7
  * NOTE - Nota de seguimiento (pide evidencia, deja contexto).
7
8
  * APPROVAL - Queda aprobada.
8
9
  * REJECTION - Queda rechazada.
@@ -10,6 +11,7 @@
10
11
  */
11
12
  export declare enum SaleExceptionEventKindEnum {
12
13
  REQUEST = "REQUEST",
14
+ REVIEW = "REVIEW",
13
15
  NOTE = "NOTE",
14
16
  APPROVAL = "APPROVAL",
15
17
  REJECTION = "REJECTION",
@@ -6,6 +6,7 @@ exports.SaleExceptionEventKindEnum = void 0;
6
6
  * dibuja bajo la ficha). SureKeep Fase 3 — pista Retail.
7
7
  *
8
8
  * REQUEST - El alta: quién la levantó y por qué.
9
+ * REVIEW - Un Admin VL la TOMÓ para revisarla (`NEW → IN_REVIEW`). No es un veredicto.
9
10
  * NOTE - Nota de seguimiento (pide evidencia, deja contexto).
10
11
  * APPROVAL - Queda aprobada.
11
12
  * REJECTION - Queda rechazada.
@@ -14,6 +15,7 @@ exports.SaleExceptionEventKindEnum = void 0;
14
15
  var SaleExceptionEventKindEnum;
15
16
  (function (SaleExceptionEventKindEnum) {
16
17
  SaleExceptionEventKindEnum["REQUEST"] = "REQUEST";
18
+ SaleExceptionEventKindEnum["REVIEW"] = "REVIEW";
17
19
  SaleExceptionEventKindEnum["NOTE"] = "NOTE";
18
20
  SaleExceptionEventKindEnum["APPROVAL"] = "APPROVAL";
19
21
  SaleExceptionEventKindEnum["REJECTION"] = "REJECTION";
@@ -84,7 +84,10 @@ export * from './dtos/SaleException';
84
84
  export * from './dtos/SalesReportDefinition';
85
85
  export * from './dtos/SalesReportRun';
86
86
  export * from './dtos/requests/CreateSaleExceptionRequest';
87
+ export * from './dtos/requests/ReviewSaleExceptionRequest';
87
88
  export * from './dtos/requests/ResolveSaleExceptionRequest';
89
+ export * from './dtos/requests/ApplySaleExceptionRequest';
90
+ export * from './dtos/requests/AddSaleExceptionNoteRequest';
88
91
  export * from './dtos/requests/RunSalesReportRequest';
89
92
  export * from './dtos/requests/BackofficeCancelSaleRequest';
90
93
  export * from './dtos/responses/BackofficeSalesStatsResponse';
@@ -111,7 +111,10 @@ __exportStar(require("./dtos/SalesReportDefinition"), exports);
111
111
  __exportStar(require("./dtos/SalesReportRun"), exports);
112
112
  // Requests
113
113
  __exportStar(require("./dtos/requests/CreateSaleExceptionRequest"), exports);
114
+ __exportStar(require("./dtos/requests/ReviewSaleExceptionRequest"), exports);
114
115
  __exportStar(require("./dtos/requests/ResolveSaleExceptionRequest"), exports);
116
+ __exportStar(require("./dtos/requests/ApplySaleExceptionRequest"), exports);
117
+ __exportStar(require("./dtos/requests/AddSaleExceptionNoteRequest"), exports);
115
118
  __exportStar(require("./dtos/requests/RunSalesReportRequest"), exports);
116
119
  __exportStar(require("./dtos/requests/BackofficeCancelSaleRequest"), exports);
117
120
  // Responses
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.282.0",
3
+ "version": "3.284.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -1,4 +1,5 @@
1
1
  import { DeviceVariantStatusEnum } from './enums/DeviceVariantStatusEnum';
2
+ import { CurrencyId } from '../currency';
2
3
 
3
4
  export class DeviceVariantResponseDto {
4
5
  id!: string;
@@ -6,6 +7,14 @@ export class DeviceVariantResponseDto {
6
7
  color!: string;
7
8
  storage!: string;
8
9
  price!: number;
10
+ /**
11
+ * Multi-moneda (DEC-011): moneda en la que viene expresado `price` — resuelta server-side del
12
+ * scope del comprador, NUNCA la elige el front. Optional: el catálogo de backoffice (que
13
+ * muestra TODAS las variantes sin resolver una sola moneda) no lo setea; el catálogo público sí,
14
+ * siempre. El front de la app DEBE mostrarlo junto al precio y usarlo para validar saldo antes
15
+ * de dejar avanzar al checkout (evita que el usuario llegue al pago y falle recién ahí).
16
+ */
17
+ currencyId?: CurrencyId;
9
18
  stock!: number;
10
19
  /**
11
20
  * Presigned GET URL (S3, expira en 1h) — nunca la URL directa del bucket.
@@ -0,0 +1,23 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsString, MaxLength, MinLength } from 'class-validator';
3
+
4
+ /**
5
+ * POST /backoffice/exceptions/:exceptionId/notes — agrega una nota a la bitácora de la excepción.
6
+ * SureKeep Fase 3 — pista Retail.
7
+ *
8
+ * Es la conversación de seguimiento que la pantalla dibuja bajo la ficha: pedir evidencia, dejar
9
+ * contexto, registrar lo que se habló por fuera. **No cambia el estado** — para eso están `/review`,
10
+ * `/resolve` y `/apply`.
11
+ *
12
+ * El `body` es OBLIGATORIO: una nota vacía no es una nota, es ruido en un registro auditable.
13
+ *
14
+ * A diferencia de las demás mutaciones de la excepción, esta se puede agregar en CUALQUIER estado,
15
+ * incluso después de resuelta: cerrar el caso no cierra la conversación sobre él.
16
+ */
17
+ export class AddSaleExceptionNoteRequest {
18
+ @Expose()
19
+ @IsString()
20
+ @MinLength(3)
21
+ @MaxLength(1000)
22
+ body!: string;
23
+ }
@@ -0,0 +1,24 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsOptional, IsString, MaxLength, MinLength } from 'class-validator';
3
+
4
+ /**
5
+ * POST /backoffice/exceptions/:exceptionId/apply — marca la excepción como APLICADA
6
+ * (`APPROVED → APPLIED`). SureKeep Fase 3 — pista Retail.
7
+ *
8
+ * 🔴 **DEC-034 — esto NO muta la venta ni re-liquida comisión.** Es marca de estado + entrada de
9
+ * bitácora, nada más. `APPROVED` significa «el Admin VL lo autorizó» y `APPLIED` «alguien ya lo
10
+ * ejecutó por fuera»: el cierre del circuito es manual hasta que exista `SaleAmendedV1` (F4). Sin este
11
+ * endpoint, toda excepción aprobada queda para siempre en `APPROVED` y la bandeja no distingue lo
12
+ * pendiente de lo hecho.
13
+ *
14
+ * La `note` es OPCIONAL: describe CÓMO se aplicó (folio de la nota de crédito, ticket del ajuste).
15
+ * Cuando viene, entra al timeline como evento `APPLIED`.
16
+ */
17
+ export class ApplySaleExceptionRequest {
18
+ @Expose()
19
+ @IsOptional()
20
+ @IsString()
21
+ @MinLength(3)
22
+ @MaxLength(1000)
23
+ note?: string;
24
+ }
@@ -0,0 +1,22 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsOptional, IsString, MaxLength, MinLength } from 'class-validator';
3
+
4
+ /**
5
+ * POST /backoffice/exceptions/:exceptionId/review — el Admin VL TOMA la excepción (`NEW → IN_REVIEW`).
6
+ * SureKeep Fase 3 — pista Retail.
7
+ *
8
+ * No es un veredicto: solo marca que alguien se hizo cargo, para que dos Admin VL no trabajen el
9
+ * mismo caso. La `note` es OPCIONAL — tomar un caso no exige explicar nada; obligarlo solo agregaría
10
+ * fricción a un click de bandeja. Cuando viene, entra al timeline como evento `REVIEW`.
11
+ *
12
+ * **Idempotente** con el guard local (`IIdempotencyGuard` + `SureKeepSharedIdempotency_GT`) y, además,
13
+ * la transición solo sale de `NEW`: un doble click devuelve `409`.
14
+ */
15
+ export class ReviewSaleExceptionRequest {
16
+ @Expose()
17
+ @IsOptional()
18
+ @IsString()
19
+ @MinLength(3)
20
+ @MaxLength(1000)
21
+ note?: string;
22
+ }
@@ -28,6 +28,14 @@ export interface BackofficeSalesKpisResponse {
28
28
  deltaVsYesterdayPct: number | null;
29
29
  /** Monto del MISMO día de la semana pasada, en centavos — el baseline honesto contra la estacionalidad. */
30
30
  baselineSameWeekdayCents: number;
31
+ /**
32
+ * Piezas del MISMO día de la semana pasada — la otra mitad del baseline.
33
+ *
34
+ * 🔴 Sin esto el ticket promedio de hace 7 días es **inderivable**: el monto solo no alcanza, y el
35
+ * Home lo necesita para su delta de ticket. Es el mismo par que `soldTodayCents` / `unitsToday`
36
+ * forman para hoy.
37
+ */
38
+ baselineSameWeekdayUnits: number;
31
39
  mix: SalesFinancierMixEntry[];
32
40
  /** Meta del día del retailer, en centavos. `null` mientras no exista la tabla de metas. */
33
41
  goalCents: number | null;
@@ -3,6 +3,7 @@
3
3
  * dibuja bajo la ficha). SureKeep Fase 3 — pista Retail.
4
4
  *
5
5
  * REQUEST - El alta: quién la levantó y por qué.
6
+ * REVIEW - Un Admin VL la TOMÓ para revisarla (`NEW → IN_REVIEW`). No es un veredicto.
6
7
  * NOTE - Nota de seguimiento (pide evidencia, deja contexto).
7
8
  * APPROVAL - Queda aprobada.
8
9
  * REJECTION - Queda rechazada.
@@ -10,6 +11,7 @@
10
11
  */
11
12
  export enum SaleExceptionEventKindEnum {
12
13
  REQUEST = 'REQUEST',
14
+ REVIEW = 'REVIEW',
13
15
  NOTE = 'NOTE',
14
16
  APPROVAL = 'APPROVAL',
15
17
  REJECTION = 'REJECTION',
@@ -104,7 +104,10 @@ export * from './dtos/SalesReportRun';
104
104
 
105
105
  // Requests
106
106
  export * from './dtos/requests/CreateSaleExceptionRequest';
107
+ export * from './dtos/requests/ReviewSaleExceptionRequest';
107
108
  export * from './dtos/requests/ResolveSaleExceptionRequest';
109
+ export * from './dtos/requests/ApplySaleExceptionRequest';
110
+ export * from './dtos/requests/AddSaleExceptionNoteRequest';
108
111
  export * from './dtos/requests/RunSalesReportRequest';
109
112
  export * from './dtos/requests/BackofficeCancelSaleRequest';
110
113
 
@@ -1,10 +0,0 @@
1
- /**
2
- * Con qué criterio se resolvió cuál archivo de S3 es la selfie del usuario.
3
- * Le dice al consumidor qué tan confiable es el match antes de mandarla a un facematch.
4
- */
5
- export declare enum SelfieSourceEnum {
6
- /** Matcheó el verificationId de la verificación vigente en People. */
7
- VERIFICATION = "VERIFICATION",
8
- /** No hubo match por verificación: se tomó el archivo de selfie más reciente del bucket. */
9
- LATEST = "LATEST"
10
- }
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SelfieSourceEnum = void 0;
4
- /**
5
- * Con qué criterio se resolvió cuál archivo de S3 es la selfie del usuario.
6
- * Le dice al consumidor qué tan confiable es el match antes de mandarla a un facematch.
7
- */
8
- var SelfieSourceEnum;
9
- (function (SelfieSourceEnum) {
10
- /** Matcheó el verificationId de la verificación vigente en People. */
11
- SelfieSourceEnum["VERIFICATION"] = "VERIFICATION";
12
- /** No hubo match por verificación: se tomó el archivo de selfie más reciente del bucket. */
13
- SelfieSourceEnum["LATEST"] = "LATEST";
14
- })(SelfieSourceEnum || (exports.SelfieSourceEnum = SelfieSourceEnum = {}));