@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.
Files changed (32) hide show
  1. package/bin/account/dtos/AccountCreateRequest.d.ts +6 -0
  2. package/bin/account/dtos/AccountCreateRequest.js +6 -0
  3. package/bin/account/dtos/CreateBankAccountUserRequest.d.ts +9 -0
  4. package/bin/card/dtos/CardApplicationRequest.d.ts +6 -0
  5. package/bin/card/dtos/CardApplicationRequest.js +6 -0
  6. package/bin/card/dtos/Internal/ReplaceBankAccountCardRequest.d.ts +6 -0
  7. package/bin/identity/dtos/PeopleResponse.d.ts +7 -0
  8. package/bin/retailWizard/dtos/requests/AddSaleExceptionNoteRequest.d.ts +16 -0
  9. package/bin/retailWizard/dtos/requests/AddSaleExceptionNoteRequest.js +37 -0
  10. package/bin/retailWizard/dtos/requests/ApplySaleExceptionRequest.d.ts +16 -0
  11. package/bin/retailWizard/dtos/requests/ApplySaleExceptionRequest.js +38 -0
  12. package/bin/retailWizard/dtos/requests/ReviewSaleExceptionRequest.d.ts +14 -0
  13. package/bin/retailWizard/dtos/requests/ReviewSaleExceptionRequest.js +36 -0
  14. package/bin/retailWizard/dtos/responses/BackofficeSalesKpisResponse.d.ts +8 -0
  15. package/bin/retailWizard/enums/SaleExceptionEventKindEnum.d.ts +2 -0
  16. package/bin/retailWizard/enums/SaleExceptionEventKindEnum.js +2 -0
  17. package/bin/retailWizard/index.d.ts +3 -0
  18. package/bin/retailWizard/index.js +3 -0
  19. package/package.json +1 -1
  20. package/src/account/dtos/AccountCreateRequest.ts +11 -1
  21. package/src/account/dtos/CreateBankAccountUserRequest.ts +10 -1
  22. package/src/card/dtos/CardApplicationRequest.ts +11 -1
  23. package/src/card/dtos/Internal/ReplaceBankAccountCardRequest.ts +6 -0
  24. package/src/identity/dtos/PeopleResponse.ts +7 -0
  25. package/src/retailWizard/dtos/requests/AddSaleExceptionNoteRequest.ts +23 -0
  26. package/src/retailWizard/dtos/requests/ApplySaleExceptionRequest.ts +24 -0
  27. package/src/retailWizard/dtos/requests/ReviewSaleExceptionRequest.ts +22 -0
  28. package/src/retailWizard/dtos/responses/BackofficeSalesKpisResponse.ts +8 -0
  29. package/src/retailWizard/enums/SaleExceptionEventKindEnum.ts +2 -0
  30. package/src/retailWizard/index.ts +3 -0
  31. package/bin/identity/enums/SelfieSourceEnum.d.ts +0 -10
  32. 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,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.283.0",
3
+ "version": "3.285.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -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 = {}));