@fiado/type-kit 3.379.0 → 3.380.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/loanOfferings/dtos/requests/ChangeSegmentStatusRequest.d.ts +10 -0
- package/bin/loanOfferings/dtos/requests/ChangeSegmentStatusRequest.js +35 -0
- package/bin/loanOfferings/dtos/requests/CreateSegmentRequest.d.ts +24 -0
- package/bin/loanOfferings/dtos/requests/CreateSegmentRequest.js +57 -0
- package/bin/loanOfferings/dtos/requests/CreateStorePolicyRequest.d.ts +2 -0
- package/bin/loanOfferings/dtos/requests/CreateStorePolicyRequest.js +8 -0
- package/bin/loanOfferings/dtos/requests/ResolveCustomerSegmentsRequest.d.ts +24 -0
- package/bin/loanOfferings/dtos/requests/ResolveCustomerSegmentsRequest.js +71 -0
- package/bin/loanOfferings/dtos/requests/SimulateCreditPlanRequest.d.ts +5 -0
- package/bin/loanOfferings/dtos/requests/SimulateCreditPlanRequest.js +7 -0
- package/bin/loanOfferings/dtos/requests/UpdateSegmentRequest.d.ts +18 -0
- package/bin/loanOfferings/dtos/requests/UpdateSegmentRequest.js +66 -0
- package/bin/loanOfferings/dtos/requests/UpdateStorePolicyRequest.d.ts +2 -0
- package/bin/loanOfferings/dtos/requests/UpdateStorePolicyRequest.js +8 -0
- package/bin/loanOfferings/dtos/responses/PromotedSkusResponse.d.ts +14 -0
- package/bin/loanOfferings/dtos/responses/PromotedSkusResponse.js +2 -0
- package/bin/loanOfferings/dtos/responses/ResolveCustomerSegmentsResponse.d.ts +10 -0
- package/bin/loanOfferings/dtos/responses/ResolveCustomerSegmentsResponse.js +2 -0
- package/bin/loanOfferings/dtos/responses/SegmentFilterResponse.d.ts +18 -0
- package/bin/loanOfferings/dtos/responses/SegmentFilterResponse.js +2 -0
- package/bin/loanOfferings/dtos/responses/SegmentResponse.d.ts +27 -0
- package/bin/loanOfferings/dtos/responses/SegmentResponse.js +2 -0
- package/bin/loanOfferings/dtos/responses/StorePolicyResponse.d.ts +2 -0
- package/bin/loanOfferings/enums/SegmentColorSlotEnum.d.ts +15 -0
- package/bin/loanOfferings/enums/SegmentColorSlotEnum.js +19 -0
- package/bin/loanOfferings/enums/SegmentFilterIdEnum.d.ts +18 -0
- package/bin/loanOfferings/enums/SegmentFilterIdEnum.js +22 -0
- package/bin/loanOfferings/enums/SegmentStatusEnum.d.ts +9 -0
- package/bin/loanOfferings/enums/SegmentStatusEnum.js +13 -0
- package/bin/loanOfferings/index.d.ts +11 -0
- package/bin/loanOfferings/index.js +11 -0
- package/package.json +1 -1
- package/src/loanOfferings/dtos/requests/ChangeSegmentStatusRequest.ts +20 -0
- package/src/loanOfferings/dtos/requests/CreateSegmentRequest.ts +49 -0
- package/src/loanOfferings/dtos/requests/CreateStorePolicyRequest.ts +8 -0
- package/src/loanOfferings/dtos/requests/ResolveCustomerSegmentsRequest.ts +57 -0
- package/src/loanOfferings/dtos/requests/SimulateCreditPlanRequest.ts +11 -1
- package/src/loanOfferings/dtos/requests/UpdateSegmentRequest.ts +49 -0
- package/src/loanOfferings/dtos/requests/UpdateStorePolicyRequest.ts +8 -0
- package/src/loanOfferings/dtos/responses/PromotedSkusResponse.ts +14 -0
- package/src/loanOfferings/dtos/responses/ResolveCustomerSegmentsResponse.ts +10 -0
- package/src/loanOfferings/dtos/responses/SegmentFilterResponse.ts +19 -0
- package/src/loanOfferings/dtos/responses/SegmentResponse.ts +28 -0
- package/src/loanOfferings/dtos/responses/StorePolicyResponse.ts +2 -0
- package/src/loanOfferings/enums/SegmentColorSlotEnum.ts +15 -0
- package/src/loanOfferings/enums/SegmentFilterIdEnum.ts +18 -0
- package/src/loanOfferings/enums/SegmentStatusEnum.ts +9 -0
- 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,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,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,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
|
+
}
|
|
@@ -49,6 +49,8 @@ export interface StorePolicyResponse {
|
|
|
49
49
|
targetLevels: CreditPlanLevelEnum[] | null;
|
|
50
50
|
/** ALCANCE. `null` = todos los SKUs. */
|
|
51
51
|
targetSkus: string[] | null;
|
|
52
|
+
/** ALCANCE. `null` = todos los segmentos. Un cliente puede estar en varios a la vez. */
|
|
53
|
+
segmentIds: string[] | null;
|
|
52
54
|
validFrom: string | null;
|
|
53
55
|
validUntil: string | null;
|
|
54
56
|
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
|
@@ -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,8 @@ export interface StorePolicyResponse {
|
|
|
54
54
|
targetLevels: CreditPlanLevelEnum[] | null;
|
|
55
55
|
/** ALCANCE. `null` = todos los SKUs. */
|
|
56
56
|
targetSkus: string[] | null;
|
|
57
|
+
/** ALCANCE. `null` = todos los segmentos. Un cliente puede estar en varios a la vez. */
|
|
58
|
+
segmentIds: string[] | null;
|
|
57
59
|
validFrom: string | null;
|
|
58
60
|
validUntil: string | null;
|
|
59
61
|
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';
|