@fiado/type-kit 3.528.0 → 3.530.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 (162) hide show
  1. package/_test_/unit/emailVerification/dtos/EmailSetTrustedRequest.test.ts +16 -0
  2. package/_test_/unit/retailWizard/emailOtpRequests.test.ts +53 -0
  3. package/_test_/unit/retailWizard/wizardSessionEmail.test.ts +22 -0
  4. package/_test_/unit/rewardsEligibility/backofficeBarrel.test.ts +6 -0
  5. package/_test_/unit/rewardsEligibility/runDtos.test.ts +2 -2
  6. package/_test_/unit/rewardsEligibility/segmentBackofficeDtos.test.ts +29 -0
  7. package/_test_/unit/rewardsEligibility/segmentDefinitionDto.test.ts +46 -0
  8. package/_test_/unit/rewardsEligibility/segmentEnums.test.ts +43 -0
  9. package/_test_/unit/rewardsEligibility/segmentMessagesAndRunDtos.test.ts +52 -0
  10. package/bin/emailVerification/dtos/EmailSetTrustedRequest.d.ts +2 -0
  11. package/bin/emailVerification/dtos/EmailSetTrustedRequest.js +6 -0
  12. package/bin/retailWizard/dtos/WizardSession.d.ts +10 -0
  13. package/bin/retailWizard/dtos/requests/SendEmailOtpRequest.d.ts +6 -0
  14. package/bin/retailWizard/dtos/requests/SendEmailOtpRequest.js +29 -0
  15. package/bin/retailWizard/dtos/requests/VerifyEmailOtpRequest.d.ts +4 -0
  16. package/bin/retailWizard/dtos/requests/VerifyEmailOtpRequest.js +24 -0
  17. package/bin/retailWizard/enums/EmailStateEnum.d.ts +9 -0
  18. package/bin/retailWizard/enums/EmailStateEnum.js +13 -0
  19. package/bin/retailWizard/index.d.ts +3 -0
  20. package/bin/retailWizard/index.js +3 -0
  21. package/bin/rewardsEligibility/constants/BackofficeLimits.d.ts +2 -0
  22. package/bin/rewardsEligibility/constants/BackofficeLimits.js +3 -1
  23. package/bin/rewardsEligibility/constants/SegmentLimits.d.ts +5 -0
  24. package/bin/rewardsEligibility/constants/SegmentLimits.js +8 -0
  25. package/bin/rewardsEligibility/dtos/backoffice/CreateRunRequest.js +4 -2
  26. package/bin/rewardsEligibility/dtos/backoffice/EvaluationRequest.d.ts +4 -0
  27. package/bin/rewardsEligibility/dtos/backoffice/EvaluationRequest.js +14 -0
  28. package/bin/rewardsEligibility/dtos/backoffice/EvaluationResponse.d.ts +2 -0
  29. package/bin/rewardsEligibility/dtos/backoffice/PopulationRunRequest.d.ts +1 -3
  30. package/bin/rewardsEligibility/dtos/backoffice/PopulationRunRequest.js +1 -18
  31. package/bin/rewardsEligibility/dtos/backoffice/RunPopulationProgress.d.ts +9 -0
  32. package/bin/rewardsEligibility/dtos/backoffice/RunPopulationProgress.js +7 -0
  33. package/bin/rewardsEligibility/dtos/backoffice/RunResponse.d.ts +19 -0
  34. package/bin/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.d.ts +8 -0
  35. package/bin/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.js +40 -0
  36. package/bin/rewardsEligibility/dtos/backoffice/segments/PrivateSegmentResponse.d.ts +11 -0
  37. package/bin/rewardsEligibility/dtos/backoffice/segments/PrivateSegmentResponse.js +7 -0
  38. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.d.ts +18 -0
  39. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.js +71 -0
  40. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.d.ts +11 -0
  41. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.js +46 -0
  42. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentExecutionPageResponse.d.ts +8 -0
  43. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentExecutionPageResponse.js +6 -0
  44. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentExecutionRequest.d.ts +6 -0
  45. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentExecutionRequest.js +31 -0
  46. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentExecutionResponse.d.ts +7 -0
  47. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentExecutionResponse.js +6 -0
  48. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.d.ts +9 -0
  49. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.js +44 -0
  50. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentLastTest.d.ts +8 -0
  51. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentLastTest.js +6 -0
  52. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentListResponse.d.ts +9 -0
  53. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentListResponse.js +10 -0
  54. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentParam.d.ts +10 -0
  55. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentParam.js +7 -0
  56. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSaveRequest.d.ts +13 -0
  57. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSaveRequest.js +58 -0
  58. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.d.ts +10 -0
  59. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.js +10 -0
  60. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentStatusRequest.d.ts +6 -0
  61. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentStatusRequest.js +31 -0
  62. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.d.ts +12 -0
  63. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.js +9 -0
  64. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTestRequest.d.ts +4 -0
  65. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTestRequest.js +25 -0
  66. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTestResponse.d.ts +26 -0
  67. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTestResponse.js +12 -0
  68. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedByResponse.d.ts +21 -0
  69. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedByResponse.js +12 -0
  70. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.d.ts +5 -0
  71. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.js +6 -0
  72. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentVersionListResponse.d.ts +4 -0
  73. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentVersionListResponse.js +6 -0
  74. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentVersionResponse.d.ts +24 -0
  75. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentVersionResponse.js +6 -0
  76. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentVersionSummaryResponse.d.ts +12 -0
  77. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentVersionSummaryResponse.js +7 -0
  78. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.d.ts +5 -0
  79. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.js +31 -0
  80. package/bin/rewardsEligibility/dtos/messages/EvaluateBatchMessage.d.ts +14 -0
  81. package/bin/rewardsEligibility/dtos/messages/EvaluateBatchMessage.js +61 -0
  82. package/bin/rewardsEligibility/dtos/messages/GrantBatchMessage.d.ts +8 -0
  83. package/bin/rewardsEligibility/dtos/messages/GrantBatchMessage.js +42 -0
  84. package/bin/rewardsEligibility/dtos/messages/PopulationPageMessage.d.ts +6 -0
  85. package/bin/rewardsEligibility/dtos/messages/PopulationPageMessage.js +30 -0
  86. package/bin/rewardsEligibility/dtos/messages/ReleaseTrancheMessage.d.ts +6 -0
  87. package/bin/rewardsEligibility/dtos/messages/ReleaseTrancheMessage.js +30 -0
  88. package/bin/rewardsEligibility/enums/EligibilityMessageTypeEnum.d.ts +6 -0
  89. package/bin/rewardsEligibility/enums/EligibilityMessageTypeEnum.js +11 -0
  90. package/bin/rewardsEligibility/enums/SegmentAggregateFnEnum.d.ts +5 -0
  91. package/bin/rewardsEligibility/enums/SegmentAggregateFnEnum.js +9 -0
  92. package/bin/rewardsEligibility/enums/SegmentConditionKindEnum.d.ts +4 -0
  93. package/bin/rewardsEligibility/enums/SegmentConditionKindEnum.js +8 -0
  94. package/bin/rewardsEligibility/enums/SegmentErrorCodeEnum.d.ts +16 -0
  95. package/bin/rewardsEligibility/enums/SegmentErrorCodeEnum.js +20 -0
  96. package/bin/rewardsEligibility/enums/SegmentMatchEnum.d.ts +4 -0
  97. package/bin/rewardsEligibility/enums/SegmentMatchEnum.js +8 -0
  98. package/bin/rewardsEligibility/enums/SegmentOperatorEnum.d.ts +16 -0
  99. package/bin/rewardsEligibility/enums/SegmentOperatorEnum.js +20 -0
  100. package/bin/rewardsEligibility/enums/SegmentParamSourceEnum.d.ts +5 -0
  101. package/bin/rewardsEligibility/enums/SegmentParamSourceEnum.js +9 -0
  102. package/bin/rewardsEligibility/enums/SegmentParamTypeEnum.d.ts +7 -0
  103. package/bin/rewardsEligibility/enums/SegmentParamTypeEnum.js +11 -0
  104. package/bin/rewardsEligibility/enums/SegmentStatusEnum.d.ts +5 -0
  105. package/bin/rewardsEligibility/enums/SegmentStatusEnum.js +9 -0
  106. package/bin/rewardsEligibility/enums/SegmentTestStatusEnum.d.ts +5 -0
  107. package/bin/rewardsEligibility/enums/SegmentTestStatusEnum.js +9 -0
  108. package/bin/rewardsEligibility/index.d.ts +39 -0
  109. package/bin/rewardsEligibility/index.js +43 -0
  110. package/package.json +1 -1
  111. package/src/emailVerification/dtos/EmailSetTrustedRequest.ts +7 -1
  112. package/src/retailWizard/dtos/WizardSession.ts +10 -0
  113. package/src/retailWizard/dtos/requests/SendEmailOtpRequest.ts +14 -0
  114. package/src/retailWizard/dtos/requests/VerifyEmailOtpRequest.ts +10 -0
  115. package/src/retailWizard/enums/EmailStateEnum.ts +9 -0
  116. package/src/retailWizard/index.ts +3 -0
  117. package/src/rewardsEligibility/constants/BackofficeLimits.ts +2 -0
  118. package/src/rewardsEligibility/constants/SegmentLimits.ts +5 -0
  119. package/src/rewardsEligibility/dtos/backoffice/CreateRunRequest.ts +3 -2
  120. package/src/rewardsEligibility/dtos/backoffice/EvaluationRequest.ts +16 -2
  121. package/src/rewardsEligibility/dtos/backoffice/EvaluationResponse.ts +2 -0
  122. package/src/rewardsEligibility/dtos/backoffice/PopulationRunRequest.ts +2 -11
  123. package/src/rewardsEligibility/dtos/backoffice/RunPopulationProgress.ts +9 -0
  124. package/src/rewardsEligibility/dtos/backoffice/RunResponse.ts +12 -0
  125. package/src/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.ts +12 -0
  126. package/src/rewardsEligibility/dtos/backoffice/segments/PrivateSegmentResponse.ts +12 -0
  127. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.ts +22 -0
  128. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.ts +15 -0
  129. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentExecutionPageResponse.ts +8 -0
  130. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentExecutionRequest.ts +17 -0
  131. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentExecutionResponse.ts +7 -0
  132. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.ts +27 -0
  133. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentLastTest.ts +8 -0
  134. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentListResponse.ts +11 -0
  135. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentParam.ts +11 -0
  136. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentSaveRequest.ts +16 -0
  137. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.ts +11 -0
  138. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentStatusRequest.ts +9 -0
  139. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.ts +14 -0
  140. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentTestRequest.ts +7 -0
  141. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentTestResponse.ts +29 -0
  142. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentUsedByResponse.ts +24 -0
  143. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.ts +5 -0
  144. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentVersionListResponse.ts +5 -0
  145. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentVersionResponse.ts +25 -0
  146. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentVersionSummaryResponse.ts +13 -0
  147. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.ts +9 -0
  148. package/src/rewardsEligibility/dtos/messages/EvaluateBatchMessage.ts +42 -0
  149. package/src/rewardsEligibility/dtos/messages/GrantBatchMessage.ts +25 -0
  150. package/src/rewardsEligibility/dtos/messages/PopulationPageMessage.ts +15 -0
  151. package/src/rewardsEligibility/dtos/messages/ReleaseTrancheMessage.ts +15 -0
  152. package/src/rewardsEligibility/enums/EligibilityMessageTypeEnum.ts +7 -0
  153. package/src/rewardsEligibility/enums/SegmentAggregateFnEnum.ts +5 -0
  154. package/src/rewardsEligibility/enums/SegmentConditionKindEnum.ts +4 -0
  155. package/src/rewardsEligibility/enums/SegmentErrorCodeEnum.ts +16 -0
  156. package/src/rewardsEligibility/enums/SegmentMatchEnum.ts +4 -0
  157. package/src/rewardsEligibility/enums/SegmentOperatorEnum.ts +16 -0
  158. package/src/rewardsEligibility/enums/SegmentParamSourceEnum.ts +5 -0
  159. package/src/rewardsEligibility/enums/SegmentParamTypeEnum.ts +7 -0
  160. package/src/rewardsEligibility/enums/SegmentStatusEnum.ts +5 -0
  161. package/src/rewardsEligibility/enums/SegmentTestStatusEnum.ts +5 -0
  162. package/src/rewardsEligibility/index.ts +47 -0
