@fiado/type-kit 3.379.0 → 3.381.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 (48) hide show
  1. package/bin/loanOfferings/dtos/requests/ChangeSegmentStatusRequest.d.ts +10 -0
  2. package/bin/loanOfferings/dtos/requests/ChangeSegmentStatusRequest.js +35 -0
  3. package/bin/loanOfferings/dtos/requests/CreateSegmentRequest.d.ts +24 -0
  4. package/bin/loanOfferings/dtos/requests/CreateSegmentRequest.js +57 -0
  5. package/bin/loanOfferings/dtos/requests/CreateStorePolicyRequest.d.ts +2 -0
  6. package/bin/loanOfferings/dtos/requests/CreateStorePolicyRequest.js +8 -0
  7. package/bin/loanOfferings/dtos/requests/ResolveCustomerSegmentsRequest.d.ts +24 -0
  8. package/bin/loanOfferings/dtos/requests/ResolveCustomerSegmentsRequest.js +71 -0
  9. package/bin/loanOfferings/dtos/requests/SimulateCreditPlanRequest.d.ts +5 -0
  10. package/bin/loanOfferings/dtos/requests/SimulateCreditPlanRequest.js +7 -0
  11. package/bin/loanOfferings/dtos/requests/UpdateSegmentRequest.d.ts +18 -0
  12. package/bin/loanOfferings/dtos/requests/UpdateSegmentRequest.js +66 -0
  13. package/bin/loanOfferings/dtos/requests/UpdateStorePolicyRequest.d.ts +2 -0
  14. package/bin/loanOfferings/dtos/requests/UpdateStorePolicyRequest.js +8 -0
  15. package/bin/loanOfferings/dtos/responses/PromotedSkusResponse.d.ts +14 -0
  16. package/bin/loanOfferings/dtos/responses/PromotedSkusResponse.js +2 -0
  17. package/bin/loanOfferings/dtos/responses/ResolveCustomerSegmentsResponse.d.ts +10 -0
  18. package/bin/loanOfferings/dtos/responses/ResolveCustomerSegmentsResponse.js +2 -0
  19. package/bin/loanOfferings/dtos/responses/SegmentFilterResponse.d.ts +18 -0
  20. package/bin/loanOfferings/dtos/responses/SegmentFilterResponse.js +2 -0
  21. package/bin/loanOfferings/dtos/responses/SegmentResponse.d.ts +27 -0
  22. package/bin/loanOfferings/dtos/responses/SegmentResponse.js +2 -0
  23. package/bin/loanOfferings/dtos/responses/StorePolicyResponse.d.ts +6 -0
  24. package/bin/loanOfferings/enums/SegmentColorSlotEnum.d.ts +15 -0
  25. package/bin/loanOfferings/enums/SegmentColorSlotEnum.js +19 -0
  26. package/bin/loanOfferings/enums/SegmentFilterIdEnum.d.ts +18 -0
  27. package/bin/loanOfferings/enums/SegmentFilterIdEnum.js +22 -0
  28. package/bin/loanOfferings/enums/SegmentStatusEnum.d.ts +9 -0
  29. package/bin/loanOfferings/enums/SegmentStatusEnum.js +13 -0
  30. package/bin/loanOfferings/index.d.ts +11 -0
  31. package/bin/loanOfferings/index.js +11 -0
  32. package/package.json +1 -1
  33. package/src/loanOfferings/dtos/requests/ChangeSegmentStatusRequest.ts +20 -0
  34. package/src/loanOfferings/dtos/requests/CreateSegmentRequest.ts +49 -0
  35. package/src/loanOfferings/dtos/requests/CreateStorePolicyRequest.ts +8 -0
  36. package/src/loanOfferings/dtos/requests/ResolveCustomerSegmentsRequest.ts +57 -0
  37. package/src/loanOfferings/dtos/requests/SimulateCreditPlanRequest.ts +11 -1
  38. package/src/loanOfferings/dtos/requests/UpdateSegmentRequest.ts +49 -0
  39. package/src/loanOfferings/dtos/requests/UpdateStorePolicyRequest.ts +8 -0
  40. package/src/loanOfferings/dtos/responses/PromotedSkusResponse.ts +14 -0
  41. package/src/loanOfferings/dtos/responses/ResolveCustomerSegmentsResponse.ts +10 -0
  42. package/src/loanOfferings/dtos/responses/SegmentFilterResponse.ts +19 -0
  43. package/src/loanOfferings/dtos/responses/SegmentResponse.ts +28 -0
  44. package/src/loanOfferings/dtos/responses/StorePolicyResponse.ts +6 -0
  45. package/src/loanOfferings/enums/SegmentColorSlotEnum.ts +15 -0
  46. package/src/loanOfferings/enums/SegmentFilterIdEnum.ts +18 -0
  47. package/src/loanOfferings/enums/SegmentStatusEnum.ts +9 -0
  48. package/src/loanOfferings/index.ts +11 -0
