@fiado/type-kit 3.262.0 → 3.265.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 (67) hide show
  1. package/bin/collection/dtos/AuthorizeCollectionMovementRequest.d.ts +13 -0
  2. package/bin/collection/dtos/AuthorizeCollectionMovementRequest.js +57 -0
  3. package/bin/collection/dtos/AuthorizeCollectionMovementResponse.d.ts +7 -0
  4. package/bin/collection/dtos/AuthorizeCollectionMovementResponse.js +35 -0
  5. package/bin/collection/dtos/CollectRequest.d.ts +8 -0
  6. package/bin/collection/dtos/CollectRequest.js +40 -0
  7. package/bin/collection/dtos/CollectResponse.d.ts +7 -0
  8. package/bin/collection/dtos/CollectResponse.js +33 -0
  9. package/bin/collection/dtos/CollectionResultEvent.d.ts +12 -0
  10. package/bin/collection/dtos/CollectionResultEvent.js +50 -0
  11. package/bin/collection/dtos/PendingChargeDto.d.ts +19 -0
  12. package/bin/collection/dtos/PendingChargeDto.js +87 -0
  13. package/bin/collection/dtos/RegisterCollectibleRequest.d.ts +7 -0
  14. package/bin/collection/dtos/RegisterCollectibleRequest.js +36 -0
  15. package/bin/collection/enums/CollectionResultStatus.d.ts +5 -0
  16. package/bin/collection/enums/CollectionResultStatus.js +9 -0
  17. package/bin/collection/enums/CollectionState.d.ts +8 -0
  18. package/bin/collection/enums/CollectionState.js +12 -0
  19. package/bin/collection/enums/MechanismType.d.ts +5 -0
  20. package/bin/collection/enums/MechanismType.js +9 -0
  21. package/bin/collection/enums/SagaStep.d.ts +7 -0
  22. package/bin/collection/enums/SagaStep.js +11 -0
  23. package/bin/collection/index.d.ts +11 -0
  24. package/bin/collection/index.js +29 -0
  25. package/bin/index.d.ts +1 -0
  26. package/bin/index.js +6 -1
  27. package/bin/retailCatalog/dtos/requests/InventoryLensQuery.d.ts +13 -0
  28. package/bin/retailCatalog/dtos/requests/InventoryLensQuery.js +30 -0
  29. package/bin/retailCatalog/dtos/responses/InventoryLensResponse.d.ts +106 -0
  30. package/bin/retailCatalog/dtos/responses/InventoryLensResponse.js +2 -0
  31. package/bin/retailCatalog/enums/InventoryLensFilterEnum.d.ts +21 -0
  32. package/bin/retailCatalog/enums/InventoryLensFilterEnum.js +25 -0
  33. package/bin/retailCatalog/enums/InventoryLensUnavailableReasonEnum.d.ts +14 -0
  34. package/bin/retailCatalog/enums/InventoryLensUnavailableReasonEnum.js +18 -0
  35. package/bin/retailCatalog/enums/InventoryTransferReasonEnum.d.ts +11 -0
  36. package/bin/retailCatalog/enums/InventoryTransferReasonEnum.js +15 -0
  37. package/bin/retailCatalog/index.d.ts +5 -0
  38. package/bin/retailCatalog/index.js +6 -0
  39. package/bin/retailWizard/events/SaleCancelledV2.d.ts +20 -0
  40. package/bin/retailWizard/events/SaleCancelledV2.js +2 -0
  41. package/bin/retailWizard/events/SaleCompletedV2.d.ts +41 -0
  42. package/bin/retailWizard/events/SaleCompletedV2.js +2 -0
  43. package/bin/retailWizard/index.d.ts +2 -0
  44. package/bin/retailWizard/index.js +2 -0
  45. package/package.json +1 -1
  46. package/src/collection/dtos/AuthorizeCollectionMovementRequest.ts +15 -0
  47. package/src/collection/dtos/AuthorizeCollectionMovementResponse.ts +9 -0
  48. package/src/collection/dtos/CollectRequest.ts +10 -0
  49. package/src/collection/dtos/CollectResponse.ts +9 -0
  50. package/src/collection/dtos/CollectionResultEvent.ts +14 -0
  51. package/src/collection/dtos/PendingChargeDto.ts +21 -0
  52. package/src/collection/dtos/RegisterCollectibleRequest.ts +9 -0
  53. package/src/collection/enums/CollectionResultStatus.ts +5 -0
  54. package/src/collection/enums/CollectionState.ts +8 -0
  55. package/src/collection/enums/MechanismType.ts +5 -0
  56. package/src/collection/enums/SagaStep.ts +7 -0
  57. package/src/collection/index.ts +14 -0
  58. package/src/index.ts +5 -0
  59. package/src/retailCatalog/dtos/requests/InventoryLensQuery.ts +16 -0
  60. package/src/retailCatalog/dtos/responses/InventoryLensResponse.ts +123 -0
  61. package/src/retailCatalog/enums/InventoryLensFilterEnum.ts +21 -0
  62. package/src/retailCatalog/enums/InventoryLensUnavailableReasonEnum.ts +14 -0
  63. package/src/retailCatalog/enums/InventoryTransferReasonEnum.ts +11 -0
  64. package/src/retailCatalog/index.ts +7 -0
  65. package/src/retailWizard/events/SaleCancelledV2.ts +20 -0
  66. package/src/retailWizard/events/SaleCompletedV2.ts +42 -0
  67. package/src/retailWizard/index.ts +2 -0
