@fiado/type-kit 3.520.0 → 3.522.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 (94) hide show
  1. package/_test_/unit/loanCredit/regulatoryNoticeDtos.test.ts +39 -0
  2. package/_test_/unit/mdm/dtos/mdmDeviceContract.test.ts +24 -1
  3. package/_test_/unit/messageMoments/MessageMomentCatalog.test.ts +111 -0
  4. package/_test_/unit/messagesConnector/SendMessageRequest.test.ts +33 -0
  5. package/_test_/unit/messagesConnector/TemplateMessageAuthor.test.ts +41 -0
  6. package/_test_/unit/notificationMessages/MomentTemplateContracts.test.ts +59 -0
  7. package/_test_/unit/notificationMessages/NotificationQueueMessageRequest.test.ts +21 -0
  8. package/_test_/unit/retailWizard/storeMixCategory.test.ts +22 -0
  9. package/_test_/unit/rewardsEligibility/metricsDtos.test.ts +8 -2
  10. package/bin/index.d.ts +1 -0
  11. package/bin/index.js +4 -3
  12. package/bin/loanCredit/constants/RegulatoryCampaign.d.ts +5 -0
  13. package/bin/loanCredit/constants/RegulatoryCampaign.js +11 -0
  14. package/bin/loanCredit/dtos/requests/BackofficeSendRegulatoryNoticeRequest.d.ts +9 -0
  15. package/bin/loanCredit/dtos/requests/BackofficeSendRegulatoryNoticeRequest.js +38 -0
  16. package/bin/loanCredit/dtos/responses/RegulatoryNoticeCampaignPage.d.ts +13 -0
  17. package/bin/loanCredit/dtos/responses/RegulatoryNoticeCampaignPage.js +2 -0
  18. package/bin/loanCredit/index.d.ts +3 -0
  19. package/bin/loanCredit/index.js +3 -0
  20. package/bin/mdm/dtos/DeviceEnrollRequest.d.ts +2 -0
  21. package/bin/mdm/dtos/DeviceEnrollRequest.js +6 -0
  22. package/bin/mdm/enums/MdmNoticeTypeEnum.d.ts +2 -0
  23. package/bin/mdm/enums/MdmNoticeTypeEnum.js +2 -0
  24. package/bin/messageMoments/constants/MessageMomentCatalog.d.ts +18 -0
  25. package/bin/messageMoments/constants/MessageMomentCatalog.js +69 -0
  26. package/bin/messageMoments/constants/MessageMomentVariables.d.ts +11 -0
  27. package/bin/messageMoments/constants/MessageMomentVariables.js +40 -0
  28. package/bin/messageMoments/constants/TemplatePlaceholder.d.ts +3 -0
  29. package/bin/messageMoments/constants/TemplatePlaceholder.js +6 -0
  30. package/bin/messageMoments/enums/MessageMomentBlockEnum.d.ts +11 -0
  31. package/bin/messageMoments/enums/MessageMomentBlockEnum.js +15 -0
  32. package/bin/messageMoments/enums/MessageMomentEnum.d.ts +42 -0
  33. package/bin/messageMoments/enums/MessageMomentEnum.js +46 -0
  34. package/bin/messageMoments/index.d.ts +5 -0
  35. package/bin/messageMoments/index.js +21 -0
  36. package/bin/messagesConnector/dtos/SendMessageRequest.d.ts +1 -0
  37. package/bin/messagesConnector/dtos/SendMessageRequest.js +7 -0
  38. package/bin/messagesConnector/dtos/TemplateMessageCreateRequest.d.ts +2 -0
  39. package/bin/messagesConnector/dtos/TemplateMessageCreateRequest.js +6 -0
  40. package/bin/messagesConnector/dtos/TemplateMessageUpdateRequest.d.ts +2 -0
  41. package/bin/messagesConnector/dtos/TemplateMessageUpdateRequest.js +6 -0
  42. package/bin/notificationMessages/constants/MomentTemplateLimits.d.ts +4 -0
  43. package/bin/notificationMessages/constants/MomentTemplateLimits.js +7 -0
  44. package/bin/notificationMessages/dtos/MomentTemplateListResponse.d.ts +5 -0
  45. package/bin/notificationMessages/dtos/MomentTemplateListResponse.js +23 -0
  46. package/bin/notificationMessages/dtos/MomentTemplateResponse.d.ts +15 -0
  47. package/bin/notificationMessages/dtos/MomentTemplateResponse.js +54 -0
  48. package/bin/notificationMessages/dtos/MomentTemplateUpsertRequest.d.ts +6 -0
  49. package/bin/notificationMessages/dtos/MomentTemplateUpsertRequest.js +39 -0
  50. package/bin/notificationMessages/dtos/NotificationQueueMessageRequest.d.ts +2 -0
  51. package/bin/notificationMessages/enums/NotificationTemplateOriginEnum.d.ts +4 -0
  52. package/bin/notificationMessages/enums/NotificationTemplateOriginEnum.js +8 -0
  53. package/bin/notificationMessages/index.d.ts +5 -0
  54. package/bin/notificationMessages/index.js +5 -0
  55. package/bin/retailWizard/dtos/responses/BackofficeStoreDetailResponse.d.ts +3 -1
  56. package/bin/retailWizard/enums/StoreMixCategoryEnum.d.ts +9 -0
  57. package/bin/retailWizard/enums/StoreMixCategoryEnum.js +13 -0
  58. package/bin/retailWizard/index.d.ts +1 -0
  59. package/bin/retailWizard/index.js +1 -0
  60. package/bin/rewardsEligibility/dtos/backoffice/FailedConditionEvaluationResponse.d.ts +6 -0
  61. package/bin/rewardsEligibility/dtos/backoffice/FailedConditionEvaluationResponse.js +7 -0
  62. package/bin/rewardsEligibility/dtos/backoffice/FailedConditionStatResponse.d.ts +3 -0
  63. package/bin/rewardsEligibility/index.d.ts +1 -0
  64. package/bin/rewardsEligibility/index.js +1 -0
  65. package/package.json +1 -1
  66. package/src/index.ts +1 -0
  67. package/src/loanCredit/constants/RegulatoryCampaign.ts +10 -0
  68. package/src/loanCredit/dtos/requests/BackofficeSendRegulatoryNoticeRequest.ts +24 -0
  69. package/src/loanCredit/dtos/responses/RegulatoryNoticeCampaignPage.ts +13 -0
  70. package/src/loanCredit/index.ts +3 -0
  71. package/src/mdm/dtos/DeviceEnrollRequest.ts +7 -1
  72. package/src/mdm/enums/MdmNoticeTypeEnum.ts +2 -0
  73. package/src/messageMoments/constants/MessageMomentCatalog.ts +91 -0
  74. package/src/messageMoments/constants/MessageMomentVariables.ts +42 -0
  75. package/src/messageMoments/constants/TemplatePlaceholder.ts +3 -0
  76. package/src/messageMoments/enums/MessageMomentBlockEnum.ts +11 -0
  77. package/src/messageMoments/enums/MessageMomentEnum.ts +50 -0
  78. package/src/messageMoments/index.ts +5 -0
  79. package/src/messagesConnector/dtos/SendMessageRequest.ts +2 -0
  80. package/src/messagesConnector/dtos/TemplateMessageCreateRequest.ts +6 -0
  81. package/src/messagesConnector/dtos/TemplateMessageUpdateRequest.ts +6 -0
  82. package/src/notificationMessages/constants/MomentTemplateLimits.ts +5 -0
  83. package/src/notificationMessages/dtos/MomentTemplateListResponse.ts +9 -0
  84. package/src/notificationMessages/dtos/MomentTemplateResponse.ts +34 -0
  85. package/src/notificationMessages/dtos/MomentTemplateUpsertRequest.ts +24 -0
  86. package/src/notificationMessages/dtos/NotificationQueueMessageRequest.ts +3 -1
  87. package/src/notificationMessages/enums/NotificationTemplateOriginEnum.ts +4 -0
  88. package/src/notificationMessages/index.ts +6 -2
  89. package/src/retailWizard/dtos/responses/BackofficeStoreDetailResponse.ts +3 -1
  90. package/src/retailWizard/enums/StoreMixCategoryEnum.ts +9 -0
  91. package/src/retailWizard/index.ts +1 -0
  92. package/src/rewardsEligibility/dtos/backoffice/FailedConditionEvaluationResponse.ts +6 -0
  93. package/src/rewardsEligibility/dtos/backoffice/FailedConditionStatResponse.ts +4 -0
  94. package/src/rewardsEligibility/index.ts +1 -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
