@fiado/type-kit 3.613.0 → 3.614.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 (128) hide show
  1. package/_test_/unit/loanCredit/segmentFactsDtos.test.ts +80 -0
  2. package/_test_/unit/loanOfferings/segmentCatalog.test.ts +4 -2
  3. package/_test_/unit/loanOfferings/segmentCohorts.test.ts +333 -0
  4. package/bin/loanCredit/dtos/requests/SegmentFactsBatchRequest.d.ts +4 -0
  5. package/bin/loanCredit/dtos/requests/SegmentFactsBatchRequest.js +27 -0
  6. package/bin/loanCredit/dtos/requests/SegmentFactsPageRequest.d.ts +7 -0
  7. package/bin/loanCredit/dtos/requests/SegmentFactsPageRequest.js +32 -0
  8. package/bin/loanCredit/dtos/responses/BorrowerSegmentFacts.d.ts +22 -0
  9. package/bin/loanCredit/dtos/responses/BorrowerSegmentFacts.js +2 -0
  10. package/bin/loanCredit/dtos/responses/SegmentFactsBatchResponse.d.ts +5 -0
  11. package/bin/loanCredit/dtos/responses/SegmentFactsBatchResponse.js +2 -0
  12. package/bin/loanCredit/dtos/responses/SegmentFactsPageResponse.d.ts +7 -0
  13. package/bin/loanCredit/dtos/responses/SegmentFactsPageResponse.js +2 -0
  14. package/bin/loanCredit/index.d.ts +5 -0
  15. package/bin/loanCredit/index.js +6 -0
  16. package/bin/loanOfferings/dtos/requests/ChangeCohortStatusRequest.d.ts +9 -0
  17. package/bin/loanOfferings/dtos/requests/ChangeCohortStatusRequest.js +34 -0
  18. package/bin/loanOfferings/dtos/requests/CohortCondition.d.ts +15 -0
  19. package/bin/loanOfferings/dtos/requests/CohortCondition.js +48 -0
  20. package/bin/loanOfferings/dtos/requests/CreateCohortRequest.d.ts +11 -0
  21. package/bin/loanOfferings/dtos/requests/CreateCohortRequest.js +44 -0
  22. package/bin/loanOfferings/dtos/requests/CreateSegmentRequest.d.ts +7 -8
  23. package/bin/loanOfferings/dtos/requests/CreateSegmentRequest.js +5 -3
  24. package/bin/loanOfferings/dtos/requests/CustomerSegmentFacts.d.ts +30 -0
  25. package/bin/loanOfferings/dtos/requests/CustomerSegmentFacts.js +92 -0
  26. package/bin/loanOfferings/dtos/requests/ListCohortsQuery.d.ts +5 -0
  27. package/bin/loanOfferings/dtos/requests/ListCohortsQuery.js +25 -0
  28. package/bin/loanOfferings/dtos/requests/ResolveCustomerSegmentsRequest.d.ts +4 -20
  29. package/bin/loanOfferings/dtos/requests/ResolveCustomerSegmentsRequest.js +4 -48
  30. package/bin/loanOfferings/dtos/requests/ResolveSegmentMembersRequest.d.ts +8 -0
  31. package/bin/loanOfferings/dtos/requests/ResolveSegmentMembersRequest.js +31 -0
  32. package/bin/loanOfferings/dtos/requests/TestCohortRequest.d.ts +9 -0
  33. package/bin/loanOfferings/dtos/requests/TestCohortRequest.js +36 -0
  34. package/bin/loanOfferings/dtos/requests/TestCustomerSegmentsRequest.d.ts +4 -0
  35. package/bin/loanOfferings/dtos/requests/TestCustomerSegmentsRequest.js +23 -0
  36. package/bin/loanOfferings/dtos/requests/UpdateCohortRequest.d.ts +12 -0
  37. package/bin/loanOfferings/dtos/requests/UpdateCohortRequest.js +53 -0
  38. package/bin/loanOfferings/dtos/requests/UpdateSegmentRequest.d.ts +2 -2
  39. package/bin/loanOfferings/dtos/requests/UpdateSegmentRequest.js +3 -1
  40. package/bin/loanOfferings/dtos/responses/CohortCatalogResponse.d.ts +33 -0
  41. package/bin/loanOfferings/dtos/responses/CohortCatalogResponse.js +2 -0
  42. package/bin/loanOfferings/dtos/responses/CohortLogEntryResponse.d.ts +11 -0
  43. package/bin/loanOfferings/dtos/responses/CohortLogEntryResponse.js +2 -0
  44. package/bin/loanOfferings/dtos/responses/CohortResponse.d.ts +43 -0
  45. package/bin/loanOfferings/dtos/responses/CohortResponse.js +2 -0
  46. package/bin/loanOfferings/dtos/responses/SegmentCatalogResponse.d.ts +5 -2
  47. package/bin/loanOfferings/dtos/responses/SegmentLogEntryResponse.d.ts +11 -0
  48. package/bin/loanOfferings/dtos/responses/SegmentLogEntryResponse.js +2 -0
  49. package/bin/loanOfferings/dtos/responses/SegmentMembersResponse.d.ts +19 -0
  50. package/bin/loanOfferings/dtos/responses/SegmentMembersResponse.js +2 -0
  51. package/bin/loanOfferings/dtos/responses/SegmentResponse.d.ts +12 -6
  52. package/bin/loanOfferings/dtos/responses/SegmentUsageResponse.d.ts +18 -0
  53. package/bin/loanOfferings/dtos/responses/SegmentUsageResponse.js +2 -0
  54. package/bin/loanOfferings/dtos/responses/SegmentationRecountRunResponse.d.ts +23 -0
  55. package/bin/loanOfferings/dtos/responses/SegmentationRecountRunResponse.js +2 -0
  56. package/bin/loanOfferings/dtos/responses/SegmentationRecountStartResponse.d.ts +6 -0
  57. package/bin/loanOfferings/dtos/responses/SegmentationRecountStartResponse.js +2 -0
  58. package/bin/loanOfferings/dtos/responses/TestCohortResponse.d.ts +17 -0
  59. package/bin/loanOfferings/dtos/responses/TestCohortResponse.js +2 -0
  60. package/bin/loanOfferings/dtos/responses/TestCustomerSegmentsResponse.d.ts +23 -0
  61. package/bin/loanOfferings/dtos/responses/TestCustomerSegmentsResponse.js +2 -0
  62. package/bin/loanOfferings/enums/CohortConditionOutcomeEnum.d.ts +10 -0
  63. package/bin/loanOfferings/enums/CohortConditionOutcomeEnum.js +14 -0
  64. package/bin/loanOfferings/enums/CohortFactKeyEnum.d.ts +17 -0
  65. package/bin/loanOfferings/enums/CohortFactKeyEnum.js +21 -0
  66. package/bin/loanOfferings/enums/CohortFactTypeEnum.d.ts +9 -0
  67. package/bin/loanOfferings/enums/CohortFactTypeEnum.js +13 -0
  68. package/bin/loanOfferings/enums/CohortLogEventEnum.d.ts +10 -0
  69. package/bin/loanOfferings/enums/CohortLogEventEnum.js +14 -0
  70. package/bin/loanOfferings/enums/CohortOperatorEnum.d.ts +15 -0
  71. package/bin/loanOfferings/enums/CohortOperatorEnum.js +19 -0
  72. package/bin/loanOfferings/enums/CohortStatusEnum.d.ts +9 -0
  73. package/bin/loanOfferings/enums/CohortStatusEnum.js +13 -0
  74. package/bin/loanOfferings/enums/SegmentFilterIdEnum.d.ts +2 -0
  75. package/bin/loanOfferings/enums/SegmentFilterIdEnum.js +2 -0
  76. package/bin/loanOfferings/enums/SegmentLogEventEnum.d.ts +10 -0
  77. package/bin/loanOfferings/enums/SegmentLogEventEnum.js +14 -0
  78. package/bin/loanOfferings/enums/SegmentMembershipReasonEnum.d.ts +9 -0
  79. package/bin/loanOfferings/enums/SegmentMembershipReasonEnum.js +13 -0
  80. package/bin/loanOfferings/enums/SegmentationRecountStatusEnum.d.ts +9 -0
  81. package/bin/loanOfferings/enums/SegmentationRecountStatusEnum.js +13 -0
  82. package/bin/loanOfferings/enums/SegmentationRecountTriggerEnum.d.ts +8 -0
  83. package/bin/loanOfferings/enums/SegmentationRecountTriggerEnum.js +12 -0
  84. package/bin/loanOfferings/index.d.ts +29 -0
  85. package/bin/loanOfferings/index.js +29 -0
  86. package/package.json +1 -1
  87. package/src/loanCredit/dtos/requests/SegmentFactsBatchRequest.ts +13 -0
  88. package/src/loanCredit/dtos/requests/SegmentFactsPageRequest.ts +19 -0
  89. package/src/loanCredit/dtos/responses/BorrowerSegmentFacts.ts +24 -0
  90. package/src/loanCredit/dtos/responses/SegmentFactsBatchResponse.ts +6 -0
  91. package/src/loanCredit/dtos/responses/SegmentFactsPageResponse.ts +8 -0
  92. package/src/loanCredit/index.ts +7 -0
  93. package/src/loanOfferings/dtos/requests/ChangeCohortStatusRequest.ts +19 -0
  94. package/src/loanOfferings/dtos/requests/CohortCondition.ts +33 -0
  95. package/src/loanOfferings/dtos/requests/CreateCohortRequest.ts +29 -0
  96. package/src/loanOfferings/dtos/requests/CreateSegmentRequest.ts +10 -9
  97. package/src/loanOfferings/dtos/requests/CustomerSegmentFacts.ts +79 -0
  98. package/src/loanOfferings/dtos/requests/ListCohortsQuery.ts +11 -0
  99. package/src/loanOfferings/dtos/requests/ResolveCustomerSegmentsRequest.ts +5 -49
  100. package/src/loanOfferings/dtos/requests/ResolveSegmentMembersRequest.ts +17 -0
  101. package/src/loanOfferings/dtos/requests/TestCohortRequest.ts +21 -0
  102. package/src/loanOfferings/dtos/requests/TestCustomerSegmentsRequest.ts +9 -0
  103. package/src/loanOfferings/dtos/requests/UpdateCohortRequest.ts +37 -0
  104. package/src/loanOfferings/dtos/requests/UpdateSegmentRequest.ts +5 -3
  105. package/src/loanOfferings/dtos/responses/CohortCatalogResponse.ts +36 -0
  106. package/src/loanOfferings/dtos/responses/CohortLogEntryResponse.ts +12 -0
  107. package/src/loanOfferings/dtos/responses/CohortResponse.ts +47 -0
  108. package/src/loanOfferings/dtos/responses/SegmentCatalogResponse.ts +5 -2
  109. package/src/loanOfferings/dtos/responses/SegmentLogEntryResponse.ts +12 -0
  110. package/src/loanOfferings/dtos/responses/SegmentMembersResponse.ts +21 -0
  111. package/src/loanOfferings/dtos/responses/SegmentResponse.ts +12 -6
  112. package/src/loanOfferings/dtos/responses/SegmentUsageResponse.ts +20 -0
  113. package/src/loanOfferings/dtos/responses/SegmentationRecountRunResponse.ts +25 -0
  114. package/src/loanOfferings/dtos/responses/SegmentationRecountStartResponse.ts +7 -0
  115. package/src/loanOfferings/dtos/responses/TestCohortResponse.ts +19 -0
  116. package/src/loanOfferings/dtos/responses/TestCustomerSegmentsResponse.ts +25 -0
  117. package/src/loanOfferings/enums/CohortConditionOutcomeEnum.ts +10 -0
  118. package/src/loanOfferings/enums/CohortFactKeyEnum.ts +17 -0
  119. package/src/loanOfferings/enums/CohortFactTypeEnum.ts +9 -0
  120. package/src/loanOfferings/enums/CohortLogEventEnum.ts +10 -0
  121. package/src/loanOfferings/enums/CohortOperatorEnum.ts +15 -0
  122. package/src/loanOfferings/enums/CohortStatusEnum.ts +9 -0
  123. package/src/loanOfferings/enums/SegmentFilterIdEnum.ts +2 -0
  124. package/src/loanOfferings/enums/SegmentLogEventEnum.ts +10 -0
  125. package/src/loanOfferings/enums/SegmentMembershipReasonEnum.ts +9 -0
  126. package/src/loanOfferings/enums/SegmentationRecountStatusEnum.ts +9 -0
  127. package/src/loanOfferings/enums/SegmentationRecountTriggerEnum.ts +8 -0
  128. package/src/loanOfferings/index.ts +29 -0