@@ -0,0 +1,10 @@
1
+ import { SegmentStatusEnum } from '../../enums/SegmentStatusEnum';
2
+ /**
3
+ * Body de PUT /segments/:segmentId/status — archiva o reactiva un segmento.
4
+ * No hay borrado: archivar lo saca del motor y de los selectores sin dejar huérfanas a las
5
+ * políticas y promociones que le apuntan. `reason` queda en la bitácora.
6
+ */
7
+ export declare class ChangeSegmentStatusRequest {
8
+ status: SegmentStatusEnum;
9
+ reason?: string;
10
+ }
@@ -0,0 +1,35 @@
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.ChangeSegmentStatusRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const SegmentStatusEnum_1 = require("../../enums/SegmentStatusEnum");
16
+ /**
17
+ * Body de PUT /segments/:segmentId/status — archiva o reactiva un segmento.
18
+ * No hay borrado: archivar lo saca del motor y de los selectores sin dejar huérfanas a las
19
+ * políticas y promociones que le apuntan. `reason` queda en la bitácora.
20
+ */
21
+ class ChangeSegmentStatusRequest {
22
+ }
23
+ exports.ChangeSegmentStatusRequest = ChangeSegmentStatusRequest;
24
+ __decorate([
25
+ (0, class_transformer_1.Expose)(),
26
+ (0, class_validator_1.IsEnum)(SegmentStatusEnum_1.SegmentStatusEnum),
27
+ __metadata("design:type", String)
28
+ ], ChangeSegmentStatusRequest.prototype, "status", void 0);
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.MaxLength)(280),
34
+ __metadata("design:type", String)
35
+ ], ChangeSegmentStatusRequest.prototype, "reason", void 0);
@@ -0,0 +1,24 @@
1
+ import { SegmentColorSlotEnum } from '../../enums/SegmentColorSlotEnum';
2
+ /**
3
+ * Body de POST /segments — alta de un segmento de clientes.
4
+ * Nace en `ACTIVE`: `segmentId`, `status`, `version`, `isDefault` y la auditoría los asigna el
5
+ * lambda y NO viajan en el request. Que cada filtro exista en el catálogo y tenga fuente lo valida
6
+ * el lambda contra `GET /segments/filters`.
7
+ */
8
+ export declare class CreateSegmentRequest {
9
+ name: string;
10
+ description?: string;
11
+ /** Ranura de color del chip. Ausente = `slate`. */
12
+ colorSlot?: SegmentColorSlotEnum;
13
+ /**
14
+ * Filtros del catálogo cerrado. Un cliente pertenece si cumple AL MENOS UNO — es un OR, no un
15
+ * AND. Se valida contra el catálogo en el lambda (422), no acá, para poder nombrar el filtro
16
+ * desconocido y el que todavía no tiene fuente.
17
+ */
18
+ filterIds?: string[];
19
+ /**
20
+ * Clientes agregados a mano por `retailCustomerId`. Ganan siempre, cumplan o no un filtro.
21
+ * Un segmento puede nacer SOLO con esta lista, sin ningún filtro activo.
22
+ */
23
+ memberIds?: string[];
24
+ }
@@ -0,0 +1,57 @@
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.CreateSegmentRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const SegmentColorSlotEnum_1 = require("../../enums/SegmentColorSlotEnum");
16
+ /**
17
+ * Body de POST /segments — alta de un segmento de clientes.
18
+ * Nace en `ACTIVE`: `segmentId`, `status`, `version`, `isDefault` y la auditoría los asigna el
19
+ * lambda y NO viajan en el request. Que cada filtro exista en el catálogo y tenga fuente lo valida
20
+ * el lambda contra `GET /segments/filters`.
21
+ */
22
+ class CreateSegmentRequest {
23
+ }
24
+ exports.CreateSegmentRequest = CreateSegmentRequest;
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.IsString)(),
28
+ (0, class_validator_1.MaxLength)(120),
29
+ __metadata("design:type", String)
30
+ ], CreateSegmentRequest.prototype, "name", void 0);
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.MaxLength)(500),
36
+ __metadata("design:type", String)
37
+ ], CreateSegmentRequest.prototype, "description", void 0);
38
+ __decorate([
39
+ (0, class_transformer_1.Expose)(),
40
+ (0, class_validator_1.IsOptional)(),
41
+ (0, class_validator_1.IsEnum)(SegmentColorSlotEnum_1.SegmentColorSlotEnum),
42
+ __metadata("design:type", String)
43
+ ], CreateSegmentRequest.prototype, "colorSlot", void 0);
44
+ __decorate([
45
+ (0, class_transformer_1.Expose)(),
46
+ (0, class_validator_1.IsOptional)(),
47
+ (0, class_validator_1.IsArray)(),
48
+ (0, class_validator_1.IsString)({ each: true }),
49
+ __metadata("design:type", Array)
50
+ ], CreateSegmentRequest.prototype, "filterIds", void 0);
51
+ __decorate([
52
+ (0, class_transformer_1.Expose)(),
53
+ (0, class_validator_1.IsOptional)(),
54
+ (0, class_validator_1.IsArray)(),
55
+ (0, class_validator_1.IsString)({ each: true }),
56
+ __metadata("design:type", Array)
57
+ ], CreateSegmentRequest.prototype, "memberIds", void 0);
@@ -32,6 +32,8 @@ export declare class CreateStorePolicyRequest {
32
32
  storeIds?: string[];
33
33
  /** Alcance: niveles alcanzados. Ausente = todos los niveles. */
34
34
  targetLevels?: CreditPlanLevelEnum[];
35
+ /** Alcance: segmentos alcanzados. Ausente = todos los segmentos. */
36
+ segmentIds?: string[];
35
37
  /** Alcance: SKUs alcanzados. Ausente = todos los productos. */
36
38
  targetSkus?: string[];
37
39
  validFrom?: string;
@@ -140,6 +140,14 @@ __decorate([
140
140
  (0, class_validator_1.IsEnum)(CreditPlanLevelEnum_1.CreditPlanLevelEnum, { each: true }),
141
141
  __metadata("design:type", Array)
142
142
  ], CreateStorePolicyRequest.prototype, "targetLevels", void 0);
143
+ __decorate([
144
+ (0, class_transformer_1.Expose)(),
145
+ (0, class_validator_1.IsOptional)(),
146
+ (0, class_validator_1.IsArray)(),
147
+ (0, class_validator_1.ArrayNotEmpty)(),
148
+ (0, class_validator_1.IsString)({ each: true }),
149
+ __metadata("design:type", Array)
150
+ ], CreateStorePolicyRequest.prototype, "segmentIds", void 0);
143
151
  __decorate([
144
152
  (0, class_transformer_1.Expose)(),
145
153
  (0, class_validator_1.IsOptional)(),
@@ -0,0 +1,24 @@
1
+ import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
2
+ /**
3
+ * Body de POST /private/segments/resolve — los hechos del cliente contra los que se evalúan los
4
+ * filtros. Los junta quien ya tiene al cliente delante (el wizard o el motor de crédito); este
5
+ * lambda no sale a buscarlos a otro silo en el camino caliente.
6
+ *
7
+ * Un hecho AUSENTE hace que su filtro NO se cumpla: sin el dato no se puede afirmar que el cliente
8
+ * califica, y de las dos salidas la segura es dejarlo fuera.
9
+ */
10
+ export declare class ResolveCustomerSegmentsRequest {
11
+ retailCustomerId: string;
12
+ /** Colaborador de la red. Hoy ningún sistema lo produce — ver la lista de individuos. */
13
+ isEmployee?: boolean;
14
+ /** Nivel que resolvió loan-scoring a partir del SCI. */
15
+ sciLevel?: CreditPlanLevelEnum;
16
+ /** Créditos cerrados en toda la vida del cliente. */
17
+ completedCredits?: number;
18
+ /** Días de mora acumulados en la ventana de 180 días. `0` es sin mora. */
19
+ delinquencyDaysLast6M?: number;
20
+ /** Bajas contables vitalicias. `0` es ninguna. */
21
+ lifetimeWriteOffs?: number;
22
+ /** Reestructuras vitalicias. `0` es ninguna. */
23
+ lifetimeRestructures?: number;
24
+ }
@@ -0,0 +1,71 @@
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.ResolveCustomerSegmentsRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const CreditPlanLevelEnum_1 = require("../../enums/CreditPlanLevelEnum");
16
+ /**
17
+ * Body de POST /private/segments/resolve — los hechos del cliente contra los que se evalúan los
18
+ * filtros. Los junta quien ya tiene al cliente delante (el wizard o el motor de crédito); este
19
+ * lambda no sale a buscarlos a otro silo en el camino caliente.
20
+ *
21
+ * Un hecho AUSENTE hace que su filtro NO se cumpla: sin el dato no se puede afirmar que el cliente
22
+ * califica, y de las dos salidas la segura es dejarlo fuera.
23
+ */
24
+ class ResolveCustomerSegmentsRequest {
25
+ }
26
+ exports.ResolveCustomerSegmentsRequest = ResolveCustomerSegmentsRequest;
27
+ __decorate([
28
+ (0, class_transformer_1.Expose)(),
29
+ (0, class_validator_1.IsString)(),
30
+ __metadata("design:type", String)
31
+ ], ResolveCustomerSegmentsRequest.prototype, "retailCustomerId", void 0);
32
+ __decorate([
33
+ (0, class_transformer_1.Expose)(),
34
+ (0, class_validator_1.IsOptional)(),
35
+ (0, class_validator_1.IsBoolean)(),
36
+ __metadata("design:type", Boolean)
37
+ ], ResolveCustomerSegmentsRequest.prototype, "isEmployee", void 0);
38
+ __decorate([
39
+ (0, class_transformer_1.Expose)(),
40
+ (0, class_validator_1.IsOptional)(),
41
+ (0, class_validator_1.IsEnum)(CreditPlanLevelEnum_1.CreditPlanLevelEnum),
42
+ __metadata("design:type", String)
43
+ ], ResolveCustomerSegmentsRequest.prototype, "sciLevel", void 0);
44
+ __decorate([
45
+ (0, class_transformer_1.Expose)(),
46
+ (0, class_validator_1.IsOptional)(),
47
+ (0, class_validator_1.IsInt)(),
48
+ (0, class_validator_1.Min)(0),
49
+ __metadata("design:type", Number)
50
+ ], ResolveCustomerSegmentsRequest.prototype, "completedCredits", void 0);
51
+ __decorate([
52
+ (0, class_transformer_1.Expose)(),
53
+ (0, class_validator_1.IsOptional)(),
54
+ (0, class_validator_1.IsInt)(),
55
+ (0, class_validator_1.Min)(0),
56
+ __metadata("design:type", Number)
57
+ ], ResolveCustomerSegmentsRequest.prototype, "delinquencyDaysLast6M", void 0);
58
+ __decorate([
59
+ (0, class_transformer_1.Expose)(),
60
+ (0, class_validator_1.IsOptional)(),
61
+ (0, class_validator_1.IsInt)(),
62
+ (0, class_validator_1.Min)(0),
63
+ __metadata("design:type", Number)
64
+ ], ResolveCustomerSegmentsRequest.prototype, "lifetimeWriteOffs", void 0);
65
+ __decorate([
66
+ (0, class_transformer_1.Expose)(),
67
+ (0, class_validator_1.IsOptional)(),
68
+ (0, class_validator_1.IsInt)(),
69
+ (0, class_validator_1.Min)(0),
70
+ __metadata("design:type", Number)
71
+ ], ResolveCustomerSegmentsRequest.prototype, "lifetimeRestructures", void 0);
@@ -16,4 +16,9 @@ export declare class SimulateCreditPlanRequest {
16
16
  storeId?: string;
17
17
  /** SKU del equipo. Sin él no se resuelven las promociones acotadas por producto. */
18
18
  productSku?: string;
19
+ /**
20
+ * Segmentos del cliente, los que devolvió `POST /private/segments/resolve`. Un arreglo vacío
21
+ * declara que el cliente no está en ninguno; ausente declara que el caller no lo consultó.
22
+ */
23
+ customerSegmentIds?: string[];
19
24
  }
@@ -63,3 +63,10 @@ __decorate([
63
63
  (0, class_validator_1.IsString)(),
64
64
  __metadata("design:type", String)
65
65
  ], SimulateCreditPlanRequest.prototype, "productSku", void 0);
66
+ __decorate([
67
+ (0, class_transformer_1.Expose)(),
68
+ (0, class_validator_1.IsOptional)(),
69
+ (0, class_validator_1.IsArray)(),
70
+ (0, class_validator_1.IsString)({ each: true }),
71
+ __metadata("design:type", Array)
72
+ ], SimulateCreditPlanRequest.prototype, "customerSegmentIds", void 0);
@@ -0,0 +1,18 @@
1
+ import { SegmentColorSlotEnum } from '../../enums/SegmentColorSlotEnum';
2
+ /**
3
+ * Body de PUT /segments/:segmentId — edición parcial (todos los campos opcionales). Sube `version`.
4
+ * El cambio de estado va por su endpoint dedicado.
5
+ *
6
+ * Un arreglo vacío VACÍA la lista; ausente la deja como está. El segmento por omisión
7
+ * (`isDefault`) solo acepta el cambio de nombre.
8
+ */
9
+ export declare class UpdateSegmentRequest {
10
+ name?: string;
11
+ description?: string;
12
+ colorSlot?: SegmentColorSlotEnum;
13
+ /** Reemplaza la lista entera; `[]` deja el segmento sin filtros. */
14
+ filterIds?: string[];
15
+ /** Reemplaza la lista entera; `[]` saca a todos los agregados a mano. */
16
+ memberIds?: string[];
17
+ reason?: string;
18
+ }
@@ -0,0 +1,66 @@
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.UpdateSegmentRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const SegmentColorSlotEnum_1 = require("../../enums/SegmentColorSlotEnum");
16
+ /**
17
+ * Body de PUT /segments/:segmentId — edición parcial (todos los campos opcionales). Sube `version`.
18
+ * El cambio de estado va por su endpoint dedicado.
19
+ *
20
+ * Un arreglo vacío VACÍA la lista; ausente la deja como está. El segmento por omisión
21
+ * (`isDefault`) solo acepta el cambio de nombre.
22
+ */
23
+ class UpdateSegmentRequest {
24
+ }
25
+ exports.UpdateSegmentRequest = UpdateSegmentRequest;
26
+ __decorate([
27
+ (0, class_transformer_1.Expose)(),
28
+ (0, class_validator_1.IsOptional)(),
29
+ (0, class_validator_1.IsString)(),
30
+ (0, class_validator_1.MaxLength)(120),
31
+ __metadata("design:type", String)
32
+ ], UpdateSegmentRequest.prototype, "name", void 0);
33
+ __decorate([
34
+ (0, class_transformer_1.Expose)(),
35
+ (0, class_validator_1.IsOptional)(),
36
+ (0, class_validator_1.IsString)(),
37
+ (0, class_validator_1.MaxLength)(500),
38
+ __metadata("design:type", String)
39
+ ], UpdateSegmentRequest.prototype, "description", void 0);
40
+ __decorate([
41
+ (0, class_transformer_1.Expose)(),
42
+ (0, class_validator_1.IsOptional)(),
43
+ (0, class_validator_1.IsEnum)(SegmentColorSlotEnum_1.SegmentColorSlotEnum),
44
+ __metadata("design:type", String)
45
+ ], UpdateSegmentRequest.prototype, "colorSlot", void 0);
46
+ __decorate([
47
+ (0, class_transformer_1.Expose)(),
48
+ (0, class_validator_1.IsOptional)(),
49
+ (0, class_validator_1.IsArray)(),
50
+ (0, class_validator_1.IsString)({ each: true }),
51
+ __metadata("design:type", Array)
52
+ ], UpdateSegmentRequest.prototype, "filterIds", void 0);
53
+ __decorate([
54
+ (0, class_transformer_1.Expose)(),
55
+ (0, class_validator_1.IsOptional)(),
56
+ (0, class_validator_1.IsArray)(),
57
+ (0, class_validator_1.IsString)({ each: true }),
58
+ __metadata("design:type", Array)
59
+ ], UpdateSegmentRequest.prototype, "memberIds", void 0);
60
+ __decorate([
61
+ (0, class_transformer_1.Expose)(),
62
+ (0, class_validator_1.IsOptional)(),
63
+ (0, class_validator_1.IsString)(),
64
+ (0, class_validator_1.MaxLength)(280),
65
+ __metadata("design:type", String)
66
+ ], UpdateSegmentRequest.prototype, "reason", void 0);
@@ -14,6 +14,8 @@ export declare class UpdateStorePolicyRequest {
14
14
  allowedSkus?: string[];
15
15
  storeIds?: string[];
16
16
  targetLevels?: CreditPlanLevelEnum[];
17
+ /** Alcance: segmentos alcanzados. */
18
+ segmentIds?: string[];
17
19
  targetSkus?: string[];
18
20
  validFrom?: string;
19
21
  validUntil?: string;
@@ -80,6 +80,14 @@ __decorate([
80
80
  (0, class_validator_1.IsEnum)(CreditPlanLevelEnum_1.CreditPlanLevelEnum, { each: true }),
81
81
  __metadata("design:type", Array)
82
82
  ], UpdateStorePolicyRequest.prototype, "targetLevels", void 0);
83
+ __decorate([
84
+ (0, class_transformer_1.Expose)(),
85
+ (0, class_validator_1.IsOptional)(),
86
+ (0, class_validator_1.IsArray)(),
87
+ (0, class_validator_1.ArrayNotEmpty)(),
88
+ (0, class_validator_1.IsString)({ each: true }),
89
+ __metadata("design:type", Array)
90
+ ], UpdateStorePolicyRequest.prototype, "segmentIds", void 0);
83
91
  __decorate([
84
92
  (0, class_transformer_1.Expose)(),
85
93
  (0, class_validator_1.IsOptional)(),
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SKUs que hoy traen promoción en una tienda, para el badge del catálogo del wizard.
3
+ *
4
+ * El catálogo se pinta en el paso 03 y el nivel del cliente recién sale en el paso 05, así que la
5
+ * lista solo incluye promociones que alcanzan a CUALQUIER nivel: una acotada por nivel prometería
6
+ * un beneficio que la cotización puede no dar, y el vendedor ya se lo dijo al cliente.
7
+ *
8
+ * Solo entran las promociones que ACOTAN por SKU. Una promoción de «todos los productos» no es una
9
+ * propiedad del equipo y marcaría el catálogo entero, que es lo mismo que no marcar nada.
10
+ */
11
+ export interface PromotedSkusResponse {
12
+ /** SKUs con al menos una promoción vigente que los nombra. Vacío si no hay ninguna. */
13
+ skus: string[];
14
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Respuesta de POST /private/segments/resolve: los segmentos a los que pertenece el cliente HOY.
3
+ *
4
+ * Puede venir VACÍO, y eso no es un error: «estar en Estándar» es justamente no pertenecer a
5
+ * ningún segmento preferente. El segmento por omisión NUNCA se devuelve acá.
6
+ */
7
+ export interface ResolveCustomerSegmentsResponse {
8
+ retailCustomerId: string;
9
+ segmentIds: string[];
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,18 @@
1
+ import { SegmentFilterIdEnum } from '../../enums/SegmentFilterIdEnum';
2
+ /**
3
+ * Un filtro del catálogo cerrado, tal como lo sirve `GET /segments/filters`. El front lo pinta
4
+ * desde acá en vez de duplicar la lista.
5
+ */
6
+ export interface SegmentFilterResponse {
7
+ filterId: SegmentFilterIdEnum;
8
+ name: string;
9
+ description: string;
10
+ /**
11
+ * `false` cuando el filtro está declarado pero ningún sistema produce su insumo: la pantalla lo
12
+ * muestra deshabilitado con la razón y el lambda rechaza guardarlo (422). Ofrecer un filtro que
13
+ * no evalúa nada es la mentira que este módulo viene a cerrar.
14
+ */
15
+ hasSource: boolean;
16
+ /** Por qué no tiene fuente todavía. `null` cuando `hasSource` es `true`. */
17
+ missingSourceReason: string | null;
18
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,27 @@
1
+ import { SegmentColorSlotEnum } from '../../enums/SegmentColorSlotEnum';
2
+ import { SegmentFilterIdEnum } from '../../enums/SegmentFilterIdEnum';
3
+ import { SegmentStatusEnum } from '../../enums/SegmentStatusEnum';
4
+ /**
5
+ * Shape de salida de un segmento (GET / POST / PUT de /segments).
6
+ *
7
+ * Un cliente pertenece si cumple AL MENOS UNO de los `filterIds` (OR) **o** está en `memberIds`.
8
+ * No hay prioridad ni desempate: el cliente puede estar en varios segmentos a la vez.
9
+ */
10
+ export interface SegmentResponse {
11
+ segmentId: string;
12
+ name: string;
13
+ description: string | null;
14
+ colorSlot: SegmentColorSlotEnum;
15
+ /** Ids del catálogo cerrado. Vacío = no alcanza a nadie por regla. */
16
+ filterIds: SegmentFilterIdEnum[];
17
+ /** `retailCustomerId` agregados a mano. Ganan aunque el cliente no cumpla ningún filtro. */
18
+ memberIds: string[];
19
+ /** El catch-all implícito. No acepta filtros ni individuos, no se archiva y solo se renombra. */
20
+ isDefault: boolean;
21
+ status: SegmentStatusEnum;
22
+ version: number;
23
+ createdAt: string;
24
+ updatedAt: string;
25
+ createdBy: string;
26
+ updatedBy: string;
27
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -49,6 +49,12 @@ export interface StorePolicyResponse {
49
49
  targetLevels: CreditPlanLevelEnum[] | null;
50
50
  /** ALCANCE. `null` = todos los SKUs. */
51
51
  targetSkus: string[] | null;
52
+ /**
53
+ * ALCANCE. `null` = todos los segmentos. Un cliente puede estar en varios a la vez.
54
+ * Opcional hasta que todos los productores lo emitan: obligatorio rompe a quien construya la
55
+ * respuesta y todavía no lo llene.
56
+ */
57
+ segmentIds?: string[] | null;
52
58
  validFrom: string | null;
53
59
  validUntil: string | null;
54
60
  reason: string | null;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Ranura de color con la que el Portal Admin pinta el chip del segmento. Es un catálogo CERRADO de
3
+ * ocho: el valor viaja como llave, no como color, y la paleta la resuelve el front.
4
+ * @enum {string}
5
+ */
6
+ export declare enum SegmentColorSlotEnum {
7
+ SLATE = "slate",
8
+ SKY = "sky",
9
+ AMBER = "amber",
10
+ VIOLET = "violet",
11
+ EMERALD = "emerald",
12
+ TEAL = "teal",
13
+ PINK = "pink",
14
+ ROSE = "rose"
15
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SegmentColorSlotEnum = void 0;
4
+ /**
5
+ * Ranura de color con la que el Portal Admin pinta el chip del segmento. Es un catálogo CERRADO de
6
+ * ocho: el valor viaja como llave, no como color, y la paleta la resuelve el front.
7
+ * @enum {string}
8
+ */
9
+ var SegmentColorSlotEnum;
10
+ (function (SegmentColorSlotEnum) {
11
+ SegmentColorSlotEnum["SLATE"] = "slate";
12
+ SegmentColorSlotEnum["SKY"] = "sky";
13
+ SegmentColorSlotEnum["AMBER"] = "amber";
14
+ SegmentColorSlotEnum["VIOLET"] = "violet";
15
+ SegmentColorSlotEnum["EMERALD"] = "emerald";
16
+ SegmentColorSlotEnum["TEAL"] = "teal";
17
+ SegmentColorSlotEnum["PINK"] = "pink";
18
+ SegmentColorSlotEnum["ROSE"] = "rose";
19
+ })(SegmentColorSlotEnum || (exports.SegmentColorSlotEnum = SegmentColorSlotEnum = {}));
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Catálogo CERRADO de filtros que un segmento puede activar. El operador elige de la lista, no la
3
+ * edita: un filtro que no está aquí no lo evalúa nadie.
4
+ *
5
+ * El nombre y la descripción que ve el operador NO viven acá: los sirve
6
+ * `GET /segments/filters`, junto con la marca de si el filtro tiene fuente de datos hoy.
7
+ * @enum {string}
8
+ */
9
+ export declare enum SegmentFilterIdEnum {
10
+ IS_EMPLOYEE = "isEmployee",
11
+ LEVEL_GOLD = "levelGold",
12
+ LEVEL_SILVER = "levelSilver",
13
+ LEVEL_BRONZE = "levelBronze",
14
+ COMPLETED_CREDITS_GTE_3 = "completedCreditsGte3",
15
+ NO_DELINQUENCY_LAST_6_MONTHS = "noDelinquencyLast6Months",
16
+ NO_LIFETIME_WRITE_OFFS = "noLifetimeWriteOffs",
17
+ NO_LIFETIME_RESTRUCTURES = "noLifetimeRestructures"
18
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SegmentFilterIdEnum = void 0;
4
+ /**
5
+ * Catálogo CERRADO de filtros que un segmento puede activar. El operador elige de la lista, no la
6
+ * edita: un filtro que no está aquí no lo evalúa nadie.
7
+ *
8
+ * El nombre y la descripción que ve el operador NO viven acá: los sirve
9
+ * `GET /segments/filters`, junto con la marca de si el filtro tiene fuente de datos hoy.
10
+ * @enum {string}
11
+ */
12
+ var SegmentFilterIdEnum;
13
+ (function (SegmentFilterIdEnum) {
14
+ SegmentFilterIdEnum["IS_EMPLOYEE"] = "isEmployee";
15
+ SegmentFilterIdEnum["LEVEL_GOLD"] = "levelGold";
16
+ SegmentFilterIdEnum["LEVEL_SILVER"] = "levelSilver";
17
+ SegmentFilterIdEnum["LEVEL_BRONZE"] = "levelBronze";
18
+ SegmentFilterIdEnum["COMPLETED_CREDITS_GTE_3"] = "completedCreditsGte3";
19
+ SegmentFilterIdEnum["NO_DELINQUENCY_LAST_6_MONTHS"] = "noDelinquencyLast6Months";
20
+ SegmentFilterIdEnum["NO_LIFETIME_WRITE_OFFS"] = "noLifetimeWriteOffs";
21
+ SegmentFilterIdEnum["NO_LIFETIME_RESTRUCTURES"] = "noLifetimeRestructures";
22
+ })(SegmentFilterIdEnum || (exports.SegmentFilterIdEnum = SegmentFilterIdEnum = {}));
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Estado PERSISTIDO de un segmento de clientes. No hay borrado: `ARCHIVED` lo saca del motor y de
3
+ * los selectores, y las referencias que le apuntan siguen resolviendo su nombre.
4
+ * @enum {string}
5
+ */
6
+ export declare enum SegmentStatusEnum {
7
+ ACTIVE = "ACTIVE",
8
+ ARCHIVED = "ARCHIVED"
9
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SegmentStatusEnum = void 0;
4
+ /**
5
+ * Estado PERSISTIDO de un segmento de clientes. No hay borrado: `ARCHIVED` lo saca del motor y de
6
+ * los selectores, y las referencias que le apuntan siguen resolviendo su nombre.
7
+ * @enum {string}
8
+ */
9
+ var SegmentStatusEnum;
10
+ (function (SegmentStatusEnum) {
11
+ SegmentStatusEnum["ACTIVE"] = "ACTIVE";
12
+ SegmentStatusEnum["ARCHIVED"] = "ARCHIVED";
13
+ })(SegmentStatusEnum || (exports.SegmentStatusEnum = SegmentStatusEnum = {}));
@@ -10,6 +10,9 @@ export * from './enums/PromotionPhaseEnum';
10
10
  export * from './enums/PromotionLogEventEnum';
11
11
  export * from './enums/StorePolicyStatusEnum';
12
12
  export * from './enums/StorePolicyPhaseEnum';
13
+ export * from './enums/SegmentStatusEnum';
14
+ export * from './enums/SegmentColorSlotEnum';
15
+ export * from './enums/SegmentFilterIdEnum';
13
16
  export * from './dtos/CreditPlan';
14
17
  export * from './dtos/Financier';
15
18
  export * from './dtos/RetailerCreditPlan';
@@ -30,6 +33,10 @@ export * from './dtos/requests/ConsumePromotionRequest';
30
33
  export * from './dtos/requests/CreateStorePolicyRequest';
31
34
  export * from './dtos/requests/UpdateStorePolicyRequest';
32
35
  export * from './dtos/requests/ChangeStorePolicyStatusRequest';
36
+ export * from './dtos/requests/CreateSegmentRequest';
37
+ export * from './dtos/requests/UpdateSegmentRequest';
38
+ export * from './dtos/requests/ChangeSegmentStatusRequest';
39
+ export * from './dtos/requests/ResolveCustomerSegmentsRequest';
33
40
  export * from './dtos/responses/CreditPlanResponse';
34
41
  export * from './dtos/responses/FinancierResponse';
35
42
  export * from './dtos/responses/RetailerCreditPlanResponse';
@@ -37,4 +44,8 @@ export * from './dtos/responses/SimulationResultResponse';
37
44
  export * from './dtos/responses/PromotionResponse';
38
45
  export * from './dtos/responses/PromotionLogEntryResponse';
39
46
  export * from './dtos/responses/ConsumePromotionResponse';
47
+ export * from './dtos/responses/PromotedSkusResponse';
40
48
  export * from './dtos/responses/StorePolicyResponse';
49
+ export * from './dtos/responses/SegmentResponse';
50
+ export * from './dtos/responses/SegmentFilterResponse';
51
+ export * from './dtos/responses/ResolveCustomerSegmentsResponse';
@@ -27,6 +27,9 @@ __exportStar(require("./enums/PromotionPhaseEnum"), exports);
27
27
  __exportStar(require("./enums/PromotionLogEventEnum"), exports);
28
28
  __exportStar(require("./enums/StorePolicyStatusEnum"), exports);
29
29
  __exportStar(require("./enums/StorePolicyPhaseEnum"), exports);
30
+ __exportStar(require("./enums/SegmentStatusEnum"), exports);
31
+ __exportStar(require("./enums/SegmentColorSlotEnum"), exports);
32
+ __exportStar(require("./enums/SegmentFilterIdEnum"), exports);
30
33
  // Entity DTOs
31
34
  __exportStar(require("./dtos/CreditPlan"), exports);
32
35
  __exportStar(require("./dtos/Financier"), exports);
@@ -49,6 +52,10 @@ __exportStar(require("./dtos/requests/ConsumePromotionRequest"), exports);
49
52
  __exportStar(require("./dtos/requests/CreateStorePolicyRequest"), exports);
50
53
  __exportStar(require("./dtos/requests/UpdateStorePolicyRequest"), exports);
51
54
  __exportStar(require("./dtos/requests/ChangeStorePolicyStatusRequest"), exports);
55
+ __exportStar(require("./dtos/requests/CreateSegmentRequest"), exports);
56
+ __exportStar(require("./dtos/requests/UpdateSegmentRequest"), exports);
57
+ __exportStar(require("./dtos/requests/ChangeSegmentStatusRequest"), exports);
58
+ __exportStar(require("./dtos/requests/ResolveCustomerSegmentsRequest"), exports);
52
59
  // Response DTOs
53
60
  __exportStar(require("./dtos/responses/CreditPlanResponse"), exports);
54
61
  __exportStar(require("./dtos/responses/FinancierResponse"), exports);
@@ -57,4 +64,8 @@ __exportStar(require("./dtos/responses/SimulationResultResponse"), exports);
57
64
  __exportStar(require("./dtos/responses/PromotionResponse"), exports);
58
65
  __exportStar(require("./dtos/responses/PromotionLogEntryResponse"), exports);
59
66
  __exportStar(require("./dtos/responses/ConsumePromotionResponse"), exports);
67
+ __exportStar(require("./dtos/responses/PromotedSkusResponse"), exports);
60
68
  __exportStar(require("./dtos/responses/StorePolicyResponse"), exports);
69
+ __exportStar(require("./dtos/responses/SegmentResponse"), exports);
70
+ __exportStar(require("./dtos/responses/SegmentFilterResponse"), exports);
71
+ __exportStar(require("./dtos/responses/ResolveCustomerSegmentsResponse"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.379.0",
3
+ "version": "3.381.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,20 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsEnum, IsOptional, IsString, MaxLength } from 'class-validator';
3
+ import { SegmentStatusEnum } from '../../enums/SegmentStatusEnum';
4
+
5
+ /**
6
+ * Body de PUT /segments/:segmentId/status — archiva o reactiva un segmento.
7
+ * No hay borrado: archivar lo saca del motor y de los selectores sin dejar huérfanas a las
8
+ * políticas y promociones que le apuntan. `reason` queda en la bitácora.
9
+ */
10
+ export class ChangeSegmentStatusRequest {
11
+ @Expose()
12
+ @IsEnum(SegmentStatusEnum)
13
+ status!: SegmentStatusEnum;
14
+
15
+ @Expose()
16
+ @IsOptional()
17
+ @IsString()
18
+ @MaxLength(280)
19
+ reason?: string;
20
+ }
@@ -0,0 +1,49 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsArray, IsEnum, IsOptional, IsString, MaxLength } from 'class-validator';
3
+ import { SegmentColorSlotEnum } from '../../enums/SegmentColorSlotEnum';
4
+
5
+ /**
6
+ * Body de POST /segments — alta de un segmento de clientes.
7
+ * Nace en `ACTIVE`: `segmentId`, `status`, `version`, `isDefault` y la auditoría los asigna el
8
+ * lambda y NO viajan en el request. Que cada filtro exista en el catálogo y tenga fuente lo valida
9
+ * el lambda contra `GET /segments/filters`.
10
+ */
11
+ export class CreateSegmentRequest {
12
+ @Expose()
13
+ @IsString()
14
+ @MaxLength(120)
15
+ name!: string;
16
+
17
+ @Expose()
18
+ @IsOptional()
19
+ @IsString()
20
+ @MaxLength(500)
21
+ description?: string;
22
+
23
+ /** Ranura de color del chip. Ausente = `slate`. */
24
+ @Expose()
25
+ @IsOptional()
26
+ @IsEnum(SegmentColorSlotEnum)
27
+ colorSlot?: SegmentColorSlotEnum;
28
+
29
+ /**
30
+ * Filtros del catálogo cerrado. Un cliente pertenece si cumple AL MENOS UNO — es un OR, no un
31
+ * AND. Se valida contra el catálogo en el lambda (422), no acá, para poder nombrar el filtro
32
+ * desconocido y el que todavía no tiene fuente.
33
+ */
34
+ @Expose()
35
+ @IsOptional()
36
+ @IsArray()
37
+ @IsString({ each: true })
38
+ filterIds?: string[];
39
+
40
+ /**
41
+ * Clientes agregados a mano por `retailCustomerId`. Ganan siempre, cumplan o no un filtro.
42
+ * Un segmento puede nacer SOLO con esta lista, sin ningún filtro activo.
43
+ */
44
+ @Expose()
45
+ @IsOptional()
46
+ @IsArray()
47
+ @IsString({ each: true })
48
+ memberIds?: string[];
49
+ }
@@ -130,6 +130,14 @@ export class CreateStorePolicyRequest {
130
130
  @IsEnum(CreditPlanLevelEnum, { each: true })
131
131
  targetLevels?: CreditPlanLevelEnum[];
132
132
 
133
+ /** Alcance: segmentos alcanzados. Ausente = todos los segmentos. */
134
+ @Expose()
135
+ @IsOptional()
136
+ @IsArray()
137
+ @ArrayNotEmpty()
138
+ @IsString({ each: true })
139
+ segmentIds?: string[];
140
+
133
141
  /** Alcance: SKUs alcanzados. Ausente = todos los productos. */
134
142
  @Expose()
135
143
  @IsOptional()
@@ -0,0 +1,57 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsBoolean, IsEnum, IsInt, IsOptional, IsString, Min } from 'class-validator';
3
+ import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
4
+
5
+ /**
6
+ * Body de POST /private/segments/resolve — los hechos del cliente contra los que se evalúan los
7
+ * filtros. Los junta quien ya tiene al cliente delante (el wizard o el motor de crédito); este
8
+ * lambda no sale a buscarlos a otro silo en el camino caliente.
9
+ *
10
+ * Un hecho AUSENTE hace que su filtro NO se cumpla: sin el dato no se puede afirmar que el cliente
11
+ * califica, y de las dos salidas la segura es dejarlo fuera.
12
+ */
13
+ export class ResolveCustomerSegmentsRequest {
14
+ @Expose()
15
+ @IsString()
16
+ retailCustomerId!: string;
17
+
18
+ /** Colaborador de la red. Hoy ningún sistema lo produce — ver la lista de individuos. */
19
+ @Expose()
20
+ @IsOptional()
21
+ @IsBoolean()
22
+ isEmployee?: boolean;
23
+
24
+ /** Nivel que resolvió loan-scoring a partir del SCI. */
25
+ @Expose()
26
+ @IsOptional()
27
+ @IsEnum(CreditPlanLevelEnum)
28
+ sciLevel?: CreditPlanLevelEnum;
29
+
30
+ /** Créditos cerrados en toda la vida del cliente. */
31
+ @Expose()
32
+ @IsOptional()
33
+ @IsInt()
34
+ @Min(0)
35
+ completedCredits?: number;
36
+
37
+ /** Días de mora acumulados en la ventana de 180 días. `0` es sin mora. */
38
+ @Expose()
39
+ @IsOptional()
40
+ @IsInt()
41
+ @Min(0)
42
+ delinquencyDaysLast6M?: number;
43
+
44
+ /** Bajas contables vitalicias. `0` es ninguna. */
45
+ @Expose()
46
+ @IsOptional()
47
+ @IsInt()
48
+ @Min(0)
49
+ lifetimeWriteOffs?: number;
50
+
51
+ /** Reestructuras vitalicias. `0` es ninguna. */
52
+ @Expose()
53
+ @IsOptional()
54
+ @IsInt()
55
+ @Min(0)
56
+ lifetimeRestructures?: number;
57
+ }
@@ -1,5 +1,5 @@
1
1
  import { Expose } from 'class-transformer';
2
- import { IsInt, IsNumber, IsOptional, IsString, Max, Min } from 'class-validator';
2
+ import { IsArray, IsInt, IsNumber, IsOptional, IsString, Max, Min } from 'class-validator';
3
3
 
4
4
  /**
5
5
  * Body de POST /private/credit-plans/:planId/simulate y query de GET /credit-plans/:planId/simulator.
@@ -45,4 +45,14 @@ export class SimulateCreditPlanRequest {
45
45
  @IsOptional()
46
46
  @IsString()
47
47
  productSku?: string;
48
+
49
+ /**
50
+ * Segmentos del cliente, los que devolvió `POST /private/segments/resolve`. Un arreglo vacío
51
+ * declara que el cliente no está en ninguno; ausente declara que el caller no lo consultó.
52
+ */
53
+ @Expose()
54
+ @IsOptional()
55
+ @IsArray()
56
+ @IsString({ each: true })
57
+ customerSegmentIds?: string[];
48
58
  }
@@ -0,0 +1,49 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsArray, IsEnum, IsOptional, IsString, MaxLength } from 'class-validator';
3
+ import { SegmentColorSlotEnum } from '../../enums/SegmentColorSlotEnum';
4
+
5
+ /**
6
+ * Body de PUT /segments/:segmentId — edición parcial (todos los campos opcionales). Sube `version`.
7
+ * El cambio de estado va por su endpoint dedicado.
8
+ *
9
+ * Un arreglo vacío VACÍA la lista; ausente la deja como está. El segmento por omisión
10
+ * (`isDefault`) solo acepta el cambio de nombre.
11
+ */
12
+ export class UpdateSegmentRequest {
13
+ @Expose()
14
+ @IsOptional()
15
+ @IsString()
16
+ @MaxLength(120)
17
+ name?: string;
18
+
19
+ @Expose()
20
+ @IsOptional()
21
+ @IsString()
22
+ @MaxLength(500)
23
+ description?: string;
24
+
25
+ @Expose()
26
+ @IsOptional()
27
+ @IsEnum(SegmentColorSlotEnum)
28
+ colorSlot?: SegmentColorSlotEnum;
29
+
30
+ /** Reemplaza la lista entera; `[]` deja el segmento sin filtros. */
31
+ @Expose()
32
+ @IsOptional()
33
+ @IsArray()
34
+ @IsString({ each: true })
35
+ filterIds?: string[];
36
+
37
+ /** Reemplaza la lista entera; `[]` saca a todos los agregados a mano. */
38
+ @Expose()
39
+ @IsOptional()
40
+ @IsArray()
41
+ @IsString({ each: true })
42
+ memberIds?: string[];
43
+
44
+ @Expose()
45
+ @IsOptional()
46
+ @IsString()
47
+ @MaxLength(280)
48
+ reason?: string;
49
+ }
@@ -69,6 +69,14 @@ export class UpdateStorePolicyRequest {
69
69
  @IsEnum(CreditPlanLevelEnum, { each: true })
70
70
  targetLevels?: CreditPlanLevelEnum[];
71
71
 
72
+ /** Alcance: segmentos alcanzados. */
73
+ @Expose()
74
+ @IsOptional()
75
+ @IsArray()
76
+ @ArrayNotEmpty()
77
+ @IsString({ each: true })
78
+ segmentIds?: string[];
79
+
72
80
  @Expose()
73
81
  @IsOptional()
74
82
  @IsArray()
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SKUs que hoy traen promoción en una tienda, para el badge del catálogo del wizard.
3
+ *
4
+ * El catálogo se pinta en el paso 03 y el nivel del cliente recién sale en el paso 05, así que la
5
+ * lista solo incluye promociones que alcanzan a CUALQUIER nivel: una acotada por nivel prometería
6
+ * un beneficio que la cotización puede no dar, y el vendedor ya se lo dijo al cliente.
7
+ *
8
+ * Solo entran las promociones que ACOTAN por SKU. Una promoción de «todos los productos» no es una
9
+ * propiedad del equipo y marcaría el catálogo entero, que es lo mismo que no marcar nada.
10
+ */
11
+ export interface PromotedSkusResponse {
12
+ /** SKUs con al menos una promoción vigente que los nombra. Vacío si no hay ninguna. */
13
+ skus: string[];
14
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Respuesta de POST /private/segments/resolve: los segmentos a los que pertenece el cliente HOY.
3
+ *
4
+ * Puede venir VACÍO, y eso no es un error: «estar en Estándar» es justamente no pertenecer a
5
+ * ningún segmento preferente. El segmento por omisión NUNCA se devuelve acá.
6
+ */
7
+ export interface ResolveCustomerSegmentsResponse {
8
+ retailCustomerId: string;
9
+ segmentIds: string[];
10
+ }
@@ -0,0 +1,19 @@
1
+ import { SegmentFilterIdEnum } from '../../enums/SegmentFilterIdEnum';
2
+
3
+ /**
4
+ * Un filtro del catálogo cerrado, tal como lo sirve `GET /segments/filters`. El front lo pinta
5
+ * desde acá en vez de duplicar la lista.
6
+ */
7
+ export interface SegmentFilterResponse {
8
+ filterId: SegmentFilterIdEnum;
9
+ name: string;
10
+ description: string;
11
+ /**
12
+ * `false` cuando el filtro está declarado pero ningún sistema produce su insumo: la pantalla lo
13
+ * muestra deshabilitado con la razón y el lambda rechaza guardarlo (422). Ofrecer un filtro que
14
+ * no evalúa nada es la mentira que este módulo viene a cerrar.
15
+ */
16
+ hasSource: boolean;
17
+ /** Por qué no tiene fuente todavía. `null` cuando `hasSource` es `true`. */
18
+ missingSourceReason: string | null;
19
+ }
@@ -0,0 +1,28 @@
1
+ import { SegmentColorSlotEnum } from '../../enums/SegmentColorSlotEnum';
2
+ import { SegmentFilterIdEnum } from '../../enums/SegmentFilterIdEnum';
3
+ import { SegmentStatusEnum } from '../../enums/SegmentStatusEnum';
4
+
5
+ /**
6
+ * Shape de salida de un segmento (GET / POST / PUT de /segments).
7
+ *
8
+ * Un cliente pertenece si cumple AL MENOS UNO de los `filterIds` (OR) **o** está en `memberIds`.
9
+ * No hay prioridad ni desempate: el cliente puede estar en varios segmentos a la vez.
10
+ */
11
+ export interface SegmentResponse {
12
+ segmentId: string;
13
+ name: string;
14
+ description: string | null;
15
+ colorSlot: SegmentColorSlotEnum;
16
+ /** Ids del catálogo cerrado. Vacío = no alcanza a nadie por regla. */
17
+ filterIds: SegmentFilterIdEnum[];
18
+ /** `retailCustomerId` agregados a mano. Ganan aunque el cliente no cumpla ningún filtro. */
19
+ memberIds: string[];
20
+ /** El catch-all implícito. No acepta filtros ni individuos, no se archiva y solo se renombra. */
21
+ isDefault: boolean;
22
+ status: SegmentStatusEnum;
23
+ version: number;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ createdBy: string;
27
+ updatedBy: string;
28
+ }
@@ -54,6 +54,12 @@ export interface StorePolicyResponse {
54
54
  targetLevels: CreditPlanLevelEnum[] | null;
55
55
  /** ALCANCE. `null` = todos los SKUs. */
56
56
  targetSkus: string[] | null;
57
+ /**
58
+ * ALCANCE. `null` = todos los segmentos. Un cliente puede estar en varios a la vez.
59
+ * Opcional hasta que todos los productores lo emitan: obligatorio rompe a quien construya la
60
+ * respuesta y todavía no lo llene.
61
+ */
62
+ segmentIds?: string[] | null;
57
63
  validFrom: string | null;
58
64
  validUntil: string | null;
59
65
  reason: string | null;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Ranura de color con la que el Portal Admin pinta el chip del segmento. Es un catálogo CERRADO de
3
+ * ocho: el valor viaja como llave, no como color, y la paleta la resuelve el front.
4
+ * @enum {string}
5
+ */
6
+ export enum SegmentColorSlotEnum {
7
+ SLATE = 'slate',
8
+ SKY = 'sky',
9
+ AMBER = 'amber',
10
+ VIOLET = 'violet',
11
+ EMERALD = 'emerald',
12
+ TEAL = 'teal',
13
+ PINK = 'pink',
14
+ ROSE = 'rose',
15
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Catálogo CERRADO de filtros que un segmento puede activar. El operador elige de la lista, no la
3
+ * edita: un filtro que no está aquí no lo evalúa nadie.
4
+ *
5
+ * El nombre y la descripción que ve el operador NO viven acá: los sirve
6
+ * `GET /segments/filters`, junto con la marca de si el filtro tiene fuente de datos hoy.
7
+ * @enum {string}
8
+ */
9
+ export enum SegmentFilterIdEnum {
10
+ IS_EMPLOYEE = 'isEmployee',
11
+ LEVEL_GOLD = 'levelGold',
12
+ LEVEL_SILVER = 'levelSilver',
13
+ LEVEL_BRONZE = 'levelBronze',
14
+ COMPLETED_CREDITS_GTE_3 = 'completedCreditsGte3',
15
+ NO_DELINQUENCY_LAST_6_MONTHS = 'noDelinquencyLast6Months',
16
+ NO_LIFETIME_WRITE_OFFS = 'noLifetimeWriteOffs',
17
+ NO_LIFETIME_RESTRUCTURES = 'noLifetimeRestructures',
18
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Estado PERSISTIDO de un segmento de clientes. No hay borrado: `ARCHIVED` lo saca del motor y de
3
+ * los selectores, y las referencias que le apuntan siguen resolviendo su nombre.
4
+ * @enum {string}
5
+ */
6
+ export enum SegmentStatusEnum {
7
+ ACTIVE = 'ACTIVE',
8
+ ARCHIVED = 'ARCHIVED',
9
+ }
@@ -11,6 +11,9 @@ export * from './enums/PromotionPhaseEnum';
11
11
  export * from './enums/PromotionLogEventEnum';
12
12
  export * from './enums/StorePolicyStatusEnum';
13
13
  export * from './enums/StorePolicyPhaseEnum';
14
+ export * from './enums/SegmentStatusEnum';
15
+ export * from './enums/SegmentColorSlotEnum';
16
+ export * from './enums/SegmentFilterIdEnum';
14
17
 
15
18
  // Entity DTOs
16
19
  export * from './dtos/CreditPlan';
@@ -35,6 +38,10 @@ export * from './dtos/requests/ConsumePromotionRequest';
35
38
  export * from './dtos/requests/CreateStorePolicyRequest';
36
39
  export * from './dtos/requests/UpdateStorePolicyRequest';
37
40
  export * from './dtos/requests/ChangeStorePolicyStatusRequest';
41
+ export * from './dtos/requests/CreateSegmentRequest';
42
+ export * from './dtos/requests/UpdateSegmentRequest';
43
+ export * from './dtos/requests/ChangeSegmentStatusRequest';
44
+ export * from './dtos/requests/ResolveCustomerSegmentsRequest';
38
45
 
39
46
  // Response DTOs
40
47
  export * from './dtos/responses/CreditPlanResponse';
@@ -44,4 +51,8 @@ export * from './dtos/responses/SimulationResultResponse';
44
51
  export * from './dtos/responses/PromotionResponse';
45
52
  export * from './dtos/responses/PromotionLogEntryResponse';
46
53
  export * from './dtos/responses/ConsumePromotionResponse';
54
+ export * from './dtos/responses/PromotedSkusResponse';
47
55
  export * from './dtos/responses/StorePolicyResponse';
56
+ export * from './dtos/responses/SegmentResponse';
57
+ export * from './dtos/responses/SegmentFilterResponse';
58
+ export * from './dtos/responses/ResolveCustomerSegmentsResponse';