@@ -0,0 +1,106 @@
1
+ import type { InventoryLensFilterEnum } from '../../enums/InventoryLensFilterEnum';
2
+ import type { InventoryLensUnavailableReasonEnum } from '../../enums/InventoryLensUnavailableReasonEnum';
3
+ import type { InventoryTransferReasonEnum } from '../../enums/InventoryTransferReasonEnum';
4
+ /**
5
+ * Los contadores que la pantalla «Inventario» del Admin VL pinta arriba, siempre — los cuatro viajan
6
+ * con cualquier `filter`, porque las tarjetas no cambian al cambiar de tab.
7
+ * SureKeep Fase 3 — pista Retail.
8
+ *
9
+ * ⚠️ **No hay contador de `gap`.** El mockup pinta cinco tarjetas, pero la quinta compara contra las
10
+ * ventas de LUGA (INT6) y no se puede calcular. Se omite en vez de mandar un cero mentiroso.
11
+ */
12
+ export interface InventoryLensCounters {
13
+ /** Unidades `AVAILABLE` del retailer, sumadas sobre todas las tiendas. */
14
+ totalStock: number;
15
+ /** SKUs distintos del catálogo del retailer — el subtítulo de la tarjeta de stock. */
16
+ distinctSkus: number;
17
+ /** Pares (SKU, tienda) en stock crítico. */
18
+ critical: number;
19
+ /** Pares (SKU, tienda) sin rotación o recién llegados sin venta. */
20
+ stale: number;
21
+ /** Traspasos sugeridos entre tiendas. */
22
+ transfers: number;
23
+ }
24
+ /**
25
+ * Una fila de los tabs `critical` y `stale`: un SKU **en una tienda concreta**. El mismo SKU aparece
26
+ * una vez por cada tienda donde vive, porque la acción (traspasar, promocionar) es por tienda.
27
+ */
28
+ export interface InventoryLensSkuItem {
29
+ sku: string;
30
+ productId: string;
31
+ brand: string;
32
+ model: string;
33
+ capacity: string;
34
+ storeId: string;
35
+ /** Unidades `AVAILABLE` de este SKU en esta tienda. */
36
+ stock: number;
37
+ /**
38
+ * Días sin vender este SKU, medidos sobre **todo el retailer** (no por tienda) — es la definición
39
+ * del mockup, donde la rotación es un atributo del producto.
40
+ *
41
+ * Si el SKU nunca se vendió no hay `soldAt` del que restar: se cae a los días desde el ingreso más
42
+ * antiguo del SKU en el retailer, que es la cota inferior honesta de «cuánto lleva sin venderse».
43
+ */
44
+ rotationDays: number;
45
+ /** Días desde que este SKU entró a ESTA tienda (el lote más reciente). */
46
+ daysSinceArrival: number;
47
+ /** Fecha ISO-8601 de ese ingreso. */
48
+ arrivedAt: string;
49
+ /** El lote llegó hace menos de 7 días. */
50
+ recentArrival: boolean;
51
+ /** `rotationDays > 90`. */
52
+ noRotation90d: boolean;
53
+ /** No hubo ninguna venta del SKU posterior a su ingreso a esta tienda. */
54
+ noSaleSinceArrival: boolean;
55
+ /** `0 < stock < 3`. */
56
+ criticalStock: boolean;
57
+ /** Unidades de este SKU vendidas hoy en esta tienda, **financiadas por SureKeep**. */
58
+ soldTodayUnits: number;
59
+ /** Precio de contado en centavos (`listPriceCents`, o `basePriceCents` si no hay lista). */
60
+ cashPriceCents: number;
61
+ }
62
+ /** Una fila del tab `transfers`: mover unidades de un SKU de una tienda con excedente a una en crítico. */
63
+ export interface InventoryLensTransferSuggestion {
64
+ sku: string;
65
+ productId: string;
66
+ brand: string;
67
+ model: string;
68
+ /** Tienda con excedente (≥ 5 unidades del SKU). */
69
+ fromStoreId: string;
70
+ fromStoreStock: number;
71
+ /** Tienda en stock crítico. */
72
+ toStoreId: string;
73
+ toStoreStock: number;
74
+ /** Unidades sugeridas: `min(floor(fromStoreStock / 3), 3)`. */
75
+ units: number;
76
+ reason: InventoryTransferReasonEnum;
77
+ }
78
+ /** Fila del lente — el tipo depende del tab pedido. */
79
+ export type InventoryLensItem = InventoryLensSkuItem | InventoryLensTransferSuggestion;
80
+ /**
81
+ * `GET /backoffice/inventory/lens?filter=…` — la pantalla «Inventario» del Portal Admin VentasLuga.
82
+ * SureKeep Fase 3 — pista Retail.
83
+ *
84
+ * Es una **lente, no un clon** (D11): se sirve de solo lectura sobre el inventario propio y ninguna
85
+ * acción de la pantalla muta nada — los botones son deep links al ERP de LUGA. El inventario lo mueve
86
+ * La Central, no SureKeep.
87
+ *
88
+ * `counters` viaja siempre, con cualquier `filter`. `items` trae el tab pedido.
89
+ */
90
+ export interface InventoryLensResponse {
91
+ /** El tab que se resolvió — eco del query, para que el front no se confunda de pestaña. */
92
+ filter: InventoryLensFilterEnum;
93
+ counters: InventoryLensCounters;
94
+ /** Filas del tab. Vacío cuando `unavailable` es `true`. */
95
+ items: InventoryLensItem[];
96
+ /**
97
+ * `true` cuando el tab **no se puede calcular** (hoy solo `filter=gap`).
98
+ *
99
+ * ⚠️ El front DEBE distinguirlo de una lista vacía normal: `unavailable: true` significa «este
100
+ * comparativo necesita la integración con La Central», no «no hay gap». Pintar un cero acá sería
101
+ * dar por buena una medición que nunca se hizo.
102
+ */
103
+ unavailable?: boolean;
104
+ /** Por qué no se pudo. Presente solo junto a `unavailable: true`. */
105
+ reason?: InventoryLensUnavailableReasonEnum;
106
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Los cuatro tabs de la pantalla «Inventario» del Portal Admin VentasLuga (B-INV).
3
+ * SureKeep Fase 3 — pista Retail.
4
+ *
5
+ * El valor viaja como query string en `GET /backoffice/inventory/lens?filter=…`, así que son las
6
+ * cadenas literales del mockup, no SCREAMING_CASE.
7
+ *
8
+ * ⚠️ `GAP` está en el contrato pero **no se puede calcular**: compara las ventas de LUGA contra las
9
+ * que financia SureKeep, y el lado LUGA llega por La Central (INT6), cuyo spec todavía no existe.
10
+ * El endpoint lo acepta y responde con `unavailable: true` — ver `InventoryLensResponse`.
11
+ */
12
+ export declare enum InventoryLensFilterEnum {
13
+ /** SKUs con stock por agotarse en una tienda. */
14
+ CRITICAL = "critical",
15
+ /** SKUs sin rotación, o recién llegados que todavía no venden. */
16
+ STALE = "stale",
17
+ /** Top vendidos en LUGA que SureKeep no financia. **No disponible** (INT6). */
18
+ GAP = "gap",
19
+ /** Desbalance de stock del mismo SKU entre tiendas. */
20
+ TRANSFERS = "transfers"
21
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InventoryLensFilterEnum = void 0;
4
+ /**
5
+ * Los cuatro tabs de la pantalla «Inventario» del Portal Admin VentasLuga (B-INV).
6
+ * SureKeep Fase 3 — pista Retail.
7
+ *
8
+ * El valor viaja como query string en `GET /backoffice/inventory/lens?filter=…`, así que son las
9
+ * cadenas literales del mockup, no SCREAMING_CASE.
10
+ *
11
+ * ⚠️ `GAP` está en el contrato pero **no se puede calcular**: compara las ventas de LUGA contra las
12
+ * que financia SureKeep, y el lado LUGA llega por La Central (INT6), cuyo spec todavía no existe.
13
+ * El endpoint lo acepta y responde con `unavailable: true` — ver `InventoryLensResponse`.
14
+ */
15
+ var InventoryLensFilterEnum;
16
+ (function (InventoryLensFilterEnum) {
17
+ /** SKUs con stock por agotarse en una tienda. */
18
+ InventoryLensFilterEnum["CRITICAL"] = "critical";
19
+ /** SKUs sin rotación, o recién llegados que todavía no venden. */
20
+ InventoryLensFilterEnum["STALE"] = "stale";
21
+ /** Top vendidos en LUGA que SureKeep no financia. **No disponible** (INT6). */
22
+ InventoryLensFilterEnum["GAP"] = "gap";
23
+ /** Desbalance de stock del mismo SKU entre tiendas. */
24
+ InventoryLensFilterEnum["TRANSFERS"] = "transfers";
25
+ })(InventoryLensFilterEnum || (exports.InventoryLensFilterEnum = InventoryLensFilterEnum = {}));
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Por qué un tab del lente de inventario no se puede calcular. SureKeep Fase 3 — pista Retail.
3
+ *
4
+ * Existe para que el front distinga **«no lo puedo calcular»** de **«calculé y dio cero»**. Un tab
5
+ * que no se puede servir viaja con `items: []` + `unavailable: true` + este motivo; sin él, el cero
6
+ * se leería como un dato bueno y la pantalla mentiría.
7
+ */
8
+ export declare enum InventoryLensUnavailableReasonEnum {
9
+ /**
10
+ * El tab necesita las ventas de LUGA, que llegan por La Central (INT6). La integración no está
11
+ * especificada todavía, así que el dato no existe — no es que valga cero.
12
+ */
13
+ INT6_NOT_AVAILABLE = "INT6_NOT_AVAILABLE"
14
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InventoryLensUnavailableReasonEnum = void 0;
4
+ /**
5
+ * Por qué un tab del lente de inventario no se puede calcular. SureKeep Fase 3 — pista Retail.
6
+ *
7
+ * Existe para que el front distinga **«no lo puedo calcular»** de **«calculé y dio cero»**. Un tab
8
+ * que no se puede servir viaja con `items: []` + `unavailable: true` + este motivo; sin él, el cero
9
+ * se leería como un dato bueno y la pantalla mentiría.
10
+ */
11
+ var InventoryLensUnavailableReasonEnum;
12
+ (function (InventoryLensUnavailableReasonEnum) {
13
+ /**
14
+ * El tab necesita las ventas de LUGA, que llegan por La Central (INT6). La integración no está
15
+ * especificada todavía, así que el dato no existe — no es que valga cero.
16
+ */
17
+ InventoryLensUnavailableReasonEnum["INT6_NOT_AVAILABLE"] = "INT6_NOT_AVAILABLE";
18
+ })(InventoryLensUnavailableReasonEnum || (exports.InventoryLensUnavailableReasonEnum = InventoryLensUnavailableReasonEnum = {}));
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Motivo por el que el lente sugiere mover unidades de una tienda a otra. SureKeep Fase 3 — pista Retail.
3
+ *
4
+ * ⚠️ El mockup rotula el motivo como «Stock crítico + demanda hoy», pero la **demanda** sale de las
5
+ * ventas de LUGA (INT6, no disponible). Acá solo se declara la mitad que sí se puede probar con
6
+ * datos propios: la tienda destino está en crítico y hay otra con excedente del mismo SKU.
7
+ */
8
+ export declare enum InventoryTransferReasonEnum {
9
+ /** El destino tiene stock crítico y el origen tiene excedente del mismo SKU. */
10
+ CRITICAL_STOCK_AT_DESTINATION = "CRITICAL_STOCK_AT_DESTINATION"
11
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InventoryTransferReasonEnum = void 0;
4
+ /**
5
+ * Motivo por el que el lente sugiere mover unidades de una tienda a otra. SureKeep Fase 3 — pista Retail.
6
+ *
7
+ * ⚠️ El mockup rotula el motivo como «Stock crítico + demanda hoy», pero la **demanda** sale de las
8
+ * ventas de LUGA (INT6, no disponible). Acá solo se declara la mitad que sí se puede probar con
9
+ * datos propios: la tienda destino está en crítico y hay otra con excedente del mismo SKU.
10
+ */
11
+ var InventoryTransferReasonEnum;
12
+ (function (InventoryTransferReasonEnum) {
13
+ /** El destino tiene stock crítico y el origen tiene excedente del mismo SKU. */
14
+ InventoryTransferReasonEnum["CRITICAL_STOCK_AT_DESTINATION"] = "CRITICAL_STOCK_AT_DESTINATION";
15
+ })(InventoryTransferReasonEnum || (exports.InventoryTransferReasonEnum = InventoryTransferReasonEnum = {}));
@@ -3,6 +3,9 @@ export * from './enums/ProductStatusEnum';
3
3
  export * from './enums/InventoryItemStatusEnum';
4
4
  export * from './enums/MdmProviderEnum';
5
5
  export * from './enums/MdmLockModeEnum';
6
+ export * from './enums/InventoryLensFilterEnum';
7
+ export * from './enums/InventoryLensUnavailableReasonEnum';
8
+ export * from './enums/InventoryTransferReasonEnum';
6
9
  export * from './constants/SkuPattern';
7
10
  export * from './validators/IsMdmCoherentConstraint';
8
11
  export * from './dtos/Product';
@@ -14,9 +17,11 @@ export * from './dtos/requests/ListProductsQuery';
14
17
  export * from './dtos/requests/RegisterInventoryRequest';
15
18
  export * from './dtos/requests/TransferInventoryRequest';
16
19
  export * from './dtos/requests/ChangeInventoryStatusRequest';
20
+ export * from './dtos/requests/InventoryLensQuery';
17
21
  export * from './dtos/responses/ProductResponse';
18
22
  export * from './dtos/responses/InventoryItemResponse';
19
23
  export * from './dtos/responses/ImportCsvFailure';
20
24
  export * from './dtos/responses/ImportCsvResult';
25
+ export * from './dtos/responses/InventoryLensResponse';
21
26
  export * from './dtos/validation/ValidateProductResponse';
22
27
  export * from './dtos/validation/ValidateInventoryResponse';
@@ -19,6 +19,10 @@ __exportStar(require("./enums/ProductStatusEnum"), exports);
19
19
  __exportStar(require("./enums/InventoryItemStatusEnum"), exports);
20
20
  __exportStar(require("./enums/MdmProviderEnum"), exports);
21
21
  __exportStar(require("./enums/MdmLockModeEnum"), exports);
22
+ // F3 — lente de inventario del Portal Admin VentasLuga
23
+ __exportStar(require("./enums/InventoryLensFilterEnum"), exports);
24
+ __exportStar(require("./enums/InventoryLensUnavailableReasonEnum"), exports);
25
+ __exportStar(require("./enums/InventoryTransferReasonEnum"), exports);
22
26
  // Constantes del dominio
23
27
  __exportStar(require("./constants/SkuPattern"), exports);
24
28
  // Validators custom
@@ -34,11 +38,13 @@ __exportStar(require("./dtos/requests/ListProductsQuery"), exports);
34
38
  __exportStar(require("./dtos/requests/RegisterInventoryRequest"), exports);
35
39
  __exportStar(require("./dtos/requests/TransferInventoryRequest"), exports);
36
40
  __exportStar(require("./dtos/requests/ChangeInventoryStatusRequest"), exports);
41
+ __exportStar(require("./dtos/requests/InventoryLensQuery"), exports);
37
42
  // Response DTOs
38
43
  __exportStar(require("./dtos/responses/ProductResponse"), exports);
39
44
  __exportStar(require("./dtos/responses/InventoryItemResponse"), exports);
40
45
  __exportStar(require("./dtos/responses/ImportCsvFailure"), exports);
41
46
  __exportStar(require("./dtos/responses/ImportCsvResult"), exports);
47
+ __exportStar(require("./dtos/responses/InventoryLensResponse"), exports);
42
48
  // Validation DTOs (shapes de endpoints privados)
43
49
  __exportStar(require("./dtos/validation/ValidateProductResponse"), exports);
44
50
  __exportStar(require("./dtos/validation/ValidateInventoryResponse"), exports);
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Emitido al cancelar una venta, en la MISMA `TransactWriteItems` de la cancelación.
3
+ * SureKeep Fase 3 — pista Retail.
4
+ *
5
+ * **La V1 NO se toca** (tiene consumers en producción). La V2 se emite además y es la que consume el
6
+ * motor de comisiones, que necesita el `sellerRetailUserId` para saber a QUIÉN revertirle la comisión
7
+ * y el `soldAt` para saber en qué CORTE se había liquidado.
8
+ *
9
+ * ⚠️ `tenantId` NO va en el payload: viaja en el sobre del outbox.
10
+ */
11
+ export interface SaleCancelledV2 {
12
+ saleId: string;
13
+ /** A quién se le revierte la comisión. */
14
+ sellerRetailUserId: string;
15
+ /** Fecha de la venta ORIGINAL — identifica el corte en el que se había liquidado. */
16
+ soldAt: string;
17
+ reason: string;
18
+ cancelledAt: string;
19
+ occurredAt: string;
20
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,41 @@
1
+ import type { SaleTypeEnum } from '../enums/SaleTypeEnum';
2
+ import type { ExternalProviderEnum } from '../enums/ExternalProviderEnum';
3
+ /**
4
+ * Emitido al cerrar una venta, en la MISMA `TransactWriteItems` del cierre (patrón Outbox).
5
+ * SureKeep Fase 3 — pista Retail.
6
+ *
7
+ * **La V1 NO se toca:** ya tiene consumers en producción (La Central, datalake). La V2 se emite
8
+ * ADEMÁS, en la misma transacción, y es la que consume el motor de comisiones — que necesita saber
9
+ * QUIÉN vendió (`sellerRetailUserId`), CÓMO se financió (`type` + `externalProvider`) y de qué MARCA
10
+ * era el equipo (`brand`), tres datos que la V1 no lleva.
11
+ *
12
+ * ⚠️ `tenantId` NO va en el payload: ya viaja en el sobre del outbox (`OutboxEventPublisher`).
13
+ * Duplicarlo abriría la puerta a que los dos discrepen.
14
+ *
15
+ * ⚠️ NO hay `lines[]`: una `RetailSale` es de UN solo producto (D16) y se comisiona la venta, no un
16
+ * renglón. Modelarlo como array sugeriría un carrito que el wizard no tiene.
17
+ */
18
+ export interface SaleCompletedV2 {
19
+ saleId: string;
20
+ folio: string;
21
+ retailerId: string;
22
+ storeId: string;
23
+ /** Quién vendió — el eje del cálculo de comisión. Es lo que más falta en la V1. */
24
+ sellerRetailUserId: string;
25
+ retailCustomerId: string;
26
+ sku: string;
27
+ /** Marca del equipo, del snapshot congelado al cerrar. `null` si no se pudo resolver. */
28
+ brand: string | null;
29
+ imei: string | null;
30
+ /** Lo COBRADO en caja. En contado == precio del equipo; en CREDIT es SOLO el enganche. */
31
+ amountCents: number;
32
+ /** Precio de lista del equipo — la base de comisión. `null` en ventas sin el dato. */
33
+ equipmentPriceCents: number | null;
34
+ downPaymentCents: number | null;
35
+ creditId: string | null;
36
+ type: SaleTypeEnum;
37
+ /** Proveedor externo cuando `type = EXTERNAL_REFERRAL`; `null` en contado y crédito propio. */
38
+ externalProvider: ExternalProviderEnum | null;
39
+ soldAt: string;
40
+ occurredAt: string;
41
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -92,4 +92,6 @@ export * from './dtos/responses/BackofficeSalesKpisResponse';
92
92
  export * from './dtos/responses/BackofficeReportsResponse';
93
93
  export * from './events/SaleCompletedV1';
94
94
  export * from './events/SaleCancelledV1';
95
+ export * from './events/SaleCompletedV2';
96
+ export * from './events/SaleCancelledV2';
95
97
  export * from './events/SessionExpiredV1';
@@ -121,4 +121,6 @@ __exportStar(require("./dtos/responses/BackofficeReportsResponse"), exports);
121
121
  // Contratos de eventos (PascalCase + sufijo V1)
122
122
  __exportStar(require("./events/SaleCompletedV1"), exports);
123
123
  __exportStar(require("./events/SaleCancelledV1"), exports);
124
+ __exportStar(require("./events/SaleCompletedV2"), exports);
125
+ __exportStar(require("./events/SaleCancelledV2"), exports);
124
126
  __exportStar(require("./events/SessionExpiredV1"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.262.0",
3
+ "version": "3.265.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,15 @@
1
+ import { IsString, IsInt, IsEnum, IsOptional } from 'class-validator';
2
+ import { MechanismType } from '../enums/MechanismType';
3
+ import { CurrencyId } from '../../currency/enums/CurrencyId';
4
+
5
+ export class AuthorizeCollectionMovementRequest {
6
+ @IsString() executionId!: string; // idempotencia (@IdempotencyController)
7
+ @IsString() directoryId!: string;
8
+ @IsString() provider!: string; // lo pone el motor desde la config
9
+ @IsEnum(MechanismType) mechanism!: MechanismType;
10
+ @IsInt() amount!: number; // ya convertido por el motor (FX previo)
11
+ @IsEnum(CurrencyId) currencyId!: CurrencyId;
12
+ @IsOptional() @IsString() intentId?: string;
13
+ @IsOptional() @IsString() chargeId?: string;
14
+ @IsOptional() @IsString() holdTxId?: string;
15
+ }
@@ -0,0 +1,9 @@
1
+ import { IsString, IsInt, IsEnum, IsOptional } from 'class-validator';
2
+ import { CollectionResultStatus } from '../enums/CollectionResultStatus';
3
+
4
+ export class AuthorizeCollectionMovementResponse {
5
+ @IsEnum(CollectionResultStatus) status!: CollectionResultStatus;
6
+ @IsInt() amount!: number; // reservado o cobrado
7
+ @IsOptional() @IsString() holdTxId?: string;
8
+ @IsOptional() @IsString() transactionId?: string;
9
+ }
@@ -0,0 +1,10 @@
1
+ import { IsString, IsInt } from 'class-validator';
2
+
3
+ export class CollectRequest {
4
+ @IsString() ownerRef!: string;
5
+ @IsString() tenantId!: string;
6
+ @IsString() domain!: string;
7
+ @IsString() productId!: string;
8
+ @IsString() chargeId!: string;
9
+ @IsInt() amount!: number;
10
+ }
@@ -0,0 +1,9 @@
1
+ import { IsString, IsInt, IsEnum } from 'class-validator';
2
+ import { CollectionResultStatus } from '../enums/CollectionResultStatus';
3
+
4
+ export class CollectResponse {
5
+ @IsString() intentId!: string;
6
+ @IsEnum(CollectionResultStatus) status!: CollectionResultStatus;
7
+ @IsInt() amountReserved!: number;
8
+ @IsInt() amountCollected!: number;
9
+ }
@@ -0,0 +1,14 @@
1
+ import { IsString, IsInt, IsEnum } from 'class-validator';
2
+ import { CollectionResultStatus } from '../enums/CollectionResultStatus';
3
+ import { MechanismType } from '../enums/MechanismType';
4
+
5
+ export class CollectionResultEvent {
6
+ @IsString() attemptId!: string; // dedupe en el consumidor
7
+ @IsString() intentId!: string;
8
+ @IsString() domain!: string; // routing (filter policy)
9
+ @IsString() tenantId!: string;
10
+ @IsString() chargeId!: string;
11
+ @IsEnum(CollectionResultStatus) status!: CollectionResultStatus;
12
+ @IsEnum(MechanismType) mechanism!: MechanismType;
13
+ @IsInt() amount!: number; // reservado o cobrado según mecanismo
14
+ }
@@ -0,0 +1,21 @@
1
+ import { IsString, IsInt, IsOptional, IsEnum, IsObject } from 'class-validator';
2
+ import { CurrencyId } from '../../currency/enums/CurrencyId';
3
+
4
+ export class PendingChargeDto {
5
+ @IsString() chargeId!: string; // record_id / INSTALLMENT#n
6
+ @IsString() ownerRef!: string; // directoryId
7
+ @IsString() tenantId!: string; // FIADO | surekeep
8
+ @IsString() domain!: string; // une-credit | surekeep-retail
9
+ @IsString() parentDebtId!: string; // credit_id / CREDIT#id
10
+ @IsInt() installmentNumber!: number; // coupon_number / installment_number
11
+ @IsInt() amount!: number; // centavos
12
+ @IsEnum(CurrencyId) currency!: CurrencyId;
13
+ @IsString() dueDate!: string; // ISO date
14
+ @IsString() status!: string; // estado del cargo en el dominio (normalizado por el motor)
15
+ @IsOptional() @IsInt() principalAmount?: number;
16
+ @IsOptional() @IsInt() interestAmount?: number;
17
+ @IsOptional() @IsInt() taxAmount?: number;
18
+ @IsOptional() @IsInt() outstandingBalance?: number;
19
+ @IsOptional() @IsInt() amountCollected?: number;
20
+ @IsOptional() @IsObject() metadata?: Record<string, unknown>; // por-dominio (fiado_/loanco_interest, imei…)
21
+ }
@@ -0,0 +1,9 @@
1
+ import { IsString } from 'class-validator';
2
+
3
+ export class RegisterCollectibleRequest {
4
+ @IsString() ownerRef!: string;
5
+ @IsString() tenantId!: string;
6
+ @IsString() domain!: string;
7
+ @IsString() productId!: string;
8
+ @IsString() chargeId!: string;
9
+ }
@@ -0,0 +1,5 @@
1
+ export enum CollectionResultStatus {
2
+ FULL = 'FULL',
3
+ PARTIAL = 'PARTIAL',
4
+ NONE = 'NONE',
5
+ }
@@ -0,0 +1,8 @@
1
+ export enum CollectionState {
2
+ PENDING = 'PENDING',
3
+ ATTEMPT = 'ATTEMPT',
4
+ RESERVED = 'RESERVED',
5
+ COLLECTED = 'COLLECTED',
6
+ AWAITING_FUNDS = 'AWAITING_FUNDS',
7
+ CANCELLED = 'CANCELLED',
8
+ }
@@ -0,0 +1,5 @@
1
+ export enum MechanismType {
2
+ USD_PREAUTH = 'USD_PREAUTH',
3
+ USD_DIRECT = 'USD_DIRECT',
4
+ MXN_DIRECT = 'MXN_DIRECT',
5
+ }
@@ -0,0 +1,7 @@
1
+ export enum SagaStep {
2
+ RESOLVE = 'RESOLVE',
3
+ PICK_SOURCE = 'PICK_SOURCE',
4
+ EXECUTE = 'EXECUTE',
5
+ PERSIST = 'PERSIST',
6
+ DISPATCH = 'DISPATCH',
7
+ }
@@ -0,0 +1,14 @@
1
+ // Enums
2
+ export * from './enums/MechanismType';
3
+ export * from './enums/CollectionState';
4
+ export * from './enums/SagaStep';
5
+ export * from './enums/CollectionResultStatus';
6
+
7
+ // DTOs
8
+ export * from './dtos/PendingChargeDto';
9
+ export * from './dtos/CollectRequest';
10
+ export * from './dtos/CollectResponse';
11
+ export * from './dtos/RegisterCollectibleRequest';
12
+ export * from './dtos/CollectionResultEvent';
13
+ export * from './dtos/AuthorizeCollectionMovementRequest';
14
+ export * from './dtos/AuthorizeCollectionMovementResponse';
package/src/index.ts CHANGED
@@ -153,3 +153,8 @@ export * as PhoneSales from './phoneSales';
153
153
  // (tarjetas, teléfonos, …). ExternalShippingStatus se reexporta acá desde `card/` sin moverlo,
154
154
  // para no romper a los consumidores actuales del namespace Card.
155
155
  export * as Shipping from './shipping';
156
+ // Collection: contrato del motor de cobro central (collection-engine-business) — dominio
157
+ // agnóstico de proveedores/cuentas. PendingChargeDto es la deuda genérica; CollectRequest/
158
+ // CollectResponse el contrato dominio↔motor; AuthorizeCollectionMovementRequest/Response el
159
+ // contrato motor↔processor. Ver spec 2026-07-29-motor-cobro-central-design.
160
+ export * as Collection from './collection';
@@ -0,0 +1,16 @@
1
+ import { IsEnum } from 'class-validator';
2
+ import { InventoryLensFilterEnum } from '../../enums/InventoryLensFilterEnum';
3
+
4
+ /**
5
+ * Query string de `GET /backoffice/inventory/lens`. SureKeep Fase 3 — pista Retail.
6
+ *
7
+ * `filter` es **obligatorio** a propósito: no hay un tab «por defecto» razonable, y caer a uno en
8
+ * silencio le devolvería al front una vista que no pidió. Un filtro ausente o desconocido es un 400.
9
+ *
10
+ * No lleva `retailerId`: el scope del endpoint es LEVEL_1 y el retailer se **impone desde el token**,
11
+ * nunca se acepta del request (si viajara, sería un IDOR entre cadenas).
12
+ */
13
+ export class InventoryLensQuery {
14
+ @IsEnum(InventoryLensFilterEnum)
15
+ filter!: InventoryLensFilterEnum;
16
+ }