@@ -16,6 +16,16 @@ export * from './enums/SegmentStatusEnum';
16
16
  export * from './enums/SegmentColorSlotEnum';
17
17
  export * from './enums/SegmentFilterIdEnum';
18
18
  export * from './enums/PrepaymentMinimumModeEnum';
19
+ export * from './enums/CohortStatusEnum';
20
+ export * from './enums/CohortFactKeyEnum';
21
+ export * from './enums/CohortFactTypeEnum';
22
+ export * from './enums/CohortOperatorEnum';
23
+ export * from './enums/CohortConditionOutcomeEnum';
24
+ export * from './enums/CohortLogEventEnum';
25
+ export * from './enums/SegmentLogEventEnum';
26
+ export * from './enums/SegmentMembershipReasonEnum';
27
+ export * from './enums/SegmentationRecountTriggerEnum';
28
+ export * from './enums/SegmentationRecountStatusEnum';
19
29
  export * from './constants/promotionSkuBatch';
20
30
  export * from './dtos/CreditPlan';
21
31
  export * from './dtos/PrepaymentMinimum';
@@ -43,7 +53,16 @@ export * from './dtos/requests/ChangeStorePolicyStatusRequest';
43
53
  export * from './dtos/requests/CreateSegmentRequest';
44
54
  export * from './dtos/requests/UpdateSegmentRequest';
