@fiado/type-kit 3.311.0 → 3.315.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/_test_/unit/retailCards/cardStockRequests.test.ts +52 -2
- package/_test_/unit/retailWizard/deleteProductRequest.test.ts +24 -0
- package/bin/retailCards/dtos/requests/RegisterCardBatchRequest.d.ts +4 -1
- package/bin/retailCards/dtos/requests/RegisterCardBatchRequest.js +3 -0
- package/bin/retailCards/dtos/requests/WriteOffCardStockRequest.d.ts +5 -0
- package/bin/retailCards/dtos/requests/WriteOffCardStockRequest.js +4 -0
- package/bin/retailCards/dtos/responses/CardDeliveryResponse.d.ts +5 -2
- package/bin/retailWizard/dtos/AppOnboardingStep.d.ts +11 -0
- package/bin/retailWizard/dtos/AppOnboardingStep.js +2 -0
- package/bin/retailWizard/dtos/requests/DeleteProductRequest.d.ts +2 -1
- package/bin/retailWizard/dtos/requests/DeleteProductRequest.js +1 -0
- package/bin/retailWizard/dtos/responses/ActiveSessionByPhoneResponse.d.ts +21 -0
- package/bin/retailWizard/dtos/responses/ActiveSessionByPhoneResponse.js +2 -0
- package/bin/retailWizard/dtos/responses/AppOnboardingResponse.d.ts +14 -0
- package/bin/retailWizard/dtos/responses/AppOnboardingResponse.js +2 -0
- package/bin/retailWizard/enums/AppOnboardingStepEnum.d.ts +14 -0
- package/bin/retailWizard/enums/AppOnboardingStepEnum.js +18 -0
- package/bin/retailWizard/enums/AppOnboardingStepStatusEnum.d.ts +12 -0
- package/bin/retailWizard/enums/AppOnboardingStepStatusEnum.js +16 -0
- package/bin/retailWizard/index.d.ts +5 -0
- package/bin/retailWizard/index.js +5 -0
- package/package.json +1 -1
- package/src/retailCards/dtos/requests/RegisterCardBatchRequest.ts +8 -2
- package/src/retailCards/dtos/requests/WriteOffCardStockRequest.ts +8 -1
- package/src/retailCards/dtos/responses/CardDeliveryResponse.ts +5 -2
- package/src/retailWizard/dtos/AppOnboardingStep.ts +12 -0
- package/src/retailWizard/dtos/requests/DeleteProductRequest.ts +4 -2
- package/src/retailWizard/dtos/responses/ActiveSessionByPhoneResponse.ts +22 -0
- package/src/retailWizard/dtos/responses/AppOnboardingResponse.ts +15 -0
- package/src/retailWizard/enums/AppOnboardingStepEnum.ts +14 -0
- package/src/retailWizard/enums/AppOnboardingStepStatusEnum.ts +12 -0
- package/src/retailWizard/index.ts +5 -0
|
@@ -30,6 +30,29 @@ describe('RegisterCardBatchRequest — el lote se recibe por cantidad, no por n
|
|
|
30
30
|
).toContain('supplierBatchRef');
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
+
it('rechaza un folio en blanco: degradaría la clave del marcador a una constante por tienda', () => {
|
|
34
|
+
for (const supplierBatchRef of ['', ' ']) {
|
|
35
|
+
expect(
|
|
36
|
+
errorsOf(RegisterCardBatchRequest, {
|
|
37
|
+
storeId: 'STORE#1',
|
|
38
|
+
quantity: 50,
|
|
39
|
+
supplierBatchRef,
|
|
40
|
+
}),
|
|
41
|
+
).toContain('supplierBatchRef');
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// El folio es la clave de idempotencia: sin recortar, reteclearlo con un espacio de más registra
|
|
46
|
+
// el mismo lote dos veces y suma el stock doble.
|
|
47
|
+
it('recorta los espacios del folio antes de que llegue al dominio', () => {
|
|
48
|
+
const dto = plainToInstance(RegisterCardBatchRequest, {
|
|
49
|
+
storeId: 'STORE#1',
|
|
50
|
+
quantity: 50,
|
|
51
|
+
supplierBatchRef: ' L-4471 ',
|
|
52
|
+
});
|
|
53
|
+
expect(dto.supplierBatchRef).toBe('L-4471');
|
|
54
|
+
});
|
|
55
|
+
|
|
33
56
|
it('rechaza una cantidad de 0, negativa o fraccionaria', () => {
|
|
34
57
|
for (const quantity of [0, -1, 1.5]) {
|
|
35
58
|
expect(
|
|
@@ -103,18 +126,44 @@ describe('RegisterCardDeliveryRequest — entrega en un solo acto, idempotente p
|
|
|
103
126
|
});
|
|
104
127
|
|
|
105
128
|
describe('WriteOffCardStockRequest — baja de inventario por cantidad', () => {
|
|
106
|
-
|
|
129
|
+
const OPERATION_ID = '3f1a9c52-8d0e-4b7a-9c31-6ad2f0e15b74';
|
|
130
|
+
|
|
131
|
+
it('acepta cantidad + motivo del catálogo + clave de operación', () => {
|
|
107
132
|
expect(
|
|
108
133
|
errorsOf(WriteOffCardStockRequest, {
|
|
109
134
|
quantity: 3,
|
|
110
135
|
reason: CardWriteOffReasonEnum.PLASTIC_DAMAGED,
|
|
136
|
+
operationId: OPERATION_ID,
|
|
111
137
|
}),
|
|
112
138
|
).toEqual([]);
|
|
113
139
|
});
|
|
114
140
|
|
|
141
|
+
it('la clave de operación es obligatoria: sin ella un doble clic descuenta dos veces', () => {
|
|
142
|
+
expect(
|
|
143
|
+
errorsOf(WriteOffCardStockRequest, {
|
|
144
|
+
quantity: 3,
|
|
145
|
+
reason: CardWriteOffReasonEnum.LOST,
|
|
146
|
+
}),
|
|
147
|
+
).toContain('operationId');
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('rechaza una clave de operación que no sea un UUID', () => {
|
|
151
|
+
expect(
|
|
152
|
+
errorsOf(WriteOffCardStockRequest, {
|
|
153
|
+
quantity: 3,
|
|
154
|
+
reason: CardWriteOffReasonEnum.LOST,
|
|
155
|
+
operationId: 'baja-del-martes',
|
|
156
|
+
}),
|
|
157
|
+
).toContain('operationId');
|
|
158
|
+
});
|
|
159
|
+
|
|
115
160
|
it('rechaza un motivo fuera del catálogo', () => {
|
|
116
161
|
expect(
|
|
117
|
-
errorsOf(WriteOffCardStockRequest, {
|
|
162
|
+
errorsOf(WriteOffCardStockRequest, {
|
|
163
|
+
quantity: 3,
|
|
164
|
+
reason: 'THEFT_REPORTED',
|
|
165
|
+
operationId: OPERATION_ID,
|
|
166
|
+
}),
|
|
118
167
|
).toContain('reason');
|
|
119
168
|
});
|
|
120
169
|
|
|
@@ -124,6 +173,7 @@ describe('WriteOffCardStockRequest — baja de inventario por cantidad', () => {
|
|
|
124
173
|
errorsOf(WriteOffCardStockRequest, {
|
|
125
174
|
quantity,
|
|
126
175
|
reason: CardWriteOffReasonEnum.LOST,
|
|
176
|
+
operationId: OPERATION_ID,
|
|
127
177
|
}),
|
|
128
178
|
).toContain('quantity');
|
|
129
179
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validateSync } from 'class-validator';
|
|
4
|
+
import { DeleteProductRequest } from '../../../src/retailWizard/dtos/requests/DeleteProductRequest';
|
|
5
|
+
|
|
6
|
+
function errorsOf(payload: Record<string, unknown>): string[] {
|
|
7
|
+
const dto = plainToInstance(DeleteProductRequest, payload, { excludeExtraneousValues: true });
|
|
8
|
+
return validateSync(dto).map((e) => e.property);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
describe('DeleteProductRequest — liberar el equipo no exige el imei', () => {
|
|
12
|
+
// Un caller que no manda `imei` produce `{}` al serializar: el silo debe atenderlo igual.
|
|
13
|
+
it('acepta un request sin imei', () => {
|
|
14
|
+
expect(errorsOf({})).toEqual([]);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('acepta un request con imei explícito', () => {
|
|
18
|
+
expect(errorsOf({ imei: '356938035643809' })).toEqual([]);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('rechaza un imei que no es string', () => {
|
|
22
|
+
expect(errorsOf({ imei: 356938035643809 })).toContain('imei');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -5,7 +5,10 @@
|
|
|
5
5
|
export declare class RegisterCardBatchRequest {
|
|
6
6
|
storeId: string;
|
|
7
7
|
quantity: number;
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Folio de la remesa del proveedor: lo único que distingue dos entradas iguales a la misma tienda.
|
|
10
|
+
* Se recorta y no admite blanco, porque es la clave de idempotencia de la recepción.
|
|
11
|
+
*/
|
|
9
12
|
supplierBatchRef: string;
|
|
10
13
|
notes?: string | null;
|
|
11
14
|
}
|
|
@@ -10,6 +10,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.RegisterCardBatchRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
13
14
|
const class_validator_1 = require("class-validator");
|
|
14
15
|
/**
|
|
15
16
|
* Body del registro (recepción) de un lote de tarjetas para una tienda. Los sobres llegan sellados:
|
|
@@ -30,6 +31,8 @@ __decorate([
|
|
|
30
31
|
], RegisterCardBatchRequest.prototype, "quantity", void 0);
|
|
31
32
|
__decorate([
|
|
32
33
|
(0, class_validator_1.IsString)(),
|
|
34
|
+
(0, class_transformer_1.Transform)(({ value }) => (typeof value === 'string' ? value.trim() : value)),
|
|
35
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
33
36
|
__metadata("design:type", String)
|
|
34
37
|
], RegisterCardBatchRequest.prototype, "supplierBatchRef", void 0);
|
|
35
38
|
__decorate([
|
|
@@ -3,5 +3,10 @@ import { CardWriteOffReasonEnum } from '../../enums/CardWriteOffReasonEnum';
|
|
|
3
3
|
export declare class WriteOffCardStockRequest {
|
|
4
4
|
quantity: number;
|
|
5
5
|
reason: CardWriteOffReasonEnum;
|
|
6
|
+
/**
|
|
7
|
+
* Clave de idempotencia de la baja, generada por el caller una vez por intento. Un reintento
|
|
8
|
+
* devuelve el asiento original: sin ella un doble clic descontaría el doble.
|
|
9
|
+
*/
|
|
10
|
+
operationId: string;
|
|
6
11
|
notes?: string | null;
|
|
7
12
|
}
|
|
@@ -25,6 +25,10 @@ __decorate([
|
|
|
25
25
|
(0, class_validator_1.IsEnum)(CardWriteOffReasonEnum_1.CardWriteOffReasonEnum),
|
|
26
26
|
__metadata("design:type", String)
|
|
27
27
|
], WriteOffCardStockRequest.prototype, "reason", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
(0, class_validator_1.IsUUID)(),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], WriteOffCardStockRequest.prototype, "operationId", void 0);
|
|
28
32
|
__decorate([
|
|
29
33
|
(0, class_validator_1.IsOptional)(),
|
|
30
34
|
(0, class_validator_1.IsString)(),
|
|
@@ -5,7 +5,10 @@
|
|
|
5
5
|
export interface CardDeliveryResponse {
|
|
6
6
|
deliveryId: string;
|
|
7
7
|
movementSk: string;
|
|
8
|
-
/**
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Saldo disponible de la tienda al momento de responder, leído después de la transacción. No es
|
|
10
|
+
* el saldo del instante del asiento: si otra entrega cae en medio, refleja las dos.
|
|
11
|
+
*/
|
|
12
|
+
availableNow: number;
|
|
10
13
|
occurredAt: string;
|
|
11
14
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AppOnboardingStepEnum } from '../enums/AppOnboardingStepEnum';
|
|
2
|
+
import { AppOnboardingStepStatusEnum } from '../enums/AppOnboardingStepStatusEnum';
|
|
3
|
+
/**
|
|
4
|
+
* Una condición del onboarding en la app con su estado. SureKeep Fase 2 — pista Retail.
|
|
5
|
+
*/
|
|
6
|
+
export interface AppOnboardingStep {
|
|
7
|
+
step: AppOnboardingStepEnum;
|
|
8
|
+
status: AppOnboardingStepStatusEnum;
|
|
9
|
+
/** Por qué no se pudo verificar. Solo viaja con `UNVERIFIABLE`. */
|
|
10
|
+
reason?: string;
|
|
11
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** DELETE /wizard/sessions/:id/product — libera la reserva del equipo (vuelve al catálogo). SureKeep Fase 2 — pista Retail. */
|
|
2
2
|
export declare class DeleteProductRequest {
|
|
3
|
-
|
|
3
|
+
/** Opcional a propósito: exigirlo rompe a los callers que liberan la reserva sin mandar el imei. */
|
|
4
|
+
imei?: string;
|
|
4
5
|
}
|
|
@@ -18,6 +18,7 @@ class DeleteProductRequest {
|
|
|
18
18
|
exports.DeleteProductRequest = DeleteProductRequest;
|
|
19
19
|
__decorate([
|
|
20
20
|
(0, class_transformer_1.Expose)(),
|
|
21
|
+
(0, class_validator_1.IsOptional)(),
|
|
21
22
|
(0, class_validator_1.IsString)(),
|
|
22
23
|
__metadata("design:type", String)
|
|
23
24
|
], DeleteProductRequest.prototype, "imei", void 0);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { WizardStateEnum } from '../../enums/WizardStateEnum';
|
|
2
|
+
import type { WizardStepEnum } from '../../enums/WizardStepEnum';
|
|
3
|
+
/**
|
|
4
|
+
* GET /wizard/sessions?phone=... — la venta en curso de un telefono, para la pestana «Wizard» de la
|
|
5
|
+
* pantalla Prospectos. El prospecto no guarda la sesion, asi que el telefono es la unica llave.
|
|
6
|
+
*
|
|
7
|
+
* `found: false` es la respuesta NORMAL: la mayoria de los prospectos no tienen venta empezada, y una
|
|
8
|
+
* sesion activa de OTRA tienda devuelve lo mismo (DEC-018 la trata como inexistente para el vendedor).
|
|
9
|
+
*
|
|
10
|
+
* SureKeep Fase 2 — pista Retail.
|
|
11
|
+
*/
|
|
12
|
+
export interface ActiveSessionByPhoneResponse {
|
|
13
|
+
/** Unico campo con el que el front decide si pinta el paso o un guion. */
|
|
14
|
+
found: boolean;
|
|
15
|
+
/** `null` cuando `found` es `false`. */
|
|
16
|
+
sessionId: string | null;
|
|
17
|
+
/** Paso en el que se quedo la venta. `null` cuando `found` es `false`. */
|
|
18
|
+
currentStep: WizardStepEnum | null;
|
|
19
|
+
/** Hoy siempre `ACTIVE`: la busqueda filtra por ese estado. `null` cuando `found` es `false`. */
|
|
20
|
+
state: WizardStateEnum | null;
|
|
21
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AppOnboardingStep } from '../AppOnboardingStep';
|
|
2
|
+
/**
|
|
3
|
+
* GET /wizard/sessions/:id/app-onboarding — las condiciones del onboarding que el cliente hace en
|
|
4
|
+
* la app Fiado.
|
|
5
|
+
*
|
|
6
|
+
* Lo pollea el paso 09 del wizard, que dejó de pedirle al vendedor que teclee el número de tarjeta.
|
|
7
|
+
* SureKeep Fase 2 — pista Retail.
|
|
8
|
+
*/
|
|
9
|
+
export interface AppOnboardingResponse {
|
|
10
|
+
/** Las cuatro condiciones, siempre las cuatro, en orden fijo. */
|
|
11
|
+
steps: AppOnboardingStep[];
|
|
12
|
+
/** Ninguna quedó en `PENDING`. Una `UNVERIFIABLE` NO bloquea: cuenta como saldada. */
|
|
13
|
+
allSettled: boolean;
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Condiciones del onboarding que el cliente hace en la app Fiado, y que el paso 09 del wizard
|
|
3
|
+
* pollea en vez de pedirle al vendedor que las teclee. SureKeep Fase 2 — pista Retail.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum AppOnboardingStepEnum {
|
|
6
|
+
/** Ya puso su contraseña sobre la cuenta que abrió la tienda. */
|
|
7
|
+
PASSWORD = "PASSWORD",
|
|
8
|
+
/** Ya firmó el contrato MX. */
|
|
9
|
+
CONTRACT_SIGNED = "CONTRACT_SIGNED",
|
|
10
|
+
/** Ya activó su número secreto de la app (2FA/transacciones, NO el NIP de la tarjeta). */
|
|
11
|
+
SECRET_NUMBER = "SECRET_NUMBER",
|
|
12
|
+
/** Ya tiene una tarjeta física vigente. */
|
|
13
|
+
PHYSICAL_CARD = "PHYSICAL_CARD"
|
|
14
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AppOnboardingStepEnum = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Condiciones del onboarding que el cliente hace en la app Fiado, y que el paso 09 del wizard
|
|
6
|
+
* pollea en vez de pedirle al vendedor que las teclee. SureKeep Fase 2 — pista Retail.
|
|
7
|
+
*/
|
|
8
|
+
var AppOnboardingStepEnum;
|
|
9
|
+
(function (AppOnboardingStepEnum) {
|
|
10
|
+
/** Ya puso su contraseña sobre la cuenta que abrió la tienda. */
|
|
11
|
+
AppOnboardingStepEnum["PASSWORD"] = "PASSWORD";
|
|
12
|
+
/** Ya firmó el contrato MX. */
|
|
13
|
+
AppOnboardingStepEnum["CONTRACT_SIGNED"] = "CONTRACT_SIGNED";
|
|
14
|
+
/** Ya activó su número secreto de la app (2FA/transacciones, NO el NIP de la tarjeta). */
|
|
15
|
+
AppOnboardingStepEnum["SECRET_NUMBER"] = "SECRET_NUMBER";
|
|
16
|
+
/** Ya tiene una tarjeta física vigente. */
|
|
17
|
+
AppOnboardingStepEnum["PHYSICAL_CARD"] = "PHYSICAL_CARD";
|
|
18
|
+
})(AppOnboardingStepEnum || (exports.AppOnboardingStepEnum = AppOnboardingStepEnum = {}));
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estado de una condición del onboarding en la app. SureKeep Fase 2 — pista Retail.
|
|
3
|
+
*
|
|
4
|
+
* `UNVERIFIABLE` existe para no aplastar «no cumplió» contra «no pudimos saber»: un booleano le
|
|
5
|
+
* mostraría al vendedor la palomita apagada de un cliente que sí lo hizo, cuando lo que se cayó es
|
|
6
|
+
* un lambda nuestro. NO bloquea: cuenta como saldada.
|
|
7
|
+
*/
|
|
8
|
+
export declare enum AppOnboardingStepStatusEnum {
|
|
9
|
+
COMPLETED = "COMPLETED",
|
|
10
|
+
PENDING = "PENDING",
|
|
11
|
+
UNVERIFIABLE = "UNVERIFIABLE"
|
|
12
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AppOnboardingStepStatusEnum = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Estado de una condición del onboarding en la app. SureKeep Fase 2 — pista Retail.
|
|
6
|
+
*
|
|
7
|
+
* `UNVERIFIABLE` existe para no aplastar «no cumplió» contra «no pudimos saber»: un booleano le
|
|
8
|
+
* mostraría al vendedor la palomita apagada de un cliente que sí lo hizo, cuando lo que se cayó es
|
|
9
|
+
* un lambda nuestro. NO bloquea: cuenta como saldada.
|
|
10
|
+
*/
|
|
11
|
+
var AppOnboardingStepStatusEnum;
|
|
12
|
+
(function (AppOnboardingStepStatusEnum) {
|
|
13
|
+
AppOnboardingStepStatusEnum["COMPLETED"] = "COMPLETED";
|
|
14
|
+
AppOnboardingStepStatusEnum["PENDING"] = "PENDING";
|
|
15
|
+
AppOnboardingStepStatusEnum["UNVERIFIABLE"] = "UNVERIFIABLE";
|
|
16
|
+
})(AppOnboardingStepStatusEnum || (exports.AppOnboardingStepStatusEnum = AppOnboardingStepStatusEnum = {}));
|
|
@@ -17,6 +17,8 @@ export * from './enums/AccountVerdictEnum';
|
|
|
17
17
|
export * from './enums/AccountOutcomeEnum';
|
|
18
18
|
export * from './enums/AccountStepStatusEnum';
|
|
19
19
|
export * from './enums/ResumeReasonEnum';
|
|
20
|
+
export * from './enums/AppOnboardingStepEnum';
|
|
21
|
+
export * from './enums/AppOnboardingStepStatusEnum';
|
|
20
22
|
export * from './dtos/WizardConsents';
|
|
21
23
|
export * from './dtos/WizardPayment';
|
|
22
24
|
export * from './dtos/WizardProduct';
|
|
@@ -27,6 +29,7 @@ export * from './dtos/WizardBeneficiary';
|
|
|
27
29
|
export * from './dtos/WizardLoan';
|
|
28
30
|
export * from './dtos/WizardCreditSummary';
|
|
29
31
|
export * from './dtos/AccountStep';
|
|
32
|
+
export * from './dtos/AppOnboardingStep';
|
|
30
33
|
export * from './dtos/WizardResumeTarget';
|
|
31
34
|
export * from './dtos/WizardSession';
|
|
32
35
|
export * from './dtos/OtpVerification';
|
|
@@ -75,6 +78,8 @@ export * from './dtos/responses/SignatureSendOtpResponse';
|
|
|
75
78
|
export * from './dtos/responses/SignatureSignResponse';
|
|
76
79
|
export * from './dtos/responses/RegisterDeviceResponse';
|
|
77
80
|
export * from './dtos/responses/AccountStatusResponse';
|
|
81
|
+
export * from './dtos/responses/ActiveSessionByPhoneResponse';
|
|
82
|
+
export * from './dtos/responses/AppOnboardingResponse';
|
|
78
83
|
export * from './enums/SaleFinancierEnum';
|
|
79
84
|
export * from './enums/SaleExceptionTypeEnum';
|
|
80
85
|
export * from './enums/SaleExceptionStatusEnum';
|
|
@@ -35,6 +35,8 @@ __exportStar(require("./enums/AccountVerdictEnum"), exports);
|
|
|
35
35
|
__exportStar(require("./enums/AccountOutcomeEnum"), exports);
|
|
36
36
|
__exportStar(require("./enums/AccountStepStatusEnum"), exports);
|
|
37
37
|
__exportStar(require("./enums/ResumeReasonEnum"), exports);
|
|
38
|
+
__exportStar(require("./enums/AppOnboardingStepEnum"), exports);
|
|
39
|
+
__exportStar(require("./enums/AppOnboardingStepStatusEnum"), exports);
|
|
38
40
|
// DTOs anidados
|
|
39
41
|
__exportStar(require("./dtos/WizardConsents"), exports);
|
|
40
42
|
__exportStar(require("./dtos/WizardPayment"), exports);
|
|
@@ -46,6 +48,7 @@ __exportStar(require("./dtos/WizardBeneficiary"), exports);
|
|
|
46
48
|
__exportStar(require("./dtos/WizardLoan"), exports);
|
|
47
49
|
__exportStar(require("./dtos/WizardCreditSummary"), exports);
|
|
48
50
|
__exportStar(require("./dtos/AccountStep"), exports);
|
|
51
|
+
__exportStar(require("./dtos/AppOnboardingStep"), exports);
|
|
49
52
|
__exportStar(require("./dtos/WizardResumeTarget"), exports);
|
|
50
53
|
// Entidades principales (shapes de estado/persistencia — planas)
|
|
51
54
|
__exportStar(require("./dtos/WizardSession"), exports);
|
|
@@ -98,6 +101,8 @@ __exportStar(require("./dtos/responses/SignatureSendOtpResponse"), exports);
|
|
|
98
101
|
__exportStar(require("./dtos/responses/SignatureSignResponse"), exports);
|
|
99
102
|
__exportStar(require("./dtos/responses/RegisterDeviceResponse"), exports);
|
|
100
103
|
__exportStar(require("./dtos/responses/AccountStatusResponse"), exports);
|
|
104
|
+
__exportStar(require("./dtos/responses/ActiveSessionByPhoneResponse"), exports);
|
|
105
|
+
__exportStar(require("./dtos/responses/AppOnboardingResponse"), exports);
|
|
101
106
|
// ── F3 · Backoffice VentasLuga ────────────────────────────────────────────────
|
|
102
107
|
// Enums
|
|
103
108
|
__exportStar(require("./enums/SaleFinancierEnum"), exports);
|
package/package.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Transform } from 'class-transformer';
|
|
2
|
+
import { IsInt, IsNotEmpty, IsOptional, IsString, Max, Min } from 'class-validator';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Body del registro (recepción) de un lote de tarjetas para una tienda. Los sobres llegan sellados:
|
|
@@ -13,8 +14,13 @@ export class RegisterCardBatchRequest {
|
|
|
13
14
|
@Max(1000)
|
|
14
15
|
quantity!: number;
|
|
15
16
|
|
|
16
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Folio de la remesa del proveedor: lo único que distingue dos entradas iguales a la misma tienda.
|
|
19
|
+
* Se recorta y no admite blanco, porque es la clave de idempotencia de la recepción.
|
|
20
|
+
*/
|
|
17
21
|
@IsString()
|
|
22
|
+
@Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
|
|
23
|
+
@IsNotEmpty()
|
|
18
24
|
supplierBatchRef!: string;
|
|
19
25
|
|
|
20
26
|
@IsOptional()
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IsEnum, IsInt, IsOptional, IsString, Min } from 'class-validator';
|
|
1
|
+
import { IsEnum, IsInt, IsOptional, IsString, IsUUID, Min } from 'class-validator';
|
|
2
2
|
import { CardWriteOffReasonEnum } from '../../enums/CardWriteOffReasonEnum';
|
|
3
3
|
|
|
4
4
|
/** Body de la baja de inventario de tarjetas de una tienda, por cantidad. */
|
|
@@ -10,6 +10,13 @@ export class WriteOffCardStockRequest {
|
|
|
10
10
|
@IsEnum(CardWriteOffReasonEnum)
|
|
11
11
|
reason!: CardWriteOffReasonEnum;
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Clave de idempotencia de la baja, generada por el caller una vez por intento. Un reintento
|
|
15
|
+
* devuelve el asiento original: sin ella un doble clic descontaría el doble.
|
|
16
|
+
*/
|
|
17
|
+
@IsUUID()
|
|
18
|
+
operationId!: string;
|
|
19
|
+
|
|
13
20
|
@IsOptional()
|
|
14
21
|
@IsString()
|
|
15
22
|
notes?: string | null;
|
|
@@ -5,7 +5,10 @@
|
|
|
5
5
|
export interface CardDeliveryResponse {
|
|
6
6
|
deliveryId: string;
|
|
7
7
|
movementSk: string;
|
|
8
|
-
/**
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Saldo disponible de la tienda al momento de responder, leído después de la transacción. No es
|
|
10
|
+
* el saldo del instante del asiento: si otra entrega cae en medio, refleja las dos.
|
|
11
|
+
*/
|
|
12
|
+
availableNow: number;
|
|
10
13
|
occurredAt: string;
|
|
11
14
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AppOnboardingStepEnum } from '../enums/AppOnboardingStepEnum';
|
|
2
|
+
import { AppOnboardingStepStatusEnum } from '../enums/AppOnboardingStepStatusEnum';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Una condición del onboarding en la app con su estado. SureKeep Fase 2 — pista Retail.
|
|
6
|
+
*/
|
|
7
|
+
export interface AppOnboardingStep {
|
|
8
|
+
step: AppOnboardingStepEnum;
|
|
9
|
+
status: AppOnboardingStepStatusEnum;
|
|
10
|
+
/** Por qué no se pudo verificar. Solo viaja con `UNVERIFIABLE`. */
|
|
11
|
+
reason?: string;
|
|
12
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Expose } from 'class-transformer';
|
|
2
|
-
import { IsString } from 'class-validator';
|
|
2
|
+
import { IsOptional, IsString } from 'class-validator';
|
|
3
3
|
|
|
4
4
|
/** DELETE /wizard/sessions/:id/product — libera la reserva del equipo (vuelve al catálogo). SureKeep Fase 2 — pista Retail. */
|
|
5
5
|
export class DeleteProductRequest {
|
|
6
|
+
/** Opcional a propósito: exigirlo rompe a los callers que liberan la reserva sin mandar el imei. */
|
|
6
7
|
@Expose()
|
|
8
|
+
@IsOptional()
|
|
7
9
|
@IsString()
|
|
8
|
-
imei
|
|
10
|
+
imei?: string;
|
|
9
11
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { WizardStateEnum } from '../../enums/WizardStateEnum';
|
|
2
|
+
import type { WizardStepEnum } from '../../enums/WizardStepEnum';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* GET /wizard/sessions?phone=... — la venta en curso de un telefono, para la pestana «Wizard» de la
|
|
6
|
+
* pantalla Prospectos. El prospecto no guarda la sesion, asi que el telefono es la unica llave.
|
|
7
|
+
*
|
|
8
|
+
* `found: false` es la respuesta NORMAL: la mayoria de los prospectos no tienen venta empezada, y una
|
|
9
|
+
* sesion activa de OTRA tienda devuelve lo mismo (DEC-018 la trata como inexistente para el vendedor).
|
|
10
|
+
*
|
|
11
|
+
* SureKeep Fase 2 — pista Retail.
|
|
12
|
+
*/
|
|
13
|
+
export interface ActiveSessionByPhoneResponse {
|
|
14
|
+
/** Unico campo con el que el front decide si pinta el paso o un guion. */
|
|
15
|
+
found: boolean;
|
|
16
|
+
/** `null` cuando `found` es `false`. */
|
|
17
|
+
sessionId: string | null;
|
|
18
|
+
/** Paso en el que se quedo la venta. `null` cuando `found` es `false`. */
|
|
19
|
+
currentStep: WizardStepEnum | null;
|
|
20
|
+
/** Hoy siempre `ACTIVE`: la busqueda filtra por ese estado. `null` cuando `found` es `false`. */
|
|
21
|
+
state: WizardStateEnum | null;
|
|
22
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AppOnboardingStep } from '../AppOnboardingStep';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GET /wizard/sessions/:id/app-onboarding — las condiciones del onboarding que el cliente hace en
|
|
5
|
+
* la app Fiado.
|
|
6
|
+
*
|
|
7
|
+
* Lo pollea el paso 09 del wizard, que dejó de pedirle al vendedor que teclee el número de tarjeta.
|
|
8
|
+
* SureKeep Fase 2 — pista Retail.
|
|
9
|
+
*/
|
|
10
|
+
export interface AppOnboardingResponse {
|
|
11
|
+
/** Las cuatro condiciones, siempre las cuatro, en orden fijo. */
|
|
12
|
+
steps: AppOnboardingStep[];
|
|
13
|
+
/** Ninguna quedó en `PENDING`. Una `UNVERIFIABLE` NO bloquea: cuenta como saldada. */
|
|
14
|
+
allSettled: boolean;
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Condiciones del onboarding que el cliente hace en la app Fiado, y que el paso 09 del wizard
|
|
3
|
+
* pollea en vez de pedirle al vendedor que las teclee. SureKeep Fase 2 — pista Retail.
|
|
4
|
+
*/
|
|
5
|
+
export enum AppOnboardingStepEnum {
|
|
6
|
+
/** Ya puso su contraseña sobre la cuenta que abrió la tienda. */
|
|
7
|
+
PASSWORD = 'PASSWORD',
|
|
8
|
+
/** Ya firmó el contrato MX. */
|
|
9
|
+
CONTRACT_SIGNED = 'CONTRACT_SIGNED',
|
|
10
|
+
/** Ya activó su número secreto de la app (2FA/transacciones, NO el NIP de la tarjeta). */
|
|
11
|
+
SECRET_NUMBER = 'SECRET_NUMBER',
|
|
12
|
+
/** Ya tiene una tarjeta física vigente. */
|
|
13
|
+
PHYSICAL_CARD = 'PHYSICAL_CARD',
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estado de una condición del onboarding en la app. SureKeep Fase 2 — pista Retail.
|
|
3
|
+
*
|
|
4
|
+
* `UNVERIFIABLE` existe para no aplastar «no cumplió» contra «no pudimos saber»: un booleano le
|
|
5
|
+
* mostraría al vendedor la palomita apagada de un cliente que sí lo hizo, cuando lo que se cayó es
|
|
6
|
+
* un lambda nuestro. NO bloquea: cuenta como saldada.
|
|
7
|
+
*/
|
|
8
|
+
export enum AppOnboardingStepStatusEnum {
|
|
9
|
+
COMPLETED = 'COMPLETED',
|
|
10
|
+
PENDING = 'PENDING',
|
|
11
|
+
UNVERIFIABLE = 'UNVERIFIABLE',
|
|
12
|
+
}
|
|
@@ -20,6 +20,8 @@ export * from './enums/AccountVerdictEnum';
|
|
|
20
20
|
export * from './enums/AccountOutcomeEnum';
|
|
21
21
|
export * from './enums/AccountStepStatusEnum';
|
|
22
22
|
export * from './enums/ResumeReasonEnum';
|
|
23
|
+
export * from './enums/AppOnboardingStepEnum';
|
|
24
|
+
export * from './enums/AppOnboardingStepStatusEnum';
|
|
23
25
|
|
|
24
26
|
// DTOs anidados
|
|
25
27
|
export * from './dtos/WizardConsents';
|
|
@@ -32,6 +34,7 @@ export * from './dtos/WizardBeneficiary';
|
|
|
32
34
|
export * from './dtos/WizardLoan';
|
|
33
35
|
export * from './dtos/WizardCreditSummary';
|
|
34
36
|
export * from './dtos/AccountStep';
|
|
37
|
+
export * from './dtos/AppOnboardingStep';
|
|
35
38
|
export * from './dtos/WizardResumeTarget';
|
|
36
39
|
|
|
37
40
|
// Entidades principales (shapes de estado/persistencia — planas)
|
|
@@ -88,6 +91,8 @@ export * from './dtos/responses/SignatureSendOtpResponse';
|
|
|
88
91
|
export * from './dtos/responses/SignatureSignResponse';
|
|
89
92
|
export * from './dtos/responses/RegisterDeviceResponse';
|
|
90
93
|
export * from './dtos/responses/AccountStatusResponse';
|
|
94
|
+
export * from './dtos/responses/ActiveSessionByPhoneResponse';
|
|
95
|
+
export * from './dtos/responses/AppOnboardingResponse';
|
|
91
96
|
|
|
92
97
|
// ── F3 · Backoffice VentasLuga ────────────────────────────────────────────────
|
|
93
98
|
// Enums
|