@fiado/type-kit 3.436.0 → 3.438.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_test_/unit/loanConfig/recentParameterChanges.test.ts +91 -0
- package/_test_/unit/loanCredit/creditLifecycleEnums.test.ts +8 -1
- package/_test_/unit/loanCredit/dtos/creditLifecycleRequests.test.ts +6 -2
- package/bin/loanConfig/constants/RecentParameterChangesLimits.d.ts +4 -0
- package/bin/loanConfig/constants/RecentParameterChangesLimits.js +7 -0
- package/bin/loanConfig/dtos/requests/ListRecentParameterChangesRequest.d.ts +6 -0
- package/bin/loanConfig/dtos/requests/ListRecentParameterChangesRequest.js +37 -0
- package/bin/loanConfig/dtos/responses/ListRecentParameterChangesResponse.d.ts +12 -0
- package/bin/loanConfig/dtos/responses/ListRecentParameterChangesResponse.js +2 -0
- package/bin/loanConfig/dtos/responses/ParameterAuditEntry.d.ts +14 -0
- package/bin/loanConfig/dtos/responses/ParameterAuditEntry.js +2 -0
- package/bin/loanConfig/enums/ParameterTypeEnum.d.ts +3 -2
- package/bin/loanConfig/enums/ParameterTypeEnum.js +2 -1
- package/bin/loanConfig/index.d.ts +4 -0
- package/bin/loanConfig/index.js +5 -0
- package/bin/loanCredit/dtos/requests/BackofficeWriteOffCreditRequest.js +0 -1
- package/bin/loanCredit/enums/PaymentReviewReasonEnum.d.ts +3 -1
- package/bin/loanCredit/enums/PaymentReviewReasonEnum.js +2 -0
- package/package.json +1 -1
- package/src/loanConfig/constants/RecentParameterChangesLimits.ts +5 -0
- package/src/loanConfig/dtos/requests/ListRecentParameterChangesRequest.ts +26 -0
- package/src/loanConfig/dtos/responses/ListRecentParameterChangesResponse.ts +14 -0
- package/src/loanConfig/dtos/responses/ParameterAuditEntry.ts +14 -0
- package/src/loanConfig/enums/ParameterTypeEnum.ts +2 -1
- package/src/loanConfig/index.ts +6 -0
- package/src/loanCredit/dtos/requests/BackofficeWriteOffCreditRequest.ts +1 -2
- package/src/loanCredit/enums/PaymentReviewReasonEnum.ts +2 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { ParameterTypeEnum } from '../../../src/loanConfig/enums/ParameterTypeEnum';
|
|
5
|
+
import type { ParameterAuditEntry } from '../../../src/loanConfig/dtos/responses/ParameterAuditEntry';
|
|
6
|
+
import type {
|
|
7
|
+
ListRecentParameterChangesResponse,
|
|
8
|
+
RecentParameterChange,
|
|
9
|
+
} from '../../../src/loanConfig/dtos/responses/ListRecentParameterChangesResponse';
|
|
10
|
+
import { ListRecentParameterChangesRequest } from '../../../src/loanConfig/dtos/requests/ListRecentParameterChangesRequest';
|
|
11
|
+
import {
|
|
12
|
+
RECENT_PARAMETER_CHANGES_MAX_DAYS,
|
|
13
|
+
RECENT_PARAMETER_CHANGES_MAX_LIMIT,
|
|
14
|
+
} from '../../../src/loanConfig/constants/RecentParameterChangesLimits';
|
|
15
|
+
|
|
16
|
+
/** Igual que `validateRequest` del lambda: sin `@Expose` la propiedad se descarta. */
|
|
17
|
+
const validateQuery = (query: object) => {
|
|
18
|
+
const dto = plainToInstance(ListRecentParameterChangesRequest, query, { excludeExtraneousValues: true });
|
|
19
|
+
return validate(dto, { whitelist: true, forbidNonWhitelisted: true }).then((errors) => ({ dto, errors }));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
describe('ParameterTypeEnum', () => {
|
|
23
|
+
it('incluye FEATURE_FLAG como el paramType 15', () => {
|
|
24
|
+
expect(ParameterTypeEnum.FEATURE_FLAG).toBe('FEATURE_FLAG');
|
|
25
|
+
expect(Object.values(ParameterTypeEnum)).toHaveLength(15);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('ParameterAuditEntry', () => {
|
|
30
|
+
it('describe una fila del histórico sin ip', () => {
|
|
31
|
+
const entry: ParameterAuditEntry = {
|
|
32
|
+
at: '2026-09-15T18:30:00.000Z',
|
|
33
|
+
action: 'UPDATE',
|
|
34
|
+
fieldChanged: 'value',
|
|
35
|
+
oldValue: 'false',
|
|
36
|
+
newValue: 'true',
|
|
37
|
+
performedBy: 'sub-123',
|
|
38
|
+
reason: 'Piloto de bloqueo en tienda',
|
|
39
|
+
};
|
|
40
|
+
expect(Object.keys(entry)).not.toContain('ip');
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe('ListRecentParameterChangesRequest', () => {
|
|
45
|
+
it('acepta el query vacío: los defaults los pone el lambda', async () => {
|
|
46
|
+
const { dto, errors } = await validateQuery({});
|
|
47
|
+
expect(errors).toEqual([]);
|
|
48
|
+
expect(dto.days).toBeUndefined();
|
|
49
|
+
expect(dto.limit).toBeUndefined();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('convierte days y limit que llegan como texto', async () => {
|
|
53
|
+
const { dto, errors } = await validateQuery({ days: '30', limit: '50' });
|
|
54
|
+
expect(errors).toEqual([]);
|
|
55
|
+
expect(dto.days).toBe(30);
|
|
56
|
+
expect(dto.limit).toBe(50);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('los topes son 30 días y 50 filas', () => {
|
|
60
|
+
expect(RECENT_PARAMETER_CHANGES_MAX_DAYS).toBe(30);
|
|
61
|
+
expect(RECENT_PARAMETER_CHANGES_MAX_LIMIT).toBe(50);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it.each([['31'], ['0'], ['1.5'], ['abc']])('rechaza days=%s', async (days) => {
|
|
65
|
+
const { errors } = await validateQuery({ days });
|
|
66
|
+
expect(errors.some((error) => error.property === 'days')).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it.each([['51'], ['0'], ['-1'], ['x']])('rechaza limit=%s', async (limit) => {
|
|
70
|
+
const { errors } = await validateQuery({ limit });
|
|
71
|
+
expect(errors.some((error) => error.property === 'limit')).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('ListRecentParameterChangesResponse', () => {
|
|
76
|
+
it('cada cambio es una entrada del histórico más su paramType y key', () => {
|
|
77
|
+
const item: RecentParameterChange = {
|
|
78
|
+
at: '2026-09-15T18:30:00.000Z',
|
|
79
|
+
action: 'UPDATE',
|
|
80
|
+
fieldChanged: 'value',
|
|
81
|
+
oldValue: '300',
|
|
82
|
+
newValue: '240',
|
|
83
|
+
performedBy: 'sub-123',
|
|
84
|
+
reason: 'Ajuste del OTP del wizard',
|
|
85
|
+
paramType: ParameterTypeEnum.WIZARD,
|
|
86
|
+
key: 'otp_timeout_seconds',
|
|
87
|
+
};
|
|
88
|
+
const response: ListRecentParameterChangesResponse = { items: [item], totalInWindow: 7 };
|
|
89
|
+
expect(response.totalInWindow).toBeGreaterThanOrEqual(response.items.length);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
@@ -41,7 +41,14 @@ describe.each([
|
|
|
41
41
|
[
|
|
42
42
|
'PaymentReviewReasonEnum',
|
|
43
43
|
PaymentReviewReasonEnum,
|
|
44
|
-
[
|
|
44
|
+
[
|
|
45
|
+
'OVERPAYMENT',
|
|
46
|
+
'INSTALLMENT_CLOSED',
|
|
47
|
+
'CREDIT_NOT_COLLECTIBLE',
|
|
48
|
+
'LEGACY_INSTALLMENT_WITH_PAYMENT',
|
|
49
|
+
'UNCAPTURED_HOLD',
|
|
50
|
+
'AD_HOC_CHARGE_INCOMPLETE',
|
|
51
|
+
],
|
|
45
52
|
],
|
|
46
53
|
['PaymentReviewActionEnum', PaymentReviewActionEnum, ['APPLY', 'REFUND', 'RECONCILE']],
|
|
47
54
|
['RefundDestinationEnum', RefundDestinationEnum, ['CUSTOMER_ACCOUNT', 'PCF_CLABE']],
|
|
@@ -60,8 +60,12 @@ describe('BackofficeWriteOffCreditRequest', () => {
|
|
|
60
60
|
expect(await errorPaths(BackofficeWriteOffCreditRequest, body)).toEqual([]);
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
-
it('
|
|
64
|
-
|
|
63
|
+
it('deja pasar el motivo vacío para que el lambda responda WRITE_OFF_REASON_REQUIRED', async () => {
|
|
64
|
+
expect(await errorPaths(BackofficeWriteOffCreditRequest, { reason: '' })).toEqual([]);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('rechaza un motivo que no es texto y una confirmación que no es booleana', async () => {
|
|
68
|
+
const body = { reason: 42, confirmations: { recoveryResourcesExhausted: 'yes' } };
|
|
65
69
|
|
|
66
70
|
expect(await errorPaths(BackofficeWriteOffCreditRequest, body)).toEqual(
|
|
67
71
|
expect.arrayContaining(['reason', 'confirmations.recoveryResourcesExhausted']),
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RECENT_PARAMETER_CHANGES_MAX_LIMIT = exports.RECENT_PARAMETER_CHANGES_MAX_DAYS = void 0;
|
|
4
|
+
/** Días máximos que cubre el feed de cambios recientes, hoy incluido. */
|
|
5
|
+
exports.RECENT_PARAMETER_CHANGES_MAX_DAYS = 30;
|
|
6
|
+
/** Filas máximas que devuelve el feed en una llamada. */
|
|
7
|
+
exports.RECENT_PARAMETER_CHANGES_MAX_LIMIT = 50;
|
|
@@ -0,0 +1,37 @@
|
|
|
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.ListRecentParameterChangesRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const RecentParameterChangesLimits_1 = require("../../constants/RecentParameterChangesLimits");
|
|
16
|
+
/** Query de `GET /public/parameters/audit/recent`. Sin valores, el lambda pone sus defaults. */
|
|
17
|
+
class ListRecentParameterChangesRequest {
|
|
18
|
+
}
|
|
19
|
+
exports.ListRecentParameterChangesRequest = ListRecentParameterChangesRequest;
|
|
20
|
+
__decorate([
|
|
21
|
+
(0, class_transformer_1.Expose)(),
|
|
22
|
+
(0, class_validator_1.IsOptional)(),
|
|
23
|
+
(0, class_transformer_1.Type)(() => Number),
|
|
24
|
+
(0, class_validator_1.IsInt)(),
|
|
25
|
+
(0, class_validator_1.Min)(1),
|
|
26
|
+
(0, class_validator_1.Max)(RecentParameterChangesLimits_1.RECENT_PARAMETER_CHANGES_MAX_DAYS),
|
|
27
|
+
__metadata("design:type", Number)
|
|
28
|
+
], ListRecentParameterChangesRequest.prototype, "days", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, class_transformer_1.Expose)(),
|
|
31
|
+
(0, class_validator_1.IsOptional)(),
|
|
32
|
+
(0, class_transformer_1.Type)(() => Number),
|
|
33
|
+
(0, class_validator_1.IsInt)(),
|
|
34
|
+
(0, class_validator_1.Min)(1),
|
|
35
|
+
(0, class_validator_1.Max)(RecentParameterChangesLimits_1.RECENT_PARAMETER_CHANGES_MAX_LIMIT),
|
|
36
|
+
__metadata("design:type", Number)
|
|
37
|
+
], ListRecentParameterChangesRequest.prototype, "limit", void 0);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ParameterTypeEnum } from '../../enums/ParameterTypeEnum';
|
|
2
|
+
import { ParameterAuditEntry } from './ParameterAuditEntry';
|
|
3
|
+
/** Un cambio del feed: la entrada del histórico más la llave del parámetro que cambió. */
|
|
4
|
+
export interface RecentParameterChange extends ParameterAuditEntry {
|
|
5
|
+
paramType: ParameterTypeEnum;
|
|
6
|
+
key: string;
|
|
7
|
+
}
|
|
8
|
+
/** Respuesta de `GET /public/parameters/audit/recent`. `totalInWindow` cuenta toda la ventana. */
|
|
9
|
+
export interface ListRecentParameterChangesResponse {
|
|
10
|
+
items: RecentParameterChange[];
|
|
11
|
+
totalInWindow: number;
|
|
12
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Una fila del histórico de un parámetro. Sin `ip`; `performedBy` puede traer el correo del actor
|
|
3
|
+
* y solo lo lee quien tiene `loan.parameter.audit`.
|
|
4
|
+
*/
|
|
5
|
+
export interface ParameterAuditEntry {
|
|
6
|
+
/** ISO del cambio. */
|
|
7
|
+
at: string;
|
|
8
|
+
action: 'CREATE' | 'UPDATE' | 'DELETE' | 'STATUS_CHANGE';
|
|
9
|
+
fieldChanged: string | null;
|
|
10
|
+
oldValue: string | null;
|
|
11
|
+
newValue: string | null;
|
|
12
|
+
performedBy: string;
|
|
13
|
+
reason: string | null;
|
|
14
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 =
|
|
2
|
+
* Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 + FEATURE_FLAG = 15).
|
|
3
3
|
* @enum {string}
|
|
4
4
|
*/
|
|
5
5
|
export declare enum ParameterTypeEnum {
|
|
@@ -16,5 +16,6 @@ export declare enum ParameterTypeEnum {
|
|
|
16
16
|
CROSS_BORDER = "CROSS_BORDER",
|
|
17
17
|
WIZARD = "WIZARD",
|
|
18
18
|
INTEGRATIONS = "INTEGRATIONS",
|
|
19
|
-
SCORING = "SCORING"
|
|
19
|
+
SCORING = "SCORING",
|
|
20
|
+
FEATURE_FLAG = "FEATURE_FLAG"
|
|
20
21
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ParameterTypeEnum = void 0;
|
|
4
4
|
/**
|
|
5
|
-
* Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 =
|
|
5
|
+
* Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 + FEATURE_FLAG = 15).
|
|
6
6
|
* @enum {string}
|
|
7
7
|
*/
|
|
8
8
|
var ParameterTypeEnum;
|
|
@@ -21,4 +21,5 @@ var ParameterTypeEnum;
|
|
|
21
21
|
ParameterTypeEnum["WIZARD"] = "WIZARD";
|
|
22
22
|
ParameterTypeEnum["INTEGRATIONS"] = "INTEGRATIONS";
|
|
23
23
|
ParameterTypeEnum["SCORING"] = "SCORING";
|
|
24
|
+
ParameterTypeEnum["FEATURE_FLAG"] = "FEATURE_FLAG";
|
|
24
25
|
})(ParameterTypeEnum || (exports.ParameterTypeEnum = ParameterTypeEnum = {}));
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
export * from './enums/ParameterTypeEnum';
|
|
2
2
|
export * from './enums/ParameterValueTypeEnum';
|
|
3
|
+
export * from './constants/RecentParameterChangesLimits';
|
|
3
4
|
export * from './dtos/Parameter';
|
|
4
5
|
export * from './dtos/requests/UpdateParameterRequest';
|
|
5
6
|
export * from './dtos/requests/BulkUpdateParametersRequest';
|
|
6
7
|
export * from './dtos/requests/BulkGetParametersRequest';
|
|
8
|
+
export * from './dtos/requests/ListRecentParameterChangesRequest';
|
|
7
9
|
export * from './dtos/responses/ParameterResponse';
|
|
10
|
+
export * from './dtos/responses/ParameterAuditEntry';
|
|
11
|
+
export * from './dtos/responses/ListRecentParameterChangesResponse';
|
package/bin/loanConfig/index.js
CHANGED
|
@@ -16,11 +16,16 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./enums/ParameterTypeEnum"), exports);
|
|
18
18
|
__exportStar(require("./enums/ParameterValueTypeEnum"), exports);
|
|
19
|
+
// Constants
|
|
20
|
+
__exportStar(require("./constants/RecentParameterChangesLimits"), exports);
|
|
19
21
|
// Entity DTOs
|
|
20
22
|
__exportStar(require("./dtos/Parameter"), exports);
|
|
21
23
|
// Request DTOs
|
|
22
24
|
__exportStar(require("./dtos/requests/UpdateParameterRequest"), exports);
|
|
23
25
|
__exportStar(require("./dtos/requests/BulkUpdateParametersRequest"), exports);
|
|
24
26
|
__exportStar(require("./dtos/requests/BulkGetParametersRequest"), exports);
|
|
27
|
+
__exportStar(require("./dtos/requests/ListRecentParameterChangesRequest"), exports);
|
|
25
28
|
// Response DTOs
|
|
26
29
|
__exportStar(require("./dtos/responses/ParameterResponse"), exports);
|
|
30
|
+
__exportStar(require("./dtos/responses/ParameterAuditEntry"), exports);
|
|
31
|
+
__exportStar(require("./dtos/responses/ListRecentParameterChangesResponse"), exports);
|
|
@@ -21,7 +21,6 @@ __decorate([
|
|
|
21
21
|
(0, class_transformer_1.Expose)(),
|
|
22
22
|
(0, class_validator_1.IsOptional)(),
|
|
23
23
|
(0, class_validator_1.IsString)(),
|
|
24
|
-
(0, class_validator_1.MinLength)(1),
|
|
25
24
|
__metadata("design:type", String)
|
|
26
25
|
], BackofficeWriteOffCreditRequest.prototype, "reason", void 0);
|
|
27
26
|
__decorate([
|
|
@@ -12,5 +12,7 @@ export declare enum PaymentReviewReasonEnum {
|
|
|
12
12
|
/** Cuota con abonos previos sin desglose. */
|
|
13
13
|
LEGACY_INSTALLMENT_WITH_PAYMENT = "LEGACY_INSTALLMENT_WITH_PAYMENT",
|
|
14
14
|
/** Lo retenido sin capturar. */
|
|
15
|
-
UNCAPTURED_HOLD = "UNCAPTURED_HOLD"
|
|
15
|
+
UNCAPTURED_HOLD = "UNCAPTURED_HOLD",
|
|
16
|
+
/** Cobro ad hoc PREPAYMENT, ADVANCE o RECOVERY que no fue completo. */
|
|
17
|
+
AD_HOC_CHARGE_INCOMPLETE = "AD_HOC_CHARGE_INCOMPLETE"
|
|
16
18
|
}
|
|
@@ -17,4 +17,6 @@ var PaymentReviewReasonEnum;
|
|
|
17
17
|
PaymentReviewReasonEnum["LEGACY_INSTALLMENT_WITH_PAYMENT"] = "LEGACY_INSTALLMENT_WITH_PAYMENT";
|
|
18
18
|
/** Lo retenido sin capturar. */
|
|
19
19
|
PaymentReviewReasonEnum["UNCAPTURED_HOLD"] = "UNCAPTURED_HOLD";
|
|
20
|
+
/** Cobro ad hoc PREPAYMENT, ADVANCE o RECOVERY que no fue completo. */
|
|
21
|
+
PaymentReviewReasonEnum["AD_HOC_CHARGE_INCOMPLETE"] = "AD_HOC_CHARGE_INCOMPLETE";
|
|
20
22
|
})(PaymentReviewReasonEnum || (exports.PaymentReviewReasonEnum = PaymentReviewReasonEnum = {}));
|
package/package.json
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
|
+
import { IsInt, IsOptional, Max, Min } from 'class-validator';
|
|
3
|
+
import {
|
|
4
|
+
RECENT_PARAMETER_CHANGES_MAX_DAYS,
|
|
5
|
+
RECENT_PARAMETER_CHANGES_MAX_LIMIT,
|
|
6
|
+
} from '../../constants/RecentParameterChangesLimits';
|
|
7
|
+
|
|
8
|
+
/** Query de `GET /public/parameters/audit/recent`. Sin valores, el lambda pone sus defaults. */
|
|
9
|
+
export class ListRecentParameterChangesRequest {
|
|
10
|
+
/** Días hacia atrás que cubre la ventana, hoy incluido (días UTC). */
|
|
11
|
+
@Expose()
|
|
12
|
+
@IsOptional()
|
|
13
|
+
@Type(() => Number)
|
|
14
|
+
@IsInt()
|
|
15
|
+
@Min(1)
|
|
16
|
+
@Max(RECENT_PARAMETER_CHANGES_MAX_DAYS)
|
|
17
|
+
days?: number;
|
|
18
|
+
|
|
19
|
+
@Expose()
|
|
20
|
+
@IsOptional()
|
|
21
|
+
@Type(() => Number)
|
|
22
|
+
@IsInt()
|
|
23
|
+
@Min(1)
|
|
24
|
+
@Max(RECENT_PARAMETER_CHANGES_MAX_LIMIT)
|
|
25
|
+
limit?: number;
|
|
26
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ParameterTypeEnum } from '../../enums/ParameterTypeEnum';
|
|
2
|
+
import { ParameterAuditEntry } from './ParameterAuditEntry';
|
|
3
|
+
|
|
4
|
+
/** Un cambio del feed: la entrada del histórico más la llave del parámetro que cambió. */
|
|
5
|
+
export interface RecentParameterChange extends ParameterAuditEntry {
|
|
6
|
+
paramType: ParameterTypeEnum;
|
|
7
|
+
key: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Respuesta de `GET /public/parameters/audit/recent`. `totalInWindow` cuenta toda la ventana. */
|
|
11
|
+
export interface ListRecentParameterChangesResponse {
|
|
12
|
+
items: RecentParameterChange[];
|
|
13
|
+
totalInWindow: number;
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Una fila del histórico de un parámetro. Sin `ip`; `performedBy` puede traer el correo del actor
|
|
3
|
+
* y solo lo lee quien tiene `loan.parameter.audit`.
|
|
4
|
+
*/
|
|
5
|
+
export interface ParameterAuditEntry {
|
|
6
|
+
/** ISO del cambio. */
|
|
7
|
+
at: string;
|
|
8
|
+
action: 'CREATE' | 'UPDATE' | 'DELETE' | 'STATUS_CHANGE';
|
|
9
|
+
fieldChanged: string | null;
|
|
10
|
+
oldValue: string | null;
|
|
11
|
+
newValue: string | null;
|
|
12
|
+
performedBy: string;
|
|
13
|
+
reason: string | null;
|
|
14
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 =
|
|
2
|
+
* Sub-tipos de parámetro operativo del SOFOM (M6 §8 = 13 + SCORING de §5 + FEATURE_FLAG = 15).
|
|
3
3
|
* @enum {string}
|
|
4
4
|
*/
|
|
5
5
|
export enum ParameterTypeEnum {
|
|
@@ -17,4 +17,5 @@ export enum ParameterTypeEnum {
|
|
|
17
17
|
WIZARD = 'WIZARD',
|
|
18
18
|
INTEGRATIONS = 'INTEGRATIONS',
|
|
19
19
|
SCORING = 'SCORING',
|
|
20
|
+
FEATURE_FLAG = 'FEATURE_FLAG',
|
|
20
21
|
}
|
package/src/loanConfig/index.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export * from './enums/ParameterTypeEnum';
|
|
2
2
|
export * from './enums/ParameterValueTypeEnum';
|
|
3
3
|
|
|
4
|
+
// Constants
|
|
5
|
+
export * from './constants/RecentParameterChangesLimits';
|
|
6
|
+
|
|
4
7
|
// Entity DTOs
|
|
5
8
|
export * from './dtos/Parameter';
|
|
6
9
|
|
|
@@ -8,6 +11,9 @@ export * from './dtos/Parameter';
|
|
|
8
11
|
export * from './dtos/requests/UpdateParameterRequest';
|
|
9
12
|
export * from './dtos/requests/BulkUpdateParametersRequest';
|
|
10
13
|
export * from './dtos/requests/BulkGetParametersRequest';
|
|
14
|
+
export * from './dtos/requests/ListRecentParameterChangesRequest';
|
|
11
15
|
|
|
12
16
|
// Response DTOs
|
|
13
17
|
export * from './dtos/responses/ParameterResponse';
|
|
18
|
+
export * from './dtos/responses/ParameterAuditEntry';
|
|
19
|
+
export * from './dtos/responses/ListRecentParameterChangesResponse';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Expose, Type } from 'class-transformer';
|
|
2
|
-
import { IsOptional, IsString,
|
|
2
|
+
import { IsOptional, IsString, ValidateNested } from 'class-validator';
|
|
3
3
|
import { WriteOffConfirmations } from '../WriteOffConfirmations';
|
|
4
4
|
|
|
5
5
|
/** Body de `POST /backoffice/credits/:creditId/write-off`. Los faltantes los responde el lambda con su code. */
|
|
@@ -8,7 +8,6 @@ export class BackofficeWriteOffCreditRequest {
|
|
|
8
8
|
@Expose()
|
|
9
9
|
@IsOptional()
|
|
10
10
|
@IsString()
|
|
11
|
-
@MinLength(1)
|
|
12
11
|
reason?: string;
|
|
13
12
|
|
|
14
13
|
@Expose()
|
|
@@ -13,4 +13,6 @@ export enum PaymentReviewReasonEnum {
|
|
|
13
13
|
LEGACY_INSTALLMENT_WITH_PAYMENT = 'LEGACY_INSTALLMENT_WITH_PAYMENT',
|
|
14
14
|
/** Lo retenido sin capturar. */
|
|
15
15
|
UNCAPTURED_HOLD = 'UNCAPTURED_HOLD',
|
|
16
|
+
/** Cobro ad hoc PREPAYMENT, ADVANCE o RECOVERY que no fue completo. */
|
|
17
|
+
AD_HOC_CHARGE_INCOMPLETE = 'AD_HOC_CHARGE_INCOMPLETE',
|
|
16
18
|
}
|