45
55
  export * from './dtos/requests/ChangeSegmentStatusRequest';
56
+ export * from './dtos/requests/CustomerSegmentFacts';
46
57
  export * from './dtos/requests/ResolveCustomerSegmentsRequest';
58
+ export * from './dtos/requests/ResolveSegmentMembersRequest';
59
+ export * from './dtos/requests/TestCustomerSegmentsRequest';
60
+ export * from './dtos/requests/CohortCondition';
61
+ export * from './dtos/requests/CreateCohortRequest';
62
+ export * from './dtos/requests/UpdateCohortRequest';
63
+ export * from './dtos/requests/ChangeCohortStatusRequest';
64
+ export * from './dtos/requests/TestCohortRequest';
65
+ export * from './dtos/requests/ListCohortsQuery';
47
66
  export * from './dtos/requests/ComputeAmortizationScheduleRequest';
48
67
  export * from './dtos/requests/ListSegmentCatalogQuery';
49
68
  export * from './dtos/requests/PromotionSkuInput';
@@ -66,5 +85,15 @@ export * from './dtos/responses/SegmentResponse';
66
85
  export * from './dtos/responses/SegmentFilterResponse';
67
86
  export * from './dtos/responses/SegmentCatalogResponse';
68
87
  export * from './dtos/responses/ResolveCustomerSegmentsResponse';
88
+ export * from './dtos/responses/SegmentMembersResponse';
89
+ export * from './dtos/responses/SegmentUsageResponse';
90
+ export * from './dtos/responses/TestCustomerSegmentsResponse';
91
+ export * from './dtos/responses/SegmentLogEntryResponse';
92
+ export * from './dtos/responses/SegmentationRecountStartResponse';
93
+ export * from './dtos/responses/SegmentationRecountRunResponse';
94
+ export * from './dtos/responses/CohortResponse';
95
+ export * from './dtos/responses/CohortCatalogResponse';
96
+ export * from './dtos/responses/TestCohortResponse';
97
+ export * from './dtos/responses/CohortLogEntryResponse';
69
98
  export * from './dtos/responses/AmortizationScheduleRow';
70
99
  export * from './dtos/responses/AmortizationScheduleResponse';
@@ -33,6 +33,16 @@ __exportStar(require("./enums/SegmentStatusEnum"), exports);
33
33
  __exportStar(require("./enums/SegmentColorSlotEnum"), exports);
