@fiado/type-kit 3.289.0 → 3.291.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/card/dtos/CardUpdateIssuanceRequest.d.ts +3 -0
- package/bin/card/dtos/CardUpdateIssuanceRequest.js +9 -0
- package/bin/card/dtos/KycVendorResultDetail.d.ts +10 -0
- package/bin/card/dtos/KycVendorResultDetail.js +40 -0
- package/bin/card/index.d.ts +1 -0
- package/bin/card/index.js +1 -0
- package/bin/loanCredit/dtos/requests/UpdateActivationChecklistRequest.d.ts +11 -0
- package/bin/loanCredit/dtos/requests/UpdateActivationChecklistRequest.js +46 -0
- package/bin/loanCredit/enums/ClientLevelEnum.d.ts +11 -0
- package/bin/loanCredit/enums/ClientLevelEnum.js +15 -0
- package/bin/retailWizard/dtos/SaleLogEntry.d.ts +13 -0
- package/bin/retailWizard/dtos/responses/BackofficeSalesStatsResponse.d.ts +20 -4
- package/bin/retailWizard/dtos/responses/BackofficeSellerKpisResponse.d.ts +7 -0
- package/bin/retailWizard/dtos/responses/BackofficeStoreKpisResponse.d.ts +27 -0
- package/package.json +1 -1
- package/src/card/dtos/CardUpdateIssuanceRequest.ts +10 -1
- package/src/card/dtos/KycVendorResultDetail.ts +24 -0
- package/src/card/index.ts +1 -0
- package/src/retailWizard/dtos/SaleLogEntry.ts +13 -0
- package/src/retailWizard/dtos/responses/BackofficeSalesStatsResponse.ts +20 -4
- package/src/retailWizard/dtos/responses/BackofficeSellerKpisResponse.ts +7 -0
- package/src/retailWizard/dtos/responses/BackofficeStoreKpisResponse.ts +27 -0
- package/bin/identity/enums/SelfieSourceEnum.d.ts +0 -10
- package/bin/identity/enums/SelfieSourceEnum.js +0 -14
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { KycStatus } from "../enums/issuance/KycStatus";
|
|
2
2
|
import { UserStatus } from "../enums/issuance/UserStatus";
|
|
3
3
|
import { KycReason } from "../enums/KycReason";
|
|
4
|
+
import { KycVendorResultDetail } from "./KycVendorResultDetail";
|
|
4
5
|
export declare class CardUpdateIssuanceRequest {
|
|
5
6
|
kycStatus: KycStatus;
|
|
6
7
|
userStatus: UserStatus;
|
|
7
8
|
directoryId: string;
|
|
8
9
|
externalUserId: string;
|
|
9
10
|
kycReasons?: KycReason[];
|
|
11
|
+
/** Detalle crudo del vendor de KYC. Solo lo manda la ruta del webhook/connector de CP. */
|
|
12
|
+
kycVendorResults?: KycVendorResultDetail[];
|
|
10
13
|
}
|
|
@@ -10,9 +10,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.CardUpdateIssuanceRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
13
14
|
const class_validator_1 = require("class-validator");
|
|
14
15
|
const KycStatus_1 = require("../enums/issuance/KycStatus");
|
|
15
16
|
const UserStatus_1 = require("../enums/issuance/UserStatus");
|
|
17
|
+
const KycVendorResultDetail_1 = require("./KycVendorResultDetail");
|
|
16
18
|
class CardUpdateIssuanceRequest {
|
|
17
19
|
}
|
|
18
20
|
exports.CardUpdateIssuanceRequest = CardUpdateIssuanceRequest;
|
|
@@ -37,3 +39,10 @@ __decorate([
|
|
|
37
39
|
(0, class_validator_1.IsString)(),
|
|
38
40
|
__metadata("design:type", Array)
|
|
39
41
|
], CardUpdateIssuanceRequest.prototype, "kycReasons", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
(0, class_validator_1.IsOptional)(),
|
|
44
|
+
(0, class_validator_1.IsArray)(),
|
|
45
|
+
(0, class_validator_1.ValidateNested)({ each: true }),
|
|
46
|
+
(0, class_transformer_1.Type)(() => KycVendorResultDetail_1.KycVendorResultDetail),
|
|
47
|
+
__metadata("design:type", Array)
|
|
48
|
+
], CardUpdateIssuanceRequest.prototype, "kycVendorResults", void 0);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resultado crudo del vendor de KYC (IDology vía Central Payments). Valores libres a propósito:
|
|
3
|
+
* los códigos son un conjunto abierto del vendor — la traducción vive en el consumidor.
|
|
4
|
+
*/
|
|
5
|
+
export declare class KycVendorResultDetail {
|
|
6
|
+
vendor?: string;
|
|
7
|
+
type?: string;
|
|
8
|
+
code?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
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.KycVendorResultDetail = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
/**
|
|
15
|
+
* Resultado crudo del vendor de KYC (IDology vía Central Payments). Valores libres a propósito:
|
|
16
|
+
* los códigos son un conjunto abierto del vendor — la traducción vive en el consumidor.
|
|
17
|
+
*/
|
|
18
|
+
class KycVendorResultDetail {
|
|
19
|
+
}
|
|
20
|
+
exports.KycVendorResultDetail = KycVendorResultDetail;
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, class_validator_1.IsOptional)(),
|
|
23
|
+
(0, class_validator_1.IsString)(),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], KycVendorResultDetail.prototype, "vendor", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, class_validator_1.IsOptional)(),
|
|
28
|
+
(0, class_validator_1.IsString)(),
|
|
29
|
+
__metadata("design:type", String)
|
|
30
|
+
], KycVendorResultDetail.prototype, "type", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, class_validator_1.IsOptional)(),
|
|
33
|
+
(0, class_validator_1.IsString)(),
|
|
34
|
+
__metadata("design:type", String)
|
|
35
|
+
], KycVendorResultDetail.prototype, "code", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, class_validator_1.IsOptional)(),
|
|
38
|
+
(0, class_validator_1.IsString)(),
|
|
39
|
+
__metadata("design:type", String)
|
|
40
|
+
], KycVendorResultDetail.prototype, "description", void 0);
|
package/bin/card/index.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export * from './dtos/CardSummaryResponse';
|
|
|
37
37
|
export * from './dtos/CardAdditionalResponse';
|
|
38
38
|
export * from './dtos/AccountCancelGetResponse';
|
|
39
39
|
export * from './dtos/CardUpdateIssuanceRequest';
|
|
40
|
+
export * from './dtos/KycVendorResultDetail';
|
|
40
41
|
export * from './dtos/AccountIssuanceStepConfig';
|
|
41
42
|
export * from './enums/CardType';
|
|
42
43
|
export * from './enums/CardUpdateKey';
|
package/bin/card/index.js
CHANGED
|
@@ -55,6 +55,7 @@ __exportStar(require("./dtos/CardSummaryResponse"), exports);
|
|
|
55
55
|
__exportStar(require("./dtos/CardAdditionalResponse"), exports);
|
|
56
56
|
__exportStar(require("./dtos/AccountCancelGetResponse"), exports);
|
|
57
57
|
__exportStar(require("./dtos/CardUpdateIssuanceRequest"), exports);
|
|
58
|
+
__exportStar(require("./dtos/KycVendorResultDetail"), exports);
|
|
58
59
|
__exportStar(require("./dtos/AccountIssuanceStepConfig"), exports);
|
|
59
60
|
//enums
|
|
60
61
|
__exportStar(require("./enums/CardType"), exports);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Body de PUT /credits/:creditId/checklist (loan-credit-business). Marca condiciones de activación
|
|
3
|
+
* cumplidas. Solo se mandan las que cambian; en F3 las marcarán los flujos de firma de contrato
|
|
4
|
+
* (`downPayment` + `contractSigned`) y de enrolamiento MDM (`imeiEnrolled` + `lockVerified`).
|
|
5
|
+
*/
|
|
6
|
+
export declare class UpdateActivationChecklistRequest {
|
|
7
|
+
downPayment?: boolean;
|
|
8
|
+
contractSigned?: boolean;
|
|
9
|
+
imeiEnrolled?: boolean;
|
|
10
|
+
lockVerified?: boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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.UpdateActivationChecklistRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
/**
|
|
16
|
+
* Body de PUT /credits/:creditId/checklist (loan-credit-business). Marca condiciones de activación
|
|
17
|
+
* cumplidas. Solo se mandan las que cambian; en F3 las marcarán los flujos de firma de contrato
|
|
18
|
+
* (`downPayment` + `contractSigned`) y de enrolamiento MDM (`imeiEnrolled` + `lockVerified`).
|
|
19
|
+
*/
|
|
20
|
+
class UpdateActivationChecklistRequest {
|
|
21
|
+
}
|
|
22
|
+
exports.UpdateActivationChecklistRequest = UpdateActivationChecklistRequest;
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, class_transformer_1.Expose)(),
|
|
25
|
+
(0, class_validator_1.IsOptional)(),
|
|
26
|
+
(0, class_validator_1.IsBoolean)(),
|
|
27
|
+
__metadata("design:type", Boolean)
|
|
28
|
+
], UpdateActivationChecklistRequest.prototype, "downPayment", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, class_transformer_1.Expose)(),
|
|
31
|
+
(0, class_validator_1.IsOptional)(),
|
|
32
|
+
(0, class_validator_1.IsBoolean)(),
|
|
33
|
+
__metadata("design:type", Boolean)
|
|
34
|
+
], UpdateActivationChecklistRequest.prototype, "contractSigned", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, class_transformer_1.Expose)(),
|
|
37
|
+
(0, class_validator_1.IsOptional)(),
|
|
38
|
+
(0, class_validator_1.IsBoolean)(),
|
|
39
|
+
__metadata("design:type", Boolean)
|
|
40
|
+
], UpdateActivationChecklistRequest.prototype, "imeiEnrolled", void 0);
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, class_transformer_1.Expose)(),
|
|
43
|
+
(0, class_validator_1.IsOptional)(),
|
|
44
|
+
(0, class_validator_1.IsBoolean)(),
|
|
45
|
+
__metadata("design:type", Boolean)
|
|
46
|
+
], UpdateActivationChecklistRequest.prototype, "lockVerified", void 0);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nivel del cliente según su SCI (M7/05_MOTOR §3.2): 21-60 Bronce · 61-80 Plata · 81-100 Oro.
|
|
3
|
+
* Distinto de `CreditPlanLevelEnum` de loanOfferings (que además tiene `ALL` para planes):
|
|
4
|
+
* un CLIENTE nunca es `ALL`.
|
|
5
|
+
* @enum {string}
|
|
6
|
+
*/
|
|
7
|
+
export declare enum ClientLevelEnum {
|
|
8
|
+
BRONZE = "BRONZE",
|
|
9
|
+
SILVER = "SILVER",
|
|
10
|
+
GOLD = "GOLD"
|
|
11
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClientLevelEnum = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Nivel del cliente según su SCI (M7/05_MOTOR §3.2): 21-60 Bronce · 61-80 Plata · 81-100 Oro.
|
|
6
|
+
* Distinto de `CreditPlanLevelEnum` de loanOfferings (que además tiene `ALL` para planes):
|
|
7
|
+
* un CLIENTE nunca es `ALL`.
|
|
8
|
+
* @enum {string}
|
|
9
|
+
*/
|
|
10
|
+
var ClientLevelEnum;
|
|
11
|
+
(function (ClientLevelEnum) {
|
|
12
|
+
ClientLevelEnum["BRONZE"] = "BRONZE";
|
|
13
|
+
ClientLevelEnum["SILVER"] = "SILVER";
|
|
14
|
+
ClientLevelEnum["GOLD"] = "GOLD";
|
|
15
|
+
})(ClientLevelEnum || (exports.ClientLevelEnum = ClientLevelEnum = {}));
|
|
@@ -26,4 +26,17 @@ export interface SaleLogEntry {
|
|
|
26
26
|
/** Motivo, cuando la acción lo exige (cancelación, excepción aplicada). */
|
|
27
27
|
reason: string | null;
|
|
28
28
|
changes: SaleLogChange[];
|
|
29
|
+
/**
|
|
30
|
+
* Datos de la venta que la acción NO cambió y que se guardan para poder leer la entrada sin abrir
|
|
31
|
+
* otra pantalla (en un `SALE_CANCEL`: el tipo de venta, el monto, el enganche, el crédito).
|
|
32
|
+
*
|
|
33
|
+
* Va aparte de `changes` a propósito. Antes viajaba dentro de `new` y `changes` lo pintaba como un
|
|
34
|
+
* alta: la bitácora afirmaba que en la cancelación el tipo de venta había pasado «de nada a CASH».
|
|
35
|
+
* En una auditoría un cambio inventado es peor que un dato faltante.
|
|
36
|
+
*
|
|
37
|
+
* **El front lo pinta como contexto, NUNCA como «antes → después».** `null` cuando la acción no
|
|
38
|
+
* mandó contexto. Valores serializados a string igual que `changes`; y como `changes`, NUNCA
|
|
39
|
+
* lleva PII.
|
|
40
|
+
*/
|
|
41
|
+
context: Record<string, string | null> | null;
|
|
29
42
|
}
|
|
@@ -7,20 +7,36 @@
|
|
|
7
7
|
* contra el que el front ya mockeó la pantalla. Cambiarlas a inglés por consistencia rompería una
|
|
8
8
|
* pantalla ya construida sin ganar nada. Decisión de Andrés, 2026-08-03.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* **Las identidades del contrato** (las tres se cumplen siempre y están cubiertas por tests):
|
|
11
|
+
*
|
|
12
|
+
* - `contado` + `credito` + `sinProveedor` == `total`
|
|
13
|
+
* - `surekeep` + `externas` == `credito`
|
|
14
|
+
*
|
|
15
|
+
* `contado`, `credito` y `sinProveedor` particionan `total`; `surekeep` y `externas` particionan
|
|
16
|
+
* `credito`. Ninguna de las dos particiones se solapa (ver `helpers/saleFinancier`).
|
|
12
17
|
*/
|
|
13
18
|
export interface BackofficeSalesStatsResponse {
|
|
14
19
|
/** Ventas del retailer en la ventana consultada. */
|
|
15
20
|
total: number;
|
|
16
21
|
/** Subconjunto de `total` con `soldAt` en el día de hoy. */
|
|
17
22
|
hoy: number;
|
|
18
|
-
/** `type: CASH`. */
|
|
23
|
+
/** `type: CASH`. Efectivo de verdad — ver `sinProveedor`. */
|
|
19
24
|
contado: number;
|
|
20
|
-
/** `type: CREDIT
|
|
25
|
+
/** Derivadas con financiera CONOCIDA: `type: CREDIT`, o `EXTERNAL_REFERRAL` con proveedor. */
|
|
21
26
|
credito: number;
|
|
22
27
|
/** Financiadas por la SOFOM (`type: CREDIT`). */
|
|
23
28
|
surekeep: number;
|
|
24
29
|
/** Financiadas por un tercero (`EXTERNAL_REFERRAL` con proveedor). */
|
|
25
30
|
externas: number;
|
|
31
|
+
/**
|
|
32
|
+
* `type: EXTERNAL_REFERRAL` **sin** `externalProvider` — derivadas cuya financiera no quedó
|
|
33
|
+
* registrada. Es un DATO ROTO, no una forma de pago.
|
|
34
|
+
*
|
|
35
|
+
* Vive en su propia llave y NO en `contado` porque antes caía ahí y la pantalla las leía como
|
|
36
|
+
* EFECTIVO, que es la lectura más cara de equivocar. Tampoco entra en `credito`: `surekeep` +
|
|
37
|
+
* `externas` == `credito` y una venta sin financiera no pertenece a ninguna de las dos.
|
|
38
|
+
* Análisis ya las descartaba de su mix, y por eso Ventas y Análisis contaban distinto el mismo
|
|
39
|
+
* período. Un valor > 0 es una invitación a ir a corregir esas filas.
|
|
40
|
+
*/
|
|
41
|
+
sinProveedor: number;
|
|
26
42
|
}
|
|
@@ -22,6 +22,13 @@ export interface SellerKpiRow {
|
|
|
22
22
|
*
|
|
23
23
|
* Mismo criterio que A3: el eje es la venta, así que solo aparecen los vendedores que vendieron en
|
|
24
24
|
* la ventana. El roster completo vive en `retail-org-business`.
|
|
25
|
+
*
|
|
26
|
+
* ⚠️ **Sin la ★ de encargado de tienda** que pinta el mockup (`es_admin_tienda`). Ese flag es del
|
|
27
|
+
* padrón (`RetailUser_GT`, de `retail-org-business`), no del snapshot de la venta: la pantalla lo
|
|
28
|
+
* trae de ahí y lo une por `sellerRetailUserId`.
|
|
29
|
+
*
|
|
30
|
+
* ⚠️ Tampoco lleva variación contra la semana pasada — el mockup de Vendedores no la pinta, solo el
|
|
31
|
+
* de Tiendas (ver `StoreKpiRow.weekOverWeekChangePct`).
|
|
25
32
|
*/
|
|
26
33
|
export interface BackofficeSellerKpisResponse {
|
|
27
34
|
items: SellerKpiRow[];
|
|
@@ -15,6 +15,21 @@ export interface StoreKpiRow {
|
|
|
15
15
|
averageTicketCents: number | null;
|
|
16
16
|
/** ISO-8601 de la venta más reciente de la tienda en la ventana. `null` si no vendió. */
|
|
17
17
|
lastSaleAt: string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Variación porcentual del volumen colocado contra la MISMA ventana corrida 7 días atrás, con un
|
|
20
|
+
* decimal. Es el chip `+12%` / `-8%` de la pantalla Tiendas.
|
|
21
|
+
*
|
|
22
|
+
* `null` en tres casos, todos «no sé» y ninguno «no cambió»:
|
|
23
|
+
* - la ventana pedida abarca **más de 7 días**, así que el baseline se solaparía con ella y el
|
|
24
|
+
* delta compararía un período contra sí mismo (con el default de 90 días, siempre);
|
|
25
|
+
* - la tienda no vendió nada esa semana — no se divide por cero;
|
|
26
|
+
* - los números vienen del data lake y no hay fila para esta tienda en el baseline.
|
|
27
|
+
*/
|
|
28
|
+
weekOverWeekChangePct: number | null;
|
|
29
|
+
/** Volumen colocado de la ventana de hace 7 días — el denominador del chip, explícito. */
|
|
30
|
+
baselineSameWeekdayCents: number | null;
|
|
31
|
+
/** Piezas de esa misma ventana. La pantalla las pinta debajo del chip («N piezas semana pasada»). */
|
|
32
|
+
baselineSameWeekdayUnits: number | null;
|
|
18
33
|
}
|
|
19
34
|
/**
|
|
20
35
|
* GET /backoffice/stores/kpis — la pantalla Tiendas del Admin VL (A3).
|
|
@@ -22,6 +37,18 @@ export interface StoreKpiRow {
|
|
|
22
37
|
*
|
|
23
38
|
* El eje es la VENTA: solo aparecen las tiendas que vendieron en la ventana. El roster completo
|
|
24
39
|
* (incluidas las que no vendieron) lo tiene `retail-org-business`; la pantalla los cruza.
|
|
40
|
+
*
|
|
41
|
+
* ⚠️ **Tres columnas del mockup NO salen de acá y no van a salir**, porque no están en el snapshot
|
|
42
|
+
* congelado de la venta sino en el padrón:
|
|
43
|
+
*
|
|
44
|
+
* | Columna | Dónde vive |
|
|
45
|
+
* |---|---|
|
|
46
|
+
* | código de tienda | `Store` — `retail-org-business` |
|
|
47
|
+
* | tipo propia / subdistribuidor | NO es un campo de `Store`: un subdistribuidor es un *retailer hijo*, así que sale de `GET /retailers/{retailerId}/hierarchy` |
|
|
48
|
+
* | vendedores activos | `RetailUser_GT` — `retail-org-business` |
|
|
49
|
+
*
|
|
50
|
+
* La pantalla las trae de ahí y las une por `storeId`. Devolverlas desde este endpoint obligaría al
|
|
51
|
+
* silo de ventas a consultar el padrón en cada lectura de tablero.
|
|
25
52
|
*/
|
|
26
53
|
export interface BackofficeStoreKpisResponse {
|
|
27
54
|
items: StoreKpiRow[];
|
package/package.json
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Type } from "class-transformer";
|
|
2
|
+
import { IsArray, IsEnum, IsOptional, IsString, IsUUID, ValidateNested } from "class-validator";
|
|
2
3
|
import { KycStatus } from "../enums/issuance/KycStatus";
|
|
3
4
|
import { UserStatus } from "../enums/issuance/UserStatus";
|
|
4
5
|
import { KycReason } from "../enums/KycReason";
|
|
6
|
+
import { KycVendorResultDetail } from "./KycVendorResultDetail";
|
|
5
7
|
|
|
6
8
|
|
|
7
9
|
export class CardUpdateIssuanceRequest {
|
|
@@ -22,4 +24,11 @@ export class CardUpdateIssuanceRequest {
|
|
|
22
24
|
@IsString()
|
|
23
25
|
kycReasons?: KycReason[];
|
|
24
26
|
|
|
27
|
+
/** Detalle crudo del vendor de KYC. Solo lo manda la ruta del webhook/connector de CP. */
|
|
28
|
+
@IsOptional()
|
|
29
|
+
@IsArray()
|
|
30
|
+
@ValidateNested({ each: true })
|
|
31
|
+
@Type(() => KycVendorResultDetail)
|
|
32
|
+
kycVendorResults?: KycVendorResultDetail[];
|
|
33
|
+
|
|
25
34
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { IsOptional, IsString } from "class-validator";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resultado crudo del vendor de KYC (IDology vía Central Payments). Valores libres a propósito:
|
|
5
|
+
* los códigos son un conjunto abierto del vendor — la traducción vive en el consumidor.
|
|
6
|
+
*/
|
|
7
|
+
export class KycVendorResultDetail {
|
|
8
|
+
|
|
9
|
+
@IsOptional()
|
|
10
|
+
@IsString()
|
|
11
|
+
vendor?: string;
|
|
12
|
+
|
|
13
|
+
@IsOptional()
|
|
14
|
+
@IsString()
|
|
15
|
+
type?: string;
|
|
16
|
+
|
|
17
|
+
@IsOptional()
|
|
18
|
+
@IsString()
|
|
19
|
+
code?: string;
|
|
20
|
+
|
|
21
|
+
@IsOptional()
|
|
22
|
+
@IsString()
|
|
23
|
+
description?: string;
|
|
24
|
+
}
|
package/src/card/index.ts
CHANGED
|
@@ -41,6 +41,7 @@ export * from './dtos/CardSummaryResponse'
|
|
|
41
41
|
export * from './dtos/CardAdditionalResponse'
|
|
42
42
|
export * from './dtos/AccountCancelGetResponse'
|
|
43
43
|
export * from './dtos/CardUpdateIssuanceRequest'
|
|
44
|
+
export * from './dtos/KycVendorResultDetail'
|
|
44
45
|
export * from './dtos/AccountIssuanceStepConfig'
|
|
45
46
|
|
|
46
47
|
//enums
|
|
@@ -27,4 +27,17 @@ export interface SaleLogEntry {
|
|
|
27
27
|
/** Motivo, cuando la acción lo exige (cancelación, excepción aplicada). */
|
|
28
28
|
reason: string | null;
|
|
29
29
|
changes: SaleLogChange[];
|
|
30
|
+
/**
|
|
31
|
+
* Datos de la venta que la acción NO cambió y que se guardan para poder leer la entrada sin abrir
|
|
32
|
+
* otra pantalla (en un `SALE_CANCEL`: el tipo de venta, el monto, el enganche, el crédito).
|
|
33
|
+
*
|
|
34
|
+
* Va aparte de `changes` a propósito. Antes viajaba dentro de `new` y `changes` lo pintaba como un
|
|
35
|
+
* alta: la bitácora afirmaba que en la cancelación el tipo de venta había pasado «de nada a CASH».
|
|
36
|
+
* En una auditoría un cambio inventado es peor que un dato faltante.
|
|
37
|
+
*
|
|
38
|
+
* **El front lo pinta como contexto, NUNCA como «antes → después».** `null` cuando la acción no
|
|
39
|
+
* mandó contexto. Valores serializados a string igual que `changes`; y como `changes`, NUNCA
|
|
40
|
+
* lleva PII.
|
|
41
|
+
*/
|
|
42
|
+
context: Record<string, string | null> | null;
|
|
30
43
|
}
|
|
@@ -7,20 +7,36 @@
|
|
|
7
7
|
* contra el que el front ya mockeó la pantalla. Cambiarlas a inglés por consistencia rompería una
|
|
8
8
|
* pantalla ya construida sin ganar nada. Decisión de Andrés, 2026-08-03.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* **Las identidades del contrato** (las tres se cumplen siempre y están cubiertas por tests):
|
|
11
|
+
*
|
|
12
|
+
* - `contado` + `credito` + `sinProveedor` == `total`
|
|
13
|
+
* - `surekeep` + `externas` == `credito`
|
|
14
|
+
*
|
|
15
|
+
* `contado`, `credito` y `sinProveedor` particionan `total`; `surekeep` y `externas` particionan
|
|
16
|
+
* `credito`. Ninguna de las dos particiones se solapa (ver `helpers/saleFinancier`).
|
|
12
17
|
*/
|
|
13
18
|
export interface BackofficeSalesStatsResponse {
|
|
14
19
|
/** Ventas del retailer en la ventana consultada. */
|
|
15
20
|
total: number;
|
|
16
21
|
/** Subconjunto de `total` con `soldAt` en el día de hoy. */
|
|
17
22
|
hoy: number;
|
|
18
|
-
/** `type: CASH`. */
|
|
23
|
+
/** `type: CASH`. Efectivo de verdad — ver `sinProveedor`. */
|
|
19
24
|
contado: number;
|
|
20
|
-
/** `type: CREDIT
|
|
25
|
+
/** Derivadas con financiera CONOCIDA: `type: CREDIT`, o `EXTERNAL_REFERRAL` con proveedor. */
|
|
21
26
|
credito: number;
|
|
22
27
|
/** Financiadas por la SOFOM (`type: CREDIT`). */
|
|
23
28
|
surekeep: number;
|
|
24
29
|
/** Financiadas por un tercero (`EXTERNAL_REFERRAL` con proveedor). */
|
|
25
30
|
externas: number;
|
|
31
|
+
/**
|
|
32
|
+
* `type: EXTERNAL_REFERRAL` **sin** `externalProvider` — derivadas cuya financiera no quedó
|
|
33
|
+
* registrada. Es un DATO ROTO, no una forma de pago.
|
|
34
|
+
*
|
|
35
|
+
* Vive en su propia llave y NO en `contado` porque antes caía ahí y la pantalla las leía como
|
|
36
|
+
* EFECTIVO, que es la lectura más cara de equivocar. Tampoco entra en `credito`: `surekeep` +
|
|
37
|
+
* `externas` == `credito` y una venta sin financiera no pertenece a ninguna de las dos.
|
|
38
|
+
* Análisis ya las descartaba de su mix, y por eso Ventas y Análisis contaban distinto el mismo
|
|
39
|
+
* período. Un valor > 0 es una invitación a ir a corregir esas filas.
|
|
40
|
+
*/
|
|
41
|
+
sinProveedor: number;
|
|
26
42
|
}
|
|
@@ -23,6 +23,13 @@ export interface SellerKpiRow {
|
|
|
23
23
|
*
|
|
24
24
|
* Mismo criterio que A3: el eje es la venta, así que solo aparecen los vendedores que vendieron en
|
|
25
25
|
* la ventana. El roster completo vive en `retail-org-business`.
|
|
26
|
+
*
|
|
27
|
+
* ⚠️ **Sin la ★ de encargado de tienda** que pinta el mockup (`es_admin_tienda`). Ese flag es del
|
|
28
|
+
* padrón (`RetailUser_GT`, de `retail-org-business`), no del snapshot de la venta: la pantalla lo
|
|
29
|
+
* trae de ahí y lo une por `sellerRetailUserId`.
|
|
30
|
+
*
|
|
31
|
+
* ⚠️ Tampoco lleva variación contra la semana pasada — el mockup de Vendedores no la pinta, solo el
|
|
32
|
+
* de Tiendas (ver `StoreKpiRow.weekOverWeekChangePct`).
|
|
26
33
|
*/
|
|
27
34
|
export interface BackofficeSellerKpisResponse {
|
|
28
35
|
items: SellerKpiRow[];
|
|
@@ -15,6 +15,21 @@ export interface StoreKpiRow {
|
|
|
15
15
|
averageTicketCents: number | null;
|
|
16
16
|
/** ISO-8601 de la venta más reciente de la tienda en la ventana. `null` si no vendió. */
|
|
17
17
|
lastSaleAt: string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Variación porcentual del volumen colocado contra la MISMA ventana corrida 7 días atrás, con un
|
|
20
|
+
* decimal. Es el chip `+12%` / `-8%` de la pantalla Tiendas.
|
|
21
|
+
*
|
|
22
|
+
* `null` en tres casos, todos «no sé» y ninguno «no cambió»:
|
|
23
|
+
* - la ventana pedida abarca **más de 7 días**, así que el baseline se solaparía con ella y el
|
|
24
|
+
* delta compararía un período contra sí mismo (con el default de 90 días, siempre);
|
|
25
|
+
* - la tienda no vendió nada esa semana — no se divide por cero;
|
|
26
|
+
* - los números vienen del data lake y no hay fila para esta tienda en el baseline.
|
|
27
|
+
*/
|
|
28
|
+
weekOverWeekChangePct: number | null;
|
|
29
|
+
/** Volumen colocado de la ventana de hace 7 días — el denominador del chip, explícito. */
|
|
30
|
+
baselineSameWeekdayCents: number | null;
|
|
31
|
+
/** Piezas de esa misma ventana. La pantalla las pinta debajo del chip («N piezas semana pasada»). */
|
|
32
|
+
baselineSameWeekdayUnits: number | null;
|
|
18
33
|
}
|
|
19
34
|
|
|
20
35
|
/**
|
|
@@ -23,6 +38,18 @@ export interface StoreKpiRow {
|
|
|
23
38
|
*
|
|
24
39
|
* El eje es la VENTA: solo aparecen las tiendas que vendieron en la ventana. El roster completo
|
|
25
40
|
* (incluidas las que no vendieron) lo tiene `retail-org-business`; la pantalla los cruza.
|
|
41
|
+
*
|
|
42
|
+
* ⚠️ **Tres columnas del mockup NO salen de acá y no van a salir**, porque no están en el snapshot
|
|
43
|
+
* congelado de la venta sino en el padrón:
|
|
44
|
+
*
|
|
45
|
+
* | Columna | Dónde vive |
|
|
46
|
+
* |---|---|
|
|
47
|
+
* | código de tienda | `Store` — `retail-org-business` |
|
|
48
|
+
* | tipo propia / subdistribuidor | NO es un campo de `Store`: un subdistribuidor es un *retailer hijo*, así que sale de `GET /retailers/{retailerId}/hierarchy` |
|
|
49
|
+
* | vendedores activos | `RetailUser_GT` — `retail-org-business` |
|
|
50
|
+
*
|
|
51
|
+
* La pantalla las trae de ahí y las une por `storeId`. Devolverlas desde este endpoint obligaría al
|
|
52
|
+
* silo de ventas a consultar el padrón en cada lectura de tablero.
|
|
26
53
|
*/
|
|
27
54
|
export interface BackofficeStoreKpisResponse {
|
|
28
55
|
items: StoreKpiRow[];
|
|
@@ -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 = {}));
|