@@ -50,4 +50,20 @@ describe('EmailSetTrustedRequest', () => {
50
50
  const errors = await validate(dto);
51
51
  expect(errors.some(e => e.property === 'type')).toBe(true);
52
52
  });
53
+
54
+ it('acepta isPrincipal en true', async () => {
55
+ const dto = plainToInstance(EmailSetTrustedRequest, { ...valid, isPrincipal: true });
56
+ const errors = await validate(dto);
57
+ expect(errors).toEqual([]);
58
+ expect(dto.isPrincipal).toBe(true);
59
+ });
60
+
61
+ it('falla si isPrincipal no es booleano', async () => {
62
+ const dto = plainToInstance(EmailSetTrustedRequest, {
63
+ ...valid,
64
+ isPrincipal: 'si' as unknown as boolean,
65
+ });
66
+ const errors = await validate(dto);
67
+ expect(errors.some(e => e.property === 'isPrincipal')).toBe(true);
68
+ });
53
69
  });
@@ -0,0 +1,53 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validateSync } from 'class-validator';
4
+ import { SendEmailOtpRequest } from '../../../src/retailWizard/dtos/requests/SendEmailOtpRequest';
5
+ import { VerifyEmailOtpRequest } from '../../../src/retailWizard/dtos/requests/VerifyEmailOtpRequest';
6
+ import { EmailStateEnum } from '../../../src/retailWizard/enums/EmailStateEnum';
7
+ import { EmailTypeEnum } from '../../../src/emailVerification/enums/EmailTypeEnum';
8
+ import * as RetailWizard from '../../../src/retailWizard';
9
+
10
+ function errorsOf<T extends object>(cls: new () => T, payload: Record<string, unknown>): string[] {
11
+ const dto = plainToInstance(cls, payload, { excludeExtraneousValues: true });
12
+ return validateSync(dto).map((e) => e.property);
13
+ }
14
+
15
+ describe('SendEmailOtpRequest', () => {
16
+ it('acepta correo y tipo válidos', () => {
17
+ expect(errorsOf(SendEmailOtpRequest, { email: 'cliente@correo.com', type: EmailTypeEnum.PERSONAL })).toEqual([]);
18
+ });
19
+
20
+ it('rechaza un correo mal formado', () => {
21
+ expect(errorsOf(SendEmailOtpRequest, { email: 'no-es-correo', type: EmailTypeEnum.PERSONAL })).toContain('email');
22
+ });
23
+
24
+ it('rechaza un tipo fuera del enum', () => {
25
+ expect(errorsOf(SendEmailOtpRequest, { email: 'cliente@correo.com', type: 'WORK' })).toContain('type');
26
+ });
27
+
28
+ it('exige el tipo', () => {
29
+ expect(errorsOf(SendEmailOtpRequest, { email: 'cliente@correo.com' })).toContain('type');
30
+ });
31
+ });
32
+
33
+ describe('VerifyEmailOtpRequest', () => {
34
+ it('acepta un código de 4 dígitos', () => {
35
+ expect(errorsOf(VerifyEmailOtpRequest, { code: '1234' })).toEqual([]);
36
+ });
37
+
38
+ it('rechaza un código vacío', () => {
39
+ expect(errorsOf(VerifyEmailOtpRequest, { code: '' })).toContain('code');
40
+ });
41
+ });
42
+
43
+ describe('EmailStateEnum', () => {
44
+ it('tiene los tres estados del correo de la sesión', () => {
45
+ expect(Object.values(EmailStateEnum)).toEqual(['EXISTING', 'CAPTURED', 'PENDING']);
46
+ });
47
+
48
+ it('se exporta desde el índice de retailWizard junto con los requests', () => {
49
+ expect(RetailWizard.EmailStateEnum).toBe(EmailStateEnum);
50
+ expect(RetailWizard.SendEmailOtpRequest).toBe(SendEmailOtpRequest);
51
+ expect(RetailWizard.VerifyEmailOtpRequest).toBe(VerifyEmailOtpRequest);
52
+ });
53
+ });
@@ -0,0 +1,22 @@
1
+ import type { WizardSession } from '../../../src/retailWizard/dtos/WizardSession';
2
+ import { EmailStateEnum } from '../../../src/retailWizard/enums/EmailStateEnum';
3
+ import { EmailTypeEnum } from '../../../src/emailVerification/enums/EmailTypeEnum';
4
+
5
+ type SessionEmail = Pick<WizardSession, 'emailState' | 'emailType' | 'emailMasked' | 'email'>;
6
+
7
+ describe('WizardSession — correo del paso 01', () => {
8
+ it('declara los cuatro campos del correo', () => {
9
+ const captured: SessionEmail = {
10
+ emailState: EmailStateEnum.CAPTURED,
11
+ emailType: EmailTypeEnum.PERSONAL,
12
+ emailMasked: 'ju•••••@gmail.com',
13
+ email: 'juan@gmail.com',
14
+ };
15
+ expect(captured.emailState).toBe('CAPTURED');
16
+ });
17
+
18
+ it('los cuatro son opcionales: una sesión vieja no los trae', () => {
19
+ const legacy: SessionEmail = {};
20
+ expect(legacy).toEqual({});
21
+ });
22
+ });
@@ -11,6 +11,12 @@ describe('barrel rewardsEligibility incluye el backoffice', () => {
11
11
  'RunResultResponse', 'RunResultListResponse', 'CreateRunResponse', 'MetricsPointResponse', 'FailedConditionStatResponse', 'MetricsQuery',
12
12
  'MetricsDimensionEnum', 'RuleValueTypeEnum', 'ELIGIBILITY_ID_PATTERN', 'EVENT_KEY_PATTERN', 'REQUEST_ID_PATTERN', 'MAX_QUOTAS_PER_CAMPAIGN',
13
13
  'RulesChatRoleEnum', 'RulesChatTurn', 'GenerateRulesRequest', 'GenerateRulesResponse', 'RULES_CHAT_TURN_MAX_LENGTH', 'RULES_CHAT_MAX_TURNS_HARD',
14
+ 'SegmentParam', 'SegmentUsedColumn', 'SegmentLastTest', 'SegmentTestRequest', 'SegmentTestResponse', 'SegmentTestResultResponse',
15
+ 'SegmentTestErrorResponse', 'SegmentSaveRequest', 'SegmentStatusRequest', 'SegmentVersionResponse', 'SegmentVersionSummaryResponse',
16
+ 'SegmentListItemResponse', 'SegmentListResponse', 'SegmentVersionListResponse', 'SegmentSchemaResponse', 'SegmentSchemaTableResponse',
17
+ 'SegmentTableSchemaResponse', 'SegmentColumnSchemaResponse', 'SegmentUsedByResponse', 'SegmentUsedByEvaluation', 'SegmentUsedByRun',
18
+ 'PopulationPageMessage', 'EvaluateBatchMessage', 'EvaluateBatchSubject', 'GrantBatchMessage', 'ReleaseTrancheMessage', 'PrivateSegmentResponse',
19
+ 'SegmentExecutionRequest', 'SegmentExecutionResponse', 'SegmentExecutionPageResponse', 'RunPopulationProgress', 'INPUT_KEY_PATTERN',
14
20
  ])('exporta %s', (name) => {
15
21
  expect((kit as Record<string, object | string | number | RegExp>)[name]).toBeDefined();
16
22
  });