34
34
  __exportStar(require("./enums/SegmentFilterIdEnum"), exports);
35
35
  __exportStar(require("./enums/PrepaymentMinimumModeEnum"), exports);
36
+ __exportStar(require("./enums/CohortStatusEnum"), exports);
37
+ __exportStar(require("./enums/CohortFactKeyEnum"), exports);
38
+ __exportStar(require("./enums/CohortFactTypeEnum"), exports);
39
+ __exportStar(require("./enums/CohortOperatorEnum"), exports);
40
+ __exportStar(require("./enums/CohortConditionOutcomeEnum"), exports);
41
+ __exportStar(require("./enums/CohortLogEventEnum"), exports);
42
+ __exportStar(require("./enums/SegmentLogEventEnum"), exports);
43
+ __exportStar(require("./enums/SegmentMembershipReasonEnum"), exports);
44
+ __exportStar(require("./enums/SegmentationRecountTriggerEnum"), exports);
45
+ __exportStar(require("./enums/SegmentationRecountStatusEnum"), exports);
36
46
  // Constantes
37
47
  __exportStar(require("./constants/promotionSkuBatch"), exports);
38
48
  // Entity DTOs
@@ -63,7 +73,16 @@ __exportStar(require("./dtos/requests/ChangeStorePolicyStatusRequest"), exports)
63
73
  __exportStar(require("./dtos/requests/CreateSegmentRequest"), exports);
64
74
  __exportStar(require("./dtos/requests/UpdateSegmentRequest"), exports);
65
75
  __exportStar(require("./dtos/requests/ChangeSegmentStatusRequest"), exports);
76
+ __exportStar(require("./dtos/requests/CustomerSegmentFacts"), exports);
66
77
  __exportStar(require("./dtos/requests/ResolveCustomerSegmentsRequest"), exports);
78
+ __exportStar(require("./dtos/requests/ResolveSegmentMembersRequest"), exports);
79
+ __exportStar(require("./dtos/requests/TestCustomerSegmentsRequest"), exports);
80
+ __exportStar(require("./dtos/requests/CohortCondition"), exports);
81
+ __exportStar(require("./dtos/requests/CreateCohortRequest"), exports);
82
+ __exportStar(require("./dtos/requests/UpdateCohortRequest"), exports);
83
+ __exportStar(require("./dtos/requests/ChangeCohortStatusRequest"), exports);
84
+ __exportStar(require("./dtos/requests/TestCohortRequest"), exports);
85
+ __exportStar(require("./dtos/requests/ListCohortsQuery"), exports);
67
86
  __exportStar(require("./dtos/requests/ComputeAmortizationScheduleRequest"), exports);
68
87
  __exportStar(require("./dtos/requests/ListSegmentCatalogQuery"), exports);
69
88
  __exportStar(require("./dtos/requests/PromotionSkuInput"), exports);
@@ -87,5 +106,15 @@ __exportStar(require("./dtos/responses/SegmentResponse"), exports);
87
106
  __exportStar(require("./dtos/responses/SegmentFilterResponse"), exports);
88
107
  __exportStar(require("./dtos/responses/SegmentCatalogResponse"), exports);
89
108
  __exportStar(require("./dtos/responses/ResolveCustomerSegmentsResponse"), exports);
109
+ __exportStar(require("./dtos/responses/SegmentMembersResponse"), exports);
110
+ __exportStar(require("./dtos/responses/SegmentUsageResponse"), exports);
111
+ __exportStar(require("./dtos/responses/TestCustomerSegmentsResponse"), exports);
112
+ __exportStar(require("./dtos/responses/SegmentLogEntryResponse"), exports);
113
+ __exportStar(require("./dtos/responses/SegmentationRecountStartResponse"), exports);
114
+ __exportStar(require("./dtos/responses/SegmentationRecountRunResponse"), exports);
115
+ __exportStar(require("./dtos/responses/CohortResponse"), exports);
116
+ __exportStar(require("./dtos/responses/CohortCatalogResponse"), exports);
117
+ __exportStar(require("./dtos/responses/TestCohortResponse"), exports);
118
+ __exportStar(require("./dtos/responses/CohortLogEntryResponse"), exports);
90
119
  __exportStar(require("./dtos/responses/AmortizationScheduleRow"), exports);
