@fiado/type-kit 3.608.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.
Files changed (32) hide show
  1. package/_test_/unit/loanCredit/dtos/originateLoanCreditRequest.test.ts +9 -0
  2. package/_test_/unit/loanOfferings/promotionCategoryTierScope.test.ts +89 -0
  3. package/bin/loanCredit/dtos/requests/OriginateLoanCreditRequest.d.ts +6 -0
  4. package/bin/loanCredit/dtos/requests/OriginateLoanCreditRequest.js +14 -0
  5. package/bin/loanOfferings/constants/promotionSkuBatch.d.ts +2 -0
  6. package/bin/loanOfferings/constants/promotionSkuBatch.js +5 -0
  7. package/bin/loanOfferings/dtos/requests/CreatePromotionRequest.d.ts +6 -0
  8. package/bin/loanOfferings/dtos/requests/CreatePromotionRequest.js +16 -0
  9. package/bin/loanOfferings/dtos/requests/ListPromotedSkusRequest.d.ts +11 -0
  10. package/bin/loanOfferings/dtos/requests/ListPromotedSkusRequest.js +47 -0
  11. package/bin/loanOfferings/dtos/requests/ListSkuPromotionsRequest.d.ts +11 -0
  12. package/bin/loanOfferings/dtos/requests/ListSkuPromotionsRequest.js +47 -0
  13. package/bin/loanOfferings/dtos/requests/PromotionSkuInput.d.ts +8 -0
  14. package/bin/loanOfferings/dtos/requests/PromotionSkuInput.js +37 -0
  15. package/bin/loanOfferings/dtos/requests/SimulateCreditPlanRequest.d.ts +6 -0
  16. package/bin/loanOfferings/dtos/requests/SimulateCreditPlanRequest.js +14 -0
  17. package/bin/loanOfferings/dtos/requests/UpdatePromotionRequest.d.ts +6 -0
  18. package/bin/loanOfferings/dtos/requests/UpdatePromotionRequest.js +16 -0
  19. package/bin/loanOfferings/dtos/responses/PromotionResponse.d.ts +6 -0
  20. package/bin/loanOfferings/index.d.ts +4 -0
  21. package/bin/loanOfferings/index.js +5 -0
  22. package/package.json +1 -1
  23. package/src/loanCredit/dtos/requests/OriginateLoanCreditRequest.ts +14 -0
  24. package/src/loanOfferings/constants/promotionSkuBatch.ts +2 -0
  25. package/src/loanOfferings/dtos/requests/CreatePromotionRequest.ts +16 -0
  26. package/src/loanOfferings/dtos/requests/ListPromotedSkusRequest.ts +32 -0
  27. package/src/loanOfferings/dtos/requests/ListSkuPromotionsRequest.ts +32 -0
  28. package/src/loanOfferings/dtos/requests/PromotionSkuInput.ts +21 -0
  29. package/src/loanOfferings/dtos/requests/SimulateCreditPlanRequest.ts +16 -1
  30. package/src/loanOfferings/dtos/requests/UpdatePromotionRequest.ts +16 -0
  31. package/src/loanOfferings/dtos/responses/PromotionResponse.ts +6 -0
  32. package/src/loanOfferings/index.ts +6 -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
+ });
@@ -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,2 @@
1
+ /** Tope de SKUs por llamada a los lotes de promociones por SKU; el caller parte en bloques. */
2
+ export declare const PROMOTION_SKU_BATCH_MAX_ITEMS = 100;
@@ -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';
@@ -33,6 +33,8 @@ __exportStar(require("./enums/SegmentStatusEnum"), exports);
33
33
  __exportStar(require("./enums/SegmentColorSlotEnum"), exports);
34
34
  __exportStar(require("./enums/SegmentFilterIdEnum"), exports);
35
35
  __exportStar(require("./enums/PrepaymentMinimumModeEnum"), exports);
36
+ // Constantes
37
+ __exportStar(require("./constants/promotionSkuBatch"), exports);
36
38
  // Entity DTOs
