@fiado/type-kit 3.283.0 → 3.285.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/account/dtos/AccountCreateRequest.d.ts +6 -0
- package/bin/account/dtos/AccountCreateRequest.js +6 -0
- package/bin/account/dtos/CreateBankAccountUserRequest.d.ts +9 -0
- package/bin/card/dtos/CardApplicationRequest.d.ts +6 -0
- package/bin/card/dtos/CardApplicationRequest.js +6 -0
- package/bin/card/dtos/Internal/ReplaceBankAccountCardRequest.d.ts +6 -0
- package/bin/identity/dtos/PeopleResponse.d.ts +7 -0
- package/bin/retailWizard/dtos/requests/AddSaleExceptionNoteRequest.d.ts +16 -0
- package/bin/retailWizard/dtos/requests/AddSaleExceptionNoteRequest.js +37 -0
- package/bin/retailWizard/dtos/requests/ApplySaleExceptionRequest.d.ts +16 -0
- package/bin/retailWizard/dtos/requests/ApplySaleExceptionRequest.js +38 -0
- package/bin/retailWizard/dtos/requests/ReviewSaleExceptionRequest.d.ts +14 -0
- package/bin/retailWizard/dtos/requests/ReviewSaleExceptionRequest.js +36 -0
- package/bin/retailWizard/dtos/responses/BackofficeSalesKpisResponse.d.ts +8 -0
- package/bin/retailWizard/enums/SaleExceptionEventKindEnum.d.ts +2 -0
- package/bin/retailWizard/enums/SaleExceptionEventKindEnum.js +2 -0
- package/bin/retailWizard/index.d.ts +3 -0
- package/bin/retailWizard/index.js +3 -0
- package/package.json +1 -1
- package/src/account/dtos/AccountCreateRequest.ts +11 -1
- package/src/account/dtos/CreateBankAccountUserRequest.ts +10 -1
- package/src/card/dtos/CardApplicationRequest.ts +11 -1
- package/src/card/dtos/Internal/ReplaceBankAccountCardRequest.ts +6 -0
- package/src/identity/dtos/PeopleResponse.ts +7 -0
- package/src/retailWizard/dtos/requests/AddSaleExceptionNoteRequest.ts +23 -0
- package/src/retailWizard/dtos/requests/ApplySaleExceptionRequest.ts +24 -0
- package/src/retailWizard/dtos/requests/ReviewSaleExceptionRequest.ts +22 -0
- package/src/retailWizard/dtos/responses/BackofficeSalesKpisResponse.ts +8 -0
- package/src/retailWizard/enums/SaleExceptionEventKindEnum.ts +2 -0
- package/src/retailWizard/index.ts +3 -0
- package/bin/identity/enums/SelfieSourceEnum.d.ts +0 -10
- package/bin/identity/enums/SelfieSourceEnum.js +0 -14
|
@@ -37,4 +37,10 @@ export declare class AccountCreateRequest {
|
|
|
37
37
|
SSN_ITIN?: string;
|
|
38
38
|
externalReferenceId?: string;
|
|
39
39
|
source?: "BACKOFFICE" | "USER_APP" | "API";
|
|
40
|
+
/**
|
|
41
|
+
* Nombre a imprimir en la tarjeta, leido de People tal cual: lo calcula el
|
|
42
|
+
* lambda de identidad y aqui solo se transporta. MAYUSCULAS sin acentos y
|
|
43
|
+
* maximo 21 caracteres, que es el limite de name_on_card en Central Payments.
|
|
44
|
+
*/
|
|
45
|
+
usName21?: string;
|
|
40
46
|
}
|
|
@@ -141,3 +141,9 @@ __decorate([
|
|
|
141
141
|
(0, class_validator_1.IsString)(),
|
|
142
142
|
__metadata("design:type", String)
|
|
143
143
|
], AccountCreateRequest.prototype, "source", void 0);
|
|
144
|
+
__decorate([
|
|
145
|
+
(0, class_validator_1.IsOptional)(),
|
|
146
|
+
(0, class_validator_1.IsString)(),
|
|
147
|
+
(0, class_validator_1.MaxLength)(21),
|
|
148
|
+
__metadata("design:type", String)
|
|
149
|
+
], AccountCreateRequest.prototype, "usName21", void 0);
|
|
@@ -16,4 +16,13 @@ export declare class CreateBankAccountUserRequest {
|
|
|
16
16
|
gender?: "M" | "F";
|
|
17
17
|
externalReferenceId?: string;
|
|
18
18
|
source?: "BACKOFFICE" | "USER_APP" | "API";
|
|
19
|
+
/**
|
|
20
|
+
* Nombre a imprimir en la tarjeta que se emite con el alta. Viene ya
|
|
21
|
+
* calculado desde People, en MAYUSCULAS sin acentos y con maximo 21
|
|
22
|
+
* caracteres, que es el limite de name_on_card en Central Payments.
|
|
23
|
+
*
|
|
24
|
+
* Opcional a proposito: si no llega, el proveedor genera el nombre como lo
|
|
25
|
+
* hacia antes, asi que el despliegue no depende del orden entre lambdas.
|
|
26
|
+
*/
|
|
27
|
+
usName21?: string;
|
|
19
28
|
}
|
|
@@ -12,4 +12,10 @@ export declare class CardApplicationRequest {
|
|
|
12
12
|
firstNameSecondary: string;
|
|
13
13
|
lastNameSecondary: string;
|
|
14
14
|
phoneNumberSecondary: string;
|
|
15
|
+
/**
|
|
16
|
+
* Nombre a imprimir en la tarjeta. Si no viene, el proveedor conserva el que
|
|
17
|
+
* ya traia la tarjeta. El limite de 21 es el de name_on_card en Central
|
|
18
|
+
* Payments.
|
|
19
|
+
*/
|
|
20
|
+
nameOnCard?: string;
|
|
15
21
|
}
|
|
@@ -70,3 +70,9 @@ __decorate([
|
|
|
70
70
|
(0, IsPhoneNumberConstraint_1.IsPhoneNumberFiado)(),
|
|
71
71
|
__metadata("design:type", String)
|
|
72
72
|
], CardApplicationRequest.prototype, "phoneNumberSecondary", void 0);
|
|
73
|
+
__decorate([
|
|
74
|
+
(0, class_validator_1.IsOptional)(),
|
|
75
|
+
(0, class_validator_1.IsString)(),
|
|
76
|
+
(0, class_validator_1.MaxLength)(21),
|
|
77
|
+
__metadata("design:type", String)
|
|
78
|
+
], CardApplicationRequest.prototype, "nameOnCard", void 0);
|
|
@@ -5,4 +5,10 @@ export declare class ReplaceBankAccountCardRequest {
|
|
|
5
5
|
lastName?: string;
|
|
6
6
|
address?: AddressBase;
|
|
7
7
|
reason?: ReplaceBankAccountCardReasonEnum;
|
|
8
|
+
/**
|
|
9
|
+
* Nombre a imprimir en la tarjeta nueva, acotado a 21 caracteres, que es el
|
|
10
|
+
* limite de name_on_card en Central Payments. Si no viene, el conector
|
|
11
|
+
* conserva el nombre que ya traia la tarjeta que se reemplaza.
|
|
12
|
+
*/
|
|
13
|
+
nameOnCard?: string;
|
|
8
14
|
}
|
|
@@ -14,6 +14,13 @@ export declare class PeopleResponse {
|
|
|
14
14
|
creationMethod: AppEnum | null;
|
|
15
15
|
names: PeopleName[] | null;
|
|
16
16
|
indexName: string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Nombre a imprimir en la tarjeta, derivado de usNames y usLastNames por el
|
|
19
|
+
* lambda de identidad: MAYUSCULAS sin acentos y maximo 21 caracteres, que es
|
|
20
|
+
* el limite de name_on_card en Central Payments. Solo de lectura para los
|
|
21
|
+
* consumidores; se recalcula solo en cada guardado de la persona.
|
|
22
|
+
*/
|
|
23
|
+
usName21: string | null;
|
|
17
24
|
preferredName: string | null;
|
|
18
25
|
usSuffix: string | null;
|
|
19
26
|
usLastNames: string | null;
|
|
@@ -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,4 +1,4 @@
|
|
|
1
|
-
import { IsBoolean, IsDateString, IsEmail, IsEnum, IsOptional, IsString, Length, Matches, ValidateNested } from 'class-validator';
|
|
1
|
+
import { IsBoolean, IsDateString, IsEmail, IsEnum, IsOptional, IsString, Length, Matches, MaxLength, ValidateNested } from 'class-validator';
|
|
2
2
|
import { AddressResponse } from "../../address";
|
|
3
3
|
import { CountryId } from "../../country";
|
|
4
4
|
import { regexUuidV4 } from '../../helpers/constans/regex';
|
|
@@ -113,4 +113,14 @@ export class AccountCreateRequest {
|
|
|
113
113
|
@IsString()
|
|
114
114
|
source?: "BACKOFFICE" | "USER_APP" | "API";
|
|
115
115
|
|
|
116
|
+
/**
|
|
117
|
+
* Nombre a imprimir en la tarjeta, leido de People tal cual: lo calcula el
|
|
118
|
+
* lambda de identidad y aqui solo se transporta. MAYUSCULAS sin acentos y
|
|
119
|
+
* maximo 21 caracteres, que es el limite de name_on_card en Central Payments.
|
|
120
|
+
*/
|
|
121
|
+
@IsOptional()
|
|
122
|
+
@IsString()
|
|
123
|
+
@MaxLength(21)
|
|
124
|
+
usName21?: string;
|
|
125
|
+
|
|
116
126
|
}
|
|
@@ -17,6 +17,15 @@ export class CreateBankAccountUserRequest {
|
|
|
17
17
|
gender?: "M" | "F";
|
|
18
18
|
externalReferenceId?: string;
|
|
19
19
|
source?: "BACKOFFICE" | "USER_APP" | "API";
|
|
20
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Nombre a imprimir en la tarjeta que se emite con el alta. Viene ya
|
|
22
|
+
* calculado desde People, en MAYUSCULAS sin acentos y con maximo 21
|
|
23
|
+
* caracteres, que es el limite de name_on_card en Central Payments.
|
|
24
|
+
*
|
|
25
|
+
* Opcional a proposito: si no llega, el proveedor genera el nombre como lo
|
|
26
|
+
* hacia antes, asi que el despliegue no depende del orden entre lambdas.
|
|
27
|
+
*/
|
|
28
|
+
usName21?: string;
|
|
29
|
+
}
|
|
21
30
|
|
|
22
31
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
import { IsEnum, IsNumber, isNumber, IsOptional, IsString } from 'class-validator';
|
|
3
|
+
import { IsEnum, IsNumber, isNumber, IsOptional, IsString, MaxLength } from 'class-validator';
|
|
4
4
|
import { CreditOrDebit } from '../enums/CreditOrDebit';
|
|
5
5
|
import { VirtualOrPhysical } from '../enums/VirtualOrPhysical';
|
|
6
6
|
import { DeliveryChannel } from '../enums/DeliveryChannel';
|
|
@@ -48,5 +48,15 @@ export class CardApplicationRequest {
|
|
|
48
48
|
@IsOptional()
|
|
49
49
|
@IsPhoneNumberFiado()
|
|
50
50
|
phoneNumberSecondary: string;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Nombre a imprimir en la tarjeta. Si no viene, el proveedor conserva el que
|
|
54
|
+
* ya traia la tarjeta. El limite de 21 es el de name_on_card en Central
|
|
55
|
+
* Payments.
|
|
56
|
+
*/
|
|
57
|
+
@IsOptional()
|
|
58
|
+
@IsString()
|
|
59
|
+
@MaxLength(21)
|
|
60
|
+
nameOnCard?: string;
|
|
51
61
|
}
|
|
52
62
|
|
|
@@ -6,4 +6,10 @@ export class ReplaceBankAccountCardRequest {
|
|
|
6
6
|
lastName?: string;
|
|
7
7
|
address?: AddressBase;
|
|
8
8
|
reason?: ReplaceBankAccountCardReasonEnum;
|
|
9
|
+
/**
|
|
10
|
+
* Nombre a imprimir en la tarjeta nueva, acotado a 21 caracteres, que es el
|
|
11
|
+
* limite de name_on_card en Central Payments. Si no viene, el conector
|
|
12
|
+
* conserva el nombre que ya traia la tarjeta que se reemplaza.
|
|
13
|
+
*/
|
|
14
|
+
nameOnCard?: string;
|
|
9
15
|
}
|
|
@@ -17,6 +17,13 @@ export class PeopleResponse {
|
|
|
17
17
|
creationMethod: AppEnum | null;
|
|
18
18
|
names: PeopleName[] | null;
|
|
19
19
|
indexName: string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Nombre a imprimir en la tarjeta, derivado de usNames y usLastNames por el
|
|
22
|
+
* lambda de identidad: MAYUSCULAS sin acentos y maximo 21 caracteres, que es
|
|
23
|
+
* el limite de name_on_card en Central Payments. Solo de lectura para los
|
|
24
|
+
* consumidores; se recalcula solo en cada guardado de la persona.
|
|
25
|
+
*/
|
|
26
|
+
usName21: string | null;
|
|
20
27
|
preferredName: string | null;
|
|
21
28
|
usSuffix: string | null;
|
|
22
29
|
usLastNames: string | null;
|
|
@@ -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 = {}));
|