91
120
  __exportStar(require("./dtos/responses/AmortizationScheduleResponse"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.613.0",
3
+ "version": "3.614.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,13 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, IsNotEmpty, IsString } from 'class-validator';
3
+
4
+ /** Body de `POST /private/borrowers/segment-facts`: datos para segmentar de hasta 100 clientes retail. */
5
+ export class SegmentFactsBatchRequest {
6
+ @Expose()
7
+ @IsArray()
8
+ @ArrayMinSize(1)
9
+ @ArrayMaxSize(100)
10
+ @IsString({ each: true })
11
+ @IsNotEmpty({ each: true })
12
+ retailCustomerIds!: string[];
13
+ }
@@ -0,0 +1,19 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsInt, IsOptional, IsString, Max, Min } from 'class-validator';
3
+
4
+ /** Body de `POST /private/borrowers/segment-facts/page`: una página de la cartera de acreditados. */
5
+ export class SegmentFactsPageRequest {
6
+ /** Cursor opaco de la página anterior. Ausente en la primera página. */
7
+ @Expose()
8
+ @IsOptional()
9
+ @IsString()
10
+ cursor?: string;
11
+
12
+ /** Acreditados por página. Ausente = 100. */
13
+ @Expose()
14
+ @IsOptional()
15
+ @IsInt()
16
+ @Min(1)
17
+ @Max(100)
18
+ limit?: number;
19
+ }
@@ -0,0 +1,24 @@
1
+ import { CreditPlanLevelEnum } from '../../../loanOfferings/enums/CreditPlanLevelEnum';
2
+
3
+ /**
4
+ * Datos del acreditado para evaluar cohorts, ya normalizados: sin acreditado, conteos y días en
5
+ * `0`; `sciLevel` ausente si no hay evaluación o el nivel es `ALL` / `NOT_ELIGIBLE`.
6
+ */
7
+ export interface BorrowerSegmentFacts {
8
+ sciLevel?: CreditPlanLevelEnum;
9
+ totalCredits: number;
10
+ activeCredits: number;
11
+ completedCredits: number;
12
+ lifetimeWriteOffs: number;
13
+ currentArrearsDays: number;
14
+ /** Sin cuotas en la ventana de 180 días cuenta como `0`. */
15
+ delinquencyDaysLast6M: number;
16
+ lifetimeRestructures: number;
17
+ }
18
+
19
+ /** Un cliente retail y sus datos para segmentar. `borrowerId` en `null` = no tiene acreditado. */
20
+ export interface BorrowerSegmentFactsItem {
21
+ retailCustomerId: string;
22
+ borrowerId: string | null;
23
+ facts: BorrowerSegmentFacts;
24
+ }
@@ -0,0 +1,6 @@
1
+ import { BorrowerSegmentFactsItem } from './BorrowerSegmentFacts';
2
+
3
+ /** Respuesta de `POST /private/borrowers/segment-facts`: un ítem por id pedido, en el mismo orden. */
4
+ export interface SegmentFactsBatchResponse {
5
+ items: BorrowerSegmentFactsItem[];
6
+ }
@@ -0,0 +1,8 @@
1
+ import { BorrowerSegmentFactsItem } from './BorrowerSegmentFacts';
2
+
3
+ /** Respuesta de `POST /private/borrowers/segment-facts/page`. */
4
+ export interface SegmentFactsPageResponse {
5
+ items: BorrowerSegmentFactsItem[];
6
+ /** Cursor de la siguiente página. `null` = ya no quedan acreditados. */
7
+ nextCursor: string | null;
8
+ }
@@ -198,3 +198,10 @@ export * from './dtos/requests/UpdateReconcileModeRequest';
198
198
  export * from './dtos/responses/ReconcileModeView';
199
199
  export * from './dtos/requests/RunDevicePostureBackfillRequest';
200
200
  export * from './dtos/responses/DevicePostureBackfillResult';
201
+
202
+ // Datos del cliente para evaluar cohorts de segmentos
203
+ export * from './dtos/requests/SegmentFactsBatchRequest';
204
+ export * from './dtos/requests/SegmentFactsPageRequest';
205
+ export * from './dtos/responses/BorrowerSegmentFacts';
206
+ export * from './dtos/responses/SegmentFactsBatchResponse';
207
+ export * from './dtos/responses/SegmentFactsPageResponse';
@@ -0,0 +1,19 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsEnum, IsOptional, IsString, MaxLength } from 'class-validator';
3
+ import { CohortStatusEnum } from '../../enums/CohortStatusEnum';
4
+
5
+ /**
6
+ * Body de PUT /cohorts/:cohortId/status — archiva o reactiva un cohort. No se archiva uno que use
7
+ * un segmento activo. `reason` queda en la bitácora.
8
+ */
9
+ export class ChangeCohortStatusRequest {
10
+ @Expose()
11
+ @IsEnum(CohortStatusEnum)
12
+ status!: CohortStatusEnum;
13
+
14
+ @Expose()
15
+ @IsOptional()
16
+ @IsString()
17
+ @MaxLength(280)
18
+ reason?: string;
19
+ }
@@ -0,0 +1,33 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { ArrayMaxSize, IsArray, IsEnum, IsNotEmpty, IsOptional, IsString } from 'class-validator';
3
+ import { CohortFactKeyEnum } from '../../enums/CohortFactKeyEnum';
4
+ import { CohortOperatorEnum } from '../../enums/CohortOperatorEnum';
5
+
6
+ /**
7
+ * Una condición de cohort: «dato operador valor». Las condiciones de un cohort se unen con Y.
8
+ * Que el operador aplique al tipo del dato y que el valor tenga el tipo correcto lo valida el
9
+ * lambda (422), contra el catálogo.
10
+ */
11
+ export class CohortCondition {
12
+ @Expose()
13
+ @IsEnum(CohortFactKeyEnum)
14
+ field!: CohortFactKeyEnum;
15
+
16
+ @Expose()
17
+ @IsEnum(CohortOperatorEnum)
18
+ op!: CohortOperatorEnum;
19
+
20
+ /** Valor a comparar en los operadores de un solo valor. Tipado estricto: `3` no es `"3"`. */
21
+ @Expose()
22
+ @IsOptional()
23
+ value?: number | boolean | string;
24
+
25
+ /** Lista de opciones; solo con `IN` y `NOT_IN`. */
26
+ @Expose()
27
+ @IsOptional()
28
+ @IsArray()
29
+ @IsString({ each: true })
30
+ @IsNotEmpty({ each: true })
31
+ @ArrayMaxSize(10)
32
+ values?: string[];
33
+ }
@@ -0,0 +1,29 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, IsOptional, IsString, MaxLength, ValidateNested } from 'class-validator';
3
+ import { CohortCondition } from './CohortCondition';
4
+
5
+ /**
6
+ * Body de POST /cohorts — alta de un cohort. Nace en `ACTIVE`; `cohortId`, `status`, `version` y
7
+ * la auditoría los asigna el lambda. El nombre es único entre los cohorts activos.
8
+ */
9
+ export class CreateCohortRequest {
10
+ @Expose()
11
+ @IsString()
12
+ @MaxLength(120)
13
+ name!: string;
14
+
15
+ @Expose()
16
+ @IsOptional()
17
+ @IsString()
18
+ @MaxLength(500)
19
+ description?: string;
20
+
21
+ /** Condiciones unidas con Y: el cliente entra si cumple todas. */
22
+ @Expose()
23
+ @IsArray()
24
+ @ArrayMinSize(1)
25
+ @ArrayMaxSize(10)
26
+ @ValidateNested({ each: true })
27
+ @Type(() => CohortCondition)
28
+ conditions!: CohortCondition[];
29
+ }
@@ -1,12 +1,12 @@
1
1
  import { Expose } from 'class-transformer';