@@ -12,10 +12,10 @@ describe('CreateRunRequest', () => {
12
12
  expect(await validate(request)).toEqual([]);
13
13
  expect(request.inputs).toEqual({ buyerDirectoryId: 'd-1' });
14
14
  });
15
- it('población: params anidados se conservan', async () => {
15
+ it('población: sin params (usa el segmento de la evaluación); params enviados se descartan', async () => {
16
16
  const request = parse(CreateRunRequest, { requestId: 'req-12345678', mode: 'SIMULATION', population: { params: { window: '7d' } } });
17
17
  expect(await validate(request)).toEqual([]);
18
- expect(request.population?.params).toEqual({ window: '7d' });
18
+ expect(request.population && 'params' in request.population).toBe(false);
19
19
  });
20
20
  it.each([
21
21
  ['requestId corto', { requestId: 'a', mode: 'LIVE', inputs: {} }],
@@ -0,0 +1,29 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { SegmentSaveRequest, SegmentStatusRequest, SegmentTestRequest } from '../../../src/rewardsEligibility';
5
+
6
+ const def = { baseTable: 'remittanceusers', match: 'ALL', groups: [{ match: 'ALL', conditions: [{ kind: 'COLUMN', table: 'remittanceusers', column: 'status', op: 'EQUALS', value: 'ACTIVE' }] }] };
7
+ const ok = async <T extends object>(cls: new () => T, plain: object) => (await validate(plainToInstance(cls, plain, { excludeExtraneousValues: true }))).length === 0;
8
+
9
+ describe('DTOs de segmentos del backoffice', () => {
10
+ it('SegmentTestRequest exige definition valida', async () => {
11
+ expect(await ok(SegmentTestRequest, { definition: def })).toBe(true);
12
+ expect(await ok(SegmentTestRequest, {})).toBe(false);
13
+ expect(await ok(SegmentTestRequest, { definition: { ...def, baseTable: 'X' } })).toBe(false);
14
+ });
15
+ it('SegmentSaveRequest: name, owner, testId y status DRAFT|ACTIVE (nunca ARCHIVED al guardar)', async () => {
16
+ const base = { name: 'Promotores', description: '', owner: 'growth', definition: def, testId: 't-1', status: 'ACTIVE' };
17
+ expect(await ok(SegmentSaveRequest, base)).toBe(true);
18
+ expect(await ok(SegmentSaveRequest, { ...base, status: 'ARCHIVED' })).toBe(false);
19
+ expect(await ok(SegmentSaveRequest, { ...base, name: '' })).toBe(false);
20
+ expect(await ok(SegmentSaveRequest, { ...base, testId: undefined })).toBe(false);
21
+ expect(await ok(SegmentSaveRequest, { ...base, testId: '#TEST#x' })).toBe(false);
22
+ });
23
+ it('SegmentStatusRequest: version opcional entera >= 1; status del enum', async () => {
24
+ expect(await ok(SegmentStatusRequest, { status: 'ARCHIVED' })).toBe(true);
25
+ expect(await ok(SegmentStatusRequest, { status: 'ACTIVE', version: 2 })).toBe(true);
26
+ expect(await ok(SegmentStatusRequest, { status: 'ACTIVE', version: 0 })).toBe(false);
27
+ expect(await ok(SegmentStatusRequest, { status: 'PAUSED' })).toBe(false);
28
+ });
29
+ });
@@ -0,0 +1,46 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { PopulationSegmentDefinition, SegmentAggregateCondition, SegmentColumnCondition } from '../../../src/rewardsEligibility';
5
+
6
+ interface PlainCondition {
7
+ kind: string;
8
+ [key: string]: string | number | object;
9
+ }
10
+
11
+ const valid = {
12
+ baseTable: 'remittanceusers', match: 'ALL',
13
+ groups: [{ match: 'ALL', conditions: [
14
+ { kind: 'COLUMN', table: 'remittanceusers', column: 'status', op: 'EQUALS', value: 'ACTIVE' },
15
+ { kind: 'AGGREGATE', table: 'remittancetransactions', fn: 'SUM', column: 'amountusd', op: 'GT', value: 100,
16
+ window: { dateColumn: 'createdat', days: 30 }, filters: [{ kind: 'COLUMN', table: 'remittancetransactions', column: 'status', op: 'EQUALS', value: 'PAYABLE' }] },
17
+ ] }],
18
+ };
19
+ const aggregate: PlainCondition = valid.groups[0].conditions[1];
20
+ const errorsOf = async (plain: object): Promise<number> =>
21
+ (await validate(plainToInstance(PopulationSegmentDefinition, plain, { excludeExtraneousValues: true }))).length;
22
+
23
+ describe('PopulationSegmentDefinition', () => {
24
+ it('acepta el ejemplo combinado de A§4.6 y deserializa cada condicion a su clase', async () => {
25
+ const def = plainToInstance(PopulationSegmentDefinition, valid, { excludeExtraneousValues: true });
26
+ expect(await validate(def)).toEqual([]);
27
+ expect(def.groups[0].conditions[0]).toBeInstanceOf(SegmentColumnCondition);
28
+ expect(def.groups[0].conditions[1]).toBeInstanceOf(SegmentAggregateCondition);
29
+ });
30
+ it.each([
31
+ ['tabla con mayusculas', { ...valid, baseTable: 'Users' }],
32
+ ['tabla con comilla', { ...valid, baseTable: 'a"b' }],
33
+ ['sin grupos', { ...valid, groups: [] }],
34
+ ['match invalido', { ...valid, match: 'XOR' }],
35
+ ['days 0', { ...valid, groups: [{ match: 'ALL', conditions: [{ ...aggregate, window: { dateColumn: 'createdat', days: 0 } }] }] }],
36
+ ['days 366', { ...valid, groups: [{ match: 'ALL', conditions: [{ ...aggregate, window: { dateColumn: 'createdat', days: 366 } }] }] }],
37
+ ['operador desconocido', { ...valid, groups: [{ match: 'ALL', conditions: [{ kind: 'COLUMN', table: 't', column: 'c', op: 'LIKE', value: 'x' }] }] }],
38
+ ['kind desconocido', { ...valid, groups: [{ match: 'ALL', conditions: [{ kind: 'RAW', sql: 'select 1' }] }] }],
39
+ ])('rechaza: %s', async (_name, plain) => {
40
+ expect(await errorsOf(plain)).toBeGreaterThan(0);
41
+ });
42
+ it('descarta propiedades extra (nadie cuela un campo "sql")', () => {
43
+ const def = plainToInstance(PopulationSegmentDefinition, { ...valid, sql: 'DROP TABLE x' }, { excludeExtraneousValues: true });
44
+ expect(Object.keys(def)).not.toContain('sql');
45
+ });
46
+ });
@@ -0,0 +1,43 @@
1
+ import 'reflect-metadata';
2
+ import * as kit from '../../../src/rewardsEligibility';
3
+
4
+ const identity = (e: Record<string, string>) => Object.entries(e).every(([k, v]) => k === v);
5
+
6
+ describe('enums de segmentos', () => {
7
+ it('cada enum es identidad clave=valor (se persisten y viajan como string)', () => {
8
+ const enums: Record<string, Record<string, string>> = {
9
+ SegmentStatusEnum: kit.SegmentStatusEnum,
10
+ SegmentTestStatusEnum: kit.SegmentTestStatusEnum,
11
+ SegmentMatchEnum: kit.SegmentMatchEnum,
12
+ SegmentConditionKindEnum: kit.SegmentConditionKindEnum,
13
+ SegmentAggregateFnEnum: kit.SegmentAggregateFnEnum,
14
+ SegmentOperatorEnum: kit.SegmentOperatorEnum,
15
+ SegmentParamTypeEnum: kit.SegmentParamTypeEnum,
16
+ SegmentParamSourceEnum: kit.SegmentParamSourceEnum,
17
+ SegmentErrorCodeEnum: kit.SegmentErrorCodeEnum,
18
+ EligibilityMessageTypeEnum: kit.EligibilityMessageTypeEnum,
19
+ };
20
+ for (const e of Object.values(enums)) {
21
+ expect(e).toBeDefined();
22
+ expect(identity(e)).toBe(true);
23
+ }
24
+ });
25
+ it('valores exactos de la adenda (A§3.1, A§4.1, A§4.4, A§7)', () => {
26
+ expect(Object.values(kit.SegmentStatusEnum)).toEqual(['DRAFT', 'ACTIVE', 'ARCHIVED']);
27
+ expect(Object.values(kit.SegmentTestStatusEnum)).toEqual(['RUNNING', 'PASSED', 'FAILED']);
28
+ expect(Object.values(kit.SegmentParamSourceEnum)).toEqual(['LITERAL', 'REFERENCE_AT', 'REFERENCE_AT_MINUS_DAYS']);
29
+ expect(Object.values(kit.EligibilityMessageTypeEnum)).toEqual(['POPULATION_PAGE', 'EVALUATE_BATCH', 'GRANT_BATCH', 'RELEASE_TRANCHE']);
30
+ expect(Object.values(kit.SegmentOperatorEnum)).toEqual(expect.arrayContaining(['EQUALS', 'NOT_EQUALS', 'IN', 'NOT_IN', 'IS_NULL', 'IS_NOT_NULL', 'GT', 'GTE', 'LT', 'LTE', 'CONTAINS', 'ANY_IN', 'WITHIN_LAST_DAYS', 'NOT_WITHIN_LAST_DAYS']));
31
+ });
32
+ it('GRANT_FAILED no se duplica: sigue siendo de RewardsMessageTypeEnum', () => {
33
+ expect(Object.values(kit.EligibilityMessageTypeEnum)).not.toContain('GRANT_FAILED');
34
+ });
35
+ it('limites', () => {
36
+ expect(kit.SEGMENT_MAX_DAYS).toBe(365);
37
+ expect(kit.SEGMENT_MAX_PARAMS).toBe(40);
38
+ expect(kit.SEGMENT_IDENTIFIER_PATTERN.test('remittance_users')).toBe(true);
39
+ expect(kit.SEGMENT_IDENTIFIER_PATTERN.test('Users')).toBe(false);
40
+ expect(kit.SEGMENT_IDENTIFIER_PATTERN.test('a b')).toBe(false);
41
+ expect(kit.SEGMENT_IDENTIFIER_PATTERN.test('a"b')).toBe(false);
42
+ });
43
+ });
@@ -0,0 +1,52 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import {
5
+ CreateRunRequest, EligibilityMessageTypeEnum as T, EvaluateBatchMessage, EvaluationRequest, GrantBatchMessage, INPUT_KEY_PATTERN,
6
+ PopulationPageMessage, PopulationRunRequest, ReleaseTrancheMessage, SegmentExecutionRequest,
7
+ } from '../../../src/rewardsEligibility';
8
+
9
+ const ok = async <C extends object>(cls: new () => C, plain: object) => (await validate(plainToInstance(cls, plain, { excludeExtraneousValues: true }))).length === 0;
10
+
11
+ describe('mensajes de la cola de elegibilidad', () => {
12
+ it('POPULATION_PAGE / GRANT_BATCH / RELEASE_TRANCHE exigen su messageType', async () => {
13
+ expect(await ok(PopulationPageMessage, { messageType: T.POPULATION_PAGE, runId: 'r-1' })).toBe(true);
14
+ expect(await ok(PopulationPageMessage, { messageType: T.EVALUATE_BATCH, runId: 'r-1' })).toBe(false);
15
+ expect(await ok(GrantBatchMessage, { messageType: T.GRANT_BATCH, runId: 'r-1', batchId: 'r-1#p0#b0', part: 0 })).toBe(true);
16
+ expect(await ok(GrantBatchMessage, { messageType: T.GRANT_BATCH, runId: 'r-1', batchId: 'r-1#p0#b0', part: -1 })).toBe(false);
17
+ expect(await ok(ReleaseTrancheMessage, { messageType: T.RELEASE_TRANCHE, seq: 3 })).toBe(true);
18
+ expect(await ok(ReleaseTrancheMessage, { messageType: T.RELEASE_TRANCHE, seq: -1 })).toBe(false);
19
+ });
20
+ it('EVALUATE_BATCH: <= 100 sujetos, sin prefetchedFacts', async () => {
21
+ const subject = { subjectKey: 'd-1', inputs: { directoryId: 'd-1' } };
22
+ const base = { messageType: T.EVALUATE_BATCH, runId: 'r-1', batchId: 'r-1#p0#b0' };
23
+ expect(await ok(EvaluateBatchMessage, { ...base, subjects: [subject] })).toBe(true);
24
+ expect(await ok(EvaluateBatchMessage, { ...base, subjects: [] })).toBe(false);
25
+ expect(await ok(EvaluateBatchMessage, { ...base, subjects: Array.from({ length: 101 }, () => subject) })).toBe(false);
26
+ const parsed = plainToInstance(EvaluateBatchMessage, { ...base, subjects: [{ ...subject, prefetchedFacts: { a: 1 } }] }, { excludeExtraneousValues: true });
27
+ expect('prefetchedFacts' in parsed.subjects[0]).toBe(false);
28
+ });
29
+ });
30
+ describe('cambios a evaluacion y corrida manual', () => {
31
+ it('EvaluationRequest acepta populationSegmentId y populationInputKey opcionales', () => {
32
+ const parsed = plainToInstance(EvaluationRequest, { populationSegmentId: 'promotores', populationInputKey: 'directoryId' }, { excludeExtraneousValues: true });
33
+ expect(parsed.populationSegmentId).toBe('promotores');
34
+ expect(parsed.populationInputKey).toBe('directoryId');
35
+ expect(INPUT_KEY_PATTERN.test('directoryId')).toBe(true);
36
+ expect(INPUT_KEY_PATTERN.test('1abc')).toBe(false);
37
+ });
38
+ it('PopulationRunRequest vacio es valido y descarta params', async () => {
39
+ expect(plainToInstance(PopulationRunRequest, {}, { excludeExtraneousValues: true })).toBeInstanceOf(PopulationRunRequest);
40
+ const p = plainToInstance(PopulationRunRequest, { params: { window: '7d' } }, { excludeExtraneousValues: true });
41
+ expect('params' in p).toBe(false);
42
+ expect(await ok(CreateRunRequest, { requestId: 'req-12345678', mode: 'LIVE', population: {} })).toBe(true);
43
+ });
44
+ });
45
+ describe('SegmentExecutionRequest', () => {
46
+ it('version y referenceAt opcionales y validados', async () => {
47
+ expect(await ok(SegmentExecutionRequest, {})).toBe(true);
48
+ expect(await ok(SegmentExecutionRequest, { version: 2, referenceAt: '2026-10-12T10:00:00Z' })).toBe(true);
49
+ expect(await ok(SegmentExecutionRequest, { version: 0 })).toBe(false);
50
+ expect(await ok(SegmentExecutionRequest, { referenceAt: 'ayer' })).toBe(false);
51
+ });
52
+ });
@@ -7,4 +7,6 @@ export declare class EmailSetTrustedRequest {
7
7
  directoryId: string;
8
8
  email: string;
9
9
  type: EmailTypeEnum;
10
+ /** En true, el correo queda como principal del directorio. Sin el campo, no cambia el principal. */
11
+ isPrincipal?: boolean;
10
12
  }
@@ -35,3 +35,9 @@ __decorate([
35
35
  (0, class_validator_1.IsEnum)(EmailTypeEnum_1.EmailTypeEnum),
36
36
  __metadata("design:type", String)
37
37
  ], EmailSetTrustedRequest.prototype, "type", void 0);
38
+ __decorate([
39
+ (0, class_transformer_1.Expose)(),
40
+ (0, class_validator_1.IsOptional)(),
41
+ (0, class_validator_1.IsBoolean)(),
42
+ __metadata("design:type", Boolean)
43
+ ], EmailSetTrustedRequest.prototype, "isPrincipal", void 0);
@@ -15,6 +15,8 @@ import type { WizardReservedLine } from './WizardReservedLine';
15
15
  import type { WizardResumeTarget } from './WizardResumeTarget';
16
16
  import type { WizardWelcome } from './WizardWelcome';
17
17
  import type { WizardCreditPromotionBonus } from './WizardCreditPromotionBonus';
18
+ import type { EmailStateEnum } from '../enums/EmailStateEnum';
19
+ import type { EmailTypeEnum } from '../../emailVerification/enums/EmailTypeEnum';
18
20
  /** Modalidad de captura del KYC (M1 §213-329). */
19
21
  export type KycModality = 'CUSTOMER_LINK' | 'STORE_DEVICE' | 'MANUAL';
20
22
  /** Estado de la apertura de cuenta async (D35) — espejo de `RetailCustomer.accountStatus`. */
@@ -64,6 +66,14 @@ export interface WizardSession {
64
66
  */
65
67
  resumeTarget?: WizardResumeTarget | null;
66
68
  consents: WizardConsents | null;
69
+ /** Estado del correo del cliente en el paso 01. Ausente en sesiones anteriores al correo. */
70
+ emailState?: EmailStateEnum;
71
+ /** Tipo del correo: personal o corporativo. */
72
+ emailType?: EmailTypeEnum;
73
+ /** Correo enmascarado (`ju•••••@gmail.com`); viaja siempre que la sesión tenga correo. */
74
+ emailMasked?: string;
75
+ /** Correo completo: solo con `emailState` CAPTURED, porque lo tecleó el vendedor. */
76
+ email?: string;
67
77
  /** Espejo del estado KYC (fuente = customer). */
68
78
  kycStatus: string | null;
69
79
  kycModality: KycModality | null;
@@ -0,0 +1,6 @@
1
+ import { EmailTypeEnum } from '../../../emailVerification/enums/EmailTypeEnum';
2
+ /** POST /wizard/sessions/:id/email/otp/send — manda el código al correo que capturó el vendedor. */
3
+ export declare class SendEmailOtpRequest {
4
+ email: string;
5
+ type: EmailTypeEnum;
6
+ }
@@ -0,0 +1,29 @@
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.SendEmailOtpRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const EmailTypeEnum_1 = require("../../../emailVerification/enums/EmailTypeEnum");
16
+ /** POST /wizard/sessions/:id/email/otp/send — manda el código al correo que capturó el vendedor. */
17
+ class SendEmailOtpRequest {
18
+ }
19
+ exports.SendEmailOtpRequest = SendEmailOtpRequest;
20
+ __decorate([
21
+ (0, class_transformer_1.Expose)(),
22
+ (0, class_validator_1.IsEmail)(),
23
+ __metadata("design:type", String)
24
+ ], SendEmailOtpRequest.prototype, "email", void 0);
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.IsEnum)(EmailTypeEnum_1.EmailTypeEnum),
28
+ __metadata("design:type", String)
29
+ ], SendEmailOtpRequest.prototype, "type", void 0);
@@ -0,0 +1,4 @@
1
+ /** POST /wizard/sessions/:id/email/otp/verify — verifica el código que llegó al correo. */
2
+ export declare class VerifyEmailOtpRequest {
3
+ code: string;
4
+ }
@@ -0,0 +1,24 @@
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.VerifyEmailOtpRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /** POST /wizard/sessions/:id/email/otp/verify — verifica el código que llegó al correo. */
16
+ class VerifyEmailOtpRequest {
17
+ }
18
+ exports.VerifyEmailOtpRequest = VerifyEmailOtpRequest;
19
+ __decorate([
20
+ (0, class_transformer_1.Expose)(),
21
+ (0, class_validator_1.IsString)(),
22
+ (0, class_validator_1.Length)(4, 8),
23
+ __metadata("design:type", String)
24
+ ], VerifyEmailOtpRequest.prototype, "code", void 0);
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Correo de la sesión del wizard: EXISTING = ya verificado en contacts; CAPTURED = lo tecleó el
3
+ * vendedor y se verificó con OTP; PENDING = falta capturarlo o verificarlo.
4
+ */
5
+ export declare enum EmailStateEnum {
6
+ EXISTING = "EXISTING",
7
+ CAPTURED = "CAPTURED",
8
+ PENDING = "PENDING"
9
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EmailStateEnum = void 0;
4
+ /**
5
+ * Correo de la sesión del wizard: EXISTING = ya verificado en contacts; CAPTURED = lo tecleó el
6
+ * vendedor y se verificó con OTP; PENDING = falta capturarlo o verificarlo.
7
+ */
8
+ var EmailStateEnum;
9
+ (function (EmailStateEnum) {
10
+ EmailStateEnum["EXISTING"] = "EXISTING";
11
+ EmailStateEnum["CAPTURED"] = "CAPTURED";
12
+ EmailStateEnum["PENDING"] = "PENDING";
13
+ })(EmailStateEnum || (exports.EmailStateEnum = EmailStateEnum = {}));
@@ -26,6 +26,7 @@ export * from './enums/BlockedCategoryEnum';
26
26
  export * from './enums/WizardLineStatusEnum';
27
27
  export * from './enums/LinePaymentTypeEnum';
28
28
  export * from './enums/WizardLineRoleEnum';
29
+ export * from './enums/EmailStateEnum';
29
30
  export * from './dtos/WizardConsents';
30
31
  export * from './dtos/WizardPayment';
31
32
  export * from './dtos/WizardProduct';
@@ -90,6 +91,8 @@ export * from './dtos/requests/SignatureSignRequest';
90
91
  export * from './dtos/requests/RegisterDeviceRequest';
91
92
  export * from './dtos/requests/CompleteSaleRequest';
92
93
  export * from './dtos/requests/SuggestIdentifiersQuery';
94
+ export * from './dtos/requests/SendEmailOtpRequest';
95
+ export * from './dtos/requests/VerifyEmailOtpRequest';
93
96
  export * from './dtos/responses/KycPrepareResponse';
94
97
  export * from './dtos/responses/ProofOfAddressPrepareResponse';
95
98
  export * from './dtos/responses/SessionFinanciersResponse';
@@ -45,6 +45,7 @@ __exportStar(require("./enums/BlockedCategoryEnum"), exports);
45
45
  __exportStar(require("./enums/WizardLineStatusEnum"), exports);
46
46
  __exportStar(require("./enums/LinePaymentTypeEnum"), exports);
47
47
  __exportStar(require("./enums/WizardLineRoleEnum"), exports);
48
+ __exportStar(require("./enums/EmailStateEnum"), exports);
48
49
  // DTOs anidados
49
50
  __exportStar(require("./dtos/WizardConsents"), exports);
50
51
  __exportStar(require("./dtos/WizardPayment"), exports);
@@ -115,6 +116,8 @@ __exportStar(require("./dtos/requests/SignatureSignRequest"), exports);
115
116
  __exportStar(require("./dtos/requests/RegisterDeviceRequest"), exports);
116
117
  __exportStar(require("./dtos/requests/CompleteSaleRequest"), exports);
117
118
  __exportStar(require("./dtos/requests/SuggestIdentifiersQuery"), exports);
119
+ __exportStar(require("./dtos/requests/SendEmailOtpRequest"), exports);
120
+ __exportStar(require("./dtos/requests/VerifyEmailOtpRequest"), exports);
118
121
  // Response DTOs (output tipado por endpoint)
119
122
  __exportStar(require("./dtos/responses/KycPrepareResponse"), exports);
120
123
  __exportStar(require("./dtos/responses/ProofOfAddressPrepareResponse"), exports);
@@ -14,3 +14,5 @@ export declare const LIST_PAGE_MAX = 100;
14
14
  export declare const RULES_CHAT_TURN_MAX_LENGTH = 4000;
15
15
  /** Tope de seguridad de turnos que acepta el DTO (el límite funcional, 10, lo aplica el lambda con `AI_CHAT_HISTORY_TOO_LONG`). */
16
16
  export declare const RULES_CHAT_MAX_TURNS_HARD = 50;
17
+ /** Llave de un input de una evaluacion (ej. `directoryId`). */
18
+ export declare const INPUT_KEY_PATTERN: RegExp;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RULES_CHAT_MAX_TURNS_HARD = exports.RULES_CHAT_TURN_MAX_LENGTH = exports.LIST_PAGE_MAX = exports.MAX_QUOTAS_PER_CAMPAIGN = exports.REQUEST_ID_PATTERN = exports.DATE_PATTERN = exports.EVENT_KEY_PATTERN = exports.ELIGIBILITY_ID_PATTERN = void 0;
3
+ exports.INPUT_KEY_PATTERN = exports.RULES_CHAT_MAX_TURNS_HARD = exports.RULES_CHAT_TURN_MAX_LENGTH = exports.LIST_PAGE_MAX = exports.MAX_QUOTAS_PER_CAMPAIGN = exports.REQUEST_ID_PATTERN = exports.DATE_PATTERN = exports.EVENT_KEY_PATTERN = exports.ELIGIBILITY_ID_PATTERN = void 0;
4
4
  /** Id de campaña, evaluación (minúsculas, dígitos y guion; 2 a 64; sin `#` ni `:` porque entran en llaves compuestas y en la idempotencyKey). */
5
5
  exports.ELIGIBILITY_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$/;
6
6
  /** `eventKey` de un tipo de evento: MAYÚSCULAS con guion bajo (ej. `PHONE_SALES_CODE_REDEEMED`). */
@@ -17,3 +17,5 @@ exports.LIST_PAGE_MAX = 100;
17
17
  exports.RULES_CHAT_TURN_MAX_LENGTH = 4000;
18
18
  /** Tope de seguridad de turnos que acepta el DTO (el límite funcional, 10, lo aplica el lambda con `AI_CHAT_HISTORY_TOO_LONG`). */
19
19
  exports.RULES_CHAT_MAX_TURNS_HARD = 50;
20
+ /** Llave de un input de una evaluacion (ej. `directoryId`). */
21
+ exports.INPUT_KEY_PATTERN = /^[a-zA-Z][a-zA-Z0-9_]{0,63}$/;
@@ -0,0 +1,5 @@
1
+ /** Identificador SQL permitido para tabla/columna (A§4.3 paso 1): minusculas, digitos y guion bajo; nunca texto libre. */
2
+ export declare const SEGMENT_IDENTIFIER_PATTERN: RegExp;
3
+ export declare const SEGMENT_MAX_DAYS = 365;
4
+ export declare const SEGMENT_MAX_PARAMS = 40;
5
+ export declare const SEGMENT_MAX_AGGREGATES = 8;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SEGMENT_MAX_AGGREGATES = exports.SEGMENT_MAX_PARAMS = exports.SEGMENT_MAX_DAYS = exports.SEGMENT_IDENTIFIER_PATTERN = void 0;
4
+ /** Identificador SQL permitido para tabla/columna (A§4.3 paso 1): minusculas, digitos y guion bajo; nunca texto libre. */
5
+ exports.SEGMENT_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_]*$/;
6
+ exports.SEGMENT_MAX_DAYS = 365;
7
+ exports.SEGMENT_MAX_PARAMS = 40;
8
+ exports.SEGMENT_MAX_AGGREGATES = 8;
@@ -38,8 +38,10 @@ __decorate([
38
38
  ], CreateRunRequest.prototype, "inputs", void 0);
39
39
  __decorate([
40
40
  (0, class_transformer_1.Expose)(),
41
- (0, class_validator_1.IsOptional)(),
42
- (0, class_validator_1.ValidateNested)(),
41
+ (0, class_validator_1.IsOptional)()
42
+ // `PopulationRunRequest` no tiene campos: class-validator rechaza validar anidado una clase sin metadatos, por eso `@IsObject()`.
43
+ ,
44
+ (0, class_validator_1.IsObject)(),
43
45
  (0, class_transformer_1.Type)(() => PopulationRunRequest_1.PopulationRunRequest),
44
46
  __metadata("design:type", PopulationRunRequest_1.PopulationRunRequest)
45
47
  ], CreateRunRequest.prototype, "population", void 0);
@@ -24,4 +24,8 @@ export declare class EvaluationRequest {
24
24
  reward: EvaluationReward;
25
25
  grantPolicy: GrantPolicy;
26
26
  triggers: EvaluationTrigger[];
27
+ /** Segmento de poblacion (version ACTIVE) que usan las corridas masivas de esta evaluacion. */
28
+ populationSegmentId?: string;
29
+ /** Llave del input `DIRECTORY` que recibe el `directoryid` de cada persona del segmento. */
30
+ populationInputKey?: string;
27
31
  }
@@ -84,3 +84,17 @@ __decorate([
84
84
  (0, class_validator_1.IsObject)({ each: true }),
85
85
  __metadata("design:type", Array)
86
86
  ], EvaluationRequest.prototype, "triggers", void 0);
87
+ __decorate([
88
+ (0, class_transformer_1.Expose)(),
89
+ (0, class_validator_1.IsOptional)(),
90
+ (0, class_validator_1.IsString)(),
91
+ (0, class_validator_1.Matches)(BackofficeLimits_1.ELIGIBILITY_ID_PATTERN),
92
+ __metadata("design:type", String)
93
+ ], EvaluationRequest.prototype, "populationSegmentId", void 0);
94
+ __decorate([
95
+ (0, class_transformer_1.Expose)(),
96
+ (0, class_validator_1.IsOptional)(),
97
+ (0, class_validator_1.IsString)(),
98
+ (0, class_validator_1.Matches)(BackofficeLimits_1.INPUT_KEY_PATTERN),
99
+ __metadata("design:type", String)
100
+ ], EvaluationRequest.prototype, "populationInputKey", void 0);
@@ -20,6 +20,8 @@ export declare class EvaluationResponse {
20
20
  reward: EvaluationReward;
21
21
  grantPolicy: GrantPolicy;
22
22
  triggers: EvaluationTrigger[];
23
+ populationSegmentId?: string;
24
+ populationInputKey?: string;
23
25
  createdAt: number;
24
26
  updatedAt: number;
25
27
  updatedBy: string;
@@ -1,5 +1,3 @@
1
- import { DynamicFormValue } from '../../../dynamicForm/types/DynamicFormValue';
2
- /** Corrida por población (fase 4): los `params` de la fuente para esta corrida. El lambda de la fase 3 la rechaza con `POPULATION_RUN_NOT_SUPPORTED`. */
1
+ /** Sin override de params (A§7.3): cambiar la poblacion = version nueva del segmento. `population: {}` = "usa el segmento de la evaluacion". */
3
2
  export declare class PopulationRunRequest {
4
- params: Record<string, DynamicFormValue>;
5
3
  }
@@ -1,24 +1,7 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.PopulationRunRequest = void 0;
13
- const class_transformer_1 = require("class-transformer");
14
- const class_validator_1 = require("class-validator");
15
- const IsDynamicFormValues_1 = require("../../../dynamicForm/validators/IsDynamicFormValues");
16
- /** Corrida por población (fase 4): los `params` de la fuente para esta corrida. El lambda de la fase 3 la rechaza con `POPULATION_RUN_NOT_SUPPORTED`. */
4
+ /** Sin override de params (A§7.3): cambiar la poblacion = version nueva del segmento. `population: {}` = "usa el segmento de la evaluacion". */
17
5
  class PopulationRunRequest {
18
6
  }
19
7
  exports.PopulationRunRequest = PopulationRunRequest;
20
- __decorate([
21
- (0, class_transformer_1.Expose)(),
22
- (0, class_validator_1.Validate)(IsDynamicFormValues_1.IsDynamicFormValues),
23
- __metadata("design:type", Object)
24
- ], PopulationRunRequest.prototype, "params", void 0);
@@ -0,0 +1,9 @@
1
+ /** Avance de la corrida masiva: paginas, lotes y sujetos publicados. */
2
+ export declare class RunPopulationProgress {
3
+ pagesPublished: number;
4
+ batchesPublished: number;
5
+ subjectsPublished: number;
6
+ exhausted: boolean;
7
+ stoppedReason?: string;
8
+ lastAdvanceAt: number;
9
+ }