@fiado/type-kit 3.521.0 → 3.523.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/regulatoryNoticeDtos.test.ts +39 -0
- package/_test_/unit/mdm/dtos/mdmDeviceContract.test.ts +2 -1
- package/_test_/unit/messageMoments/MessageMomentCatalog.test.ts +111 -0
- package/_test_/unit/messagesConnector/SendMessageRequest.test.ts +33 -0
- package/_test_/unit/messagesConnector/TemplateMessageAuthor.test.ts +41 -0
- package/_test_/unit/notificationMessages/MomentTemplateContracts.test.ts +59 -0
- package/_test_/unit/notificationMessages/NotificationQueueMessageRequest.test.ts +21 -0
- package/_test_/unit/retailWizard/prospectResume.test.ts +49 -0
- package/_test_/unit/retailWizard/storeMixCategory.test.ts +22 -0
- package/bin/index.d.ts +1 -0
- package/bin/index.js +4 -3
- package/bin/loanCredit/constants/RegulatoryCampaign.d.ts +5 -0
- package/bin/loanCredit/constants/RegulatoryCampaign.js +11 -0
- package/bin/loanCredit/dtos/requests/BackofficeSendRegulatoryNoticeRequest.d.ts +9 -0
- package/bin/loanCredit/dtos/requests/BackofficeSendRegulatoryNoticeRequest.js +38 -0
- package/bin/loanCredit/dtos/responses/RegulatoryNoticeCampaignPage.d.ts +13 -0
- package/bin/loanCredit/dtos/responses/RegulatoryNoticeCampaignPage.js +2 -0
- package/bin/loanCredit/index.d.ts +3 -0
- package/bin/loanCredit/index.js +3 -0
- package/bin/mdm/enums/MdmNoticeTypeEnum.d.ts +2 -0
- package/bin/mdm/enums/MdmNoticeTypeEnum.js +2 -0
- package/bin/messageMoments/constants/MessageMomentCatalog.d.ts +18 -0
- package/bin/messageMoments/constants/MessageMomentCatalog.js +69 -0
- package/bin/messageMoments/constants/MessageMomentVariables.d.ts +11 -0
- package/bin/messageMoments/constants/MessageMomentVariables.js +40 -0
- package/bin/messageMoments/constants/TemplatePlaceholder.d.ts +3 -0
- package/bin/messageMoments/constants/TemplatePlaceholder.js +6 -0
- package/bin/messageMoments/enums/MessageMomentBlockEnum.d.ts +11 -0
- package/bin/messageMoments/enums/MessageMomentBlockEnum.js +15 -0
- package/bin/messageMoments/enums/MessageMomentEnum.d.ts +42 -0
- package/bin/messageMoments/enums/MessageMomentEnum.js +46 -0
- package/bin/messageMoments/index.d.ts +5 -0
- package/bin/messageMoments/index.js +21 -0
- package/bin/messagesConnector/dtos/SendMessageRequest.d.ts +1 -0
- package/bin/messagesConnector/dtos/SendMessageRequest.js +7 -0
- package/bin/messagesConnector/dtos/TemplateMessageCreateRequest.d.ts +2 -0
- package/bin/messagesConnector/dtos/TemplateMessageCreateRequest.js +6 -0
- package/bin/messagesConnector/dtos/TemplateMessageUpdateRequest.d.ts +2 -0
- package/bin/messagesConnector/dtos/TemplateMessageUpdateRequest.js +6 -0
- package/bin/notificationMessages/constants/MomentTemplateLimits.d.ts +4 -0
- package/bin/notificationMessages/constants/MomentTemplateLimits.js +7 -0
- package/bin/notificationMessages/dtos/MomentTemplateListResponse.d.ts +5 -0
- package/bin/notificationMessages/dtos/MomentTemplateListResponse.js +23 -0
- package/bin/notificationMessages/dtos/MomentTemplateResponse.d.ts +15 -0
- package/bin/notificationMessages/dtos/MomentTemplateResponse.js +54 -0
- package/bin/notificationMessages/dtos/MomentTemplateUpsertRequest.d.ts +6 -0
- package/bin/notificationMessages/dtos/MomentTemplateUpsertRequest.js +39 -0
- package/bin/notificationMessages/dtos/NotificationQueueMessageRequest.d.ts +2 -0
- package/bin/notificationMessages/enums/NotificationTemplateOriginEnum.d.ts +4 -0
- package/bin/notificationMessages/enums/NotificationTemplateOriginEnum.js +8 -0
- package/bin/notificationMessages/index.d.ts +5 -0
- package/bin/notificationMessages/index.js +5 -0
- package/bin/retailWizard/dtos/responses/ActiveSessionByPhoneResponse.d.ts +9 -1
- package/bin/retailWizard/dtos/responses/BackofficeStoreDetailResponse.d.ts +3 -1
- package/bin/retailWizard/dtos/responses/ProspectResumeResponse.d.ts +7 -0
- package/bin/retailWizard/dtos/responses/ProspectResumeResponse.js +2 -0
- package/bin/retailWizard/enums/ProspectResumeModeEnum.d.ts +6 -0
- package/bin/retailWizard/enums/ProspectResumeModeEnum.js +10 -0
- package/bin/retailWizard/enums/StoreMixCategoryEnum.d.ts +9 -0
- package/bin/retailWizard/enums/StoreMixCategoryEnum.js +13 -0
- package/bin/retailWizard/enums/SystemCancelReasonEnum.d.ts +4 -0
- package/bin/retailWizard/enums/SystemCancelReasonEnum.js +8 -0
- package/bin/retailWizard/index.d.ts +4 -0
- package/bin/retailWizard/index.js +4 -0
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/loanCredit/constants/RegulatoryCampaign.ts +10 -0
- package/src/loanCredit/dtos/requests/BackofficeSendRegulatoryNoticeRequest.ts +24 -0
- package/src/loanCredit/dtos/responses/RegulatoryNoticeCampaignPage.ts +13 -0
- package/src/loanCredit/index.ts +3 -0
- package/src/mdm/enums/MdmNoticeTypeEnum.ts +2 -0
- package/src/messageMoments/constants/MessageMomentCatalog.ts +91 -0
- package/src/messageMoments/constants/MessageMomentVariables.ts +42 -0
- package/src/messageMoments/constants/TemplatePlaceholder.ts +3 -0
- package/src/messageMoments/enums/MessageMomentBlockEnum.ts +11 -0
- package/src/messageMoments/enums/MessageMomentEnum.ts +50 -0
- package/src/messageMoments/index.ts +5 -0
- package/src/messagesConnector/dtos/SendMessageRequest.ts +2 -0
- package/src/messagesConnector/dtos/TemplateMessageCreateRequest.ts +6 -0
- package/src/messagesConnector/dtos/TemplateMessageUpdateRequest.ts +6 -0
- package/src/notificationMessages/constants/MomentTemplateLimits.ts +5 -0
- package/src/notificationMessages/dtos/MomentTemplateListResponse.ts +9 -0
- package/src/notificationMessages/dtos/MomentTemplateResponse.ts +34 -0
- package/src/notificationMessages/dtos/MomentTemplateUpsertRequest.ts +24 -0
- package/src/notificationMessages/dtos/NotificationQueueMessageRequest.ts +3 -1
- package/src/notificationMessages/enums/NotificationTemplateOriginEnum.ts +4 -0
- package/src/notificationMessages/index.ts +6 -2
- package/src/retailWizard/dtos/responses/ActiveSessionByPhoneResponse.ts +9 -1
- package/src/retailWizard/dtos/responses/BackofficeStoreDetailResponse.ts +3 -1
- package/src/retailWizard/dtos/responses/ProspectResumeResponse.ts +8 -0
- package/src/retailWizard/enums/ProspectResumeModeEnum.ts +6 -0
- package/src/retailWizard/enums/StoreMixCategoryEnum.ts +9 -0
- package/src/retailWizard/enums/SystemCancelReasonEnum.ts +4 -0
- package/src/retailWizard/index.ts +4 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import {
|
|
5
|
+
BackofficeSendRegulatoryNoticeRequest,
|
|
6
|
+
REGULATORY_CAMPAIGN_KEY_PATTERN,
|
|
7
|
+
REGULATORY_CAMPAIGN_MOMENTS,
|
|
8
|
+
} from '../../../src/loanCredit';
|
|
9
|
+
import { MessageMomentEnum } from '../../../src/messageMoments';
|
|
10
|
+
|
|
11
|
+
const errorsOf = async (body: unknown) =>
|
|
12
|
+
(await validate(plainToInstance(BackofficeSendRegulatoryNoticeRequest, body) as object, { whitelist: true })).map((e) => e.property);
|
|
13
|
+
|
|
14
|
+
describe('BackofficeSendRegulatoryNoticeRequest', () => {
|
|
15
|
+
it('solo el CAT y el aviso de privacidad se mandan por campaña', () => {
|
|
16
|
+
expect(REGULATORY_CAMPAIGN_MOMENTS).toEqual([MessageMomentEnum.CAT_TERMS_NOTICE, MessageMomentEnum.PRIVACY_ARCO_NOTICE]);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it.each(REGULATORY_CAMPAIGN_MOMENTS)('acepta %s con su llave de campaña', async (moment) => {
|
|
20
|
+
expect(await errorsOf({ moment, campaignKey: 'CAT-2610' })).toEqual([]);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('acepta el nextToken de la página anterior', async () => {
|
|
24
|
+
expect(await errorsOf({ moment: MessageMomentEnum.CAT_TERMS_NOTICE, campaignKey: 'c1', nextToken: 'eyJ4IjoxfQ' })).toEqual([]);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('rechaza un momento fuera de la campaña', async () => {
|
|
28
|
+
expect(await errorsOf({ moment: MessageMomentEnum.PAYMENT_APPLIED, campaignKey: 'c1' })).toContain('moment');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it.each(['', 'con espacio', 'demasiado-larga', 'acento-é'])('rechaza la llave «%s»', async (campaignKey) => {
|
|
32
|
+
expect(await errorsOf({ moment: MessageMomentEnum.CAT_TERMS_NOTICE, campaignKey })).toContain('campaignKey');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('la llave no admite # ni ~, que separan la referencia del aviso', () => {
|
|
36
|
+
expect(REGULATORY_CAMPAIGN_KEY_PATTERN.test('a#b')).toBe(false);
|
|
37
|
+
expect(REGULATORY_CAMPAIGN_KEY_PATTERN.test('a~b')).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -192,8 +192,9 @@ describe('DeviceNotifyRequest — topes de longitud de los tres textos', () => {
|
|
|
192
192
|
});
|
|
193
193
|
|
|
194
194
|
describe('MdmNoticeTypeEnum', () => {
|
|
195
|
-
it('expone los
|
|
195
|
+
it('expone los once avisos del catálogo de cobranza', () => {
|
|
196
196
|
expect(Object.values(MdmNoticeTypeEnum)).toEqual([
|
|
197
|
+
'PRE_DUE_3_DAYS',
|
|
197
198
|
'PRE_DUE_2_DAYS',
|
|
198
199
|
'PRE_DUE_1_DAY',
|
|
199
200
|
'DUE_TODAY',
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { MessageMoments } from '../../../src/index';
|
|
3
|
+
import {
|
|
4
|
+
CREDIT_MOMENT_ALWAYS_VARIABLES,
|
|
5
|
+
CREDIT_MOMENT_CONDITIONAL_VARIABLES,
|
|
6
|
+
MESSAGE_MOMENT_CATALOG,
|
|
7
|
+
MOMENT_SPECIFIC_VARIABLES,
|
|
8
|
+
MessageMomentBlockEnum,
|
|
9
|
+
MessageMomentEnum,
|
|
10
|
+
OTP_MOMENT_VARIABLES,
|
|
11
|
+
RESTRUCTURE_MOMENT_VARIABLES,
|
|
12
|
+
TEMPLATE_PLACEHOLDER_PATTERN,
|
|
13
|
+
momentByMessageType,
|
|
14
|
+
momentByTemplateId,
|
|
15
|
+
} from '../../../src/messageMoments/index';
|
|
16
|
+
|
|
17
|
+
describe('MESSAGE_MOMENT_CATALOG', () => {
|
|
18
|
+
it('trae los 38 momentos del recorrido del crédito', () => {
|
|
19
|
+
expect(MESSAGE_MOMENT_CATALOG).toHaveLength(38);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('ni el templateId ni el messageType se repiten', () => {
|
|
23
|
+
expect(momentByTemplateId.size).toBe(38);
|
|
24
|
+
expect(momentByMessageType.size).toBe(38);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('todo templateId tiene la forma PM-NNN', () => {
|
|
28
|
+
for (const moment of MESSAGE_MOMENT_CATALOG) expect(moment.templateId).toMatch(/^PM-\d{3}$/);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('todo blockId es un bloque declarado', () => {
|
|
32
|
+
const blocks = new Set<string>(Object.values(MessageMomentBlockEnum));
|
|
33
|
+
for (const moment of MESSAGE_MOMENT_CATALOG) expect(blocks.has(moment.blockId)).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('el único messageType del vocabulario fuera del catálogo es la tarjeta emitida', () => {
|
|
37
|
+
const catalogued = new Set<string>(MESSAGE_MOMENT_CATALOG.map((moment) => moment.messageType));
|
|
38
|
+
expect(Object.values(MessageMomentEnum).filter((type) => !catalogued.has(type))).toEqual([
|
|
39
|
+
MessageMomentEnum.ISSUED_CARD_SMS,
|
|
40
|
+
]);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('el OTP ofrece code y var1, lo que llena OtpManager', () => {
|
|
44
|
+
const otp = momentByTemplateId.get('PM-071');
|
|
45
|
+
expect(otp?.messageType).toBe(MessageMomentEnum.OTP_CODE);
|
|
46
|
+
expect(otp?.alwaysVariables).toEqual(OTP_MOMENT_VARIABLES);
|
|
47
|
+
expect(otp?.conditionalVariables).toEqual([]);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('los demás momentos ofrecen las variables del crédito más las propias del momento', () => {
|
|
51
|
+
for (const moment of MESSAGE_MOMENT_CATALOG.filter((m) => m.messageType !== MessageMomentEnum.OTP_CODE)) {
|
|
52
|
+
const own = MOMENT_SPECIFIC_VARIABLES[moment.messageType] ?? [];
|
|
53
|
+
expect(moment.alwaysVariables).toEqual([...CREDIT_MOMENT_ALWAYS_VARIABLES, ...own]);
|
|
54
|
+
expect(moment.conditionalVariables).toEqual(CREDIT_MOMENT_CONDITIONAL_VARIABLES);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('la reestructura propuesta y la aprobada ofrecen plazo, cuota y saldo nuevos', () => {
|
|
59
|
+
expect(RESTRUCTURE_MOMENT_VARIABLES).toEqual(['plazo_nuevo', 'cuota_nueva', 'saldo_nuevo']);
|
|
60
|
+
for (const type of [MessageMomentEnum.F1_RESTRUCTURE_PROPOSED, MessageMomentEnum.F1_RESTRUCTURE_APPROVED]) {
|
|
61
|
+
expect(momentByMessageType.get(type)?.alwaysVariables).toEqual(expect.arrayContaining([...RESTRUCTURE_MOMENT_VARIABLES]));
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('el cambio de perfil ofrece campo_cambiado y el estado de cuenta fecha_corte', () => {
|
|
66
|
+
expect(momentByTemplateId.get('PM-073')?.alwaysVariables).toContain('campo_cambiado');
|
|
67
|
+
expect(momentByTemplateId.get('PM-074')?.alwaysVariables).toContain('fecha_corte');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('una variable propia no se cuela en otro momento', () => {
|
|
71
|
+
const own = new Set(Object.values(MOMENT_SPECIFIC_VARIABLES).flat());
|
|
72
|
+
const owners = new Set(Object.keys(MOMENT_SPECIFIC_VARIABLES));
|
|
73
|
+
for (const moment of MESSAGE_MOMENT_CATALOG.filter((m) => !owners.has(m.messageType))) {
|
|
74
|
+
expect(moment.alwaysVariables.filter((name) => own.has(name))).toEqual([]);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('una variable no es siempre y condicional a la vez', () => {
|
|
79
|
+
const always = new Set(CREDIT_MOMENT_ALWAYS_VARIABLES);
|
|
80
|
+
expect(CREDIT_MOMENT_CONDITIONAL_VARIABLES.filter((name) => always.has(name))).toEqual([]);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('ninguna variable sin fuente se ofrece', () => {
|
|
84
|
+
const offered = new Set(MESSAGE_MOMENT_CATALOG.flatMap((m) => [...m.alwaysVariables, ...m.conditionalVariables]));
|
|
85
|
+
for (const name of ['dispositivo', 'fecha_promesa', 'otp', 'liga_documento', 'descripcion_correccion', 'monto_devolucion', 'monto_descuento', 'telefono_contacto']) {
|
|
86
|
+
expect(offered.has(name)).toBe(false);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('sale por el index raíz', () => {
|
|
91
|
+
expect(MessageMoments.MESSAGE_MOMENT_CATALOG).toBe(MESSAGE_MOMENT_CATALOG);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('TEMPLATE_PLACEHOLDER_PATTERN', () => {
|
|
96
|
+
const namesOf = (text: string) => [...text.matchAll(TEMPLATE_PLACEHOLDER_PATTERN)].map((match) => match[1] ?? match[2]);
|
|
97
|
+
|
|
98
|
+
it('reconoce la forma doble y la simple, igual que messages-business', () => {
|
|
99
|
+
expect(namesOf('{{monto}} {dispositivo} {otp}')).toEqual(['monto', 'dispositivo', 'otp']);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('en la forma doble no gana el {monto} interno', () => {
|
|
103
|
+
expect(namesOf('Pago de {{monto}}')).toEqual(['monto']);
|
|
104
|
+
expect('Pago de {{monto}} y {monto}'.replace(TEMPLATE_PLACEHOLDER_PATTERN, 'X')).toBe('Pago de X y X');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('es el mismo patrón que applyVariables de messages-business', () => {
|
|
108
|
+
expect(TEMPLATE_PLACEHOLDER_PATTERN.source).toBe('\\{\\{(\\w+)\\}\\}|\\{(\\w+)\\}');
|
|
109
|
+
expect(TEMPLATE_PLACEHOLDER_PATTERN.flags).toBe('g');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
@@ -46,3 +46,36 @@ describe('SendMessageRequest.directoryId', () => {
|
|
|
46
46
|
expect(await errorsOn(12345)).not.toHaveLength(0);
|
|
47
47
|
});
|
|
48
48
|
});
|
|
49
|
+
|
|
50
|
+
describe('SendMessageRequest.tenantId', () => {
|
|
51
|
+
const withTenant = (tenantId: unknown) =>
|
|
52
|
+
plainToInstance(SendMessageRequest, { ...base, directoryId: '4422194128', tenantId });
|
|
53
|
+
|
|
54
|
+
const tenantErrors = async (tenantId: unknown) => {
|
|
55
|
+
const errors = await validate(withTenant(tenantId), { whitelist: true });
|
|
56
|
+
return errors.filter((e) => e.property === 'tenantId');
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
it('es opcional: el productor legacy sin tenant sigue siendo válido', async () => {
|
|
60
|
+
const dto = plainToInstance(SendMessageRequest, { ...base, directoryId: '4422194128' });
|
|
61
|
+
expect(await validate(dto, { whitelist: true })).toHaveLength(0);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('acepta el tenant del productor', async () => {
|
|
65
|
+
expect(await tenantErrors('surekeep')).toHaveLength(0);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('sobrevive al whitelist del controller: messages-business lo recibe', async () => {
|
|
69
|
+
const dto = withTenant('surekeep');
|
|
70
|
+
await validate(dto, { whitelist: true });
|
|
71
|
+
expect(dto.tenantId).toBe('surekeep');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('rechaza vacío: un tenant vacío no puede caer en silencio a FIADO', async () => {
|
|
75
|
+
expect(await tenantErrors('')).not.toHaveLength(0);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('rechaza un no-string', async () => {
|
|
79
|
+
expect(await tenantErrors(12345)).not.toHaveLength(0);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import {
|
|
5
|
+
TemplateMessageCreateRequest,
|
|
6
|
+
TemplateMessageUpdateRequest,
|
|
7
|
+
} from '../../../src/messagesConnector/index';
|
|
8
|
+
|
|
9
|
+
const CREATE = {
|
|
10
|
+
messageType: 'COLLECTION_T_PLUS_1',
|
|
11
|
+
channelType: 'SMS',
|
|
12
|
+
language: 'es',
|
|
13
|
+
country: 'MX',
|
|
14
|
+
typeOfDirectoryId: 'USER',
|
|
15
|
+
template: 'Hola {{cliente_nombre}}',
|
|
16
|
+
contentType: 'TEXT',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
describe('autor de la plantilla', () => {
|
|
20
|
+
it('el alta acepta updatedBy y lo conserva', async () => {
|
|
21
|
+
const dto = plainToInstance(TemplateMessageCreateRequest, { ...CREATE, updatedBy: 'ana@surekeep.mx' });
|
|
22
|
+
expect(await validate(dto, { whitelist: true })).toEqual([]);
|
|
23
|
+
expect(dto.updatedBy).toBe('ana@surekeep.mx');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('la edición acepta updatedBy y lo conserva', async () => {
|
|
27
|
+
const dto = plainToInstance(TemplateMessageUpdateRequest, { template: 'Hola', updatedBy: 'ana@surekeep.mx' });
|
|
28
|
+
expect(await validate(dto, { whitelist: true })).toEqual([]);
|
|
29
|
+
expect(dto.updatedBy).toBe('ana@surekeep.mx');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('sin updatedBy los dos siguen siendo válidos', async () => {
|
|
33
|
+
expect(await validate(plainToInstance(TemplateMessageCreateRequest, CREATE))).toEqual([]);
|
|
34
|
+
expect(await validate(plainToInstance(TemplateMessageUpdateRequest, { template: 'Hola' }))).toEqual([]);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('updatedBy que no es texto se rechaza', async () => {
|
|
38
|
+
const errors = await validate(plainToInstance(TemplateMessageUpdateRequest, { updatedBy: 7 }));
|
|
39
|
+
expect(errors.map((error) => error.property)).toEqual(['updatedBy']);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { NotificationMessages } from '../../../src/index';
|
|
5
|
+
import {
|
|
6
|
+
MOMENT_MESSAGE_TYPE_PATTERN,
|
|
7
|
+
MOMENT_TEMPLATE_LIST_MAX,
|
|
8
|
+
MomentTemplateUpsertRequest,
|
|
9
|
+
NotificationTemplateOriginEnum,
|
|
10
|
+
} from '../../../src/notificationMessages/index';
|
|
11
|
+
|
|
12
|
+
async function errorsOf(body: Record<string, unknown>): Promise<string[]> {
|
|
13
|
+
const errors = await validate(plainToInstance(MomentTemplateUpsertRequest, body));
|
|
14
|
+
return errors.map((error) => error.property);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
describe('MomentTemplateUpsertRequest', () => {
|
|
18
|
+
it('acepta título, cuerpo y autor', async () => {
|
|
19
|
+
expect(await errorsOf({ title: 'Pago aplicado', body: 'Hola {{cliente_nombre}}', updatedBy: 'ana@surekeep.mx' })).toEqual([]);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it.each([
|
|
23
|
+
['title', { body: 'b', updatedBy: 'u' }],
|
|
24
|
+
['body', { title: 't', updatedBy: 'u' }],
|
|
25
|
+
['updatedBy', { title: 't', body: 'b' }],
|
|
26
|
+
])('rechaza el body sin %s', async (field, body) => {
|
|
27
|
+
expect(await errorsOf(body)).toContain(field);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it.each(['', ' '])('rechaza un título vacío o en blanco (%p)', async (title) => {
|
|
31
|
+
expect(await errorsOf({ title, body: 'b', updatedBy: 'u' })).toContain('title');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('rechaza tipos que no son texto', async () => {
|
|
35
|
+
expect(await errorsOf({ title: 1, body: [], updatedBy: {} })).toEqual(['title', 'body', 'updatedBy']);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('límites y origen', () => {
|
|
40
|
+
it('el origen de las plantillas de momento es MESSAGING_MOMENT', () => {
|
|
41
|
+
expect(NotificationTemplateOriginEnum.MESSAGING_MOMENT).toBe('MESSAGING_MOMENT');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('el listado acepta hasta 100 momentos, el tope de BatchGetItem', () => {
|
|
45
|
+
expect(MOMENT_TEMPLATE_LIST_MAX).toBe(100);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it.each(['PAYMENT_APPLIED', 'COLLECTION_T_PLUS_60_BUREAU', 'OTP_CODE'])('%s es un messageType válido', (value) => {
|
|
49
|
+
expect(MOMENT_MESSAGE_TYPE_PATTERN.test(value)).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it.each(['', 'payment_applied', 'A/B', 'A#B', 'A,B', 'A B'])('%p no es un messageType válido', (value) => {
|
|
53
|
+
expect(MOMENT_MESSAGE_TYPE_PATTERN.test(value)).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('sale por el index raíz', () => {
|
|
57
|
+
expect(NotificationMessages.NotificationTemplateOriginEnum.MESSAGING_MOMENT).toBe('MESSAGING_MOMENT');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { NotificationQueueMessageRequest } from '../../../src/notificationMessages/index';
|
|
3
|
+
|
|
4
|
+
describe('NotificationQueueMessageRequest', () => {
|
|
5
|
+
it('acepta eventId para que el consumidor deduplique por destino', () => {
|
|
6
|
+
const message: NotificationQueueMessageRequest = {
|
|
7
|
+
templateId: 'PAYMENT_APPLIED',
|
|
8
|
+
eventId: 'LIFECYCLE~PAYMENT_APPLIED~cr-1~pay-9',
|
|
9
|
+
destinations: [{ directoryId: 'dir-1', templateVariables: [] }],
|
|
10
|
+
};
|
|
11
|
+
expect(message.eventId).toBe('LIFECYCLE~PAYMENT_APPLIED~cr-1~pay-9');
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('sin eventId sigue siendo válido: los productores del wallet no lo mandan', () => {
|
|
15
|
+
const message: NotificationQueueMessageRequest = {
|
|
16
|
+
templateId: 'P2P_SENDER_MESSAGE',
|
|
17
|
+
destinations: [{ directoryId: 'dir-1' }],
|
|
18
|
+
};
|
|
19
|
+
expect(message.eventId).toBeUndefined();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import {
|
|
3
|
+
ProspectResumeModeEnum,
|
|
4
|
+
SystemCancelReasonEnum,
|
|
5
|
+
WizardStateEnum,
|
|
6
|
+
WizardStepEnum,
|
|
7
|
+
type ActiveSessionByPhoneResponse,
|
|
8
|
+
type ProspectResumeResponse,
|
|
9
|
+
} from '../../../src/retailWizard';
|
|
10
|
+
|
|
11
|
+
describe('ProspectResumeModeEnum', () => {
|
|
12
|
+
it('has the three outcomes of «Reabrir»', () => {
|
|
13
|
+
expect(Object.values(ProspectResumeModeEnum)).toEqual(['EXACT', 'CHECKPOINT', 'NEW']);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe('SystemCancelReasonEnum', () => {
|
|
18
|
+
it('names the saga cancel when loan-credit discards the quote', () => {
|
|
19
|
+
expect(SystemCancelReasonEnum.SWEEP_CREDIT_DISCARDED).toBe('SWEEP_CREDIT_DISCARDED');
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe('ProspectResumeResponse', () => {
|
|
24
|
+
it('NEW carries no session; EXACT and CHECKPOINT carry the session to resume', () => {
|
|
25
|
+
const responses: ProspectResumeResponse[] = [
|
|
26
|
+
{ sessionId: null, mode: ProspectResumeModeEnum.NEW },
|
|
27
|
+
{ sessionId: 'S1', mode: ProspectResumeModeEnum.EXACT },
|
|
28
|
+
{ sessionId: 'S1', mode: ProspectResumeModeEnum.CHECKPOINT },
|
|
29
|
+
];
|
|
30
|
+
expect(responses.map((r) => r.mode)).toEqual(['NEW', 'EXACT', 'CHECKPOINT']);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe('ActiveSessionByPhoneResponse', () => {
|
|
35
|
+
it('carries the entry screen, the entry step, the exact window and money at stake', () => {
|
|
36
|
+
const res: ActiveSessionByPhoneResponse = {
|
|
37
|
+
found: true,
|
|
38
|
+
sessionId: 'S1',
|
|
39
|
+
currentStep: WizardStepEnum.S04,
|
|
40
|
+
state: WizardStateEnum.PAUSED_EXTERNAL_REFERRAL,
|
|
41
|
+
blocked: null,
|
|
42
|
+
resumeSlug: null,
|
|
43
|
+
resumeTargetStep: WizardStepEnum.S02,
|
|
44
|
+
exactUntil: null,
|
|
45
|
+
moneyAtStake: false,
|
|
46
|
+
};
|
|
47
|
+
expect(res.resumeTargetStep).toBe(WizardStepEnum.S02);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { ProductCategoryEnum } from '../../../src/retailCatalog/enums/ProductCategoryEnum';
|
|
3
|
+
import { StoreMixCategoryEnum, type StoreCategoryMixEntry } from '../../../src/retailWizard';
|
|
4
|
+
|
|
5
|
+
describe('StoreMixCategoryEnum', () => {
|
|
6
|
+
it('trae todas las categorías de producto con los mismos strings, más SERVICE', () => {
|
|
7
|
+
for (const value of Object.values(ProductCategoryEnum)) {
|
|
8
|
+
expect(Object.values(StoreMixCategoryEnum)).toContain(value);
|
|
9
|
+
}
|
|
10
|
+
expect(StoreMixCategoryEnum.SERVICE).toBe('SERVICE');
|
|
11
|
+
expect(Object.values(StoreMixCategoryEnum)).toHaveLength(Object.values(ProductCategoryEnum).length + 1);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('acepta SERVICE y null en una entrada del mix', () => {
|
|
15
|
+
const entries: StoreCategoryMixEntry[] = [
|
|
16
|
+
{ category: StoreMixCategoryEnum.SERVICE, units: 1, placedCents: 50000 },
|
|
17
|
+
{ category: StoreMixCategoryEnum.PHONE, units: 2, placedCents: 900000 },
|
|
18
|
+
{ category: null, units: 0, placedCents: 0 },
|
|
19
|
+
];
|
|
20
|
+
expect(entries.map((e) => e.category)).toEqual(['SERVICE', 'PHONE', null]);
|
|
21
|
+
});
|
|
22
|
+
});
|
package/bin/index.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ export * as Identity from './provider';
|
|
|
22
22
|
export * as Header from './header';
|
|
23
23
|
export * as ServicePayment from './servicePayment';
|
|
24
24
|
export * as NotificationMessages from './notificationMessages';
|
|
25
|
+
export * as MessageMoments from './messageMoments';
|
|
25
26
|
export * as SessionActivity from './sessionActivity';
|
|
26
27
|
export * as EventBridgeMessage from './eventBridge';
|
|
27
28
|
export * as GenericMessage from './genericMessage';
|
package/bin/index.js
CHANGED
|
@@ -36,9 +36,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
36
36
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
40
|
-
exports.
|
|
41
|
-
exports.DatalakeReports = exports.RewardsEligibility = exports.Rewards = exports.DynamicForm = exports.FileStorage = exports.MoneyTransfer = exports.RetailLoan = exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = exports.LoanConfig = exports.DatalakeQuery = exports.RetailIntegration = void 0;
|
|
39
|
+
exports.Blacklist = exports.CentralPayments = exports.Helpdesk = exports.FiadoApiResponse = exports.Auth = exports.LegalDocumentsBusiness = exports.Role = exports.STPAccount = exports.RiskProfile = exports.FraudPreventionEngine = exports.BBVARst = exports.Stp = exports.BenefitCenter = exports.BankAccount = exports.P2pContact = exports.CreditContract = exports.Contract = exports.ProductCatalog = exports.ContactInfo = exports.TransactionAnalytics = exports.Transaction = exports.TransactionProcessor = exports.GenericMessage = exports.EventBridgeMessage = exports.SessionActivity = exports.MessageMoments = exports.NotificationMessages = exports.ServicePayment = exports.Header = exports.Identity = exports.UserTags = exports.Group = exports.File = exports.ExchangeRate = exports.Directory = exports.Currency = exports.Country = exports.Card = exports.Authentication = exports.AppContent = exports.App = exports.Offices = exports.Places = exports.Address = exports.Beneficiary = exports.Activity = exports.Biometrics = exports.MetamapConnector = exports.Account = exports.Crypto = void 0;
|
|
40
|
+
exports.RetailWizard = exports.RetailCustomer = exports.RetailCards = exports.RetailCatalog = exports.RetailCommission = exports.RetailOrg = exports.EmailVerification = exports.NetworkConnector = exports.Modelias = exports.TotpSecurity = exports.Passport = exports.WalletFunding = exports.Remittance = exports.PlatformRbac = exports.CognitoBackofficeConnector = exports.WhatsappConnector = exports.TwilioConnector = exports.MessagesConnector = exports.Mdm = exports.MilestoneBusiness = exports.CirculoCredito = exports.CreditStatements = exports.Sentry = exports.AiEngine = exports.Funnel = exports.TeamsConnector = exports.PlatformErrorEvents = exports.CustomerFile = exports.CreditBackoffice = exports.CreditDashboard = exports.CreditEngine = exports.Credit = exports.ComissionBusiness = exports.ReferralBusiness = exports.ZendeskMessaging = exports.NotificationWS = exports.Event = exports.PayrollBusiness = exports.Cnbv = exports.DirectorySetting = exports.InvoiceCollector = exports.Collector = exports.Pricelist = exports.Company = exports.Services = exports.AccountIssuanceBusiness = exports.AppSelectionData = exports.Device = exports.Observations = exports.IssuanceBusiness = void 0;
|
|
41
|
+
exports.DatalakeReports = exports.RewardsEligibility = exports.Rewards = exports.DynamicForm = exports.FileStorage = exports.MoneyTransfer = exports.RetailLoan = exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = exports.LoanConfig = exports.DatalakeQuery = exports.RetailIntegration = exports.RetailPromotions = void 0;
|
|
42
42
|
exports.Crypto = __importStar(require("./crypto"));
|
|
43
43
|
exports.Account = __importStar(require("./account"));
|
|
44
44
|
exports.MetamapConnector = __importStar(require("./metamapConnector"));
|
|
@@ -63,6 +63,7 @@ exports.Identity = __importStar(require("./provider"));
|
|
|
63
63
|
exports.Header = __importStar(require("./header"));
|
|
64
64
|
exports.ServicePayment = __importStar(require("./servicePayment"));
|
|
65
65
|
exports.NotificationMessages = __importStar(require("./notificationMessages"));
|
|
66
|
+
exports.MessageMoments = __importStar(require("./messageMoments"));
|
|
66
67
|
exports.SessionActivity = __importStar(require("./sessionActivity"));
|
|
67
68
|
exports.EventBridgeMessage = __importStar(require("./eventBridge"));
|
|
68
69
|
exports.GenericMessage = __importStar(require("./genericMessage"));
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { MessageMomentEnum } from '../../messageMoments/enums/MessageMomentEnum';
|
|
2
|
+
/** Los avisos regulatorios que se mandan a toda la cartera viva desde el backoffice. */
|
|
3
|
+
export declare const REGULATORY_CAMPAIGN_MOMENTS: readonly MessageMomentEnum[];
|
|
4
|
+
/** Llave de la campaña: corta y sin separadores, porque viaja dentro de la referencia del aviso. */
|
|
5
|
+
export declare const REGULATORY_CAMPAIGN_KEY_PATTERN: RegExp;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REGULATORY_CAMPAIGN_KEY_PATTERN = exports.REGULATORY_CAMPAIGN_MOMENTS = void 0;
|
|
4
|
+
const MessageMomentEnum_1 = require("../../messageMoments/enums/MessageMomentEnum");
|
|
5
|
+
/** Los avisos regulatorios que se mandan a toda la cartera viva desde el backoffice. */
|
|
6
|
+
exports.REGULATORY_CAMPAIGN_MOMENTS = [
|
|
7
|
+
MessageMomentEnum_1.MessageMomentEnum.CAT_TERMS_NOTICE,
|
|
8
|
+
MessageMomentEnum_1.MessageMomentEnum.PRIVACY_ARCO_NOTICE,
|
|
9
|
+
];
|
|
10
|
+
/** Llave de la campaña: corta y sin separadores, porque viaja dentro de la referencia del aviso. */
|
|
11
|
+
exports.REGULATORY_CAMPAIGN_KEY_PATTERN = /^[A-Za-z0-9-]{1,12}$/;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MessageMomentEnum } from '../../../messageMoments/enums/MessageMomentEnum';
|
|
2
|
+
/** Body de `POST /backoffice/regulatory-notices` (loan-credit-business): una página de la campaña. */
|
|
3
|
+
export declare class BackofficeSendRegulatoryNoticeRequest {
|
|
4
|
+
moment: MessageMomentEnum;
|
|
5
|
+
/** La misma en todas las páginas: reintentar la campaña no duplica el aviso. */
|
|
6
|
+
campaignKey: string;
|
|
7
|
+
/** Cursor de la página anterior; ausente en la primera. */
|
|
8
|
+
nextToken?: string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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.BackofficeSendRegulatoryNoticeRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const MessageMomentEnum_1 = require("../../../messageMoments/enums/MessageMomentEnum");
|
|
16
|
+
const RegulatoryCampaign_1 = require("../../constants/RegulatoryCampaign");
|
|
17
|
+
/** Body de `POST /backoffice/regulatory-notices` (loan-credit-business): una página de la campaña. */
|
|
18
|
+
class BackofficeSendRegulatoryNoticeRequest {
|
|
19
|
+
}
|
|
20
|
+
exports.BackofficeSendRegulatoryNoticeRequest = BackofficeSendRegulatoryNoticeRequest;
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, class_transformer_1.Expose)(),
|
|
23
|
+
(0, class_validator_1.IsIn)(RegulatoryCampaign_1.REGULATORY_CAMPAIGN_MOMENTS),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], BackofficeSendRegulatoryNoticeRequest.prototype, "moment", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, class_transformer_1.Expose)(),
|
|
28
|
+
(0, class_validator_1.IsString)(),
|
|
29
|
+
(0, class_validator_1.Matches)(RegulatoryCampaign_1.REGULATORY_CAMPAIGN_KEY_PATTERN),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], BackofficeSendRegulatoryNoticeRequest.prototype, "campaignKey", 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
|
+
], BackofficeSendRegulatoryNoticeRequest.prototype, "nextToken", void 0);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Lo que dejó una página de la campaña regulatoria. */
|
|
2
|
+
export interface RegulatoryNoticeCampaignPage {
|
|
3
|
+
/** Créditos vivos revisados en esta página. */
|
|
4
|
+
examined: number;
|
|
5
|
+
/** Avisos que salieron por algún canal. */
|
|
6
|
+
delivered: number;
|
|
7
|
+
/** Avisos que la puerta descartó, cada uno con su fila de evidencia. */
|
|
8
|
+
discarded: number;
|
|
9
|
+
/** Avisos que fallaron; también dejan fila FALLIDA. */
|
|
10
|
+
failed: number;
|
|
11
|
+
/** Cursor de la página siguiente; ausente cuando la campaña terminó. */
|
|
12
|
+
nextToken?: string;
|
|
13
|
+
}
|
|
@@ -131,6 +131,9 @@ export * from './dtos/responses/LoanRestructure';
|
|
|
131
131
|
export * from './dtos/responses/LoanRestructureListResponse';
|
|
132
132
|
export * from './dtos/responses/LoanRestructurePreviewInstallment';
|
|
133
133
|
export * from './dtos/responses/LoanRestructurePreview';
|
|
134
|
+
export * from './constants/RegulatoryCampaign';
|
|
135
|
+
export * from './dtos/requests/BackofficeSendRegulatoryNoticeRequest';
|
|
136
|
+
export * from './dtos/responses/RegulatoryNoticeCampaignPage';
|
|
134
137
|
export * from './dtos/responses/LoanOtpDispatch';
|
|
135
138
|
export * from './dtos/responses/LoanPrepaymentQuote';
|
|
136
139
|
export * from './dtos/responses/LoanPaymentReviewItem';
|
package/bin/loanCredit/index.js
CHANGED
|
@@ -173,6 +173,9 @@ __exportStar(require("./dtos/responses/LoanRestructure"), exports);
|
|
|
173
173
|
__exportStar(require("./dtos/responses/LoanRestructureListResponse"), exports);
|
|
174
174
|
__exportStar(require("./dtos/responses/LoanRestructurePreviewInstallment"), exports);
|
|
175
175
|
__exportStar(require("./dtos/responses/LoanRestructurePreview"), exports);
|
|
176
|
+
__exportStar(require("./constants/RegulatoryCampaign"), exports);
|
|
177
|
+
__exportStar(require("./dtos/requests/BackofficeSendRegulatoryNoticeRequest"), exports);
|
|
178
|
+
__exportStar(require("./dtos/responses/RegulatoryNoticeCampaignPage"), exports);
|
|
176
179
|
__exportStar(require("./dtos/responses/LoanOtpDispatch"), exports);
|
|
177
180
|
__exportStar(require("./dtos/responses/LoanPrepaymentQuote"), exports);
|
|
178
181
|
__exportStar(require("./dtos/responses/LoanPaymentReviewItem"), exports);
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* No es la cadencia completa de cobranza: los hitos de otros canales (tarde del día 0, días 90 y 180) no se pintan acá.
|
|
5
5
|
*/
|
|
6
6
|
export declare enum MdmNoticeTypeEnum {
|
|
7
|
+
/** Tres días antes del vencimiento de la cuota. */
|
|
8
|
+
PRE_DUE_3_DAYS = "PRE_DUE_3_DAYS",
|
|
7
9
|
/** Dos días antes del vencimiento de la cuota. */
|
|
8
10
|
PRE_DUE_2_DAYS = "PRE_DUE_2_DAYS",
|
|
9
11
|
/** Un día antes del vencimiento de la cuota. */
|
|
@@ -8,6 +8,8 @@ exports.MdmNoticeTypeEnum = void 0;
|
|
|
8
8
|
*/
|
|
9
9
|
var MdmNoticeTypeEnum;
|
|
10
10
|
(function (MdmNoticeTypeEnum) {
|
|
11
|
+
/** Tres días antes del vencimiento de la cuota. */
|
|
12
|
+
MdmNoticeTypeEnum["PRE_DUE_3_DAYS"] = "PRE_DUE_3_DAYS";
|
|
11
13
|
/** Dos días antes del vencimiento de la cuota. */
|
|
12
14
|
MdmNoticeTypeEnum["PRE_DUE_2_DAYS"] = "PRE_DUE_2_DAYS";
|
|
13
15
|
/** Un día antes del vencimiento de la cuota. */
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MessageMomentEnum } from '../enums/MessageMomentEnum';
|
|
2
|
+
import { MessageMomentBlockEnum } from '../enums/MessageMomentBlockEnum';
|
|
3
|
+
/** Quién es un momento: su id de ficha, su plantilla, su bloque y las variables que emite. */
|
|
4
|
+
export interface MessageMomentIdentity {
|
|
5
|
+
/** Id del momento (`PM-001`); en minúsculas es el prefijo de sus keys en la ficha. */
|
|
6
|
+
templateId: string;
|
|
7
|
+
messageType: MessageMomentEnum;
|
|
8
|
+
/** Bloque del árbol. La ficha lo puede pisar; este es el respaldo cuando su key falta. */
|
|
9
|
+
blockId: MessageMomentBlockEnum;
|
|
10
|
+
alwaysVariables: readonly string[];
|
|
11
|
+
conditionalVariables: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
/** Los 38 momentos EN ORDEN de recorrido del crédito. `PM-071` apunta al OTP de plataforma. */
|
|
14
|
+
export declare const MESSAGE_MOMENT_CATALOG: readonly MessageMomentIdentity[];
|
|
15
|
+
/** La identidad por id de ficha (`PM-030`). */
|
|
16
|
+
export declare const momentByTemplateId: ReadonlyMap<string, MessageMomentIdentity>;
|
|
17
|
+
/** La identidad por messageType de la plantilla. */
|
|
18
|
+
export declare const momentByMessageType: ReadonlyMap<string, MessageMomentIdentity>;
|