2
- import { IsArray, IsEnum, IsOptional, IsString, MaxLength } from 'class-validator';
2
+ import { ArrayMaxSize, IsArray, IsEnum, IsNotEmpty, IsOptional, IsString, MaxLength } from 'class-validator';
3
3
  import { SegmentColorSlotEnum } from '../../enums/SegmentColorSlotEnum';
4
4
 
5
5
  /**
6
6
  * Body de POST /segments — alta de un segmento de clientes.
7
7
  * Nace en `ACTIVE`: `segmentId`, `status`, `version`, `isDefault` y la auditoría los asigna el
8
- * lambda y NO viajan en el request. Que cada filtro exista en el catálogo y tenga fuente lo valida
9
- * el lambda contra `GET /segments/filters`.
8
+ * lambda y NO viajan en el request. Que cada cohort exista y esté activo lo valida el lambda, igual
9
+ * que la regla de tener al menos un cohort o un individuo.
10
10
  */
11
11
  export class CreateSegmentRequest {
12
12
  @Expose()
@@ -27,19 +27,20 @@ export class CreateSegmentRequest {
27
27
  colorSlot?: SegmentColorSlotEnum;
28
28
 
29
29
  /**
30
- * Filtros del catálogo cerrado. Un cliente pertenece si cumple AL MENOS UNO — es un OR, no un
31
- * AND. Se valida contra el catálogo en el lambda (422), no acá, para poder nombrar el filtro
32
- * desconocido y el que todavía no tiene fuente.
30
+ * Cohorts del segmento. Un cliente pertenece si cumple AL MENOS UNO — es un OR entre cohorts;
31
+ * dentro de cada cohort las condiciones se unen con Y.
33
32
  */
34
33
  @Expose()
35
34
  @IsOptional()
36
35
  @IsArray()
37
36
  @IsString({ each: true })
38
- filterIds?: string[];
37
+ @IsNotEmpty({ each: true })
38
+ @ArrayMaxSize(20)
39
+ cohortIds?: string[];
39
40
 
40
41
  /**
41
- * Clientes agregados a mano por `retailCustomerId`. Ganan siempre, cumplan o no un filtro.
42
- * Un segmento puede nacer SOLO con esta lista, sin ningún filtro activo.
42
+ * Clientes agregados a mano por `retailCustomerId`. Ganan siempre, cumplan o no un cohort.
43
+ * Un segmento puede nacer SOLO con esta lista, sin ningún cohort.
43
44
  */
44
45
  @Expose()
45
46
  @IsOptional()
@@ -0,0 +1,79 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsBoolean, IsEnum, IsInt, IsOptional, Min } from 'class-validator';
3
+ import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
4
+
5
+ /**
6
+ * Datos del cliente contra los que se evalúan los cohorts. Las llaves son las de
7
+ * `CohortFactKeyEnum`. Todos opcionales: un dato ausente hace que su condición no se cumpla.
8
+ *
9
+ * Cliente sin acreditado: conteos y días en `0`, `sciLevel` ausente. `sciLevel` en `ALL` o
10
+ * `NOT_ELIGIBLE` se manda ausente.
11
+ */
12
+ export class CustomerSegmentFacts {
13
+ /** Nivel de la última evaluación SCI del acreditado. */
14
+ @Expose()
15
+ @IsOptional()
16
+ @IsEnum(CreditPlanLevelEnum)
17
+ sciLevel?: CreditPlanLevelEnum;
18
+
19
+ /** Créditos en toda la vida del cliente, en cualquier estado. */
20
+ @Expose()
21
+ @IsOptional()
22
+ @IsInt()
23
+ @Min(0)
24
+ totalCredits?: number;
25
+
26
+ /** Créditos vivos hoy. */
27
+ @Expose()
28
+ @IsOptional()
29
+ @IsInt()
30
+ @Min(0)
31
+ activeCredits?: number;
32
+
33
+ /** Créditos liquidados en toda la vida del cliente. */
34
+ @Expose()
35
+ @IsOptional()
36
+ @IsInt()
37
+ @Min(0)
38
+ completedCredits?: number;
39
+
40
+ /** Créditos con baja contable en toda la vida del cliente. `0` es ninguno. */
41
+ @Expose()
42
+ @IsOptional()
43
+ @IsInt()
44
+ @Min(0)
45
+ lifetimeWriteOffs?: number;
46
+
47
+ /** Días de atraso hoy. `0` es al corriente. */
48
+ @Expose()
49
+ @IsOptional()
50
+ @IsInt()
51
+ @Min(0)
52
+ currentArrearsDays?: number;
53
+
54
+ /** Días de mora en la ventana de 180 días. Sin cuotas en la ventana cuenta como `0`. */
55
+ @Expose()
56
+ @IsOptional()
57
+ @IsInt()
58
+ @Min(0)
59
+ delinquencyDaysLast6M?: number;
60
+
61
+ /** Reestructuras en toda la vida del cliente. `0` es ninguna. */
62
+ @Expose()
63
+ @IsOptional()
64
+ @IsInt()
65
+ @Min(0)
66
+ lifetimeRestructures?: number;
67
+
68
+ /** Colaborador de la red. Hoy ningún sistema lo produce: se usa la lista manual del segmento. */
69
+ @Expose()
70
+ @IsOptional()
71
+ @IsBoolean()
72
+ isEmployee?: boolean;
73
+
74
+ /** Tiene cuenta PCF. Sin fuente mientras no se defina qué cuenta como cuenta PCF. */
75
+ @Expose()
76
+ @IsOptional()
77
+ @IsBoolean()
78
+ hasPcfAccount?: boolean;
79
+ }
@@ -0,0 +1,11 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsEnum, IsOptional } from 'class-validator';
3
+ import { CohortStatusEnum } from '../../enums/CohortStatusEnum';
4
+
5
+ /** Query de GET /cohorts (backoffice). El tenant sale del token. Sin `status` devuelve todos. */
6
+ export class ListCohortsQuery {
7
+ @Expose()
8
+ @IsOptional()
9
+ @IsEnum(CohortStatusEnum)
10
+ status?: CohortStatusEnum;
11
+ }
@@ -1,57 +1,13 @@
1
1
  import { Expose } from 'class-transformer';
