@fiado/type-kit 3.411.0 → 3.412.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 (30) hide show
  1. package/_test_/unit/loanCredit/dtos/listMessagingCandidates.test.ts +97 -0
  2. package/_test_/unit/messagesConnector/messagingEnums.test.ts +37 -0
  3. package/bin/loanCredit/constants/MessagingCandidateLimits.d.ts +4 -0
  4. package/bin/loanCredit/constants/MessagingCandidateLimits.js +7 -0
  5. package/bin/loanCredit/constants/StoreDayPattern.d.ts +3 -0
  6. package/bin/loanCredit/constants/StoreDayPattern.js +6 -0
  7. package/bin/loanCredit/dtos/MessagingCandidateItem.d.ts +31 -0
  8. package/bin/loanCredit/dtos/MessagingCandidateItem.js +10 -0
  9. package/bin/loanCredit/dtos/requests/ListMessagingCandidatesRequest.d.ts +11 -0
  10. package/bin/loanCredit/dtos/requests/ListMessagingCandidatesRequest.js +47 -0
  11. package/bin/loanCredit/dtos/responses/ListMessagingCandidatesResponse.d.ts +7 -0
  12. package/bin/loanCredit/dtos/responses/ListMessagingCandidatesResponse.js +7 -0
  13. package/bin/loanCredit/index.d.ts +6 -0
  14. package/bin/loanCredit/index.js +10 -1
  15. package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.d.ts +3 -1
  16. package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.js +2 -0
  17. package/bin/messagesConnector/enums/MessagingSlotEnum.d.ts +9 -0
  18. package/bin/messagesConnector/enums/MessagingSlotEnum.js +13 -0
  19. package/bin/messagesConnector/index.d.ts +1 -0
  20. package/bin/messagesConnector/index.js +1 -0
  21. package/package.json +1 -1
  22. package/src/loanCredit/constants/MessagingCandidateLimits.ts +5 -0
  23. package/src/loanCredit/constants/StoreDayPattern.ts +4 -0
  24. package/src/loanCredit/dtos/MessagingCandidateItem.ts +40 -0
  25. package/src/loanCredit/dtos/requests/ListMessagingCandidatesRequest.ts +33 -0
  26. package/src/loanCredit/dtos/responses/ListMessagingCandidatesResponse.ts +9 -0
  27. package/src/loanCredit/index.ts +10 -0
  28. package/src/messagesConnector/enums/DeliveryChannelExtendedEnum.ts +2 -0
  29. package/src/messagesConnector/enums/MessagingSlotEnum.ts +9 -0
  30. package/src/messagesConnector/index.ts +1 -0
