@fiado/type-kit 3.429.0 → 3.431.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 (156) hide show
  1. package/_test_/unit/collection/deregisterChargeStatus.test.ts +19 -0
  2. package/_test_/unit/loanCredit/creditLifecycleEnums.test.ts +68 -0
  3. package/_test_/unit/loanCredit/dtos/creditLifecycleRequests.test.ts +196 -0
  4. package/_test_/unit/loanOfferings/amortizationScheduleRequest.test.ts +44 -0
  5. package/_test_/unit/messagesConnector/otpMessagePurposeEnum.test.ts +65 -0
  6. package/bin/collection/enums/DeregisterChargeStatus.d.ts +3 -1
  7. package/bin/collection/enums/DeregisterChargeStatus.js +2 -0
  8. package/bin/loanCredit/dtos/RestructureTerms.d.ts +9 -0
  9. package/bin/loanCredit/dtos/RestructureTerms.js +36 -0
  10. package/bin/loanCredit/dtos/WriteOffConfirmations.d.ts +7 -0
  11. package/bin/loanCredit/dtos/WriteOffConfirmations.js +30 -0
  12. package/bin/loanCredit/dtos/requests/BackofficeAcceptRestructureRequest.d.ts +5 -0
  13. package/bin/loanCredit/dtos/requests/BackofficeAcceptRestructureRequest.js +24 -0
  14. package/bin/loanCredit/dtos/requests/BackofficeApplyAdvanceRequest.d.ts +7 -0
  15. package/bin/loanCredit/dtos/requests/BackofficeApplyAdvanceRequest.js +31 -0
  16. package/bin/loanCredit/dtos/requests/BackofficeApplyPrepaymentRequest.d.ts +4 -0
  17. package/bin/loanCredit/dtos/requests/BackofficeApplyPrepaymentRequest.js +24 -0
  18. package/bin/loanCredit/dtos/requests/BackofficeApproveRestructureRequest.d.ts +8 -0
  19. package/bin/loanCredit/dtos/requests/BackofficeApproveRestructureRequest.js +32 -0
  20. package/bin/loanCredit/dtos/requests/BackofficeCollectWrittenOffCreditRequest.d.ts +5 -0
  21. package/bin/loanCredit/dtos/requests/BackofficeCollectWrittenOffCreditRequest.js +24 -0
  22. package/bin/loanCredit/dtos/requests/BackofficeListPaymentsInReviewRequest.d.ts +6 -0
  23. package/bin/loanCredit/dtos/requests/BackofficeListPaymentsInReviewRequest.js +33 -0
  24. package/bin/loanCredit/dtos/requests/BackofficeListWriteOffCandidatesRequest.d.ts +6 -0
  25. package/bin/loanCredit/dtos/requests/BackofficeListWriteOffCandidatesRequest.js +33 -0
  26. package/bin/loanCredit/dtos/requests/BackofficeProposeRestructureRequest.d.ts +7 -0
  27. package/bin/loanCredit/dtos/requests/BackofficeProposeRestructureRequest.js +32 -0
  28. package/bin/loanCredit/dtos/requests/BackofficeRejectRestructureRequest.d.ts +5 -0
  29. package/bin/loanCredit/dtos/requests/BackofficeRejectRestructureRequest.js +24 -0
  30. package/bin/loanCredit/dtos/requests/BackofficeResolvePaymentReviewRequest.d.ts +11 -0
  31. package/bin/loanCredit/dtos/requests/BackofficeResolvePaymentReviewRequest.js +44 -0
  32. package/bin/loanCredit/dtos/requests/BackofficeSettleCreditRequest.d.ts +5 -0
  33. package/bin/loanCredit/dtos/requests/BackofficeSettleCreditRequest.js +24 -0
  34. package/bin/loanCredit/dtos/requests/BackofficeWriteOffCreditRequest.d.ts +7 -0
  35. package/bin/loanCredit/dtos/requests/BackofficeWriteOffCreditRequest.js +33 -0
  36. package/bin/loanCredit/dtos/responses/LoanAdHocChargeRequested.d.ts +9 -0
  37. package/bin/loanCredit/dtos/responses/LoanAdHocChargeRequested.js +2 -0
  38. package/bin/loanCredit/dtos/responses/LoanOtpDispatch.d.ts +5 -0
  39. package/bin/loanCredit/dtos/responses/LoanOtpDispatch.js +2 -0
  40. package/bin/loanCredit/dtos/responses/LoanPaymentReviewItem.d.ts +12 -0
  41. package/bin/loanCredit/dtos/responses/LoanPaymentReviewItem.js +2 -0
  42. package/bin/loanCredit/dtos/responses/LoanPaymentReviewListResponse.d.ts +7 -0
  43. package/bin/loanCredit/dtos/responses/LoanPaymentReviewListResponse.js +2 -0
  44. package/bin/loanCredit/dtos/responses/LoanPaymentReviewResolution.d.ts +11 -0
  45. package/bin/loanCredit/dtos/responses/LoanPaymentReviewResolution.js +2 -0
  46. package/bin/loanCredit/dtos/responses/LoanPrepaymentQuote.d.ts +10 -0
  47. package/bin/loanCredit/dtos/responses/LoanPrepaymentQuote.js +2 -0
  48. package/bin/loanCredit/dtos/responses/LoanRestructure.d.ts +22 -0
  49. package/bin/loanCredit/dtos/responses/LoanRestructure.js +2 -0
  50. package/bin/loanCredit/dtos/responses/LoanRestructureListResponse.d.ts +7 -0
  51. package/bin/loanCredit/dtos/responses/LoanRestructureListResponse.js +2 -0
  52. package/bin/loanCredit/dtos/responses/LoanRestructurePreview.d.ts +15 -0
  53. package/bin/loanCredit/dtos/responses/LoanRestructurePreview.js +2 -0
  54. package/bin/loanCredit/dtos/responses/LoanRestructurePreviewInstallment.d.ts +11 -0
  55. package/bin/loanCredit/dtos/responses/LoanRestructurePreviewInstallment.js +2 -0
  56. package/bin/loanCredit/dtos/responses/LoanSettlementQuote.d.ts +16 -0
  57. package/bin/loanCredit/dtos/responses/LoanSettlementQuote.js +2 -0
  58. package/bin/loanCredit/dtos/responses/LoanSettlementRequested.d.ts +11 -0
  59. package/bin/loanCredit/dtos/responses/LoanSettlementRequested.js +2 -0
  60. package/bin/loanCredit/dtos/responses/LoanWriteOffCandidateItem.d.ts +13 -0
  61. package/bin/loanCredit/dtos/responses/LoanWriteOffCandidateItem.js +2 -0
  62. package/bin/loanCredit/dtos/responses/LoanWriteOffCandidateListResponse.d.ts +7 -0
  63. package/bin/loanCredit/dtos/responses/LoanWriteOffCandidateListResponse.js +2 -0
  64. package/bin/loanCredit/dtos/responses/LoanWriteOffResult.d.ts +12 -0
  65. package/bin/loanCredit/dtos/responses/LoanWriteOffResult.js +2 -0
  66. package/bin/loanCredit/enums/ContractTypeEnum.d.ts +7 -5
  67. package/bin/loanCredit/enums/ContractTypeEnum.js +6 -4
  68. package/bin/loanCredit/enums/LoanAdHocChargeKindEnum.d.ts +10 -0
  69. package/bin/loanCredit/enums/LoanAdHocChargeKindEnum.js +14 -0
  70. package/bin/loanCredit/enums/LoanChargeKindEnum.d.ts +11 -0
  71. package/bin/loanCredit/enums/LoanChargeKindEnum.js +15 -0
  72. package/bin/loanCredit/enums/LoanRestructureStatusEnum.d.ts +11 -0
  73. package/bin/loanCredit/enums/LoanRestructureStatusEnum.js +15 -0
  74. package/bin/loanCredit/enums/LoanSettlementStatusEnum.d.ts +7 -0
  75. package/bin/loanCredit/enums/LoanSettlementStatusEnum.js +11 -0
  76. package/bin/loanCredit/enums/PaymentReviewActionEnum.d.ts +9 -0
  77. package/bin/loanCredit/enums/PaymentReviewActionEnum.js +13 -0
  78. package/bin/loanCredit/enums/PaymentReviewReasonEnum.d.ts +16 -0
  79. package/bin/loanCredit/enums/PaymentReviewReasonEnum.js +20 -0
  80. package/bin/loanCredit/enums/PaymentReviewResolutionEnum.d.ts +13 -0
  81. package/bin/loanCredit/enums/PaymentReviewResolutionEnum.js +17 -0
  82. package/bin/loanCredit/enums/RefundDestinationEnum.d.ts +8 -0
  83. package/bin/loanCredit/enums/RefundDestinationEnum.js +12 -0
  84. package/bin/loanCredit/enums/WrittenOffRecoveryTypeEnum.d.ts +8 -0
  85. package/bin/loanCredit/enums/WrittenOffRecoveryTypeEnum.js +12 -0
  86. package/bin/loanCredit/index.d.ts +38 -0
  87. package/bin/loanCredit/index.js +39 -0
  88. package/bin/loanOfferings/dtos/requests/ComputeAmortizationScheduleRequest.d.ts +11 -0
  89. package/bin/loanOfferings/dtos/requests/ComputeAmortizationScheduleRequest.js +43 -0
  90. package/bin/loanOfferings/dtos/responses/AmortizationScheduleResponse.d.ts +12 -0
  91. package/bin/loanOfferings/dtos/responses/AmortizationScheduleResponse.js +2 -0
  92. package/bin/loanOfferings/dtos/responses/AmortizationScheduleRow.d.ts +10 -0
  93. package/bin/loanOfferings/dtos/responses/AmortizationScheduleRow.js +2 -0
  94. package/bin/loanOfferings/index.d.ts +3 -0
  95. package/bin/loanOfferings/index.js +3 -0
  96. package/bin/messagesConnector/dtos/SendMessageRequest.d.ts +2 -0
  97. package/bin/messagesConnector/dtos/SendMessageRequest.js +7 -0
  98. package/bin/messagesConnector/dtos/VerifyOtpRequest.d.ts +2 -0
  99. package/bin/messagesConnector/dtos/VerifyOtpRequest.js +7 -0
  100. package/bin/messagesConnector/enums/OtpMessagePurposeEnum.d.ts +9 -0
  101. package/bin/messagesConnector/enums/OtpMessagePurposeEnum.js +13 -0
  102. package/bin/messagesConnector/index.d.ts +1 -0
  103. package/bin/messagesConnector/index.js +1 -0
  104. package/bin/transactionProcessor/enums/CreditContractStatusEnum.d.ts +8 -1
  105. package/bin/transactionProcessor/enums/CreditContractStatusEnum.js +7 -0
  106. package/package.json +1 -1
  107. package/src/collection/enums/DeregisterChargeStatus.ts +2 -0
  108. package/src/loanCredit/dtos/RestructureTerms.ts +23 -0
  109. package/src/loanCredit/dtos/WriteOffConfirmations.ts +17 -0
  110. package/src/loanCredit/dtos/requests/BackofficeAcceptRestructureRequest.ts +11 -0
  111. package/src/loanCredit/dtos/requests/BackofficeApplyAdvanceRequest.ts +18 -0
  112. package/src/loanCredit/dtos/requests/BackofficeApplyPrepaymentRequest.ts +10 -0
  113. package/src/loanCredit/dtos/requests/BackofficeApproveRestructureRequest.ts +19 -0
  114. package/src/loanCredit/dtos/requests/BackofficeCollectWrittenOffCreditRequest.ts +10 -0
  115. package/src/loanCredit/dtos/requests/BackofficeListPaymentsInReviewRequest.ts +19 -0
  116. package/src/loanCredit/dtos/requests/BackofficeListWriteOffCandidatesRequest.ts +19 -0
  117. package/src/loanCredit/dtos/requests/BackofficeProposeRestructureRequest.ts +18 -0
  118. package/src/loanCredit/dtos/requests/BackofficeRejectRestructureRequest.ts +11 -0
  119. package/src/loanCredit/dtos/requests/BackofficeResolvePaymentReviewRequest.ts +30 -0
  120. package/src/loanCredit/dtos/requests/BackofficeSettleCreditRequest.ts +11 -0
  121. package/src/loanCredit/dtos/requests/BackofficeWriteOffCreditRequest.ts +19 -0
  122. package/src/loanCredit/dtos/responses/LoanAdHocChargeRequested.ts +10 -0
  123. package/src/loanCredit/dtos/responses/LoanOtpDispatch.ts +5 -0
  124. package/src/loanCredit/dtos/responses/LoanPaymentReviewItem.ts +13 -0
  125. package/src/loanCredit/dtos/responses/LoanPaymentReviewListResponse.ts +8 -0
  126. package/src/loanCredit/dtos/responses/LoanPaymentReviewResolution.ts +12 -0
  127. package/src/loanCredit/dtos/responses/LoanPrepaymentQuote.ts +10 -0
  128. package/src/loanCredit/dtos/responses/LoanRestructure.ts +23 -0
  129. package/src/loanCredit/dtos/responses/LoanRestructureListResponse.ts +8 -0
  130. package/src/loanCredit/dtos/responses/LoanRestructurePreview.ts +16 -0
  131. package/src/loanCredit/dtos/responses/LoanRestructurePreviewInstallment.ts +11 -0
  132. package/src/loanCredit/dtos/responses/LoanSettlementQuote.ts +16 -0
  133. package/src/loanCredit/dtos/responses/LoanSettlementRequested.ts +12 -0
  134. package/src/loanCredit/dtos/responses/LoanWriteOffCandidateItem.ts +14 -0
  135. package/src/loanCredit/dtos/responses/LoanWriteOffCandidateListResponse.ts +8 -0
  136. package/src/loanCredit/dtos/responses/LoanWriteOffResult.ts +13 -0
  137. package/src/loanCredit/enums/ContractTypeEnum.ts +6 -4
  138. package/src/loanCredit/enums/LoanAdHocChargeKindEnum.ts +10 -0
  139. package/src/loanCredit/enums/LoanChargeKindEnum.ts +11 -0
  140. package/src/loanCredit/enums/LoanRestructureStatusEnum.ts +11 -0
  141. package/src/loanCredit/enums/LoanSettlementStatusEnum.ts +7 -0
  142. package/src/loanCredit/enums/PaymentReviewActionEnum.ts +9 -0
  143. package/src/loanCredit/enums/PaymentReviewReasonEnum.ts +16 -0
  144. package/src/loanCredit/enums/PaymentReviewResolutionEnum.ts +13 -0
  145. package/src/loanCredit/enums/RefundDestinationEnum.ts +8 -0
  146. package/src/loanCredit/enums/WrittenOffRecoveryTypeEnum.ts +8 -0
  147. package/src/loanCredit/index.ts +40 -0
  148. package/src/loanOfferings/dtos/requests/ComputeAmortizationScheduleRequest.ts +30 -0
  149. package/src/loanOfferings/dtos/responses/AmortizationScheduleResponse.ts +13 -0
  150. package/src/loanOfferings/dtos/responses/AmortizationScheduleRow.ts +10 -0
  151. package/src/loanOfferings/index.ts +3 -0
  152. package/src/messagesConnector/dtos/SendMessageRequest.ts +2 -0
  153. package/src/messagesConnector/dtos/VerifyOtpRequest.ts +3 -1
  154. package/src/messagesConnector/enums/OtpMessagePurposeEnum.ts +9 -0
  155. package/src/messagesConnector/index.ts +1 -0
  156. package/src/transactionProcessor/enums/CreditContractStatusEnum.ts +8 -1
