@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.
- package/_test_/unit/loanCredit/dtos/listMessagingCandidates.test.ts +97 -0
- package/_test_/unit/messagesConnector/messagingEnums.test.ts +37 -0
- package/bin/loanCredit/constants/MessagingCandidateLimits.d.ts +4 -0
- package/bin/loanCredit/constants/MessagingCandidateLimits.js +7 -0
- package/bin/loanCredit/constants/StoreDayPattern.d.ts +3 -0
- package/bin/loanCredit/constants/StoreDayPattern.js +6 -0
- package/bin/loanCredit/dtos/MessagingCandidateItem.d.ts +31 -0
- package/bin/loanCredit/dtos/MessagingCandidateItem.js +10 -0
- package/bin/loanCredit/dtos/requests/ListMessagingCandidatesRequest.d.ts +11 -0
- package/bin/loanCredit/dtos/requests/ListMessagingCandidatesRequest.js +47 -0
- package/bin/loanCredit/dtos/responses/ListMessagingCandidatesResponse.d.ts +7 -0
- package/bin/loanCredit/dtos/responses/ListMessagingCandidatesResponse.js +7 -0
- package/bin/loanCredit/index.d.ts +6 -0
- package/bin/loanCredit/index.js +10 -1
- package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.d.ts +3 -1
- package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.js +2 -0
- package/bin/messagesConnector/enums/MessagingSlotEnum.d.ts +9 -0
- package/bin/messagesConnector/enums/MessagingSlotEnum.js +13 -0
- package/bin/messagesConnector/index.d.ts +1 -0
- package/bin/messagesConnector/index.js +1 -0
- package/package.json +1 -1
- package/src/loanCredit/constants/MessagingCandidateLimits.ts +5 -0
- package/src/loanCredit/constants/StoreDayPattern.ts +4 -0
- package/src/loanCredit/dtos/MessagingCandidateItem.ts +40 -0
- package/src/loanCredit/dtos/requests/ListMessagingCandidatesRequest.ts +33 -0
- package/src/loanCredit/dtos/responses/ListMessagingCandidatesResponse.ts +9 -0
- package/src/loanCredit/index.ts +10 -0
- package/src/messagesConnector/enums/DeliveryChannelExtendedEnum.ts +2 -0
- package/src/messagesConnector/enums/MessagingSlotEnum.ts +9 -0
- 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,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,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';
|
package/bin/loanCredit/index.js
CHANGED
|
@@ -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
|
@@ -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
|
+
}
|
package/src/loanCredit/index.ts
CHANGED
|
@@ -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
|
+
|
|
@@ -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';
|