@@ -0,0 +1,97 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { ListMessagingCandidatesRequest } from '../../../../src/loanCredit/dtos/requests/ListMessagingCandidatesRequest';
5
+ import { ListMessagingCandidatesResponse } from '../../../../src/loanCredit/dtos/responses/ListMessagingCandidatesResponse';
6
+ import { MessagingCandidateItem } from '../../../../src/loanCredit/dtos/MessagingCandidateItem';
7
+ import { MESSAGING_CANDIDATES_MAX_LIMIT } from '../../../../src/loanCredit/constants/MessagingCandidateLimits';
8
+ import { DeliveryChannelExtendedEnum, MessagingSlotEnum } from '../../../../src/messagesConnector/index';
9
+ import { MdmProviderEnum } from '../../../../src/mdm/enums/MdmProviderEnum';
10
+
11
+ const RUN_DATE = '2026-09-08';
12
+
13
+ /** `whitelist: true` es lo que corre el motor en `validateRequest`: sin decorador, la propiedad se borra. */
14
+ const validateWhitelisted = (body: object) => {
15
+ const dto = plainToInstance(ListMessagingCandidatesRequest, body);
16
+ return validate(dto, { whitelist: true, forbidNonWhitelisted: false }).then(errors => ({ dto, errors }));
17
+ };
18
+
19
+ describe('ListMessagingCandidatesRequest', () => {
20
+ it('acepta la primera página: sin cursor y sin limit', async () => {
21
+ const { dto, errors } = await validateWhitelisted({ slot: MessagingSlotEnum.MORNING, runDate: RUN_DATE });
22
+
23
+ expect(errors).toEqual([]);
24
+ expect(dto.cursor).toBeUndefined();
25
+ expect(dto.limit).toBeUndefined();
26
+ });
27
+
28
+ it('convierte el limit que llega como texto', async () => {
29
+ const { dto, errors } = await validateWhitelisted({ slot: MessagingSlotEnum.EVENING, runDate: RUN_DATE, limit: '25' });
30
+
31
+ expect(errors).toEqual([]);
32
+ expect(dto.limit).toBe(25);
33
+ });
34
+
35
+ it('rechaza un slot fuera del enum', async () => {
36
+ const { errors } = await validateWhitelisted({ slot: 'NIGHT', runDate: RUN_DATE });
37
+
38
+ expect(errors.some(error => error.property === 'slot')).toBe(true);
39
+ });
40
+
41
+ it('rechaza un runDate con hora: el día de tienda no lleva reloj', async () => {
42
+ const { errors } = await validateWhitelisted({ slot: MessagingSlotEnum.MORNING, runDate: '2026-09-08T10:00:00Z' });
43
+
44
+ expect(errors.some(error => error.property === 'runDate')).toBe(true);
45
+ });
46
+
47
+ it('rechaza un limit por encima del tope de página', async () => {
48
+ const { errors } = await validateWhitelisted({
49
+ slot: MessagingSlotEnum.AFTERNOON,
50
+ runDate: RUN_DATE,
51
+ limit: MESSAGING_CANDIDATES_MAX_LIMIT + 1,
52
+ });
53
+
54
+ expect(errors.some(error => error.property === 'limit')).toBe(true);
55
+ });
56
+ });
57
+
58
+ describe('MessagingCandidateItem', () => {
59
+ it('el candidato sin crédito conserva la persona', () => {
60
+ const item: MessagingCandidateItem = {
61
+ personId: '01JB2Z0N7Q9K3M5R8T1V4W6X7Y',
62
+ messageType: 'COLLECTION_NOTICE',
63
+ slot: MessagingSlotEnum.MORNING,
64
+ channel: DeliveryChannelExtendedEnum.SMS,
65
+ variables: { firstName: 'Ana', amount: '1,250.00' },
66
+ reference: 'collections#2026-09-08#MORNING#1',
67
+ };
68
+
69
+ expect(item.personId).toBeDefined();
70
+ expect(item.creditId).toBeUndefined();
71
+ });
72
+
73
+ it('el candidato de MDM lleva IMEI y proveedor', () => {
74
+ const item: MessagingCandidateItem = {
75
+ personId: '01JB2Z0N7Q9K3M5R8T1V4W6X7Y',
76
+ creditId: 'CRD-01JB2Z0N7Q9K3M5R8T1V4W6X7Y',
77
+ messageType: 'COLLECTION_NOTICE',
78
+ slot: MessagingSlotEnum.EVENING,
79
+ channel: DeliveryChannelExtendedEnum.MDM,
80
+ variables: {},
81
+ reference: 'collections#2026-09-08#EVENING#7',
82
+ imei: '351756051523999',
83
+ mdmProvider: MdmProviderEnum.DATACULTR,
84
+ };
85
+
86
+ expect(item.channel).toBe('MDM');
87
+ expect(item.imei).toBe('351756051523999');
88
+ });
89
+ });
90
+
91
+ describe('ListMessagingCandidatesResponse', () => {
92
+ it('la última página cierra con nextCursor en null, no en undefined', () => {
93
+ const response: ListMessagingCandidatesResponse = { items: [], nextCursor: null };
94
+
95
+ expect(response.nextCursor).toBeNull();
96
+ });
97
+ });
@@ -0,0 +1,37 @@
1
+ import 'reflect-metadata';
2
+ import { DeliveryChannelExtendedEnum, MessagingSlotEnum } from '../../../src/messagesConnector/index';
3
+
4
+ describe('DeliveryChannelExtendedEnum', () => {
5
+ it('incluye MDM junto a los tres canales que ya existían', () => {
6
+ expect(Object.values(DeliveryChannelExtendedEnum).sort()).toEqual([
7
+ 'MAIL',
8
+ 'MDM',
9
+ 'PUSH_NOTIFICATION',
10
+ 'SMS',
11
+ ]);
12
+ });
13
+
14
+ it('cada clave es igual a su valor', () => {
15
+ for (const [key, value] of Object.entries(DeliveryChannelExtendedEnum)) {
16
+ expect(key).toBe(value);
17
+ }
18
+ });
19
+ });
20
+
21
+ describe('MessagingSlotEnum', () => {
22
+ it('tiene exactamente los tres momentos del contrato', () => {
23
+ expect(Object.values(MessagingSlotEnum).sort()).toEqual(['AFTERNOON', 'EVENING', 'MORNING']);
24
+ });
25
+
26
+ it('cada clave es igual a su valor', () => {
27
+ for (const [key, value] of Object.entries(MessagingSlotEnum)) {
28
+ expect(key).toBe(value);
29
+ }
30
+ });
31
+
32
+ it('ningún valor lleva la hora: la hora vive en la agenda del tenant', () => {
33
+ for (const value of Object.values(MessagingSlotEnum)) {
34
+ expect(value).not.toMatch(/\d/);
35
+ }
36
+ });
37
+ });
@@ -0,0 +1,4 @@
1
+ /** Tope de candidatos por página. Una cartera grande no cabe en una sola llamada. */
2
+ export declare const MESSAGING_CANDIDATES_MAX_LIMIT = 100;
3
+ /** Tamaño de página cuando el caller no manda `limit`. */
4
+ export declare const MESSAGING_CANDIDATES_DEFAULT_LIMIT = 50;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MESSAGING_CANDIDATES_DEFAULT_LIMIT = exports.MESSAGING_CANDIDATES_MAX_LIMIT = void 0;
4
+ /** Tope de candidatos por página. Una cartera grande no cabe en una sola llamada. */
5
+ exports.MESSAGING_CANDIDATES_MAX_LIMIT = 100;
6
+ /** Tamaño de página cuando el caller no manda `limit`. */
7
+ exports.MESSAGING_CANDIDATES_DEFAULT_LIMIT = 50;
@@ -0,0 +1,3 @@
1
+ /** Día de tienda en la zona horaria del tenant, sin hora: `YYYY-MM-DD`. */
2
+ export declare const STORE_DAY_PATTERN: RegExp;
3
+ export declare const STORE_DAY_MESSAGE = "runDate debe ser un d\u00EDa de tienda en formato YYYY-MM-DD";
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STORE_DAY_MESSAGE = exports.STORE_DAY_PATTERN = void 0;
4
+ /** Día de tienda en la zona horaria del tenant, sin hora: `YYYY-MM-DD`. */
5
+ exports.STORE_DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
6
+ exports.STORE_DAY_MESSAGE = 'runDate debe ser un día de tienda en formato YYYY-MM-DD';
@@ -0,0 +1,31 @@
1
+ import { DeliveryChannelExtendedEnum, MessagingSlotEnum } from '../../messagesConnector/index';
2
+ import { MdmProviderEnum } from '../../mdm/enums/MdmProviderEnum';
3
+ /**
4
+ * Un candidato a recibir un mensaje: a quién, qué momento le toca y por dónde sale.
5
+ * Mensajería no resuelve nada de dominio con este ítem: solo elige la plantilla y entrega.
6
+ */
7
+ export declare class MessagingCandidateItem {
8
+ /** El destinatario es la PERSONA. Siempre viaja. */
9
+ personId: string;
10
+ /**
11
+ * El crédito es el motivo del mensaje, no a quién se le manda.
12
+ * Va vacío en los avisos que no cuelgan de un crédito.
13
+ */
14
+ creditId?: string;
15
+ /** Momento del catálogo de plantillas — parte de la PK de `TemplateMessages_GT`. */
16
+ messageType: string;
17
+ /** Momento de la corrida que produjo este candidato. */
18
+ slot: MessagingSlotEnum;
19
+ channel: DeliveryChannelExtendedEnum;
20
+ /**
21
+ * Variables del texto YA RESUELTAS. Mensajería no sabe qué es un crédito:
22
+ * si aquí viajara un id para que ella lo resuelva, cada mensaje sería otra llamada entre lambdas.
23
+ */
24
+ variables: Record<string, string>;
25
+ /** Referencia de rastreo del candidato; el consumidor la usa para deduplicar. */
26
+ reference: string;
27
+ /** IMEI del equipo. Solo viaja cuando `channel` es `MDM`. */
28
+ imei?: string;
29
+ /** Proveedor MDM del equipo. Solo viaja cuando `channel` es `MDM`. */
30
+ mdmProvider?: MdmProviderEnum;
31
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessagingCandidateItem = void 0;
4
+ /**
5
+ * Un candidato a recibir un mensaje: a quién, qué momento le toca y por dónde sale.
6
+ * Mensajería no resuelve nada de dominio con este ítem: solo elige la plantilla y entrega.
7
+ */
8
+ class MessagingCandidateItem {
9
+ }
10
+ exports.MessagingCandidateItem = MessagingCandidateItem;
@@ -0,0 +1,11 @@
1
+ import { MessagingSlotEnum } from '../../../messagesConnector/index';
2
+ /** Body de `POST /private/messaging/candidates` (loan-credit-business). Pide una página de candidatos. */
3
+ export declare class ListMessagingCandidatesRequest {
4
+ /** Qué horario disparó la corrida. El nombre del momento, nunca la hora. */
5
+ slot: MessagingSlotEnum;
6
+ /** Día de tienda de la corrida. Lo manda el caller: el cupo no puede salir del reloj del lambda. */
7
+ runDate: string;
8
+ /** Cursor opaco de la página anterior. Ausente en la primera página. */
9
+ cursor?: string;
10
+ limit?: number;
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.ListMessagingCandidatesRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const index_1 = require("../../../messagesConnector/index");
16
+ const MessagingCandidateLimits_1 = require("../../constants/MessagingCandidateLimits");
17
+ const StoreDayPattern_1 = require("../../constants/StoreDayPattern");
18
+ /** Body de `POST /private/messaging/candidates` (loan-credit-business). Pide una página de candidatos. */
19
+ class ListMessagingCandidatesRequest {
20
+ }
21
+ exports.ListMessagingCandidatesRequest = ListMessagingCandidatesRequest;
22
+ __decorate([
23
+ (0, class_transformer_1.Expose)(),
24
+ (0, class_validator_1.IsEnum)(index_1.MessagingSlotEnum),
25
+ __metadata("design:type", String)
26
+ ], ListMessagingCandidatesRequest.prototype, "slot", void 0);
27
+ __decorate([
28
+ (0, class_transformer_1.Expose)(),
29
+ (0, class_validator_1.Matches)(StoreDayPattern_1.STORE_DAY_PATTERN, { message: StoreDayPattern_1.STORE_DAY_MESSAGE }),
30
+ __metadata("design:type", String)
31
+ ], ListMessagingCandidatesRequest.prototype, "runDate", void 0);
32
+ __decorate([
33
+ (0, class_transformer_1.Expose)(),
34
+ (0, class_validator_1.IsOptional)(),
35
+ (0, class_validator_1.IsString)(),
36
+ (0, class_validator_1.IsNotEmpty)(),
37
+ __metadata("design:type", String)
38
+ ], ListMessagingCandidatesRequest.prototype, "cursor", void 0);
39
+ __decorate([
40
+ (0, class_transformer_1.Expose)(),
41
+ (0, class_validator_1.IsOptional)(),
42
+ (0, class_transformer_1.Type)(() => Number),
43
+ (0, class_validator_1.IsInt)(),
44
+ (0, class_validator_1.Min)(1),
45
+ (0, class_validator_1.Max)(MessagingCandidateLimits_1.MESSAGING_CANDIDATES_MAX_LIMIT),
46
+ __metadata("design:type", Number)
47
+ ], ListMessagingCandidatesRequest.prototype, "limit", void 0);
@@ -0,0 +1,7 @@
1
+ import { MessagingCandidateItem } from '../MessagingCandidateItem';
2
+ /** Response de `POST /private/messaging/candidates`. Una página de candidatos. */
3
+ export declare class ListMessagingCandidatesResponse {
4
+ items: MessagingCandidateItem[];
5
+ /** Cursor de la siguiente página. `null` significa que ya no queda nadie — nunca `undefined`. */
6
+ nextCursor: string | null;
7
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ListMessagingCandidatesResponse = void 0;
4
+ /** Response de `POST /private/messaging/candidates`. Una página de candidatos. */
5
+ class ListMessagingCandidatesResponse {
6
+ }
7
+ exports.ListMessagingCandidatesResponse = ListMessagingCandidatesResponse;
@@ -82,3 +82,9 @@ export * from './dtos/responses/LoanDeviceNotifyResponse';
82
82
  export * from './dtos/responses/LoanDeviceReleaseResult';
83
83
  export * from './dtos/responses/LoanDeviceReleaseResponse';
84
84
  export * from './validators/IsFutureIso8601DateTime';
85
+ export { MessagingSlotEnum } from '../messagesConnector/enums/MessagingSlotEnum';
86
+ export * from './constants/MessagingCandidateLimits';
87
+ export * from './constants/StoreDayPattern';
88
+ export * from './dtos/MessagingCandidateItem';
89
+ export * from './dtos/requests/ListMessagingCandidatesRequest';
90
+ export * from './dtos/responses/ListMessagingCandidatesResponse';
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.MdmLockModeEnum = exports.DeviceLockScreenMessage = exports.MdmError = exports.DeviceReleaseReasonEnum = exports.MdmNoticeTypeEnum = exports.DeviceNotifyIntensityEnum = exports.DeviceEnrollmentModeEnum = exports.MdmProviderEnum = exports.MdmOperationTypeEnum = exports.MdmDeviceStatusEnum = exports.MdmOperationStatusEnum = exports.ClientLevelEnum = void 0;
17
+ exports.MessagingSlotEnum = exports.MdmLockModeEnum = exports.DeviceLockScreenMessage = exports.MdmError = exports.DeviceReleaseReasonEnum = exports.MdmNoticeTypeEnum = exports.DeviceNotifyIntensityEnum = exports.DeviceEnrollmentModeEnum = exports.MdmProviderEnum = exports.MdmOperationTypeEnum = exports.MdmDeviceStatusEnum = exports.MdmOperationStatusEnum = exports.ClientLevelEnum = void 0;
18
18
  // Enums
19
19
  __exportStar(require("./enums/LoanCreditStatusEnum"), exports);
20
20
  __exportStar(require("./enums/LoanInstallmentStatusEnum"), exports);
@@ -118,3 +118,12 @@ __exportStar(require("./dtos/responses/LoanDeviceNotifyResponse"), exports);
118
118
  __exportStar(require("./dtos/responses/LoanDeviceReleaseResult"), exports);
119
119
  __exportStar(require("./dtos/responses/LoanDeviceReleaseResponse"), exports);
120
120
  __exportStar(require("./validators/IsFutureIso8601DateTime"), exports);
121
+ // Candidatos de mensajería — contrato de `POST /private/messaging/candidates`
122
+ // Re-export del enum canónico del momento (owner: messagesConnector — un solo origen de verdad).
123
+ var MessagingSlotEnum_1 = require("../messagesConnector/enums/MessagingSlotEnum");
124
+ Object.defineProperty(exports, "MessagingSlotEnum", { enumerable: true, get: function () { return MessagingSlotEnum_1.MessagingSlotEnum; } });
125
+ __exportStar(require("./constants/MessagingCandidateLimits"), exports);
126
+ __exportStar(require("./constants/StoreDayPattern"), exports);
127
+ __exportStar(require("./dtos/MessagingCandidateItem"), exports);
128
+ __exportStar(require("./dtos/requests/ListMessagingCandidatesRequest"), exports);
129
+ __exportStar(require("./dtos/responses/ListMessagingCandidatesResponse"), exports);
@@ -1,5 +1,7 @@
1
1
  export declare enum DeliveryChannelExtendedEnum {
2
2
  SMS = "SMS",
3
3
  MAIL = "MAIL",
4
- PUSH_NOTIFICATION = "PUSH_NOTIFICATION"
4
+ PUSH_NOTIFICATION = "PUSH_NOTIFICATION",
5
+ /** Aviso en la pantalla del equipo financiado. Se entrega por IMEI, no por teléfono ni correo. */
6
+ MDM = "MDM"
5
7
  }
@@ -6,4 +6,6 @@ var DeliveryChannelExtendedEnum;
6
6
  DeliveryChannelExtendedEnum["SMS"] = "SMS";
7
7
  DeliveryChannelExtendedEnum["MAIL"] = "MAIL";
8
8
  DeliveryChannelExtendedEnum["PUSH_NOTIFICATION"] = "PUSH_NOTIFICATION";
9
+ /** Aviso en la pantalla del equipo financiado. Se entrega por IMEI, no por teléfono ni correo. */
10
+ DeliveryChannelExtendedEnum["MDM"] = "MDM";
9
11
  })(DeliveryChannelExtendedEnum || (exports.DeliveryChannelExtendedEnum = DeliveryChannelExtendedEnum = {}));
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Momento del día en que corre una agenda de mensajería.
3
+ * Es el nombre del momento, nunca la hora: la hora vive en la agenda de cada tenant y cambia sin desplegar.
4
+ */
5
+ export declare enum MessagingSlotEnum {
6
+ MORNING = "MORNING",
7
+ AFTERNOON = "AFTERNOON",
8
+ EVENING = "EVENING"
9
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessagingSlotEnum = void 0;
4
+ /**
5
+ * Momento del día en que corre una agenda de mensajería.
6
+ * Es el nombre del momento, nunca la hora: la hora vive en la agenda de cada tenant y cambia sin desplegar.
7
+ */
8
+ var MessagingSlotEnum;
9
+ (function (MessagingSlotEnum) {
10
+ MessagingSlotEnum["MORNING"] = "MORNING";
11
+ MessagingSlotEnum["AFTERNOON"] = "AFTERNOON";
12
+ MessagingSlotEnum["EVENING"] = "EVENING";
13
+ })(MessagingSlotEnum || (exports.MessagingSlotEnum = MessagingSlotEnum = {}));
@@ -1,5 +1,6 @@
1
1
  export * from './enums/DeliveryChannelExtendedEnum';
2
2
  export * from './enums/NotificationOriginEnum';
3
+ export * from './enums/MessagingSlotEnum';
3
4
  export * from './validators/IsStringValueRecord';
4
5
  export * from './dtos/NotificationQueueMessageRequestV2';
5
6
  export * from './dtos/SendMessageRequest';
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./enums/DeliveryChannelExtendedEnum"), exports);
18
18
  __exportStar(require("./enums/NotificationOriginEnum"), exports);
19
+ __exportStar(require("./enums/MessagingSlotEnum"), exports);
19
20
  __exportStar(require("./validators/IsStringValueRecord"), exports);
20
21
  __exportStar(require("./dtos/NotificationQueueMessageRequestV2"), exports);
21
22
  __exportStar(require("./dtos/SendMessageRequest"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.411.0",
3
+ "version": "3.412.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,5 @@
1
+ /** Tope de candidatos por página. Una cartera grande no cabe en una sola llamada. */
2
+ export const MESSAGING_CANDIDATES_MAX_LIMIT = 100;
3
+
4
+ /** Tamaño de página cuando el caller no manda `limit`. */
5
+ export const MESSAGING_CANDIDATES_DEFAULT_LIMIT = 50;
@@ -0,0 +1,4 @@
1
+ /** Día de tienda en la zona horaria del tenant, sin hora: `YYYY-MM-DD`. */
2
+ export const STORE_DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
3
+
4
+ export const STORE_DAY_MESSAGE = 'runDate debe ser un día de tienda en formato YYYY-MM-DD';
@@ -0,0 +1,40 @@
1
+ import { DeliveryChannelExtendedEnum, MessagingSlotEnum } from '../../messagesConnector/index';
2
+ import { MdmProviderEnum } from '../../mdm/enums/MdmProviderEnum';
3
+
4
+ /**
5
+ * Un candidato a recibir un mensaje: a quién, qué momento le toca y por dónde sale.
6
+ * Mensajería no resuelve nada de dominio con este ítem: solo elige la plantilla y entrega.
7
+ */
8
+ export class MessagingCandidateItem {
9
+ /** El destinatario es la PERSONA. Siempre viaja. */
10
+ personId!: string;
11
+
12
+ /**
13
+ * El crédito es el motivo del mensaje, no a quién se le manda.
14
+ * Va vacío en los avisos que no cuelgan de un crédito.
15
+ */
16
+ creditId?: string;
17
+
18
+ /** Momento del catálogo de plantillas — parte de la PK de `TemplateMessages_GT`. */
19
+ messageType!: string;
20
+
21
+ /** Momento de la corrida que produjo este candidato. */
22
+ slot!: MessagingSlotEnum;
23
+
24
+ channel!: DeliveryChannelExtendedEnum;
25
+
26
+ /**
27
+ * Variables del texto YA RESUELTAS. Mensajería no sabe qué es un crédito:
28
+ * si aquí viajara un id para que ella lo resuelva, cada mensaje sería otra llamada entre lambdas.
29
+ */
30
+ variables!: Record<string, string>;
31
+
32
+ /** Referencia de rastreo del candidato; el consumidor la usa para deduplicar. */
33
+ reference!: string;
34
+
35
+ /** IMEI del equipo. Solo viaja cuando `channel` es `MDM`. */
36
+ imei?: string;
37
+
38
+ /** Proveedor MDM del equipo. Solo viaja cuando `channel` es `MDM`. */
39
+ mdmProvider?: MdmProviderEnum;
40
+ }
@@ -0,0 +1,33 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsEnum, IsInt, IsNotEmpty, IsOptional, IsString, Matches, Max, Min } from 'class-validator';
3
+ import { MessagingSlotEnum } from '../../../messagesConnector/index';
4
+ import { MESSAGING_CANDIDATES_MAX_LIMIT } from '../../constants/MessagingCandidateLimits';
5
+ import { STORE_DAY_MESSAGE, STORE_DAY_PATTERN } from '../../constants/StoreDayPattern';
6
+
7
+ /** Body de `POST /private/messaging/candidates` (loan-credit-business). Pide una página de candidatos. */
8
+ export class ListMessagingCandidatesRequest {
9
+ /** Qué horario disparó la corrida. El nombre del momento, nunca la hora. */
10
+ @Expose()
11
+ @IsEnum(MessagingSlotEnum)
12
+ slot!: MessagingSlotEnum;
13
+
14
+ /** Día de tienda de la corrida. Lo manda el caller: el cupo no puede salir del reloj del lambda. */
15
+ @Expose()
16
+ @Matches(STORE_DAY_PATTERN, { message: STORE_DAY_MESSAGE })
17
+ runDate!: string;
18
+
19
+ /** Cursor opaco de la página anterior. Ausente en la primera página. */
20
+ @Expose()
21
+ @IsOptional()
22
+ @IsString()
23
+ @IsNotEmpty()
24
+ cursor?: string;
25
+
26
+ @Expose()
27
+ @IsOptional()
28
+ @Type(() => Number)
29
+ @IsInt()
30
+ @Min(1)
31
+ @Max(MESSAGING_CANDIDATES_MAX_LIMIT)
32
+ limit?: number;
33
+ }
@@ -0,0 +1,9 @@
1
+ import { MessagingCandidateItem } from '../MessagingCandidateItem';
2
+
3
+ /** Response de `POST /private/messaging/candidates`. Una página de candidatos. */
4
+ export class ListMessagingCandidatesResponse {
5
+ items!: MessagingCandidateItem[];
6
+
7
+ /** Cursor de la siguiente página. `null` significa que ya no queda nadie — nunca `undefined`. */
8
+ nextCursor!: string | null;
9
+ }
@@ -98,3 +98,13 @@ export * from './dtos/responses/LoanDeviceReleaseResult';
98
98
  export * from './dtos/responses/LoanDeviceReleaseResponse';
99
99
 
100
100
  export * from './validators/IsFutureIso8601DateTime';
101
+
102
+ // Candidatos de mensajería — contrato de `POST /private/messaging/candidates`
103
+ // Re-export del enum canónico del momento (owner: messagesConnector — un solo origen de verdad).
104
+ export { MessagingSlotEnum } from '../messagesConnector/enums/MessagingSlotEnum';
105
+ export * from './constants/MessagingCandidateLimits';
106
+ export * from './constants/StoreDayPattern';
107
+ export * from './dtos/MessagingCandidateItem';
108
+ export * from './dtos/requests/ListMessagingCandidatesRequest';
109
+ export * from './dtos/responses/ListMessagingCandidatesResponse';
110
+
@@ -2,4 +2,6 @@ export enum DeliveryChannelExtendedEnum {
2
2
  SMS = 'SMS',
3
3
  MAIL = 'MAIL',
4
4
  PUSH_NOTIFICATION = 'PUSH_NOTIFICATION',
5
+ /** Aviso en la pantalla del equipo financiado. Se entrega por IMEI, no por teléfono ni correo. */
6
+ MDM = 'MDM',
5
7
  }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Momento del día en que corre una agenda de mensajería.
3
+ * Es el nombre del momento, nunca la hora: la hora vive en la agenda de cada tenant y cambia sin desplegar.
4
+ */
5
+ export enum MessagingSlotEnum {
6
+ MORNING = 'MORNING',
7
+ AFTERNOON = 'AFTERNOON',
8
+ EVENING = 'EVENING',
9
+ }
@@ -1,5 +1,6 @@
1
1
  export * from './enums/DeliveryChannelExtendedEnum';
2
2
  export * from './enums/NotificationOriginEnum';
3
+ export * from './enums/MessagingSlotEnum';
3
4
  export * from './validators/IsStringValueRecord';
4
5
  export * from './dtos/NotificationQueueMessageRequestV2';
5
6
  export * from './dtos/SendMessageRequest';