37
39
  __exportStar(require("./dtos/CreditPlan"), exports);
38
40
  __exportStar(require("./dtos/PrepaymentMinimum"), exports);
@@ -64,6 +66,9 @@ __exportStar(require("./dtos/requests/ChangeSegmentStatusRequest"), exports);
64
66
  __exportStar(require("./dtos/requests/ResolveCustomerSegmentsRequest"), exports);
65
67
  __exportStar(require("./dtos/requests/ComputeAmortizationScheduleRequest"), exports);
66
68
  __exportStar(require("./dtos/requests/ListSegmentCatalogQuery"), exports);
69
+ __exportStar(require("./dtos/requests/PromotionSkuInput"), exports);
70
+ __exportStar(require("./dtos/requests/ListPromotedSkusRequest"), exports);
71
+ __exportStar(require("./dtos/requests/ListSkuPromotionsRequest"), exports);
67
72
  // Response DTOs
68
73
  __exportStar(require("./dtos/responses/CreditPlanResponse"), exports);
69
74
  __exportStar(require("./dtos/responses/FinancierResponse"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.608.0",
3
+ "version": "3.609.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -8,6 +8,8 @@ import {
8
8
  Max,
9
9
  Min,
10
10
  } from 'class-validator';
11
+ import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
12
+ import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
11
13
  import { ClientLevelEnum } from '../../../loanScoring/enums/ClientLevelEnum';
12
14
 
13
15
  /**
@@ -106,4 +108,16 @@ export class OriginateLoanCreditRequest {
106
108
  @IsOptional()
107
109
  @IsString()
108
110
  productSku?: string;
111
+
112
+ /** Tipo del equipo: resuelve promociones acotadas por tipo. */
113
+ @Expose()
114
+ @IsOptional()
115
+ @IsEnum(ProductCategoryEnum)
116
+ productCategory?: ProductCategoryEnum;
117
+
118
+ /** Gama del equipo: resuelve promociones acotadas por gama. */
119
+ @Expose()
120
+ @IsOptional()
121
+ @IsEnum(ProductTierEnum)
122
+ productTier?: ProductTierEnum;
109
123
  }
@@ -0,0 +1,2 @@
1
+ /** Tope de SKUs por llamada a los lotes de promociones por SKU; el caller parte en bloques. */
2
+ export const PROMOTION_SKU_BATCH_MAX_ITEMS = 100;
@@ -10,6 +10,8 @@ import {
10
10
  ValidateNested,
11
11
  } from 'class-validator';
12
12
  import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
13
+ import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
14
+ import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
13
15
  import { PromotionEffectInput } from './PromotionEffectInput';
14
16
 
15
17
  /**
@@ -49,6 +51,20 @@ export class CreatePromotionRequest {
49
51
  @IsString({ each: true })
50
52
  productSkus?: string[] | null;
51
53
 
54
+ /** Tipos de producto alcanzados; ausente o `null` = todos los tipos. */
55
+ @Expose()
56
+ @IsOptional()
57
+ @IsArray()
58
+ @IsEnum(ProductCategoryEnum, { each: true })
59
+ productCategories?: ProductCategoryEnum[] | null;
60
+
61
+ /** Gamas alcanzadas; ausente o `null` = todas las gamas. */
62
+ @Expose()
63
+ @IsOptional()
64
+ @IsArray()
65
+ @IsEnum(ProductTierEnum, { each: true })
66
+ tiers?: ProductTierEnum[] | null;
67
+
52
68
  /** Tiendas alcanzadas. `null` o ausente = todas. */
53
69
  @Expose()
54
70
  @IsOptional()
