@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.
- package/bin/collection/dtos/AuthorizeCollectionMovementRequest.d.ts +13 -0
- package/bin/collection/dtos/AuthorizeCollectionMovementRequest.js +57 -0
- package/bin/collection/dtos/AuthorizeCollectionMovementResponse.d.ts +7 -0
- package/bin/collection/dtos/AuthorizeCollectionMovementResponse.js +35 -0
- package/bin/collection/dtos/CollectRequest.d.ts +8 -0
- package/bin/collection/dtos/CollectRequest.js +40 -0
- package/bin/collection/dtos/CollectResponse.d.ts +7 -0
- package/bin/collection/dtos/CollectResponse.js +33 -0
- package/bin/collection/dtos/CollectionResultEvent.d.ts +12 -0
- package/bin/collection/dtos/CollectionResultEvent.js +50 -0
- package/bin/collection/dtos/PendingChargeDto.d.ts +19 -0
- package/bin/collection/dtos/PendingChargeDto.js +87 -0
- package/bin/collection/dtos/RegisterCollectibleRequest.d.ts +7 -0
- package/bin/collection/dtos/RegisterCollectibleRequest.js +36 -0
- package/bin/collection/enums/CollectionResultStatus.d.ts +5 -0
- package/bin/collection/enums/CollectionResultStatus.js +9 -0
- package/bin/collection/enums/CollectionState.d.ts +8 -0
- package/bin/collection/enums/CollectionState.js +12 -0
- package/bin/collection/enums/MechanismType.d.ts +5 -0
- package/bin/collection/enums/MechanismType.js +9 -0
- package/bin/collection/enums/SagaStep.d.ts +7 -0
- package/bin/collection/enums/SagaStep.js +11 -0
- package/bin/collection/index.d.ts +11 -0
- package/bin/collection/index.js +29 -0
- package/bin/index.d.ts +1 -0
- package/bin/index.js +6 -1
- package/bin/retailCatalog/dtos/requests/InventoryLensQuery.d.ts +13 -0
- package/bin/retailCatalog/dtos/requests/InventoryLensQuery.js +30 -0
- package/bin/retailCatalog/dtos/responses/InventoryLensResponse.d.ts +106 -0
- package/bin/retailCatalog/dtos/responses/InventoryLensResponse.js +2 -0
- package/bin/retailCatalog/enums/InventoryLensFilterEnum.d.ts +21 -0
- package/bin/retailCatalog/enums/InventoryLensFilterEnum.js +25 -0
- package/bin/retailCatalog/enums/InventoryLensUnavailableReasonEnum.d.ts +14 -0
- package/bin/retailCatalog/enums/InventoryLensUnavailableReasonEnum.js +18 -0
- package/bin/retailCatalog/enums/InventoryTransferReasonEnum.d.ts +11 -0
- package/bin/retailCatalog/enums/InventoryTransferReasonEnum.js +15 -0
- package/bin/retailCatalog/index.d.ts +5 -0
- package/bin/retailCatalog/index.js +6 -0
- package/bin/retailWizard/events/SaleCancelledV2.d.ts +20 -0
- package/bin/retailWizard/events/SaleCancelledV2.js +2 -0
- package/bin/retailWizard/events/SaleCompletedV2.d.ts +41 -0
- package/bin/retailWizard/events/SaleCompletedV2.js +2 -0
- package/bin/retailWizard/index.d.ts +2 -0
- package/bin/retailWizard/index.js +2 -0
- package/package.json +1 -1
- package/src/collection/dtos/AuthorizeCollectionMovementRequest.ts +15 -0
- package/src/collection/dtos/AuthorizeCollectionMovementResponse.ts +9 -0
- package/src/collection/dtos/CollectRequest.ts +10 -0
- package/src/collection/dtos/CollectResponse.ts +9 -0
- package/src/collection/dtos/CollectionResultEvent.ts +14 -0
- package/src/collection/dtos/PendingChargeDto.ts +21 -0
- package/src/collection/dtos/RegisterCollectibleRequest.ts +9 -0
- package/src/collection/enums/CollectionResultStatus.ts +5 -0
- package/src/collection/enums/CollectionState.ts +8 -0
- package/src/collection/enums/MechanismType.ts +5 -0
- package/src/collection/enums/SagaStep.ts +7 -0
- package/src/collection/index.ts +14 -0
- package/src/index.ts +5 -0
- package/src/retailCatalog/dtos/requests/InventoryLensQuery.ts +16 -0
- package/src/retailCatalog/dtos/responses/InventoryLensResponse.ts +123 -0
- package/src/retailCatalog/enums/InventoryLensFilterEnum.ts +21 -0
- package/src/retailCatalog/enums/InventoryLensUnavailableReasonEnum.ts +14 -0
- package/src/retailCatalog/enums/InventoryTransferReasonEnum.ts +11 -0
- package/src/retailCatalog/index.ts +7 -0
- package/src/retailWizard/events/SaleCancelledV2.ts +20 -0
- package/src/retailWizard/events/SaleCompletedV2.ts +42 -0
- package/src/retailWizard/index.ts +2 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { InventoryLensFilterEnum } from '../../enums/InventoryLensFilterEnum';
|
|
2
|
+
import type { InventoryLensUnavailableReasonEnum } from '../../enums/InventoryLensUnavailableReasonEnum';
|
|
3
|
+
import type { InventoryTransferReasonEnum } from '../../enums/InventoryTransferReasonEnum';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Los contadores que la pantalla «Inventario» del Admin VL pinta arriba, siempre — los cuatro viajan
|
|
7
|
+
* con cualquier `filter`, porque las tarjetas no cambian al cambiar de tab.
|
|
8
|
+
* SureKeep Fase 3 — pista Retail.
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ **No hay contador de `gap`.** El mockup pinta cinco tarjetas, pero la quinta compara contra las
|
|
11
|
+
* ventas de LUGA (INT6) y no se puede calcular. Se omite en vez de mandar un cero mentiroso.
|
|
12
|
+
*/
|
|
13
|
+
export interface InventoryLensCounters {
|
|
14
|
+
/** Unidades `AVAILABLE` del retailer, sumadas sobre todas las tiendas. */
|
|
15
|
+
totalStock: number;
|
|
16
|
+
/** SKUs distintos del catálogo del retailer — el subtítulo de la tarjeta de stock. */
|
|
17
|
+
distinctSkus: number;
|
|
18
|
+
/** Pares (SKU, tienda) en stock crítico. */
|
|
19
|
+
critical: number;
|
|
20
|
+
/** Pares (SKU, tienda) sin rotación o recién llegados sin venta. */
|
|
21
|
+
stale: number;
|
|
22
|
+
/** Traspasos sugeridos entre tiendas. */
|
|
23
|
+
transfers: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Una fila de los tabs `critical` y `stale`: un SKU **en una tienda concreta**. El mismo SKU aparece
|
|
28
|
+
* una vez por cada tienda donde vive, porque la acción (traspasar, promocionar) es por tienda.
|
|
29
|
+
*/
|
|
30
|
+
export interface InventoryLensSkuItem {
|
|
31
|
+
sku: string;
|
|
32
|
+
productId: string;
|
|
33
|
+
brand: string;
|
|
34
|
+
model: string;
|
|
35
|
+
capacity: string;
|
|
36
|
+
storeId: string;
|
|
37
|
+
|
|
38
|
+
/** Unidades `AVAILABLE` de este SKU en esta tienda. */
|
|
39
|
+
stock: number;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Días sin vender este SKU, medidos sobre **todo el retailer** (no por tienda) — es la definición
|
|
43
|
+
* del mockup, donde la rotación es un atributo del producto.
|
|
44
|
+
*
|
|
45
|
+
* Si el SKU nunca se vendió no hay `soldAt` del que restar: se cae a los días desde el ingreso más
|
|
46
|
+
* antiguo del SKU en el retailer, que es la cota inferior honesta de «cuánto lleva sin venderse».
|
|
47
|
+
*/
|
|
48
|
+
rotationDays: number;
|
|
49
|
+
|
|
50
|
+
/** Días desde que este SKU entró a ESTA tienda (el lote más reciente). */
|
|
51
|
+
daysSinceArrival: number;
|
|
52
|
+
/** Fecha ISO-8601 de ese ingreso. */
|
|
53
|
+
arrivedAt: string;
|
|
54
|
+
|
|
55
|
+
/** El lote llegó hace menos de 7 días. */
|
|
56
|
+
recentArrival: boolean;
|
|
57
|
+
/** `rotationDays > 90`. */
|
|
58
|
+
noRotation90d: boolean;
|
|
59
|
+
/** No hubo ninguna venta del SKU posterior a su ingreso a esta tienda. */
|
|
60
|
+
noSaleSinceArrival: boolean;
|
|
61
|
+
/** `0 < stock < 3`. */
|
|
62
|
+
criticalStock: boolean;
|
|
63
|
+
|
|
64
|
+
/** Unidades de este SKU vendidas hoy en esta tienda, **financiadas por SureKeep**. */
|
|
65
|
+
soldTodayUnits: number;
|
|
66
|
+
|
|
67
|
+
/** Precio de contado en centavos (`listPriceCents`, o `basePriceCents` si no hay lista). */
|
|
68
|
+
cashPriceCents: number;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Una fila del tab `transfers`: mover unidades de un SKU de una tienda con excedente a una en crítico. */
|
|
72
|
+
export interface InventoryLensTransferSuggestion {
|
|
73
|
+
sku: string;
|
|
74
|
+
productId: string;
|
|
75
|
+
brand: string;
|
|
76
|
+
model: string;
|
|
77
|
+
|
|
78
|
+
/** Tienda con excedente (≥ 5 unidades del SKU). */
|
|
79
|
+
fromStoreId: string;
|
|
80
|
+
fromStoreStock: number;
|
|
81
|
+
/** Tienda en stock crítico. */
|
|
82
|
+
toStoreId: string;
|
|
83
|
+
toStoreStock: number;
|
|
84
|
+
|
|
85
|
+
/** Unidades sugeridas: `min(floor(fromStoreStock / 3), 3)`. */
|
|
86
|
+
units: number;
|
|
87
|
+
reason: InventoryTransferReasonEnum;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Fila del lente — el tipo depende del tab pedido. */
|
|
91
|
+
export type InventoryLensItem = InventoryLensSkuItem | InventoryLensTransferSuggestion;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* `GET /backoffice/inventory/lens?filter=…` — la pantalla «Inventario» del Portal Admin VentasLuga.
|
|
95
|
+
* SureKeep Fase 3 — pista Retail.
|
|
96
|
+
*
|
|
97
|
+
* Es una **lente, no un clon** (D11): se sirve de solo lectura sobre el inventario propio y ninguna
|
|
98
|
+
* acción de la pantalla muta nada — los botones son deep links al ERP de LUGA. El inventario lo mueve
|
|
99
|
+
* La Central, no SureKeep.
|
|
100
|
+
*
|
|
101
|
+
* `counters` viaja siempre, con cualquier `filter`. `items` trae el tab pedido.
|
|
102
|
+
*/
|
|
103
|
+
export interface InventoryLensResponse {
|
|
104
|
+
/** El tab que se resolvió — eco del query, para que el front no se confunda de pestaña. */
|
|
105
|
+
filter: InventoryLensFilterEnum;
|
|
106
|
+
|
|
107
|
+
counters: InventoryLensCounters;
|
|
108
|
+
|
|
109
|
+
/** Filas del tab. Vacío cuando `unavailable` es `true`. */
|
|
110
|
+
items: InventoryLensItem[];
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* `true` cuando el tab **no se puede calcular** (hoy solo `filter=gap`).
|
|
114
|
+
*
|
|
115
|
+
* ⚠️ El front DEBE distinguirlo de una lista vacía normal: `unavailable: true` significa «este
|
|
116
|
+
* comparativo necesita la integración con La Central», no «no hay gap». Pintar un cero acá sería
|
|
117
|
+
* dar por buena una medición que nunca se hizo.
|
|
118
|
+
*/
|
|
119
|
+
unavailable?: boolean;
|
|
120
|
+
|
|
121
|
+
/** Por qué no se pudo. Presente solo junto a `unavailable: true`. */
|
|
122
|
+
reason?: InventoryLensUnavailableReasonEnum;
|
|
123
|
+
}
|
|
@@ -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 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,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 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,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 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
|
+
}
|
|
@@ -4,6 +4,11 @@ export * from './enums/InventoryItemStatusEnum';
|
|
|
4
4
|
export * from './enums/MdmProviderEnum';
|
|
5
5
|
export * from './enums/MdmLockModeEnum';
|
|
6
6
|
|
|
7
|
+
// F3 — lente de inventario del Portal Admin VentasLuga
|
|
8
|
+
export * from './enums/InventoryLensFilterEnum';
|
|
9
|
+
export * from './enums/InventoryLensUnavailableReasonEnum';
|
|
10
|
+
export * from './enums/InventoryTransferReasonEnum';
|
|
11
|
+
|
|
7
12
|
// Constantes del dominio
|
|
8
13
|
export * from './constants/SkuPattern';
|
|
9
14
|
|
|
@@ -22,12 +27,14 @@ export * from './dtos/requests/ListProductsQuery';
|
|
|
22
27
|
export * from './dtos/requests/RegisterInventoryRequest';
|
|
23
28
|
export * from './dtos/requests/TransferInventoryRequest';
|
|
24
29
|
export * from './dtos/requests/ChangeInventoryStatusRequest';
|
|
30
|
+
export * from './dtos/requests/InventoryLensQuery';
|
|
25
31
|
|
|
26
32
|
// Response DTOs
|
|
27
33
|
export * from './dtos/responses/ProductResponse';
|
|
28
34
|
export * from './dtos/responses/InventoryItemResponse';
|
|
29
35
|
export * from './dtos/responses/ImportCsvFailure';
|
|
30
36
|
export * from './dtos/responses/ImportCsvResult';
|
|
37
|
+
export * from './dtos/responses/InventoryLensResponse';
|
|
31
38
|
|
|
32
39
|
// Validation DTOs (shapes de endpoints privados)
|
|
33
40
|
export * from './dtos/validation/ValidateProductResponse';
|
|
@@ -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,42 @@
|
|
|
1
|
+
import type { SaleTypeEnum } from '../enums/SaleTypeEnum';
|
|
2
|
+
import type { ExternalProviderEnum } from '../enums/ExternalProviderEnum';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Emitido al cerrar una venta, en la MISMA `TransactWriteItems` del cierre (patrón Outbox).
|
|
6
|
+
* SureKeep Fase 3 — pista Retail.
|
|
7
|
+
*
|
|
8
|
+
* **La V1 NO se toca:** ya tiene consumers en producción (La Central, datalake). La V2 se emite
|
|
9
|
+
* ADEMÁS, en la misma transacción, y es la que consume el motor de comisiones — que necesita saber
|
|
10
|
+
* QUIÉN vendió (`sellerRetailUserId`), CÓMO se financió (`type` + `externalProvider`) y de qué MARCA
|
|
11
|
+
* era el equipo (`brand`), tres datos que la V1 no lleva.
|
|
12
|
+
*
|
|
13
|
+
* ⚠️ `tenantId` NO va en el payload: ya viaja en el sobre del outbox (`OutboxEventPublisher`).
|
|
14
|
+
* Duplicarlo abriría la puerta a que los dos discrepen.
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ NO hay `lines[]`: una `RetailSale` es de UN solo producto (D16) y se comisiona la venta, no un
|
|
17
|
+
* renglón. Modelarlo como array sugeriría un carrito que el wizard no tiene.
|
|
18
|
+
*/
|
|
19
|
+
export interface SaleCompletedV2 {
|
|
20
|
+
saleId: string;
|
|
21
|
+
folio: string;
|
|
22
|
+
retailerId: string;
|
|
23
|
+
storeId: string;
|
|
24
|
+
/** Quién vendió — el eje del cálculo de comisión. Es lo que más falta en la V1. */
|
|
25
|
+
sellerRetailUserId: string;
|
|
26
|
+
retailCustomerId: string;
|
|
27
|
+
sku: string;
|
|
28
|
+
/** Marca del equipo, del snapshot congelado al cerrar. `null` si no se pudo resolver. */
|
|
29
|
+
brand: string | null;
|
|
30
|
+
imei: string | null;
|
|
31
|
+
/** Lo COBRADO en caja. En contado == precio del equipo; en CREDIT es SOLO el enganche. */
|
|
32
|
+
amountCents: number;
|
|
33
|
+
/** Precio de lista del equipo — la base de comisión. `null` en ventas sin el dato. */
|
|
34
|
+
equipmentPriceCents: number | null;
|
|
35
|
+
downPaymentCents: number | null;
|
|
36
|
+
creditId: string | null;
|
|
37
|
+
type: SaleTypeEnum;
|
|
38
|
+
/** Proveedor externo cuando `type = EXTERNAL_REFERRAL`; `null` en contado y crédito propio. */
|
|
39
|
+
externalProvider: ExternalProviderEnum | null;
|
|
40
|
+
soldAt: string;
|
|
41
|
+
occurredAt: string;
|
|
42
|
+
}
|
|
@@ -116,4 +116,6 @@ export * from './dtos/responses/BackofficeReportsResponse';
|
|
|
116
116
|
// Contratos de eventos (PascalCase + sufijo V1)
|
|
117
117
|
export * from './events/SaleCompletedV1';
|
|
118
118
|
export * from './events/SaleCancelledV1';
|
|
119
|
+
export * from './events/SaleCompletedV2';
|
|
120
|
+
export * from './events/SaleCancelledV2';
|
|
119
121
|
export * from './events/SessionExpiredV1';
|