@fiado/type-kit 3.607.0 → 3.609.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/_test_/unit/loanCredit/dtos/originateLoanCreditRequest.test.ts +9 -0
- package/_test_/unit/loanOfferings/promotionCategoryTierScope.test.ts +89 -0
- package/_test_/unit/retailIntegration/eventPayloadBounds.test.ts +1 -1
- package/_test_/unit/retailIntegration/eventPayloads.test.ts +53 -6
- package/_test_/unit/retailIntegration/retailSystemEnums.test.ts +2 -0
- package/bin/loanCredit/dtos/requests/OriginateLoanCreditRequest.d.ts +6 -0
- package/bin/loanCredit/dtos/requests/OriginateLoanCreditRequest.js +14 -0
- package/bin/loanOfferings/constants/promotionSkuBatch.d.ts +2 -0
- package/bin/loanOfferings/constants/promotionSkuBatch.js +5 -0
- package/bin/loanOfferings/dtos/requests/CreatePromotionRequest.d.ts +6 -0
- package/bin/loanOfferings/dtos/requests/CreatePromotionRequest.js +16 -0
- package/bin/loanOfferings/dtos/requests/ListPromotedSkusRequest.d.ts +11 -0
- package/bin/loanOfferings/dtos/requests/ListPromotedSkusRequest.js +47 -0
- package/bin/loanOfferings/dtos/requests/ListSkuPromotionsRequest.d.ts +11 -0
- package/bin/loanOfferings/dtos/requests/ListSkuPromotionsRequest.js +47 -0
- package/bin/loanOfferings/dtos/requests/PromotionSkuInput.d.ts +8 -0
- package/bin/loanOfferings/dtos/requests/PromotionSkuInput.js +37 -0
- package/bin/loanOfferings/dtos/requests/SimulateCreditPlanRequest.d.ts +6 -0
- package/bin/loanOfferings/dtos/requests/SimulateCreditPlanRequest.js +14 -0
- package/bin/loanOfferings/dtos/requests/UpdatePromotionRequest.d.ts +6 -0
- package/bin/loanOfferings/dtos/requests/UpdatePromotionRequest.js +16 -0
- package/bin/loanOfferings/dtos/responses/PromotionResponse.d.ts +6 -0
- package/bin/loanOfferings/index.d.ts +4 -0
- package/bin/loanOfferings/index.js +5 -0
- package/bin/retailIntegration/dtos/ProductEventPayload.d.ts +3 -1
- package/bin/retailIntegration/dtos/ProductEventPayload.js +8 -2
- package/bin/retailIntegration/enums/RetailMdmModeEnum.d.ts +5 -0
- package/bin/retailIntegration/enums/RetailMdmModeEnum.js +9 -0
- package/bin/retailIntegration/enums/index.d.ts +1 -0
- package/bin/retailIntegration/enums/index.js +1 -0
- package/bin/retailIntegration/index.d.ts +1 -0
- package/bin/retailIntegration/index.js +1 -0
- package/bin/retailIntegration/models/RetailSystemProduct.d.ts +4 -1
- package/bin/retailIntegration/validators/productValidators.d.ts +13 -0
- package/bin/retailIntegration/validators/productValidators.js +49 -0
- package/package.json +1 -1
- package/src/loanCredit/dtos/requests/OriginateLoanCreditRequest.ts +14 -0
- package/src/loanOfferings/constants/promotionSkuBatch.ts +2 -0
- package/src/loanOfferings/dtos/requests/CreatePromotionRequest.ts +16 -0
- package/src/loanOfferings/dtos/requests/ListPromotedSkusRequest.ts +32 -0
- package/src/loanOfferings/dtos/requests/ListSkuPromotionsRequest.ts +32 -0
- package/src/loanOfferings/dtos/requests/PromotionSkuInput.ts +21 -0
- package/src/loanOfferings/dtos/requests/SimulateCreditPlanRequest.ts +16 -1
- package/src/loanOfferings/dtos/requests/UpdatePromotionRequest.ts +16 -0
- package/src/loanOfferings/dtos/responses/PromotionResponse.ts +6 -0
- package/src/loanOfferings/index.ts +6 -0
- package/src/retailIntegration/dtos/ProductEventPayload.ts +6 -2
- package/src/retailIntegration/enums/RetailMdmModeEnum.ts +5 -0
- package/src/retailIntegration/enums/index.ts +1 -0
- package/src/retailIntegration/index.ts +1 -0
- package/src/retailIntegration/models/RetailSystemProduct.ts +4 -0
- package/src/retailIntegration/validators/productValidators.ts +35 -0
|
@@ -53,4 +53,13 @@ describe('OriginateLoanCreditRequest', () => {
|
|
|
53
53
|
|
|
54
54
|
expect(errors.some((error) => error.property === 'sellerId')).toBe(true);
|
|
55
55
|
});
|
|
56
|
+
|
|
57
|
+
it('acepta tipo y gama del equipo opcionales y rechaza valores fuera del enum', async () => {
|
|
58
|
+
const ok = await validateWhitelisted({ ...BASE, productCategory: 'PHONE', productTier: 'HIGH' });
|
|
59
|
+
expect(ok.errors).toEqual([]);
|
|
60
|
+
expect([ok.dto.productCategory, ok.dto.productTier]).toEqual(['PHONE', 'HIGH']);
|
|
61
|
+
|
|
62
|
+
const bad = await validateWhitelisted({ ...BASE, productCategory: 'CAR', productTier: 'ULTRA' });
|
|
63
|
+
expect(bad.errors.map((error) => error.property).sort()).toEqual(['productCategory', 'productTier']);
|
|
64
|
+
});
|
|
56
65
|
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import {
|
|
5
|
+
CreatePromotionRequest,
|
|
6
|
+
ListPromotedSkusRequest,
|
|
7
|
+
ListSkuPromotionsRequest,
|
|
8
|
+
PROMOTION_SKU_BATCH_MAX_ITEMS,
|
|
9
|
+
SimulateCreditPlanRequest,
|
|
10
|
+
UpdatePromotionRequest,
|
|
11
|
+
} from '../../../src/loanOfferings/index';
|
|
12
|
+
import type { PromotionResponse } from '../../../src/loanOfferings/index';
|
|
13
|
+
import { ProductCategoryEnum } from '../../../src/retailCatalog/enums/ProductCategoryEnum';
|
|
14
|
+
import { ProductTierEnum } from '../../../src/retailCatalog/enums/ProductTierEnum';
|
|
15
|
+
|
|
16
|
+
type DtoClass = new () => object;
|
|
17
|
+
|
|
18
|
+
const errorsOf = async (dtoClass: DtoClass, body: object): Promise<string[]> =>
|
|
19
|
+
(await validate(plainToInstance(dtoClass, body, { excludeExtraneousValues: true }) as object)).map((e) => e.property);
|
|
20
|
+
|
|
21
|
+
const createBase = {
|
|
22
|
+
name: 'Tasa preferente gama alta',
|
|
23
|
+
description: 'Baja la tasa en teléfonos de gama alta',
|
|
24
|
+
effect: { downPaymentDeltaPct: 0.05 },
|
|
25
|
+
segmentId: 'SEG_SILVER',
|
|
26
|
+
targetLevels: ['SILVER'],
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
describe('alcance por tipo y gama en promociones de crédito', () => {
|
|
30
|
+
it('Create acepta tipos y gamas del catálogo, y null como «todos»', async () => {
|
|
31
|
+
const dto = plainToInstance(CreatePromotionRequest, { ...createBase, productCategories: ['PHONE'], tiers: ['HIGH', 'PREMIUM'] }, { excludeExtraneousValues: true });
|
|
32
|
+
expect(await validate(dto)).toHaveLength(0);
|
|
33
|
+
expect(dto.productCategories).toEqual([ProductCategoryEnum.PHONE]);
|
|
34
|
+
expect(dto.tiers).toEqual([ProductTierEnum.HIGH, ProductTierEnum.PREMIUM]);
|
|
35
|
+
expect(await errorsOf(CreatePromotionRequest, { ...createBase, productCategories: null, tiers: null })).toEqual([]);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it.each([CreatePromotionRequest, UpdatePromotionRequest])('%p rechaza tipo o gama fuera del enum', async (dtoClass) => {
|
|
39
|
+
const body = dtoClass === CreatePromotionRequest ? createBase : {};
|
|
40
|
+
expect(await errorsOf(dtoClass, { ...body, productCategories: ['CAR'] })).toContain('productCategories');
|
|
41
|
+
expect(await errorsOf(dtoClass, { ...body, tiers: ['ULTRA'] })).toContain('tiers');
|
|
42
|
+
expect(await errorsOf(dtoClass, { ...body, tiers: 'HIGH' })).toContain('tiers');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('Update acepta el parche solo con tipo y gama', async () => {
|
|
46
|
+
expect(await errorsOf(UpdatePromotionRequest, { productCategories: ['SIM', 'MODEM'], tiers: null })).toEqual([]);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('la respuesta expone tipos y gamas con null como «todos»', () => {
|
|
50
|
+
const scope: Pick<PromotionResponse, 'productCategories' | 'tiers'> = { productCategories: null, tiers: [ProductTierEnum.LOW] };
|
|
51
|
+
expect(scope.tiers).toEqual(['LOW']);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('el simulador recibe tipo y gama opcionales y valida el enum', async () => {
|
|
55
|
+
const base = { productPriceCents: 500000, downPaymentPct: 0.2, termWeeks: 26 };
|
|
56
|
+
expect(await errorsOf(SimulateCreditPlanRequest, base)).toEqual([]);
|
|
57
|
+
expect(await errorsOf(SimulateCreditPlanRequest, { ...base, productCategory: 'PHONE', productTier: 'MID' })).toEqual([]);
|
|
58
|
+
expect(await errorsOf(SimulateCreditPlanRequest, { ...base, productCategory: 'CAR' })).toContain('productCategory');
|
|
59
|
+
expect(await errorsOf(SimulateCreditPlanRequest, { ...base, productTier: 'ULTRA' })).toContain('productTier');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe.each([ListPromotedSkusRequest, ListSkuPromotionsRequest])('%p (lote por SKU)', (dtoClass) => {
|
|
64
|
+
const valid = { storeId: 'st-1', items: [{ sku: 'SKU-1', category: 'PHONE', tier: 'MID' }] };
|
|
65
|
+
|
|
66
|
+
it('acepta tienda, nivel y segmento opcionales, y SKUs con tipo y gama opcionales', async () => {
|
|
67
|
+
expect(await errorsOf(dtoClass, valid)).toEqual([]);
|
|
68
|
+
expect(await errorsOf(dtoClass, { ...valid, level: 'GOLD', segmentId: 'SEG-1', items: [{ sku: 'SKU-2' }] })).toEqual([]);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it.each([
|
|
72
|
+
['sin tienda', { ...valid, storeId: undefined }, 'storeId'],
|
|
73
|
+
['tienda vacía', { ...valid, storeId: '' }, 'storeId'],
|
|
74
|
+
['nivel fuera del enum', { ...valid, level: 'PLATINUM' }, 'level'],
|
|
75
|
+
['sin items', { ...valid, items: undefined }, 'items'],
|
|
76
|
+
['tipo fuera del enum', { ...valid, items: [{ sku: 'A', category: 'CAR' }] }, 'items'],
|
|
77
|
+
['gama fuera del enum', { ...valid, items: [{ sku: 'A', tier: 'ULTRA' }] }, 'items'],
|
|
78
|
+
['SKU no string', { ...valid, items: [{ sku: 7 }] }, 'items'],
|
|
79
|
+
])('rechaza %s', async (_label, body, property) => {
|
|
80
|
+
expect(await errorsOf(dtoClass, body)).toContain(property);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it(`rechaza más de ${PROMOTION_SKU_BATCH_MAX_ITEMS} SKUs y acepta exactamente el tope`, async () => {
|
|
84
|
+
const items = (n: number) => Array.from({ length: n }, (_v, i) => ({ sku: `S${i}` }));
|
|
85
|
+
expect(PROMOTION_SKU_BATCH_MAX_ITEMS).toBe(100);
|
|
86
|
+
expect(await errorsOf(dtoClass, { ...valid, items: items(PROMOTION_SKU_BATCH_MAX_ITEMS) })).toEqual([]);
|
|
87
|
+
expect(await errorsOf(dtoClass, { ...valid, items: items(PROMOTION_SKU_BATCH_MAX_ITEMS + 1) })).toContain('items');
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -42,7 +42,7 @@ const price = { basePrice: '4299.00', listPrice: null, effectiveFrom: '2026-08-1
|
|
|
42
42
|
const product = {
|
|
43
43
|
sku: 'SAM-A17-128-NEG', externalId: '9001', brand: 'Samsung', model: 'A17', color: 'Negro', capacity: '128 GB', description: null,
|
|
44
44
|
category: 'PHONE', trackingMode: 'IMEI', tier: null, currencyId: 'MXN', price,
|
|
45
|
-
eligibleFinanciers: ['SUREKEEP'], mdmProvider:
|
|
45
|
+
eligibleFinanciers: ['SUREKEEP'], mdmProvider: 'TRUSTONIC', mdmMode: 'SCHEDULED', status: 'ACTIVE',
|
|
46
46
|
};
|
|
47
47
|
const piece = { sku: 'SAM-A17-128-NEG', identifier: '356938035643809', storeId: '12', status: 'SOLD', reason: null };
|
|
48
48
|
const movement = { movementType: 'SALE', storeId: '12', targetStoreId: null, pieces: [piece], stock: [] };
|
|
@@ -6,7 +6,8 @@ import { RetailUserEventPayload } from '../../../src/retailIntegration/dtos/Reta
|
|
|
6
6
|
import { ProductEventPayload } from '../../../src/retailIntegration/dtos/ProductEventPayload';
|
|
7
7
|
import { InventoryEventPayload } from '../../../src/retailIntegration/dtos/InventoryEventPayload';
|
|
8
8
|
import { RETAIL_EVENT_PIECES_MAX } from '../../../src/retailIntegration/constants/retailIntegrationLimits';
|
|
9
|
-
import { RetailProductTierEnum } from '../../../src/retailIntegration/enums';
|
|
9
|
+
import { RetailMdmModeEnum, RetailProductTierEnum } from '../../../src/retailIntegration/enums';
|
|
10
|
+
import { MdmLockModeEnum } from '../../../src/retailCatalog/enums/MdmLockModeEnum';
|
|
10
11
|
import { ProductTierEnum } from '../../../src/retailCatalog/enums/ProductTierEnum';
|
|
11
12
|
|
|
12
13
|
function paths(errors: ValidationError[], prefix = ''): string[] {
|
|
@@ -80,7 +81,7 @@ const product = {
|
|
|
80
81
|
sku: 'SAM-A17-128-NEG', externalId: '9001', brand: 'Samsung', model: 'A17', color: 'Negro', capacity: '128 GB', description: null,
|
|
81
82
|
category: 'PHONE', trackingMode: 'IMEI', tier: null, currencyId: 'MXN',
|
|
82
83
|
price: { basePrice: '4299.00', listPrice: null, effectiveFrom: '2026-08-17T20:32:05Z' },
|
|
83
|
-
eligibleFinanciers: ['SUREKEEP'], mdmProvider:
|
|
84
|
+
eligibleFinanciers: ['SUREKEEP'], mdmProvider: 'TRUSTONIC', mdmMode: 'SCHEDULED', status: 'ACTIVE',
|
|
84
85
|
};
|
|
85
86
|
|
|
86
87
|
const piece = { sku: 'SAM-A17-128-NEG', identifier: '356938035643809', storeId: '12', status: 'SOLD', reason: null };
|
|
@@ -91,10 +92,6 @@ describe('ProductEventPayload', () => {
|
|
|
91
92
|
expect(await errorsOf(ProductEventPayload, product)).toEqual([]);
|
|
92
93
|
});
|
|
93
94
|
|
|
94
|
-
it.each(['TRUSTONIC', 'DATACULTR', 'MOTOSAFE'])('acepta mdmProvider %s', async (mdmProvider) => {
|
|
95
|
-
expect(await errorsOf(ProductEventPayload, { ...product, mdmProvider })).toEqual([]);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
95
|
it.each([
|
|
99
96
|
['ausente', undefined],
|
|
100
97
|
['null', null],
|
|
@@ -130,10 +127,60 @@ describe('ProductEventPayload', () => {
|
|
|
130
127
|
expect(Object.values(RetailProductTierEnum)).toEqual(Object.values(ProductTierEnum));
|
|
131
128
|
});
|
|
132
129
|
|
|
130
|
+
it.each([
|
|
131
|
+
['TRUSTONIC', 'SCHEDULED'],
|
|
132
|
+
['TRUSTONIC', 'ONDEMAND'],
|
|
133
|
+
['DATACULTR', 'SCHEDULED'],
|
|
134
|
+
['DATACULTR', 'ONDEMAND'],
|
|
135
|
+
['MOTOSAFE', 'ONDEMAND'],
|
|
136
|
+
])('acepta un teléfono IMEI con mdmProvider %s y mdmMode %s', async (mdmProvider, mdmMode) => {
|
|
137
|
+
expect(await errorsOf(ProductEventPayload, { ...product, mdmProvider, mdmMode })).toEqual([]);
|
|
138
|
+
});
|
|
139
|
+
|
|
133
140
|
it('rechaza un mdmProvider fuera del enum', async () => {
|
|
134
141
|
expect(await errorsOf(ProductEventPayload, { ...product, mdmProvider: 'KNOX' })).toContain('mdmProvider');
|
|
135
142
|
});
|
|
136
143
|
|
|
144
|
+
it('rechaza un teléfono IMEI sin mdmProvider', async () => {
|
|
145
|
+
expect(await errorsOf(ProductEventPayload, { ...product, mdmProvider: null, mdmMode: null })).toEqual(['mdmProvider']);
|
|
146
|
+
expect(await errorsOf(ProductEventPayload, { ...product, mdmProvider: undefined, mdmMode: null })).toEqual(['mdmProvider']);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('rechaza MOTOSAFE con SCHEDULED', async () => {
|
|
150
|
+
expect(await errorsOf(ProductEventPayload, { ...product, mdmProvider: 'MOTOSAFE', mdmMode: 'SCHEDULED' })).toEqual(['mdmMode']);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it.each([
|
|
154
|
+
['null', null],
|
|
155
|
+
['ausente', undefined],
|
|
156
|
+
['fuera del enum', 'ALWAYS'],
|
|
157
|
+
['con guion bajo', 'ON_DEMAND'],
|
|
158
|
+
])('rechaza mdmMode %s cuando hay mdmProvider', async (_case, mdmMode) => {
|
|
159
|
+
expect(await errorsOf(ProductEventPayload, { ...product, mdmMode })).toEqual(['mdmMode']);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it.each([
|
|
163
|
+
['ACCESSORY', 'QUANTITY'],
|
|
164
|
+
['SIM', 'SERIAL'],
|
|
165
|
+
])('acepta un %s %s con mdmProvider y mdmMode en null', async (category, trackingMode) => {
|
|
166
|
+
expect(await errorsOf(ProductEventPayload, { ...product, category, trackingMode, mdmProvider: null, mdmMode: null })).toEqual([]);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('un producto sin IMEI rechaza mdmProvider y mdmMode', async () => {
|
|
170
|
+
const accessory = { ...product, category: 'ACCESSORY', trackingMode: 'QUANTITY' };
|
|
171
|
+
expect(await errorsOf(ProductEventPayload, { ...accessory, mdmMode: null })).toEqual(['mdmProvider', 'mdmMode']);
|
|
172
|
+
expect(await errorsOf(ProductEventPayload, { ...accessory, mdmProvider: null })).toEqual(['mdmMode']);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('al transformar, mdmMode ausente queda null', () => {
|
|
176
|
+
const { mdmMode: _mode, ...withoutMode } = product;
|
|
177
|
+
expect(plainToInstance(ProductEventPayload, withoutMode).mdmMode).toBeNull();
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('el modo de MDM de la integración trae los mismos valores que el de catálogo', () => {
|
|
181
|
+
expect(Object.values(RetailMdmModeEnum).sort()).toEqual(Object.values(MdmLockModeEnum).sort());
|
|
182
|
+
});
|
|
183
|
+
|
|
137
184
|
it.each([
|
|
138
185
|
['sku', { sku: 'SAM_A17' }],
|
|
139
186
|
['price.basePrice', { price: { ...product.price, basePrice: '4299' } }],
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
RetailCurrencyEnum,
|
|
5
5
|
RetailFinancierEnum,
|
|
6
6
|
RetailLinePaymentTypeEnum,
|
|
7
|
+
RetailMdmModeEnum,
|
|
7
8
|
RetailMdmProviderEnum,
|
|
8
9
|
RetailPaymentFrequencyEnum,
|
|
9
10
|
RetailPaymentMethodEnum,
|
|
@@ -29,6 +30,7 @@ describe('enums de los objetos del retailer', () => {
|
|
|
29
30
|
[RetailCurrencyEnum, ['MXN', 'USD']],
|
|
30
31
|
[RetailFinancierEnum, ['SUREKEEP', 'PAYJOY', 'CREDIYA', 'LESPAGO', 'INNOVA']],
|
|
31
32
|
[RetailMdmProviderEnum, ['TRUSTONIC', 'DATACULTR', 'MOTOSAFE']],
|
|
33
|
+
[RetailMdmModeEnum, ['SCHEDULED', 'ONDEMAND']],
|
|
32
34
|
[RetailProductStatusEnum, ['ACTIVE', 'INACTIVE', 'DISCONTINUED']],
|
|
33
35
|
[RetailPieceStatusEnum, ['AVAILABLE', 'IN_TRANSIT', 'SOLD', 'DAMAGED']],
|
|
34
36
|
[RetailPieceReasonEnum, ['WARRANTY', 'DAMAGED_RETURN', 'SHRINKAGE']],
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
|
|
2
|
+
import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
|
|
1
3
|
import { ClientLevelEnum } from '../../../loanScoring/enums/ClientLevelEnum';
|
|
2
4
|
/**
|
|
3
5
|
* Body de `POST /private/credits/originate` (loan-credit-business — wizard, vía api-invoker).
|
|
@@ -40,4 +42,8 @@ export declare class OriginateLoanCreditRequest {
|
|
|
40
42
|
sellerId?: string;
|
|
41
43
|
/** SKU del equipo, por el mismo motivo que `storeId`: resuelve promociones acotadas por producto. */
|
|
42
44
|
productSku?: string;
|
|
45
|
+
/** Tipo del equipo: resuelve promociones acotadas por tipo. */
|
|
46
|
+
productCategory?: ProductCategoryEnum;
|
|
47
|
+
/** Gama del equipo: resuelve promociones acotadas por gama. */
|
|
48
|
+
productTier?: ProductTierEnum;
|
|
43
49
|
}
|
|
@@ -12,6 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.OriginateLoanCreditRequest = void 0;
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
|
+
const ProductCategoryEnum_1 = require("../../../retailCatalog/enums/ProductCategoryEnum");
|
|
16
|
+
const ProductTierEnum_1 = require("../../../retailCatalog/enums/ProductTierEnum");
|
|
15
17
|
const ClientLevelEnum_1 = require("../../../loanScoring/enums/ClientLevelEnum");
|
|
16
18
|
/**
|
|
17
19
|
* Body de `POST /private/credits/originate` (loan-credit-business — wizard, vía api-invoker).
|
|
@@ -108,3 +110,15 @@ __decorate([
|
|
|
108
110
|
(0, class_validator_1.IsString)(),
|
|
109
111
|
__metadata("design:type", String)
|
|
110
112
|
], OriginateLoanCreditRequest.prototype, "productSku", void 0);
|
|
113
|
+
__decorate([
|
|
114
|
+
(0, class_transformer_1.Expose)(),
|
|
115
|
+
(0, class_validator_1.IsOptional)(),
|
|
116
|
+
(0, class_validator_1.IsEnum)(ProductCategoryEnum_1.ProductCategoryEnum),
|
|
117
|
+
__metadata("design:type", String)
|
|
118
|
+
], OriginateLoanCreditRequest.prototype, "productCategory", void 0);
|
|
119
|
+
__decorate([
|
|
120
|
+
(0, class_transformer_1.Expose)(),
|
|
121
|
+
(0, class_validator_1.IsOptional)(),
|
|
122
|
+
(0, class_validator_1.IsEnum)(ProductTierEnum_1.ProductTierEnum),
|
|
123
|
+
__metadata("design:type", String)
|
|
124
|
+
], OriginateLoanCreditRequest.prototype, "productTier", void 0);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PROMOTION_SKU_BATCH_MAX_ITEMS = void 0;
|
|
4
|
+
/** Tope de SKUs por llamada a los lotes de promociones por SKU; el caller parte en bloques. */
|
|
5
|
+
exports.PROMOTION_SKU_BATCH_MAX_ITEMS = 100;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
|
|
2
|
+
import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
|
|
3
|
+
import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
|
|
2
4
|
import { PromotionEffectInput } from './PromotionEffectInput';
|
|
3
5
|
/**
|
|
4
6
|
* Body de POST /promotions — alta de una promoción del motor.
|
|
@@ -14,6 +16,10 @@ export declare class CreatePromotionRequest {
|
|
|
14
16
|
targetLevels: CreditPlanLevelEnum[];
|
|
15
17
|
/** SKUs alcanzados; ausente o `null` = todos los productos. */
|
|
16
18
|
productSkus?: string[] | null;
|
|
19
|
+
/** Tipos de producto alcanzados; ausente o `null` = todos los tipos. */
|
|
20
|
+
productCategories?: ProductCategoryEnum[] | null;
|
|
21
|
+
/** Gamas alcanzadas; ausente o `null` = todas las gamas. */
|
|
22
|
+
tiers?: ProductTierEnum[] | null;
|
|
17
23
|
/** Tiendas alcanzadas. `null` o ausente = todas. */
|
|
18
24
|
storeIds?: string[] | null;
|
|
19
25
|
validFrom?: string | null;
|
|
@@ -13,6 +13,8 @@ exports.CreatePromotionRequest = void 0;
|
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
15
|
const CreditPlanLevelEnum_1 = require("../../enums/CreditPlanLevelEnum");
|
|
16
|
+
const ProductCategoryEnum_1 = require("../../../retailCatalog/enums/ProductCategoryEnum");
|
|
17
|
+
const ProductTierEnum_1 = require("../../../retailCatalog/enums/ProductTierEnum");
|
|
16
18
|
const PromotionEffectInput_1 = require("./PromotionEffectInput");
|
|
17
19
|
/**
|
|
18
20
|
* Body de POST /promotions — alta de una promoción del motor.
|
|
@@ -57,6 +59,20 @@ __decorate([
|
|
|
57
59
|
(0, class_validator_1.IsString)({ each: true }),
|
|
58
60
|
__metadata("design:type", Array)
|
|
59
61
|
], CreatePromotionRequest.prototype, "productSkus", void 0);
|
|
62
|
+
__decorate([
|
|
63
|
+
(0, class_transformer_1.Expose)(),
|
|
64
|
+
(0, class_validator_1.IsOptional)(),
|
|
65
|
+
(0, class_validator_1.IsArray)(),
|
|
66
|
+
(0, class_validator_1.IsEnum)(ProductCategoryEnum_1.ProductCategoryEnum, { each: true }),
|
|
67
|
+
__metadata("design:type", Array)
|
|
68
|
+
], CreatePromotionRequest.prototype, "productCategories", void 0);
|
|
69
|
+
__decorate([
|
|
70
|
+
(0, class_transformer_1.Expose)(),
|
|
71
|
+
(0, class_validator_1.IsOptional)(),
|
|
72
|
+
(0, class_validator_1.IsArray)(),
|
|
73
|
+
(0, class_validator_1.IsEnum)(ProductTierEnum_1.ProductTierEnum, { each: true }),
|
|
74
|
+
__metadata("design:type", Array)
|
|
75
|
+
], CreatePromotionRequest.prototype, "tiers", void 0);
|
|
60
76
|
__decorate([
|
|
61
77
|
(0, class_transformer_1.Expose)(),
|
|
62
78
|
(0, class_validator_1.IsOptional)(),
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
|
|
2
|
+
import { PromotionSkuInput } from './PromotionSkuInput';
|
|
3
|
+
/** Body de `POST /private/promotions/promoted-skus` (M2M): SKUs del lote con promoción viva para el badge; hasta 100 SKUs. */
|
|
4
|
+
export declare class ListPromotedSkusRequest {
|
|
5
|
+
storeId: string;
|
|
6
|
+
/** Nivel del cliente si loan-scoring ya corrió. */
|
|
7
|
+
level?: CreditPlanLevelEnum;
|
|
8
|
+
/** Segmento del cliente si ya se resolvió. */
|
|
9
|
+
segmentId?: string;
|
|
10
|
+
items: PromotionSkuInput[];
|
|
11
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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.ListPromotedSkusRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const promotionSkuBatch_1 = require("../../constants/promotionSkuBatch");
|
|
16
|
+
const CreditPlanLevelEnum_1 = require("../../enums/CreditPlanLevelEnum");
|
|
17
|
+
const PromotionSkuInput_1 = require("./PromotionSkuInput");
|
|
18
|
+
/** Body de `POST /private/promotions/promoted-skus` (M2M): SKUs del lote con promoción viva para el badge; hasta 100 SKUs. */
|
|
19
|
+
class ListPromotedSkusRequest {
|
|
20
|
+
}
|
|
21
|
+
exports.ListPromotedSkusRequest = ListPromotedSkusRequest;
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, class_transformer_1.Expose)(),
|
|
24
|
+
(0, class_validator_1.IsString)(),
|
|
25
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
26
|
+
__metadata("design:type", String)
|
|
27
|
+
], ListPromotedSkusRequest.prototype, "storeId", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
(0, class_transformer_1.Expose)(),
|
|
30
|
+
(0, class_validator_1.IsOptional)(),
|
|
31
|
+
(0, class_validator_1.IsEnum)(CreditPlanLevelEnum_1.CreditPlanLevelEnum),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], ListPromotedSkusRequest.prototype, "level", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, class_transformer_1.Expose)(),
|
|
36
|
+
(0, class_validator_1.IsOptional)(),
|
|
37
|
+
(0, class_validator_1.IsString)(),
|
|
38
|
+
__metadata("design:type", String)
|
|
39
|
+
], ListPromotedSkusRequest.prototype, "segmentId", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, class_transformer_1.Expose)(),
|
|
42
|
+
(0, class_validator_1.IsArray)(),
|
|
43
|
+
(0, class_validator_1.ArrayMaxSize)(promotionSkuBatch_1.PROMOTION_SKU_BATCH_MAX_ITEMS),
|
|
44
|
+
(0, class_validator_1.ValidateNested)({ each: true }),
|
|
45
|
+
(0, class_transformer_1.Type)(() => PromotionSkuInput_1.PromotionSkuInput),
|
|
46
|
+
__metadata("design:type", Array)
|
|
47
|
+
], ListPromotedSkusRequest.prototype, "items", void 0);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
|
|
2
|
+
import { PromotionSkuInput } from './PromotionSkuInput';
|
|
3
|
+
/** Body de `POST /private/promotions/by-sku` (M2M): promociones vivas de cada SKU del lote; hasta 100 SKUs. */
|
|
4
|
+
export declare class ListSkuPromotionsRequest {
|
|
5
|
+
storeId: string;
|
|
6
|
+
/** Nivel del cliente si loan-scoring ya corrió. */
|
|
7
|
+
level?: CreditPlanLevelEnum;
|
|
8
|
+
/** Segmento del cliente si ya se resolvió. */
|
|
9
|
+
segmentId?: string;
|
|
10
|
+
items: PromotionSkuInput[];
|
|
11
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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.ListSkuPromotionsRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const promotionSkuBatch_1 = require("../../constants/promotionSkuBatch");
|
|
16
|
+
const CreditPlanLevelEnum_1 = require("../../enums/CreditPlanLevelEnum");
|
|
17
|
+
const PromotionSkuInput_1 = require("./PromotionSkuInput");
|
|
18
|
+
/** Body de `POST /private/promotions/by-sku` (M2M): promociones vivas de cada SKU del lote; hasta 100 SKUs. */
|
|
19
|
+
class ListSkuPromotionsRequest {
|
|
20
|
+
}
|
|
21
|
+
exports.ListSkuPromotionsRequest = ListSkuPromotionsRequest;
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, class_transformer_1.Expose)(),
|
|
24
|
+
(0, class_validator_1.IsString)(),
|
|
25
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
26
|
+
__metadata("design:type", String)
|
|
27
|
+
], ListSkuPromotionsRequest.prototype, "storeId", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
(0, class_transformer_1.Expose)(),
|
|
30
|
+
(0, class_validator_1.IsOptional)(),
|
|
31
|
+
(0, class_validator_1.IsEnum)(CreditPlanLevelEnum_1.CreditPlanLevelEnum),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], ListSkuPromotionsRequest.prototype, "level", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, class_transformer_1.Expose)(),
|
|
36
|
+
(0, class_validator_1.IsOptional)(),
|
|
37
|
+
(0, class_validator_1.IsString)(),
|
|
38
|
+
__metadata("design:type", String)
|
|
39
|
+
], ListSkuPromotionsRequest.prototype, "segmentId", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, class_transformer_1.Expose)(),
|
|
42
|
+
(0, class_validator_1.IsArray)(),
|
|
43
|
+
(0, class_validator_1.ArrayMaxSize)(promotionSkuBatch_1.PROMOTION_SKU_BATCH_MAX_ITEMS),
|
|
44
|
+
(0, class_validator_1.ValidateNested)({ each: true }),
|
|
45
|
+
(0, class_transformer_1.Type)(() => PromotionSkuInput_1.PromotionSkuInput),
|
|
46
|
+
__metadata("design:type", Array)
|
|
47
|
+
], ListSkuPromotionsRequest.prototype, "items", void 0);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
|
|
2
|
+
import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
|
|
3
|
+
/** Un SKU con su tipo y gama; sin ellos no cumple un alcance por tipo o por gama. */
|
|
4
|
+
export declare class PromotionSkuInput {
|
|
5
|
+
sku: string;
|
|
6
|
+
category?: ProductCategoryEnum;
|
|
7
|
+
tier?: ProductTierEnum;
|
|
8
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PromotionSkuInput = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const ProductCategoryEnum_1 = require("../../../retailCatalog/enums/ProductCategoryEnum");
|
|
16
|
+
const ProductTierEnum_1 = require("../../../retailCatalog/enums/ProductTierEnum");
|
|
17
|
+
/** Un SKU con su tipo y gama; sin ellos no cumple un alcance por tipo o por gama. */
|
|
18
|
+
class PromotionSkuInput {
|
|
19
|
+
}
|
|
20
|
+
exports.PromotionSkuInput = PromotionSkuInput;
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, class_transformer_1.Expose)(),
|
|
23
|
+
(0, class_validator_1.IsString)(),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], PromotionSkuInput.prototype, "sku", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, class_transformer_1.Expose)(),
|
|
28
|
+
(0, class_validator_1.IsOptional)(),
|
|
29
|
+
(0, class_validator_1.IsEnum)(ProductCategoryEnum_1.ProductCategoryEnum),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], PromotionSkuInput.prototype, "category", void 0);
|
|
32
|
+
__decorate([
|
|
33
|
+
(0, class_transformer_1.Expose)(),
|
|
34
|
+
(0, class_validator_1.IsOptional)(),
|
|
35
|
+
(0, class_validator_1.IsEnum)(ProductTierEnum_1.ProductTierEnum),
|
|
36
|
+
__metadata("design:type", String)
|
|
37
|
+
], PromotionSkuInput.prototype, "tier", void 0);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
|
|
2
|
+
import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
|
|
1
3
|
/**
|
|
2
4
|
* Body de POST /private/credit-plans/:planId/simulate y query de GET /credit-plans/:planId/simulator.
|
|
3
5
|
* Entradas del simulador de cuota (flow 06 §6.1.4). `productPriceCents` en cents; `downPaymentPct`
|
|
@@ -16,6 +18,10 @@ export declare class SimulateCreditPlanRequest {
|
|
|
16
18
|
storeId?: string;
|
|
17
19
|
/** SKU del equipo. Sin él no se resuelven las promociones acotadas por producto. */
|
|
18
20
|
productSku?: string;
|
|
21
|
+
/** Tipo del equipo. Sin él no se resuelven las promociones acotadas por tipo. */
|
|
22
|
+
productCategory?: ProductCategoryEnum;
|
|
23
|
+
/** Gama del equipo. Sin ella no se resuelven las promociones acotadas por gama. */
|
|
24
|
+
productTier?: ProductTierEnum;
|
|
19
25
|
/**
|
|
20
26
|
* Segmentos del cliente, los que devolvió `POST /private/segments/resolve`. Un arreglo vacío
|
|
21
27
|
* declara que el cliente no está en ninguno; ausente declara que el caller no lo consultó.
|
|
@@ -12,6 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.SimulateCreditPlanRequest = void 0;
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
|
+
const ProductCategoryEnum_1 = require("../../../retailCatalog/enums/ProductCategoryEnum");
|
|
16
|
+
const ProductTierEnum_1 = require("../../../retailCatalog/enums/ProductTierEnum");
|
|
15
17
|
/**
|
|
16
18
|
* Body de POST /private/credit-plans/:planId/simulate y query de GET /credit-plans/:planId/simulator.
|
|
17
19
|
* Entradas del simulador de cuota (flow 06 §6.1.4). `productPriceCents` en cents; `downPaymentPct`
|
|
@@ -63,6 +65,18 @@ __decorate([
|
|
|
63
65
|
(0, class_validator_1.IsString)(),
|
|
64
66
|
__metadata("design:type", String)
|
|
65
67
|
], SimulateCreditPlanRequest.prototype, "productSku", void 0);
|
|
68
|
+
__decorate([
|
|
69
|
+
(0, class_transformer_1.Expose)(),
|
|
70
|
+
(0, class_validator_1.IsOptional)(),
|
|
71
|
+
(0, class_validator_1.IsEnum)(ProductCategoryEnum_1.ProductCategoryEnum),
|
|
72
|
+
__metadata("design:type", String)
|
|
73
|
+
], SimulateCreditPlanRequest.prototype, "productCategory", void 0);
|
|
74
|
+
__decorate([
|
|
75
|
+
(0, class_transformer_1.Expose)(),
|
|
76
|
+
(0, class_validator_1.IsOptional)(),
|
|
77
|
+
(0, class_validator_1.IsEnum)(ProductTierEnum_1.ProductTierEnum),
|
|
78
|
+
__metadata("design:type", String)
|
|
79
|
+
], SimulateCreditPlanRequest.prototype, "productTier", void 0);
|
|
66
80
|
__decorate([
|
|
67
81
|
(0, class_transformer_1.Expose)(),
|
|
68
82
|
(0, class_validator_1.IsOptional)(),
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
|
|
2
|
+
import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
|
|
3
|
+
import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
|
|
2
4
|
import { PromotionEffectInput } from './PromotionEffectInput';
|
|
3
5
|
/**
|
|
4
6
|
* Body de PUT /promotions/:promotionId — edición parcial (todos los campos opcionales).
|
|
@@ -12,6 +14,10 @@ export declare class UpdatePromotionRequest {
|
|
|
12
14
|
segmentId?: string;
|
|
13
15
|
targetLevels?: CreditPlanLevelEnum[];
|
|
14
16
|
productSkus?: string[] | null;
|
|
17
|
+
/** Tipos de producto alcanzados; ausente o `null` = todos los tipos. */
|
|
18
|
+
productCategories?: ProductCategoryEnum[] | null;
|
|
19
|
+
/** Gamas alcanzadas; ausente o `null` = todas las gamas. */
|
|
20
|
+
tiers?: ProductTierEnum[] | null;
|
|
15
21
|
/** Tiendas alcanzadas. `null` o ausente = todas. */
|
|
16
22
|
storeIds?: string[] | null;
|
|
17
23
|
validFrom?: string | null;
|
|
@@ -13,6 +13,8 @@ exports.UpdatePromotionRequest = void 0;
|
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
15
|
const CreditPlanLevelEnum_1 = require("../../enums/CreditPlanLevelEnum");
|
|
16
|
+
const ProductCategoryEnum_1 = require("../../../retailCatalog/enums/ProductCategoryEnum");
|
|
17
|
+
const ProductTierEnum_1 = require("../../../retailCatalog/enums/ProductTierEnum");
|
|
16
18
|
const PromotionEffectInput_1 = require("./PromotionEffectInput");
|
|
17
19
|
/**
|
|
18
20
|
* Body de PUT /promotions/:promotionId — edición parcial (todos los campos opcionales).
|
|
@@ -62,6 +64,20 @@ __decorate([
|
|
|
62
64
|
(0, class_validator_1.IsString)({ each: true }),
|
|
63
65
|
__metadata("design:type", Array)
|
|
64
66
|
], UpdatePromotionRequest.prototype, "productSkus", void 0);
|
|
67
|
+
__decorate([
|
|
68
|
+
(0, class_transformer_1.Expose)(),
|
|
69
|
+
(0, class_validator_1.IsOptional)(),
|
|
70
|
+
(0, class_validator_1.IsArray)(),
|
|
71
|
+
(0, class_validator_1.IsEnum)(ProductCategoryEnum_1.ProductCategoryEnum, { each: true }),
|
|
72
|
+
__metadata("design:type", Array)
|
|
73
|
+
], UpdatePromotionRequest.prototype, "productCategories", void 0);
|
|
74
|
+
__decorate([
|
|
75
|
+
(0, class_transformer_1.Expose)(),
|
|
76
|
+
(0, class_validator_1.IsOptional)(),
|
|
77
|
+
(0, class_validator_1.IsArray)(),
|
|
78
|
+
(0, class_validator_1.IsEnum)(ProductTierEnum_1.ProductTierEnum, { each: true }),
|
|
79
|
+
__metadata("design:type", Array)
|
|
80
|
+
], UpdatePromotionRequest.prototype, "tiers", void 0);
|
|
65
81
|
__decorate([
|
|
66
82
|
(0, class_transformer_1.Expose)(),
|
|
67
83
|
(0, class_validator_1.IsOptional)(),
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
|
|
2
|
+
import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
|
|
1
3
|
import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
|
|
2
4
|
import { PromotionEffectKindEnum } from '../../enums/PromotionEffectKindEnum';
|
|
3
5
|
import { PromotionPhaseEnum } from '../../enums/PromotionPhaseEnum';
|
|
@@ -21,6 +23,10 @@ export interface PromotionResponse {
|
|
|
21
23
|
targetLevels: CreditPlanLevelEnum[];
|
|
22
24
|
/** `null` = alcanza a todos los productos. */
|
|
23
25
|
productSkus: string[] | null;
|
|
26
|
+
/** `null` = alcanza a todos los tipos de producto. */
|
|
27
|
+
productCategories: ProductCategoryEnum[] | null;
|
|
28
|
+
/** `null` = alcanza a todas las gamas. */
|
|
29
|
+
tiers: ProductTierEnum[] | null;
|
|
24
30
|
/** `null` = alcanza a todas las tiendas. Dimensión «Tienda / canal» del alcance. */
|
|
25
31
|
storeIds: string[] | null;
|
|
26
32
|
validFrom: string | null;
|
|
@@ -16,6 +16,7 @@ export * from './enums/SegmentStatusEnum';
|
|
|
16
16
|
export * from './enums/SegmentColorSlotEnum';
|
|
17
17
|
export * from './enums/SegmentFilterIdEnum';
|
|
18
18
|
export * from './enums/PrepaymentMinimumModeEnum';
|
|
19
|
+
export * from './constants/promotionSkuBatch';
|
|
19
20
|
export * from './dtos/CreditPlan';
|
|
20
21
|
export * from './dtos/PrepaymentMinimum';
|
|
21
22
|
export * from './dtos/Financier';
|
|
@@ -45,6 +46,9 @@ export * from './dtos/requests/ChangeSegmentStatusRequest';
|
|
|
45
46
|
export * from './dtos/requests/ResolveCustomerSegmentsRequest';
|
|
46
47
|
export * from './dtos/requests/ComputeAmortizationScheduleRequest';
|
|
47
48
|
export * from './dtos/requests/ListSegmentCatalogQuery';
|
|
49
|
+
export * from './dtos/requests/PromotionSkuInput';
|
|
50
|
+
export * from './dtos/requests/ListPromotedSkusRequest';
|
|
51
|
+
export * from './dtos/requests/ListSkuPromotionsRequest';
|
|
48
52
|
export * from './dtos/responses/CreditPlanResponse';
|
|
49
53
|
export * from './dtos/responses/FinancierResponse';
|
|
50
54
|
export * from './dtos/responses/RetailerCreditPlanResponse';
|