@@ -0,0 +1,32 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, IsArray, IsEnum, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator';
3
+ import { PROMOTION_SKU_BATCH_MAX_ITEMS } from '../../constants/promotionSkuBatch';
4
+ import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
5
+ import { PromotionSkuInput } from './PromotionSkuInput';
6
+
7
+ /** Body de `POST /private/promotions/promoted-skus` (M2M): SKUs del lote con promoción viva para el badge; hasta 100 SKUs. */
8
+ export class ListPromotedSkusRequest {
9
+ @Expose()
10
+ @IsString()
11
+ @IsNotEmpty()
12
+ storeId!: string;
13
+
14
+ /** Nivel del cliente si loan-scoring ya corrió. */
15
+ @Expose()
16
+ @IsOptional()
17
+ @IsEnum(CreditPlanLevelEnum)
18
+ level?: CreditPlanLevelEnum;
19
+
20
+ /** Segmento del cliente si ya se resolvió. */
21
+ @Expose()
22
+ @IsOptional()
23
+ @IsString()
24
+ segmentId?: string;
25
+
26
+ @Expose()
27
+ @IsArray()
28
+ @ArrayMaxSize(PROMOTION_SKU_BATCH_MAX_ITEMS)
29
+ @ValidateNested({ each: true })
30
+ @Type(() => PromotionSkuInput)
31
+ items!: PromotionSkuInput[];
32
+ }
@@ -0,0 +1,32 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, IsArray, IsEnum, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator';
3
+ import { PROMOTION_SKU_BATCH_MAX_ITEMS } from '../../constants/promotionSkuBatch';
4
+ import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
5
+ import { PromotionSkuInput } from './PromotionSkuInput';
6
+
7
+ /** Body de `POST /private/promotions/by-sku` (M2M): promociones vivas de cada SKU del lote; hasta 100 SKUs. */
8
+ export class ListSkuPromotionsRequest {
9
+ @Expose()
10
+ @IsString()
11
+ @IsNotEmpty()
12
+ storeId!: string;
13
+
14
+ /** Nivel del cliente si loan-scoring ya corrió. */
15
+ @Expose()
16
+ @IsOptional()
17
+ @IsEnum(CreditPlanLevelEnum)
18
+ level?: CreditPlanLevelEnum;
19
+
20
+ /** Segmento del cliente si ya se resolvió. */
21
+ @Expose()
22
+ @IsOptional()
23
+ @IsString()
24
+ segmentId?: string;
25
+
26
+ @Expose()
27
+ @IsArray()
28
+ @ArrayMaxSize(PROMOTION_SKU_BATCH_MAX_ITEMS)
29
+ @ValidateNested({ each: true })
30
+ @Type(() => PromotionSkuInput)
31
+ items!: PromotionSkuInput[];
32
+ }
@@ -0,0 +1,21 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsEnum, IsOptional, IsString } from 'class-validator';
3
+ import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
4
+ import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
5
+
6
+ /** Un SKU con su tipo y gama; sin ellos no cumple un alcance por tipo o por gama. */
7
+ export class PromotionSkuInput {
8
+ @Expose()
9
+ @IsString()
10
+ sku!: string;
11
+
12
+ @Expose()
13
+ @IsOptional()
14
+ @IsEnum(ProductCategoryEnum)
15
+ category?: ProductCategoryEnum;
16
+
17
+ @Expose()
18
+ @IsOptional()
19
+ @IsEnum(ProductTierEnum)
20
+ tier?: ProductTierEnum;
21
+ }
@@ -1,5 +1,8 @@
1
1
  import { Expose } from 'class-transformer';
2
- import { IsArray, IsInt, IsNumber, IsOptional, IsString, Max, Min } from 'class-validator';
2
+ import { IsArray, IsEnum, IsInt, IsNumber, IsOptional, IsString, Max, Min } from 'class-validator';
3
+ import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
4
+ import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
5
+
3
6
 