2
- import { IsBoolean, IsEnum, IsInt, IsOptional, IsString, Min } from 'class-validator';
3
- import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
2
+ import { IsString } from 'class-validator';
3
+ import { CustomerSegmentFacts } from './CustomerSegmentFacts';
4
4
 
5
5
  /**
6
- * Body de POST /private/segments/resolve — los hechos del cliente contra los que se evalúan los
7
- * filtros. Los junta quien ya tiene al cliente delante (el wizard o el motor de crédito); este
8
- * lambda no sale a buscarlos a otro silo en el camino caliente.
9
- *
10
- * Un hecho AUSENTE hace que su filtro NO se cumpla: sin el dato no se puede afirmar que el cliente
11
- * califica, y de las dos salidas la segura es dejarlo fuera.
6
+ * Body de POST /private/segments/resolve — el cliente y, opcionalmente, sus datos para evaluar los
7
+ * cohorts. Si el llamador no manda los datos, loan-offerings los pide a loan-credit.
12
8
  */
13
- export class ResolveCustomerSegmentsRequest {
9
+ export class ResolveCustomerSegmentsRequest extends CustomerSegmentFacts {
14
10
  @Expose()
15
11
  @IsString()
16
12
  retailCustomerId!: string;
17
-
18
- /** Colaborador de la red. Hoy ningún sistema lo produce — ver la lista de individuos. */
19
- @Expose()
20
- @IsOptional()
21
- @IsBoolean()
22
- isEmployee?: boolean;
23
-
24
- /** Nivel que resolvió loan-scoring a partir del SCI. */
25
- @Expose()
26
- @IsOptional()
27
- @IsEnum(CreditPlanLevelEnum)
28
- sciLevel?: CreditPlanLevelEnum;
29
-
30
- /** Créditos cerrados en toda la vida del cliente. */
31
- @Expose()
32
- @IsOptional()
33
- @IsInt()
34
- @Min(0)
35
- completedCredits?: number;
36
-
37
- /** Días de mora acumulados en la ventana de 180 días. `0` es sin mora. */
38
- @Expose()
39
- @IsOptional()
40
- @IsInt()
41
- @Min(0)
42
- delinquencyDaysLast6M?: number;
43
-
44
- /** Bajas contables vitalicias. `0` es ninguna. */
45
- @Expose()
46
- @IsOptional()
47
- @IsInt()
48
- @Min(0)
49
- lifetimeWriteOffs?: number;
50
-
51
- /** Reestructuras vitalicias. `0` es ninguna. */
52
- @Expose()
53
- @IsOptional()
54
- @IsInt()
55
- @Min(0)
56
- lifetimeRestructures?: number;
57
13
  }
@@ -0,0 +1,17 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, ValidateNested } from 'class-validator';
3
+ import { ResolveCustomerSegmentsRequest } from './ResolveCustomerSegmentsRequest';
4
+
5
+ /**
6
+ * Body de POST /private/segments/members — pertenencia a segmentos en lote, con cohorts. Cada
7
+ * cliente viaja con sus datos si el llamador los tiene; los que falten los pide loan-offerings.
8
+ */
9
+ export class ResolveSegmentMembersRequest {
10
+ @Expose()
11
+ @IsArray()
12
+ @ArrayMinSize(1)
13
+ @ArrayMaxSize(100)
14
+ @ValidateNested({ each: true })
15
+ @Type(() => ResolveCustomerSegmentsRequest)
16
+ customers!: ResolveCustomerSegmentsRequest[];
17
+ }
@@ -0,0 +1,21 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, IsString, ValidateNested } from 'class-validator';
3
+ import { CohortCondition } from './CohortCondition';
4
+
5
+ /**
6
+ * Body de POST /cohorts/test — prueba unas condiciones, guardadas o no, con un cliente. Devuelve
7
+ * los datos del cliente y el resultado de cada condición.
8
+ */
9
+ export class TestCohortRequest {
10
+ @Expose()
11
+ @IsString()
12
+ retailCustomerId!: string;
13
+
14
+ @Expose()
15
+ @IsArray()
16
+ @ArrayMinSize(1)
17
+ @ArrayMaxSize(10)
18
+ @ValidateNested({ each: true })
19
+ @Type(() => CohortCondition)
20
+ conditions!: CohortCondition[];
21
+ }
@@ -0,0 +1,9 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsString } from 'class-validator';
3
+
4
+ /** Body de POST /segments/test — en qué segmentos cae un cliente y por qué. */
5
+ export class TestCustomerSegmentsRequest {
6
+ @Expose()
7
+ @IsString()
8
+ retailCustomerId!: string;
9
+ }
@@ -0,0 +1,37 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, IsOptional, IsString, MaxLength, ValidateNested } from 'class-validator';
3
+ import { CohortCondition } from './CohortCondition';
4
+
5
+ /**
6
+ * Body de PUT /cohorts/:cohortId — edición parcial; ausente deja el campo como está. Sube
7
+ * `version`. El cambio de estado va por su endpoint dedicado.
8
+ */
9
+ export class UpdateCohortRequest {
10
+ @Expose()
11
+ @IsOptional()
12
+ @IsString()
13
+ @MaxLength(120)
14
+ name?: string;
15
+
16
+ @Expose()
17
+ @IsOptional()
18
+ @IsString()
19
+ @MaxLength(500)
20
+ description?: string;
21
+
22
+ /** Reemplaza todas las condiciones. */
23
+ @Expose()
24
+ @IsOptional()
25
+ @IsArray()
26
+ @ArrayMinSize(1)
27
+ @ArrayMaxSize(10)
28
+ @ValidateNested({ each: true })
29
+ @Type(() => CohortCondition)
30
+ conditions?: CohortCondition[];
31
+
32
+ @Expose()
33
+ @IsOptional()
34
+ @IsString()
35
+ @MaxLength(280)
36
+ reason?: string;
37
+ }
@@ -1,5 +1,5 @@
1
1
  import { Expose } from 'class-transformer';