+ });
@@ -62,6 +62,28 @@ describe('DeviceEnrollRequest.lockMode', () => {
62
62
  });
63
63
  });
64
64
 
65
+ describe('DeviceEnrollRequest.firstLockAt', () => {
66
+ it('valida sin firstLockAt: el consumidor de hoy no se rompe', async () => {
67
+ const dto = plainToInstance(DeviceEnrollRequest, validEnroll);
68
+ const errors = await validate(dto);
69
+ expect(errors).toEqual([]);
70
+ expect(dto.firstLockAt).toBeUndefined();
71
+ });
72
+
73
+ it('valida con firstLockAt en ISO-8601', async () => {
74
+ const dto = plainToInstance(DeviceEnrollRequest, { ...validEnroll, firstLockAt: '2026-11-08T06:00:00.000Z' });
75
+ const errors = await validate(dto);
76
+ expect(errors).toEqual([]);
77
+ expect(dto.firstLockAt).toBe('2026-11-08T06:00:00.000Z');
78
+ });
79
+
80
+ it('falla si firstLockAt no es ISO-8601', async () => {
81
+ const dto = plainToInstance(DeviceEnrollRequest, { ...validEnroll, firstLockAt: '08/11/2026' });
82
+ const errors = await validate(dto);
83
+ expect(hasConstraint(errors, 'firstLockAt', 'isIso8601')).toBe(true);
84
+ });
85
+ });
86
+
65
87
  describe('DeviceUnlockRequest.unlockUntil', () => {
66
88
  it('valida sin unlockUntil: el consumidor de hoy no se rompe', async () => {
67
89
  const dto = plainToInstance(DeviceUnlockRequest, validUnlock);
@@ -170,8 +192,9 @@ describe('DeviceNotifyRequest — topes de longitud de los tres textos', () => {
170
192
  });
171
193
 
172
194
  describe('MdmNoticeTypeEnum', () => {
173
- it('expone los diez avisos del catálogo de cobranza', () => {
195
+ it('expone los once avisos del catálogo de cobranza', () => {
174
196
  expect(Object.values(MdmNoticeTypeEnum)).toEqual([
197
+ 'PRE_DUE_3_DAYS',
175
198
  'PRE_DUE_2_DAYS',
176
199
  'PRE_DUE_1_DAY',
177
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,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
+ });
@@ -1,5 +1,5 @@
1
1
  import { MetricsDimensionEnum } from '../../../src/rewardsEligibility/enums/MetricsDimensionEnum';
2
- import type { FailedConditionStatResponse } from '../../../src/rewardsEligibility/dtos/backoffice/FailedConditionStatResponse';
2
+ import type { FailedConditionEvaluationResponse, FailedConditionStatResponse } from '../../../src/rewardsEligibility';
3
3
  import type { MetricsPointResponse } from '../../../src/rewardsEligibility/dtos/backoffice/MetricsPointResponse';
4
4
  import type { MetricsQuery } from '../../../src/rewardsEligibility/dtos/backoffice/MetricsQuery';
5
5
 
@@ -9,9 +9,15 @@ describe('DTOs de métricas (forma)', () => {
9
9
  expect(Object.keys(point)).toHaveLength(10);
10
10
  });
11
11
  it('ranking y query', () => {
12
- const stat: FailedConditionStatResponse = { key: 'directory.accountAgeDays', label: 'Antigüedad de la cuenta', count: 7 };
12
+ const stat: FailedConditionStatResponse = { key: 'directory.accountAgeDays', label: 'Antigüedad de la cuenta', count: 7, evaluations: [] };
13
13
  const query: MetricsQuery = { dimension: MetricsDimensionEnum.CAMPAIGN, value: 'referidos-q4', from: '2026-10-01', to: '2026-10-08' };
14
14
  expect(stat.count).toBe(7);
15
15
  expect(query.dimension).toBe('CAMPAIGN');
16
16
  });
17
+
18
+ it('FailedConditionStatResponse trae evaluations ordenables por count (D-E1)', () => {
19
+ const evaluation: FailedConditionEvaluationResponse = { evaluationId: 'ev-1', evaluationName: 'Referidos', count: 7 };
20
+ const stat: FailedConditionStatResponse = { key: 'payments.amount', label: 'Monto', count: 9, evaluations: [evaluation] };
21
+ expect(stat.evaluations[0]).toEqual({ evaluationId: 'ev-1', evaluationName: 'Referidos', count: 7 });
22
+ });
17
23
  });
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.IssuanceBusiness = 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.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.RetailPromotions = 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 = 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 = 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
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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';
@@ -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);
@@ -8,5 +8,7 @@ export declare class DeviceEnrollRequest {
8
8
  termMonths: number;
9
9
  /** Cuándo se dispara el bloqueo del equipo; si se omite es ONDEMAND, que es el modo de hoy. */
10
10
  lockMode?: MdmLockModeEnum;
11
+ /** ISO-8601 del primer bloqueo programado (primer vencimiento); lo usan proveedores que agendan el bloqueo al enrolar. */
12
+ firstLockAt?: string;
11
13
  operationReference: string;
12
14
  }
@@ -58,6 +58,12 @@ __decorate([
58
58
  (0, class_validator_1.IsOptional)(),
59
59
  __metadata("design:type", String)
60
60
  ], DeviceEnrollRequest.prototype, "lockMode", void 0);
61
+ __decorate([
62
+ (0, class_transformer_1.Expose)(),
63
+ (0, class_validator_1.IsISO8601)(),
64
+ (0, class_validator_1.IsOptional)(),
65
+ __metadata("design:type", String)
66
+ ], DeviceEnrollRequest.prototype, "firstLockAt", void 0);
61
67
  __decorate([
62
68
  (0, class_transformer_1.Expose)(),
63
69
  (0, class_validator_1.IsString)(),
@@ -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>;