4
7
  /**
5
8
  * Body de POST /private/credit-plans/:planId/simulate y query de GET /credit-plans/:planId/simulator.
@@ -46,6 +49,18 @@ export class SimulateCreditPlanRequest {
46
49
  @IsString()
47
50
  productSku?: string;
48
51
 
52
+ /** Tipo del equipo. Sin él no se resuelven las promociones acotadas por tipo. */
53
+ @Expose()
54
+ @IsOptional()
55
+ @IsEnum(ProductCategoryEnum)
56
+ productCategory?: ProductCategoryEnum;
57
+
58
+ /** Gama del equipo. Sin ella no se resuelven las promociones acotadas por gama. */
59
+ @Expose()
60
+ @IsOptional()
61
+ @IsEnum(ProductTierEnum)
62
+ productTier?: ProductTierEnum;
63
+
49
64
  /**
50
65
  * Segmentos del cliente, los que devolvió `POST /private/segments/resolve`. Un arreglo vacío
51
66
  * declara que el cliente no está en ninguno; ausente declara que el caller no lo consultó.
@@ -10,6 +10,8 @@ import {
10
10
  ValidateNested,
11
11
  } from 'class-validator';
12
12
  import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
13
+ import { ProductCategoryEnum } from '../../../retailCatalog/enums/ProductCategoryEnum';
14
+ import { ProductTierEnum } from '../../../retailCatalog/enums/ProductTierEnum';
13
15
  import { PromotionEffectInput } from './PromotionEffectInput';
14
16
 
15
17
  /**
@@ -52,6 +54,20 @@ export class UpdatePromotionRequest {
52
54
  @IsString({ each: true })
53
55
  productSkus?: string[] | null;
54
56
 
57
+ /** Tipos de producto alcanzados; ausente o `null` = todos los tipos. */
58
+ @Expose()
59
+ @IsOptional()
60
+ @IsArray()
61
+ @IsEnum(ProductCategoryEnum, { each: true })
62
+ productCategories?: ProductCategoryEnum[] | null;
63
+
64
+ /** Gamas alcanzadas; ausente o `null` = todas las gamas. */
65
+ @Expose()
66
+ @IsOptional()
67
+ @IsArray()
68
+ @IsEnum(ProductTierEnum, { each: true })
69
+ tiers?: ProductTierEnum[] | null;
70
+
55
71
  /** Tiendas alcanzadas. `null` o ausente = todas. */
56
72
  @Expose()
57
73
  @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';
@@ -22,6 +24,10 @@ export interface PromotionResponse {
22
24
  targetLevels: CreditPlanLevelEnum[];
23
25
  /** `null` = alcanza a todos los productos. */
24
26
  productSkus: string[] | null;
27
+ /** `null` = alcanza a todos los tipos de producto. */
28
+ productCategories: ProductCategoryEnum[] | null;
29
+ /** `null` = alcanza a todas las gamas. */
30
+ tiers: ProductTierEnum[] | null;
25
31
  /** `null` = alcanza a todas las tiendas. Dimensión «Tienda / canal» del alcance. */
26
32
  storeIds: string[] | null;
27
33
  validFrom: string | null;
@@ -18,6 +18,9 @@ export * from './enums/SegmentColorSlotEnum';
18
18
  export * from './enums/SegmentFilterIdEnum';
19
19
  export * from './enums/PrepaymentMinimumModeEnum';
20
20
 
21
+ // Constantes
22
+ export * from './constants/promotionSkuBatch';
23
+
21
24
  // Entity DTOs
22
25
  export * from './dtos/CreditPlan';
23
26
  export * from './dtos/PrepaymentMinimum';
@@ -50,6 +53,9 @@ export * from './dtos/requests/ChangeSegmentStatusRequest';
50
53
  export * from './dtos/requests/ResolveCustomerSegmentsRequest';
51
54
  export * from './dtos/requests/ComputeAmortizationScheduleRequest';
52
55
  export * from './dtos/requests/ListSegmentCatalogQuery';
56
+ export * from './dtos/requests/PromotionSkuInput';
57
+ export * from './dtos/requests/ListPromotedSkusRequest';
58
+ export * from './dtos/requests/ListSkuPromotionsRequest';
53
59
 
54
60
  // Response DTOs
55
61
  export * from './dtos/responses/CreditPlanResponse';