@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.
@@ -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);
@@ -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
- * `contado` + `credito` == `total`. `surekeep` + `externas` == `credito`: las dos particiones son
11
- * completas y NO se solapan (ver `helpers/saleFinancier`).
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` o `EXTERNAL_REFERRAL` todo lo que no es contado. */
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.289.0",
3
+ "version": "3.291.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -1,7 +1,9 @@
1
- import { IsEnum, IsOptional, IsString, IsUUID } from "class-validator";
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
- * `contado` + `credito` == `total`. `surekeep` + `externas` == `credito`: las dos particiones son
11
- * completas y NO se solapan (ver `helpers/saleFinancier`).
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` o `EXTERNAL_REFERRAL` todo lo que no es contado. */
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 = {}));