@@ -0,0 +1,19 @@
1
+ import 'reflect-metadata';
2
+ import { Collection } from '../../../src/index';
3
+ import { DeregisterChargeStatus } from '../../../src/collection/index';
4
+
5
+ describe('DeregisterChargeStatus', () => {
6
+ it('suma IN_FLIGHT a los desenlaces de la baja', () => {
7
+ expect(Object.values(DeregisterChargeStatus).sort()).toEqual(['ALREADY_TERMINAL', 'CANCELLED', 'IN_FLIGHT']);
8
+ });
9
+
10
+ it('cada clave es igual a su valor', () => {
11
+ for (const [key, value] of Object.entries(DeregisterChargeStatus)) {
12
+ expect(key).toBe(value);
13
+ }
14
+ });
15
+
16
+ it('sale por el index raíz', () => {
17
+ expect(Collection.DeregisterChargeStatus.IN_FLIGHT).toBe('IN_FLIGHT');
18
+ });
19
+ });
@@ -0,0 +1,68 @@
1
+ import 'reflect-metadata';
2
+ import { LoanCredit } from '../../../src/index';
3
+ import {
4
+ ContractTypeEnum,
5
+ LoanAdHocChargeKindEnum,
6
+ LoanChargeKindEnum,
7
+ LoanRestructureStatusEnum,
8
+ LoanSettlementStatusEnum,
9
+ PaymentReviewActionEnum,
10
+ PaymentReviewReasonEnum,
11
+ PaymentReviewResolutionEnum,
12
+ RefundDestinationEnum,
13
+ WrittenOffRecoveryTypeEnum,
14
+ } from '../../../src/loanCredit/index';
15
+
16
+ const sortedValues = (enumObject: Record<string, string>) => Object.values(enumObject).sort();
17
+
18
+ describe('ContractTypeEnum', () => {
19
+ it('suma los documentos del ciclo de vida a los tres de la originación', () => {
20
+ expect(sortedValues(ContractTypeEnum)).toEqual(
21
+ [
22
+ 'CREDIT',
23
+ 'PROMISSORY_NOTE',
24
+ 'SIC_AUTHORIZATION',
25
+ 'RESTRUCTURE_ADDENDUM',
26
+ 'ADVANCE_AUTHORIZATION',
27
+ 'SETTLEMENT_CERTIFICATE',
28
+ 'PAYMENT_RECEIPT',
29
+ 'ACCOUNT_STATEMENT',
30
+ ].sort(),
31
+ );
32
+ });
33
+ });
34
+
35
+ describe.each([
36
+ ['LoanSettlementStatusEnum', LoanSettlementStatusEnum, ['PENDING']],
37
+ ['LoanAdHocChargeKindEnum', LoanAdHocChargeKindEnum, ['SETTLEMENT', 'RECOVERY', 'PREPAYMENT', 'ADVANCE']],
38
+ ['WrittenOffRecoveryTypeEnum', WrittenOffRecoveryTypeEnum, ['OVERDUE', 'SETTLEMENT']],
39
+ ['LoanRestructureStatusEnum', LoanRestructureStatusEnum, ['PROPOSED', 'APPROVED', 'REJECTED', 'PENDING_REGISTRATION', 'EXECUTED']],
40
+ ['LoanChargeKindEnum', LoanChargeKindEnum, ['INSTALLMENT', 'SETTLEMENT', 'RECOVERY', 'PREPAYMENT', 'ADVANCE']],
41
+ [
42
+ 'PaymentReviewReasonEnum',
43
+ PaymentReviewReasonEnum,
44
+ ['OVERPAYMENT', 'INSTALLMENT_CLOSED', 'CREDIT_NOT_COLLECTIBLE', 'LEGACY_INSTALLMENT_WITH_PAYMENT', 'UNCAPTURED_HOLD'],
45
+ ],
46
+ ['PaymentReviewActionEnum', PaymentReviewActionEnum, ['APPLY', 'REFUND', 'RECONCILE']],
47
+ ['RefundDestinationEnum', RefundDestinationEnum, ['CUSTOMER_ACCOUNT', 'PCF_CLABE']],
48
+ ['PaymentReviewResolutionEnum', PaymentReviewResolutionEnum, ['APPLIED', 'REFUNDED', 'REFUND_PENDING', 'REFUND_REJECTED', 'RECONCILED']],
49
+ ])('%s', (_name, enumObject, expected) => {
50
+ it('tiene exactamente los valores del contrato', () => {
51
+ expect(sortedValues(enumObject)).toEqual([...expected].sort());
52
+ });
53
+
54
+ it('cada clave es igual a su valor', () => {
55
+ for (const [key, value] of Object.entries(enumObject)) {
56
+ expect(key).toBe(value);
57
+ }
58
+ });
59
+ });
60
+
61
+ describe('export por el index raíz', () => {
62
+ it('expone los DTOs del ciclo de vida en el namespace LoanCredit', () => {
63
+ expect(LoanCredit.BackofficeSettleCreditRequest).toBeDefined();
64
+ expect(LoanCredit.BackofficeResolvePaymentReviewRequest).toBeDefined();
65
+ expect(LoanCredit.RestructureTerms).toBeDefined();
66
+ expect(LoanCredit.PaymentReviewResolutionEnum.REFUND_PENDING).toBe('REFUND_PENDING');
67
+ });
68
+ });
@@ -0,0 +1,196 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import {
5
+ BackofficeAcceptRestructureRequest,
6
+ BackofficeApplyAdvanceRequest,
7
+ BackofficeApplyPrepaymentRequest,
8
+ BackofficeApproveRestructureRequest,
9
+ BackofficeCollectWrittenOffCreditRequest,
10
+ BackofficeListPaymentsInReviewRequest,
11
+ BackofficeListWriteOffCandidatesRequest,
12
+ BackofficeProposeRestructureRequest,
13
+ BackofficeRejectRestructureRequest,
14
+ BackofficeResolvePaymentReviewRequest,
15
+ BackofficeSettleCreditRequest,
16
+ BackofficeWriteOffCreditRequest,
17
+ PaymentReviewActionEnum,
18
+ RefundDestinationEnum,
19
+ WrittenOffRecoveryTypeEnum,
20
+ } from '../../../../src/loanCredit/index';
21
+
22
+ type RequestClass = new () => object;
23
+
24
+ /** Propiedades con error, recorriendo los hijos anidados como `padre.hijo`. */
25
+ const errorPaths = async (dtoClass: RequestClass, body: object): Promise<string[]> => {
26
+ const dto = plainToInstance(dtoClass, body);
27
+ const errors = await validate(dto, { whitelist: true, forbidNonWhitelisted: false });
28
+ const paths: string[] = [];
29
+ const walk = (list: typeof errors, prefix: string) => {
30
+ for (const error of list) {
31
+ const path = `${prefix}${error.property}`;
32
+ if (error.constraints) paths.push(path);
33
+ if (error.children?.length) walk(error.children, `${path}.`);
34
+ }
35
+ };
36
+ walk(errors, '');
37
+ return paths;
38
+ };
39
+
40
+ const TERMS = { newTermWeeks: 20, newTnaAnnual: 2.3 };
41
+
42
+ describe('BackofficeSettleCreditRequest', () => {
43
+ it('acepta un monto entero positivo', async () => {
44
+ expect(await errorPaths(BackofficeSettleCreditRequest, { amountCents: 150000 })).toEqual([]);
45
+ });
46
+
47
+ it.each([[{}], [{ amountCents: 0 }], [{ amountCents: 10.5 }], [{ amountCents: '100' }]])('rechaza %j', async body => {
48
+ expect(await errorPaths(BackofficeSettleCreditRequest, body)).toContain('amountCents');
49
+ });
50
+ });
51
+
52
+ describe('BackofficeWriteOffCreditRequest', () => {
53
+ it('acepta el body vacío: el lambda responde los códigos específicos', async () => {
54
+ expect(await errorPaths(BackofficeWriteOffCreditRequest, {})).toEqual([]);
55
+ });
56
+
57
+ it('acepta motivo y las dos confirmaciones', async () => {
58
+ const body = { reason: 'Sin contacto', confirmations: { recoveryResourcesExhausted: true, overdueDaysMet: true } };
59
+
60
+ expect(await errorPaths(BackofficeWriteOffCreditRequest, body)).toEqual([]);
61
+ });
62
+
63
+ it('rechaza un motivo vacío y una confirmación que no es booleana', async () => {
64
+ const body = { reason: '', confirmations: { recoveryResourcesExhausted: 'yes' } };
65
+
66
+ expect(await errorPaths(BackofficeWriteOffCreditRequest, body)).toEqual(
67
+ expect.arrayContaining(['reason', 'confirmations.recoveryResourcesExhausted']),
68
+ );
69
+ });
70
+ });
71
+
72
+ describe('BackofficeCollectWrittenOffCreditRequest', () => {
73
+ it('acepta un tipo de recuperación del enum', async () => {
74
+ const body = { recoveryType: WrittenOffRecoveryTypeEnum.SETTLEMENT };
75
+
76
+ expect(await errorPaths(BackofficeCollectWrittenOffCreditRequest, body)).toEqual([]);
77
+ });
78
+
79
+ it.each([[{}], [{ recoveryType: 'PARTIAL' }]])('rechaza %j', async body => {
80
+ expect(await errorPaths(BackofficeCollectWrittenOffCreditRequest, body)).toContain('recoveryType');
81
+ });
82
+ });
83
+
84
+ describe('BackofficeProposeRestructureRequest', () => {
85
+ it('acepta justificación y términos sin pago inicial', async () => {
86
+ expect(await errorPaths(BackofficeProposeRestructureRequest, { justification: 'Perdió empleo', terms: TERMS })).toEqual([]);
87
+ });
88
+
89
+ it('exige justificación y términos', async () => {
90
+ expect(await errorPaths(BackofficeProposeRestructureRequest, {})).toEqual(expect.arrayContaining(['justification', 'terms']));
91
+ });
92
+
93
+ it('valida los términos anidados', async () => {
94
+ const body = { justification: 'x', terms: { newTermWeeks: 0, newTnaAnnual: 'alta', initialPaymentPct: -1 } };
95
+
96
+ expect(await errorPaths(BackofficeProposeRestructureRequest, body)).toEqual(
97
+ expect.arrayContaining(['terms.newTermWeeks', 'terms.newTnaAnnual', 'terms.initialPaymentPct']),
98
+ );
99
+ });
100
+ });
101
+
102
+ describe('BackofficeApproveRestructureRequest', () => {
103
+ it('aprueba como se propuso: sin términos', async () => {
104
+ expect(await errorPaths(BackofficeApproveRestructureRequest, { reason: 'Procede' })).toEqual([]);
105
+ });
106
+
107
+ it('valida los términos ajustados cuando vienen', async () => {
108
+ const body = { reason: 'Ajuste', terms: { newTnaAnnual: 2 } };
109
+
110
+ expect(await errorPaths(BackofficeApproveRestructureRequest, body)).toContain('terms.newTermWeeks');
111
+ });
112
+
113
+ it('exige el motivo', async () => {
114
+ expect(await errorPaths(BackofficeApproveRestructureRequest, { reason: '' })).toContain('reason');
115
+ });
116
+ });
117
+
118
+ describe('BackofficeRejectRestructureRequest', () => {
119
+ it('exige el motivo', async () => {
120
+ expect(await errorPaths(BackofficeRejectRestructureRequest, {})).toContain('reason');
121
+ expect(await errorPaths(BackofficeRejectRestructureRequest, { reason: 'No procede' })).toEqual([]);
122
+ });
123
+ });
124
+
125
+ describe('BackofficeAcceptRestructureRequest', () => {
126
+ it('acepta un OTP de 4 dígitos', async () => {
127
+ expect(await errorPaths(BackofficeAcceptRestructureRequest, { otpCode: '0427' })).toEqual([]);
128
+ });
129
+
130
+ it.each([[{}], [{ otpCode: '12345' }], [{ otpCode: '12a4' }]])('rechaza %j', async body => {
131
+ expect(await errorPaths(BackofficeAcceptRestructureRequest, body)).toContain('otpCode');
132
+ });
133
+ });
134
+
135
+ describe('BackofficeApplyPrepaymentRequest', () => {
136
+ it('exige un monto entero positivo', async () => {
137
+ expect(await errorPaths(BackofficeApplyPrepaymentRequest, { amountCents: 5000 })).toEqual([]);
138
+ expect(await errorPaths(BackofficeApplyPrepaymentRequest, { amountCents: 0 })).toContain('amountCents');
139
+ });
140
+ });
141
+
142
+ describe('BackofficeApplyAdvanceRequest', () => {
143
+ it('acepta el adelanto sin OTP', async () => {
144
+ expect(await errorPaths(BackofficeApplyAdvanceRequest, { installmentCount: 2 })).toEqual([]);
145
+ });
146
+
147
+ it('rechaza cuotas en cero y un OTP mal formado', async () => {
148
+ expect(await errorPaths(BackofficeApplyAdvanceRequest, { installmentCount: 0, otpCode: '1' })).toEqual(
149
+ expect.arrayContaining(['installmentCount', 'otpCode']),
150
+ );
151
+ });
152
+ });
153
+
154
+ describe('BackofficeResolvePaymentReviewRequest', () => {
155
+ it('acepta APPLY sin datos de devolución', async () => {
156
+ expect(await errorPaths(BackofficeResolvePaymentReviewRequest, { action: PaymentReviewActionEnum.APPLY })).toEqual([]);
157
+ });
158
+
159
+ it('acepta REFUND a la cuenta del cliente con CLABE de 18 dígitos', async () => {
160
+ const body = {
161
+ action: PaymentReviewActionEnum.REFUND,
162
+ refundDestination: RefundDestinationEnum.CUSTOMER_ACCOUNT,
163
+ clabe: '012180001234567891',
164
+ };
165
+
166
+ expect(await errorPaths(BackofficeResolvePaymentReviewRequest, body)).toEqual([]);
167
+ });
168
+
169
+ it('rechaza acción y destino fuera del enum, CLABE corta y confirmación no booleana', async () => {
170
+ const body = { action: 'DELETE', refundDestination: 'CASH', clabe: '0121', customerConfirmedPcfClabe: 'true' };
171
+
172
+ expect(await errorPaths(BackofficeResolvePaymentReviewRequest, body)).toEqual(
173
+ expect.arrayContaining(['action', 'refundDestination', 'clabe', 'customerConfirmedPcfClabe']),
174
+ );
175
+ });
176
+ });
177
+
178
+ describe.each([
179
+ ['BackofficeListWriteOffCandidatesRequest', BackofficeListWriteOffCandidatesRequest],
180
+ ['BackofficeListPaymentsInReviewRequest', BackofficeListPaymentsInReviewRequest],
181
+ ])('%s', (_name, dtoClass) => {
182
+ it('acepta la primera página sin parámetros', async () => {
183
+ expect(await errorPaths(dtoClass, {})).toEqual([]);
184
+ });
185
+
186
+ it('convierte el limit que llega como texto', async () => {
187
+ const dto = plainToInstance(dtoClass, { limit: '25', nextToken: 'abc' }) as { limit?: number };
188
+
189
+ expect(await errorPaths(dtoClass, { limit: '25', nextToken: 'abc' })).toEqual([]);
190
+ expect(dto.limit).toBe(25);
191
+ });
192
+
193
+ it.each([[0], [101]])('rechaza limit %p', async limit => {
194
+ expect(await errorPaths(dtoClass, { limit })).toContain('limit');
195
+ });
196
+ });
@@ -0,0 +1,44 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { LoanOfferings } from '../../../src/index';
5
+ import { AmortizationScheduleResponse, ComputeAmortizationScheduleRequest } from '../../../src/loanOfferings/index';
6
+
7
+ const VALID = { financedAmountCents: 250000, tnaAnnual: 2.3, termWeeks: 20, ivaOnInterest: 0.16 };
8
+
9
+ const errorProperties = async (body: object): Promise<string[]> => {
10
+ const dto = plainToInstance(ComputeAmortizationScheduleRequest, body);
11
+ return (await validate(dto, { whitelist: true })).map(error => error.property);
12
+ };
13
+
14
+ describe('ComputeAmortizationScheduleRequest', () => {
15
+ it('acepta el cálculo completo', async () => {
16
+ expect(await errorProperties(VALID)).toEqual([]);
17
+ });
18
+
19
+ it('acepta TNA e IVA en cero', async () => {
20
+ expect(await errorProperties({ ...VALID, tnaAnnual: 0, ivaOnInterest: 0 })).toEqual([]);
21
+ });
22
+
23
+ it('exige los cuatro campos', async () => {
24
+ expect((await errorProperties({})).sort()).toEqual(['financedAmountCents', 'ivaOnInterest', 'termWeeks', 'tnaAnnual']);
25
+ });
26
+
27
+ it.each([
28
+ ['financedAmountCents', 0],
29
+ ['financedAmountCents', 10.5],
30
+ ['tnaAnnual', -0.1],
31
+ ['termWeeks', 0],
32
+ ['termWeeks', 1.5],
33
+ ['ivaOnInterest', 1.01],
34
+ ['ivaOnInterest', -0.01],
35
+ ])('rechaza %s = %p', async (field, value) => {
36
+ expect(await errorProperties({ ...VALID, [field]: value })).toEqual([field]);
37
+ });
38
+ });
39
+
40
+ describe('AmortizationScheduleResponse', () => {
41
+ it('sale por el index raíz', () => {
42
+ expect(LoanOfferings.ComputeAmortizationScheduleRequest).toBeDefined();
43
+ });
44
+ });
@@ -0,0 +1,65 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { MessagesConnector } from '../../../src/index';
5
+ import { OtpMessagePurposeEnum, SendMessageRequest, VerifyOtpRequest } from '../../../src/messagesConnector/index';
6
+ import { DeliveryChannelEnum } from '../../../src/messaging';
7
+
8
+ const SEND = {
9
+ channelType: DeliveryChannelEnum.SMS,
10
+ messageType: 'OTP',
11
+ directoryId: 'dir-1',
12
+ typeOfDirectory: 'CUSTOMER',
13
+ language: 'es',
14
+ country: 'MX',
15
+ };
16
+ const VERIFY = { directoryId: 'dir-1', typeOfDirectoryId: 'CUSTOMER', message: '0427' };
17
+
18
+ type RequestClass = new () => { purpose?: OtpMessagePurposeEnum };
19
+
20
+ const validateBody = async (dtoClass: RequestClass, body: object) => {
21
+ const dto = plainToInstance(dtoClass, body) as { purpose?: OtpMessagePurposeEnum };
22
+ const errors = await validate(dto, { whitelist: true });
23
+ return { dto, properties: errors.map(error => error.property) };
24
+ };
25
+
26
+ describe('OtpMessagePurposeEnum', () => {
27
+ it('tiene exactamente los tres propósitos del contrato', () => {
28
+ expect(Object.values(OtpMessagePurposeEnum).sort()).toEqual(['ADVANCE', 'RESTRUCTURE', 'SIGNATURE']);
29
+ });
30
+
31
+ it('cada clave es igual a su valor', () => {
32
+ for (const [key, value] of Object.entries(OtpMessagePurposeEnum)) {
33
+ expect(key).toBe(value);
34
+ }
35
+ });
36
+
37
+ it('sale por el index raíz', () => {
38
+ expect(MessagesConnector.OtpMessagePurposeEnum.RESTRUCTURE).toBe('RESTRUCTURE');
39
+ });
40
+ });
41
+
42
+ describe.each([
43
+ ['SendMessageRequest', SendMessageRequest, SEND],
44
+ ['VerifyOtpRequest', VerifyOtpRequest, VERIFY],
45
+ ])('%s.purpose', (_name, dtoClass, body) => {
46
+ it('es opcional y no trae default: el default lo aplica messages', async () => {
47
+ const { dto, properties } = await validateBody(dtoClass, body);
48
+
49
+ expect(properties).toEqual([]);
50
+ expect(dto.purpose).toBeUndefined();
51
+ });
52
+
53
+ it('acepta un propósito del enum', async () => {
54
+ const { dto, properties } = await validateBody(dtoClass, { ...body, purpose: OtpMessagePurposeEnum.ADVANCE });
55
+
56
+ expect(properties).toEqual([]);
57
+ expect(dto.purpose).toBe(OtpMessagePurposeEnum.ADVANCE);
58
+ });
59
+
60
+ it('rechaza un propósito fuera del enum', async () => {
61
+ const { properties } = await validateBody(dtoClass, { ...body, purpose: 'LOGIN' });
62
+
63
+ expect(properties).toEqual(['purpose']);
64
+ });
65
+ });
@@ -2,5 +2,7 @@ export declare enum DeregisterChargeStatus {
2
2
  /** El cobro estaba vivo y se detuvo: el intent pasó a CANCELLED y no se reintenta más. */
3
3
  CANCELLED = "CANCELLED",
4
4
  /** El intent ya había terminado (cobrado o cancelado antes). Dar de baja dos veces es un no-op. */
5
- ALREADY_TERMINAL = "ALREADY_TERMINAL"
5
+ ALREADY_TERMINAL = "ALREADY_TERMINAL",
6
+ /** El intent tiene candado de ejecución: se marcó la cancelación pedida y hay que reintentar la baja. */
7
+ IN_FLIGHT = "IN_FLIGHT"
6
8
  }