2
- import { IsArray, IsEnum, IsOptional, IsString, MaxLength } from 'class-validator';
2
+ import { ArrayMaxSize, IsArray, IsEnum, IsNotEmpty, IsOptional, IsString, MaxLength } from 'class-validator';
3
3
  import { SegmentColorSlotEnum } from '../../enums/SegmentColorSlotEnum';
4
4
 
5
5
  /**
@@ -27,12 +27,14 @@ export class UpdateSegmentRequest {
27
27
  @IsEnum(SegmentColorSlotEnum)
28
28
  colorSlot?: SegmentColorSlotEnum;
29
29
 
30
- /** Reemplaza la lista entera; `[]` deja el segmento sin filtros. */
30
+ /** Reemplaza la lista entera; `[]` deja el segmento sin cohorts. */
31
31
  @Expose()
32
32
  @IsOptional()
33
33
  @IsArray()
34
34
  @IsString({ each: true })
35
- filterIds?: string[];
35
+ @IsNotEmpty({ each: true })
36
+ @ArrayMaxSize(20)
37
+ cohortIds?: string[];
36
38
 
37
39
  /** Reemplaza la lista entera; `[]` saca a todos los agregados a mano. */
38
40
  @Expose()
@@ -0,0 +1,36 @@
1
+ import { CohortFactKeyEnum } from '../../enums/CohortFactKeyEnum';
2
+ import { CohortFactTypeEnum } from '../../enums/CohortFactTypeEnum';
3
+ import { CohortOperatorEnum } from '../../enums/CohortOperatorEnum';
4
+
5
+ /** Una opción de un dato de tipo `SELECT`. */
6
+ export interface CohortFactOption {
7
+ value: string;
8
+ label: string;
9
+ }
10
+
11
+ /**
12
+ * Un dato del cliente tal como lo pinta el armador de cohorts. El front lo toma de acá en vez de
13
+ * duplicar la lista.
14
+ */
15
+ export interface CohortFactFieldResponse {
16
+ key: CohortFactKeyEnum;
17
+ type: CohortFactTypeEnum;
18
+ label: string;
19
+ unit: string | null;
20
+ /** Solo en `SELECT`. */
21
+ options: CohortFactOption[] | null;
22
+ /** Operadores que admite su tipo. */
23
+ operators: CohortOperatorEnum[];
24
+ /**
25
+ * `false` cuando ningún sistema produce el dato: el armador lo muestra deshabilitado y el lambda
26
+ * rechaza guardar un cohort que lo use (422).
27
+ */
28
+ hasSource: boolean;
29
+ /** Por qué no tiene fuente. `null` cuando `hasSource` es `true`. */
30
+ missingSourceReason: string | null;
31
+ }
32
+
33
+ /** Respuesta de GET /cohorts/catalog. */
34
+ export interface CohortCatalogResponse {
35
+ fields: CohortFactFieldResponse[];
36
+ }
@@ -0,0 +1,12 @@
1
+ import { CohortLogEventEnum } from '../../enums/CohortLogEventEnum';
2
+
3
+ /** Un evento de la bitácora de un cohort. */
4
+ export interface CohortLogEntryResponse {
5
+ cohortId: string;
6
+ cohortName: string;
7
+ event: CohortLogEventEnum;
8
+ occurredAt: string;
9
+ performedBy: string;
10
+ reason: string | null;
11
+ version: number;
12
+ }