@@ -7,4 +7,6 @@ var DeregisterChargeStatus;
7
7
  DeregisterChargeStatus["CANCELLED"] = "CANCELLED";
8
8
  /** El intent ya había terminado (cobrado o cancelado antes). Dar de baja dos veces es un no-op. */
9
9
  DeregisterChargeStatus["ALREADY_TERMINAL"] = "ALREADY_TERMINAL";
10
+ /** El intent tiene candado de ejecución: se marcó la cancelación pedida y hay que reintentar la baja. */
11
+ DeregisterChargeStatus["IN_FLIGHT"] = "IN_FLIGHT";
10
12
  })(DeregisterChargeStatus || (exports.DeregisterChargeStatus = DeregisterChargeStatus = {}));
@@ -0,0 +1,9 @@
1
+ /** Términos de una reestructura: los propone el cobrador y el admin los aprueba o ajusta. */
2
+ export declare class RestructureTerms {
3
+ /** Plazo nuevo en semanas; no puede ser menor a las cuotas restantes. */
4
+ newTermWeeks: number;
5
+ /** TNA nueva en decimal (`2.30` = 230%). */
6
+ newTnaAnnual: number;
7
+ /** Porcentaje de pago inicial. */
8
+ initialPaymentPct?: number;
9
+ }
@@ -0,0 +1,36 @@
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.RestructureTerms = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /** Términos de una reestructura: los propone el cobrador y el admin los aprueba o ajusta. */
16
+ class RestructureTerms {
17
+ }
18
+ exports.RestructureTerms = RestructureTerms;
19
+ __decorate([
20
+ (0, class_transformer_1.Expose)(),
21
+ (0, class_validator_1.IsInt)(),
22
+ (0, class_validator_1.Min)(1),
23
+ __metadata("design:type", Number)
24
+ ], RestructureTerms.prototype, "newTermWeeks", void 0);
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.IsNumber)(),
28
+ __metadata("design:type", Number)
29
+ ], RestructureTerms.prototype, "newTnaAnnual", void 0);
30
+ __decorate([
31
+ (0, class_transformer_1.Expose)(),
32
+ (0, class_validator_1.IsOptional)(),
33
+ (0, class_validator_1.IsNumber)(),
34
+ (0, class_validator_1.Min)(0),
35
+ __metadata("design:type", Number)
36
+ ], RestructureTerms.prototype, "initialPaymentPct", void 0);
@@ -0,0 +1,7 @@
1
+ /** Las dos casillas de la baja contable; el lambda exige las dos en true. */
2
+ export declare class WriteOffConfirmations {
3
+ /** Se agotaron los recursos de recuperación. */
4
+ recoveryResourcesExhausted?: boolean;
5
+ /** El crédito cumple los días de mora requeridos. */
6
+ overdueDaysMet?: boolean;
7
+ }
@@ -0,0 +1,30 @@
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.WriteOffConfirmations = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /** Las dos casillas de la baja contable; el lambda exige las dos en true. */
16
+ class WriteOffConfirmations {
17
+ }
18
+ exports.WriteOffConfirmations = WriteOffConfirmations;
19
+ __decorate([
20
+ (0, class_transformer_1.Expose)(),
21
+ (0, class_validator_1.IsOptional)(),
22
+ (0, class_validator_1.IsBoolean)(),
23
+ __metadata("design:type", Boolean)
24
+ ], WriteOffConfirmations.prototype, "recoveryResourcesExhausted", void 0);
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.IsOptional)(),
28
+ (0, class_validator_1.IsBoolean)(),
29
+ __metadata("design:type", Boolean)
30
+ ], WriteOffConfirmations.prototype, "overdueDaysMet", void 0);
@@ -0,0 +1,5 @@
1
+ /** Body de `POST /backoffice/credits/:creditId/restructures/:restructureId/accept` (loan-credit-business). */
2
+ export declare class BackofficeAcceptRestructureRequest {
3
+ /** OTP de 4 dígitos con propósito RESTRUCTURE. */
4
+ otpCode: string;
5
+ }
@@ -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.BackofficeAcceptRestructureRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /** Body de `POST /backoffice/credits/:creditId/restructures/:restructureId/accept` (loan-credit-business). */
16
+ class BackofficeAcceptRestructureRequest {
17
+ }
18
+ exports.BackofficeAcceptRestructureRequest = BackofficeAcceptRestructureRequest;
19
+ __decorate([
20
+ (0, class_transformer_1.Expose)(),
21
+ (0, class_validator_1.IsString)(),
22
+ (0, class_validator_1.Matches)(/^\d{4}$/),
23
+ __metadata("design:type", String)
24
+ ], BackofficeAcceptRestructureRequest.prototype, "otpCode", void 0);
@@ -0,0 +1,7 @@
1
+ /** Body de `POST /backoffice/credits/:creditId/advances` (loan-credit-business). */
2
+ export declare class BackofficeApplyAdvanceRequest {
3
+ /** Cuántas cuotas siguientes se adelantan. */
4
+ installmentCount: number;
5
+ /** OTP con propósito ADVANCE que firma la autorización; sin él, un adelanto mayor al pago del periodo responde 422. */
6
+ otpCode?: string;
7
+ }
@@ -0,0 +1,31 @@
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.BackofficeApplyAdvanceRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /** Body de `POST /backoffice/credits/:creditId/advances` (loan-credit-business). */
16
+ class BackofficeApplyAdvanceRequest {
17
+ }
18
+ exports.BackofficeApplyAdvanceRequest = BackofficeApplyAdvanceRequest;
19
+ __decorate([
20
+ (0, class_transformer_1.Expose)(),
21
+ (0, class_validator_1.IsInt)(),
22
+ (0, class_validator_1.Min)(1),
23
+ __metadata("design:type", Number)
24
+ ], BackofficeApplyAdvanceRequest.prototype, "installmentCount", void 0);
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.IsOptional)(),
28
+ (0, class_validator_1.IsString)(),
29
+ (0, class_validator_1.Matches)(/^\d{4}$/),
30
+ __metadata("design:type", String)
31
+ ], BackofficeApplyAdvanceRequest.prototype, "otpCode", void 0);
@@ -0,0 +1,4 @@
1
+ /** Body de `POST /backoffice/credits/:creditId/prepayments` (loan-credit-business). */
2
+ export declare class BackofficeApplyPrepaymentRequest {
3
+ amountCents: number;
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.BackofficeApplyPrepaymentRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /** Body de `POST /backoffice/credits/:creditId/prepayments` (loan-credit-business). */
16
+ class BackofficeApplyPrepaymentRequest {
17
+ }
18
+ exports.BackofficeApplyPrepaymentRequest = BackofficeApplyPrepaymentRequest;
19
+ __decorate([
20
+ (0, class_transformer_1.Expose)(),
21
+ (0, class_validator_1.IsInt)(),
22
+ (0, class_validator_1.Min)(1),
23
+ __metadata("design:type", Number)
24
+ ], BackofficeApplyPrepaymentRequest.prototype, "amountCents", void 0);
@@ -0,0 +1,8 @@
1
+ import { RestructureTerms } from '../RestructureTerms';
2
+ /** Body de `POST /backoffice/credits/:creditId/restructures/:restructureId/approve` (loan-credit-business). */
3
+ export declare class BackofficeApproveRestructureRequest {
4
+ /** Motivo del admin. Va a la auditoría y no se loguea. */
5
+ reason: string;
6
+ /** Términos ajustados; ausente se aprueba como se propuso. */
7
+ terms?: RestructureTerms;
8
+ }
@@ -0,0 +1,32 @@
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.BackofficeApproveRestructureRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const RestructureTerms_1 = require("../RestructureTerms");
16
+ /** Body de `POST /backoffice/credits/:creditId/restructures/:restructureId/approve` (loan-credit-business). */
17
+ class BackofficeApproveRestructureRequest {
18
+ }
19
+ exports.BackofficeApproveRestructureRequest = BackofficeApproveRestructureRequest;
20
+ __decorate([
21
+ (0, class_transformer_1.Expose)(),
22
+ (0, class_validator_1.IsString)(),
23
+ (0, class_validator_1.MinLength)(1),
24
+ __metadata("design:type", String)
25
+ ], BackofficeApproveRestructureRequest.prototype, "reason", void 0);
26
+ __decorate([
27
+ (0, class_transformer_1.Expose)(),
28
+ (0, class_validator_1.IsOptional)(),
29
+ (0, class_validator_1.ValidateNested)(),
30
+ (0, class_transformer_1.Type)(() => RestructureTerms_1.RestructureTerms),
31
+ __metadata("design:type", RestructureTerms_1.RestructureTerms)
32
+ ], BackofficeApproveRestructureRequest.prototype, "terms", void 0);