@fiado/type-kit 3.545.0 → 3.547.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/loanOfferings/prepaymentMinimum.test.ts +40 -0
- package/_test_/unit/loanRetailAudit/loanRetailAuditContracts.test.ts +139 -0
- package/bin/index.d.ts +1 -0
- package/bin/index.js +4 -1
- package/bin/loanCredit/dtos/responses/CreditCustomerListItem.d.ts +2 -0
- package/bin/loanCredit/dtos/responses/LoanBorrowerCreditItem.d.ts +2 -0
- package/bin/loanCredit/dtos/responses/LoanCreditDetail.d.ts +2 -0
- package/bin/loanCredit/dtos/responses/LoanPrepaymentQuote.d.ts +3 -1
- package/bin/loanCredit/dtos/responses/SellerCreditRow.d.ts +2 -0
- package/bin/loanOfferings/dtos/CreditPlan.d.ts +3 -0
- package/bin/loanOfferings/dtos/CreditPlan.js +8 -0
- package/bin/loanOfferings/dtos/PrepaymentMinimum.d.ts +12 -0
- package/bin/loanOfferings/dtos/PrepaymentMinimum.js +42 -0
- package/bin/loanOfferings/dtos/requests/CreateCreditPlanRequest.d.ts +3 -0
- package/bin/loanOfferings/dtos/requests/CreateCreditPlanRequest.js +8 -0
- package/bin/loanOfferings/dtos/requests/UpdateCreditPlanRequest.d.ts +3 -0
- package/bin/loanOfferings/dtos/requests/UpdateCreditPlanRequest.js +8 -0
- package/bin/loanOfferings/dtos/responses/CreditPlanResponse.d.ts +3 -0
- package/bin/loanOfferings/enums/PrepaymentMinimumModeEnum.d.ts +9 -0
- package/bin/loanOfferings/enums/PrepaymentMinimumModeEnum.js +13 -0
- package/bin/loanOfferings/index.d.ts +2 -0
- package/bin/loanOfferings/index.js +2 -0
- package/bin/loanRetailAudit/constants/auditTrailEntityTypes.d.ts +6 -0
- package/bin/loanRetailAudit/constants/auditTrailEntityTypes.js +10 -0
- package/bin/loanRetailAudit/dtos/AuditTrailChange.d.ts +8 -0
- package/bin/loanRetailAudit/dtos/AuditTrailChange.js +36 -0
- package/bin/loanRetailAudit/dtos/AuditTrailContextEntry.d.ts +5 -0
- package/bin/loanRetailAudit/dtos/AuditTrailContextEntry.js +29 -0
- package/bin/loanRetailAudit/dtos/requests/CreatePiiAccessLogRequest.d.ts +19 -0
- package/bin/loanRetailAudit/dtos/requests/CreatePiiAccessLogRequest.js +85 -0
- package/bin/loanRetailAudit/dtos/requests/ListAuditTrailQuery.d.ts +11 -0
- package/bin/loanRetailAudit/dtos/requests/ListAuditTrailQuery.js +52 -0
- package/bin/loanRetailAudit/dtos/responses/CreatePiiAccessLogResponse.d.ts +4 -0
- package/bin/loanRetailAudit/dtos/responses/CreatePiiAccessLogResponse.js +2 -0
- package/bin/loanRetailAudit/dtos/responses/ListAuditTrailResponse.d.ts +31 -0
- package/bin/loanRetailAudit/dtos/responses/ListAuditTrailResponse.js +2 -0
- package/bin/loanRetailAudit/enums/AuditTrailActionEnum.d.ts +39 -0
- package/bin/loanRetailAudit/enums/AuditTrailActionEnum.js +43 -0
- package/bin/loanRetailAudit/enums/LoanAuditEntityTypeEnum.d.ts +12 -0
- package/bin/loanRetailAudit/enums/LoanAuditEntityTypeEnum.js +16 -0
- package/bin/loanRetailAudit/enums/PiiAccessActionEnum.d.ts +5 -0
- package/bin/loanRetailAudit/enums/PiiAccessActionEnum.js +9 -0
- package/bin/loanRetailAudit/enums/PiiResourceTypeEnum.d.ts +9 -0
- package/bin/loanRetailAudit/enums/PiiResourceTypeEnum.js +13 -0
- package/bin/loanRetailAudit/enums/RetailAuditEntityTypeEnum.d.ts +17 -0
- package/bin/loanRetailAudit/enums/RetailAuditEntityTypeEnum.js +21 -0
- package/bin/loanRetailAudit/events/AuditTrailRecordedV1.d.ts +20 -0
- package/bin/loanRetailAudit/events/AuditTrailRecordedV1.js +94 -0
- package/bin/loanRetailAudit/index.d.ts +13 -0
- package/bin/loanRetailAudit/index.js +33 -0
- package/bin/retailLoan/dtos/MyCreditSummary.d.ts +2 -0
- package/package.json +1 -1
- package/src/index.ts +4 -0
- package/src/loanCredit/dtos/responses/CreditCustomerListItem.ts +2 -0
- package/src/loanCredit/dtos/responses/LoanBorrowerCreditItem.ts +2 -0
- package/src/loanCredit/dtos/responses/LoanCreditDetail.ts +2 -0
- package/src/loanCredit/dtos/responses/LoanPrepaymentQuote.ts +3 -1
- package/src/loanCredit/dtos/responses/SellerCreditRow.ts +2 -0
- package/src/loanOfferings/dtos/CreditPlan.ts +10 -1
- package/src/loanOfferings/dtos/PrepaymentMinimum.ts +28 -0
- package/src/loanOfferings/dtos/requests/CreateCreditPlanRequest.ts +10 -1
- package/src/loanOfferings/dtos/requests/UpdateCreditPlanRequest.ts +10 -1
- package/src/loanOfferings/dtos/responses/CreditPlanResponse.ts +3 -0
- package/src/loanOfferings/enums/PrepaymentMinimumModeEnum.ts +9 -0
- package/src/loanOfferings/index.ts +2 -0
- package/src/loanRetailAudit/constants/auditTrailEntityTypes.ts +12 -0
- package/src/loanRetailAudit/dtos/AuditTrailChange.ts +22 -0
- package/src/loanRetailAudit/dtos/AuditTrailContextEntry.ts +14 -0
- package/src/loanRetailAudit/dtos/requests/CreatePiiAccessLogRequest.ts +64 -0
- package/src/loanRetailAudit/dtos/requests/ListAuditTrailQuery.ts +35 -0
- package/src/loanRetailAudit/dtos/responses/CreatePiiAccessLogResponse.ts +4 -0
- package/src/loanRetailAudit/dtos/responses/ListAuditTrailResponse.ts +31 -0
- package/src/loanRetailAudit/enums/AuditTrailActionEnum.ts +39 -0
- package/src/loanRetailAudit/enums/LoanAuditEntityTypeEnum.ts +12 -0
- package/src/loanRetailAudit/enums/PiiAccessActionEnum.ts +5 -0
- package/src/loanRetailAudit/enums/PiiResourceTypeEnum.ts +9 -0
- package/src/loanRetailAudit/enums/RetailAuditEntityTypeEnum.ts +17 -0
- package/src/loanRetailAudit/events/AuditTrailRecordedV1.ts +70 -0
- package/src/loanRetailAudit/index.ts +20 -0
- package/src/retailLoan/dtos/MyCreditSummary.ts +2 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Expose } from 'class-transformer';
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
2
|
import {
|
|
3
3
|
ArrayNotEmpty,
|
|
4
4
|
IsArray,
|
|
@@ -11,12 +11,14 @@ import {
|
|
|
11
11
|
Matches,
|
|
12
12
|
Max,
|
|
13
13
|
Min,
|
|
14
|
+
ValidateNested,
|
|
14
15
|
} from 'class-validator';
|
|
15
16
|
import { regexIso8601 } from '../../helpers/constans/regex';
|
|
16
17
|
import { CreditPlanLevelEnum } from '../enums/CreditPlanLevelEnum';
|
|
17
18
|
import { CreditPlanStatusEnum } from '../enums/CreditPlanStatusEnum';
|
|
18
19
|
import { ProductTierEnum } from '../enums/ProductTierEnum';
|
|
19
20
|
import { SaleTypeEnum } from '../enums/SaleTypeEnum';
|
|
21
|
+
import { PrepaymentMinimum } from './PrepaymentMinimum';
|
|
20
22
|
|
|
21
23
|
/**
|
|
22
24
|
* CreditPlan — plan de crédito del catálogo SOFOM SureKeep (modelo-datos §6.1 · M6 §4).
|
|
@@ -168,4 +170,11 @@ export class CreditPlan {
|
|
|
168
170
|
@IsString()
|
|
169
171
|
@Matches(regexIso8601, { message: 'updatedAt debe ser una fecha ISO 8601' })
|
|
170
172
|
updatedAt!: string;
|
|
173
|
+
|
|
174
|
+
/** Mínimo del abono a capital; ausente = `ANY` (cualquier monto). */
|
|
175
|
+
@Expose()
|
|
176
|
+
@IsOptional()
|
|
177
|
+
@ValidateNested()
|
|
178
|
+
@Type(() => PrepaymentMinimum)
|
|
179
|
+
prepaymentMinimum?: PrepaymentMinimum;
|
|
171
180
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsEnum, IsInt, IsNumber, IsOptional, Max, Min } from 'class-validator';
|
|
3
|
+
import { PrepaymentMinimumModeEnum } from '../enums/PrepaymentMinimumModeEnum';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Mínimo del abono a capital de un plan. El máximo no depende del plan: es lo que falta para liquidar.
|
|
7
|
+
* Sin este campo en el plan, el mínimo es `ANY`.
|
|
8
|
+
*/
|
|
9
|
+
export class PrepaymentMinimum {
|
|
10
|
+
@Expose()
|
|
11
|
+
@IsEnum(PrepaymentMinimumModeEnum)
|
|
12
|
+
mode!: PrepaymentMinimumModeEnum;
|
|
13
|
+
|
|
14
|
+
/** Sólo `PERCENT_OF_PERIOD_PAYMENT`: decimal sobre 1 del pago del periodo (`0.5` = 50 %). */
|
|
15
|
+
@Expose()
|
|
16
|
+
@IsOptional()
|
|
17
|
+
@IsNumber()
|
|
18
|
+
@Min(0.0001)
|
|
19
|
+
@Max(1)
|
|
20
|
+
periodPaymentPct?: number | null;
|
|
21
|
+
|
|
22
|
+
/** Sólo `FIXED`: monto mínimo en cents. */
|
|
23
|
+
@Expose()
|
|
24
|
+
@IsOptional()
|
|
25
|
+
@IsInt()
|
|
26
|
+
@Min(1)
|
|
27
|
+
amountCents?: number | null;
|
|
28
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Expose } from 'class-transformer';
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
2
|
import {
|
|
3
3
|
ArrayNotEmpty,
|
|
4
4
|
IsArray,
|
|
@@ -10,10 +10,12 @@ import {
|
|
|
10
10
|
IsString,
|
|
11
11
|
Max,
|
|
12
12
|
Min,
|
|
13
|
+
ValidateNested,
|
|
13
14
|
} from 'class-validator';
|
|
14
15
|
import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
|
|
15
16
|
import { ProductTierEnum } from '../../enums/ProductTierEnum';
|
|
16
17
|
import { SaleTypeEnum } from '../../enums/SaleTypeEnum';
|
|
18
|
+
import { PrepaymentMinimum } from '../PrepaymentMinimum';
|
|
17
19
|
|
|
18
20
|
/**
|
|
19
21
|
* Body de POST /credit-plans — alta de un plan (SureKeep Fase 1 — pista Loan).
|
|
@@ -115,4 +117,11 @@ export class CreateCreditPlanRequest {
|
|
|
115
117
|
@IsOptional()
|
|
116
118
|
@IsString()
|
|
117
119
|
validUntil?: string | null;
|
|
120
|
+
|
|
121
|
+
/** Mínimo del abono a capital; ausente = sin cambios (en el alta: `ANY`). */
|
|
122
|
+
@Expose()
|
|
123
|
+
@IsOptional()
|
|
124
|
+
@ValidateNested()
|
|
125
|
+
@Type(() => PrepaymentMinimum)
|
|
126
|
+
prepaymentMinimum?: PrepaymentMinimum;
|
|
118
127
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Expose } from 'class-transformer';
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
2
|
import {
|
|
3
3
|
ArrayNotEmpty,
|
|
4
4
|
IsArray,
|
|
@@ -10,9 +10,11 @@ import {
|
|
|
10
10
|
IsString,
|
|
11
11
|
Max,
|
|
12
12
|
Min,
|
|
13
|
+
ValidateNested,
|
|
13
14
|
} from 'class-validator';
|
|
14
15
|
import { ProductTierEnum } from '../../enums/ProductTierEnum';
|
|
15
16
|
import { SaleTypeEnum } from '../../enums/SaleTypeEnum';
|
|
17
|
+
import { PrepaymentMinimum } from '../PrepaymentMinimum';
|
|
16
18
|
|
|
17
19
|
/**
|
|
18
20
|
* Body de PUT /credit-plans/:planId — edición parcial de parámetros del plan (todos opcionales).
|
|
@@ -114,4 +116,11 @@ export class UpdateCreditPlanRequest {
|
|
|
114
116
|
@IsOptional()
|
|
115
117
|
@IsString()
|
|
116
118
|
validUntil?: string | null;
|
|
119
|
+
|
|
120
|
+
/** Mínimo del abono a capital; ausente = sin cambios (en el alta: `ANY`). */
|
|
121
|
+
@Expose()
|
|
122
|
+
@IsOptional()
|
|
123
|
+
@ValidateNested()
|
|
124
|
+
@Type(() => PrepaymentMinimum)
|
|
125
|
+
prepaymentMinimum?: PrepaymentMinimum;
|
|
117
126
|
}
|
|
@@ -2,6 +2,7 @@ import { CreditPlanLevelEnum } from '../../enums/CreditPlanLevelEnum';
|
|
|
2
2
|
import { CreditPlanStatusEnum } from '../../enums/CreditPlanStatusEnum';
|
|
3
3
|
import { ProductTierEnum } from '../../enums/ProductTierEnum';
|
|
4
4
|
import { SaleTypeEnum } from '../../enums/SaleTypeEnum';
|
|
5
|
+
import { PrepaymentMinimum } from '../PrepaymentMinimum';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Shape de salida de un plan de crédito (GET / POST / PUT de /credit-plans).
|
|
@@ -33,4 +34,6 @@ export interface CreditPlanResponse {
|
|
|
33
34
|
updatedBy: string;
|
|
34
35
|
createdAt: string;
|
|
35
36
|
updatedAt: string;
|
|
37
|
+
/** Mínimo del abono a capital; ausente = `ANY` (cualquier monto). */
|
|
38
|
+
prepaymentMinimum?: PrepaymentMinimum;
|
|
36
39
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Cómo se fija el mínimo del abono a capital de un plan. */
|
|
2
|
+
export enum PrepaymentMinimumModeEnum {
|
|
3
|
+
/** Sin mínimo: el cliente abona el monto que quiera. */
|
|
4
|
+
ANY = 'ANY',
|
|
5
|
+
/** Un porcentaje del pago del periodo (`periodPaymentPct`). */
|
|
6
|
+
PERCENT_OF_PERIOD_PAYMENT = 'PERCENT_OF_PERIOD_PAYMENT',
|
|
7
|
+
/** Un monto fijo (`amountCents`). */
|
|
8
|
+
FIXED = 'FIXED',
|
|
9
|
+
}
|
|
@@ -16,9 +16,11 @@ export * from './enums/StorePolicyPhaseEnum';
|
|
|
16
16
|
export * from './enums/SegmentStatusEnum';
|
|
17
17
|
export * from './enums/SegmentColorSlotEnum';
|
|
18
18
|
export * from './enums/SegmentFilterIdEnum';
|
|
19
|
+
export * from './enums/PrepaymentMinimumModeEnum';
|
|
19
20
|
|
|
20
21
|
// Entity DTOs
|
|
21
22
|
export * from './dtos/CreditPlan';
|
|
23
|
+
export * from './dtos/PrepaymentMinimum';
|
|
22
24
|
export * from './dtos/Financier';
|
|
23
25
|
export * from './dtos/RetailerCreditPlan';
|
|
24
26
|
export * from './dtos/PromotionEffect';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LoanAuditEntityTypeEnum } from '../enums/LoanAuditEntityTypeEnum';
|
|
2
|
+
import { RetailAuditEntityTypeEnum } from '../enums/RetailAuditEntityTypeEnum';
|
|
3
|
+
|
|
4
|
+
/** Cualquier `entityType` que acepta el central, de Loan o de Retail. */
|
|
5
|
+
export type AuditTrailEntityType = LoanAuditEntityTypeEnum | RetailAuditEntityTypeEnum;
|
|
6
|
+
|
|
7
|
+
export const AUDIT_TRAIL_ENTITY_TYPES: readonly AuditTrailEntityType[] = [
|
|
8
|
+
...Object.values(LoanAuditEntityTypeEnum),
|
|
9
|
+
...Object.values(RetailAuditEntityTypeEnum),
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
export const AUDIT_TRAIL_MAX_PAGE_SIZE = 100;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsNotEmpty, IsOptional, IsString } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
/** Un campo que cambió; los valores van serializados a string y nunca llevan PII. */
|
|
5
|
+
export class AuditTrailChange {
|
|
6
|
+
@Expose()
|
|
7
|
+
@IsString()
|
|
8
|
+
@IsNotEmpty()
|
|
9
|
+
field!: string;
|
|
10
|
+
|
|
11
|
+
/** Ausente en un alta. */
|
|
12
|
+
@Expose()
|
|
13
|
+
@IsOptional()
|
|
14
|
+
@IsString()
|
|
15
|
+
oldValue?: string;
|
|
16
|
+
|
|
17
|
+
/** Ausente en una baja. */
|
|
18
|
+
@Expose()
|
|
19
|
+
@IsOptional()
|
|
20
|
+
@IsString()
|
|
21
|
+
newValue?: string;
|
|
22
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsNotEmpty, IsString } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
/** Dato que la acción no cambió y se guarda para leer la entrada sin abrir otra pantalla. */
|
|
5
|
+
export class AuditTrailContextEntry {
|
|
6
|
+
@Expose()
|
|
7
|
+
@IsString()
|
|
8
|
+
@IsNotEmpty()
|
|
9
|
+
key!: string;
|
|
10
|
+
|
|
11
|
+
@Expose()
|
|
12
|
+
@IsString()
|
|
13
|
+
value!: string;
|
|
14
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { ArrayNotEmpty, IsArray, IsEnum, IsISO8601, IsNotEmpty, IsOptional, IsString } from 'class-validator';
|
|
3
|
+
import { PiiAccessActionEnum } from '../../enums/PiiAccessActionEnum';
|
|
4
|
+
import { PiiResourceTypeEnum } from '../../enums/PiiResourceTypeEnum';
|
|
5
|
+
|
|
6
|
+
/** Body de `POST /private/pii-access-logs` (privateCreatePiiAccessLog); el tenant va en `?tenantId=`. */
|
|
7
|
+
export class CreatePiiAccessLogRequest {
|
|
8
|
+
/** ULID generado por quien llama; con `occurredAt` forma el sk, así un reintento no duplica. */
|
|
9
|
+
@Expose()
|
|
10
|
+
@IsString()
|
|
11
|
+
@IsNotEmpty()
|
|
12
|
+
accessId!: string;
|
|
13
|
+
|
|
14
|
+
@Expose()
|
|
15
|
+
@IsISO8601()
|
|
16
|
+
occurredAt!: string;
|
|
17
|
+
|
|
18
|
+
@Expose()
|
|
19
|
+
@IsString()
|
|
20
|
+
@IsNotEmpty()
|
|
21
|
+
correlationId!: string;
|
|
22
|
+
|
|
23
|
+
@Expose()
|
|
24
|
+
@IsString()
|
|
25
|
+
@IsNotEmpty()
|
|
26
|
+
actorId!: string;
|
|
27
|
+
|
|
28
|
+
@Expose()
|
|
29
|
+
@IsString()
|
|
30
|
+
@IsNotEmpty()
|
|
31
|
+
sourceLambda!: string;
|
|
32
|
+
|
|
33
|
+
@Expose()
|
|
34
|
+
@IsString()
|
|
35
|
+
@IsNotEmpty()
|
|
36
|
+
operationName!: string;
|
|
37
|
+
|
|
38
|
+
@Expose()
|
|
39
|
+
@IsEnum(PiiAccessActionEnum)
|
|
40
|
+
action!: PiiAccessActionEnum;
|
|
41
|
+
|
|
42
|
+
@Expose()
|
|
43
|
+
@IsEnum(PiiResourceTypeEnum)
|
|
44
|
+
resourceType!: PiiResourceTypeEnum;
|
|
45
|
+
|
|
46
|
+
/** Id del recurso, o `(list)` en un listado con los ids en `resourceIds`. */
|
|
47
|
+
@Expose()
|
|
48
|
+
@IsString()
|
|
49
|
+
@IsNotEmpty()
|
|
50
|
+
resourceId!: string;
|
|
51
|
+
|
|
52
|
+
/** Nombres de los campos PII que viajaron; nunca sus valores. */
|
|
53
|
+
@Expose()
|
|
54
|
+
@IsArray()
|
|
55
|
+
@ArrayNotEmpty()
|
|
56
|
+
@IsString({ each: true })
|
|
57
|
+
fields!: string[];
|
|
58
|
+
|
|
59
|
+
@Expose()
|
|
60
|
+
@IsOptional()
|
|
61
|
+
@IsArray()
|
|
62
|
+
@IsString({ each: true })
|
|
63
|
+
resourceIds?: string[];
|
|
64
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
|
+
import { IsEnum, IsIn, IsInt, IsNotEmpty, IsOptional, IsString, Max, Min } from 'class-validator';
|
|
3
|
+
import { SortDirEnum } from '../../../passport/enums/SortDirEnum';
|
|
4
|
+
import { AUDIT_TRAIL_ENTITY_TYPES, AUDIT_TRAIL_MAX_PAGE_SIZE, AuditTrailEntityType } from '../../constants/auditTrailEntityTypes';
|
|
5
|
+
|
|
6
|
+
/** Query de `GET /private/audit-trail` (privateListAuditTrail): bitácora de una entidad, paginada por sk. */
|
|
7
|
+
export class ListAuditTrailQuery {
|
|
8
|
+
@Expose()
|
|
9
|
+
@IsIn(AUDIT_TRAIL_ENTITY_TYPES)
|
|
10
|
+
entityType!: AuditTrailEntityType;
|
|
11
|
+
|
|
12
|
+
@Expose()
|
|
13
|
+
@IsString()
|
|
14
|
+
@IsNotEmpty()
|
|
15
|
+
entityId!: string;
|
|
16
|
+
|
|
17
|
+
/** Por default `desc`, lo más reciente primero. */
|
|
18
|
+
@Expose()
|
|
19
|
+
@IsOptional()
|
|
20
|
+
@IsEnum(SortDirEnum)
|
|
21
|
+
order?: SortDirEnum;
|
|
22
|
+
|
|
23
|
+
@Expose()
|
|
24
|
+
@IsOptional()
|
|
25
|
+
@Type(() => Number)
|
|
26
|
+
@IsInt()
|
|
27
|
+
@Min(1)
|
|
28
|
+
@Max(AUDIT_TRAIL_MAX_PAGE_SIZE)
|
|
29
|
+
limit?: number;
|
|
30
|
+
|
|
31
|
+
@Expose()
|
|
32
|
+
@IsOptional()
|
|
33
|
+
@IsString()
|
|
34
|
+
nextToken?: string;
|
|
35
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AuditTrailEntityType } from '../../constants/auditTrailEntityTypes';
|
|
2
|
+
import { AuditTrailActionEnum } from '../../enums/AuditTrailActionEnum';
|
|
3
|
+
|
|
4
|
+
/** Un campo que cambió, como lo devuelve la lectura. */
|
|
5
|
+
export interface AuditTrailChangeView {
|
|
6
|
+
field: string;
|
|
7
|
+
oldValue: string | null;
|
|
8
|
+
newValue: string | null;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Una entrada de la bitácora; `eventId` y `sourceLambda` son `null` en filas Loan de forma vieja. */
|
|
12
|
+
export interface AuditTrailEntry {
|
|
13
|
+
eventId: string | null;
|
|
14
|
+
sourceLambda: string | null;
|
|
15
|
+
entityType: AuditTrailEntityType;
|
|
16
|
+
entityId: string;
|
|
17
|
+
tenantId: string | null;
|
|
18
|
+
action: AuditTrailActionEnum;
|
|
19
|
+
performedBy: string;
|
|
20
|
+
reason: string | null;
|
|
21
|
+
ip: string | null;
|
|
22
|
+
changes: AuditTrailChangeView[];
|
|
23
|
+
context: { key: string; value: string }[];
|
|
24
|
+
occurredAt: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Página de privateListAuditTrail; `nextToken` es `null` en la última. */
|
|
28
|
+
export interface ListAuditTrailResponse {
|
|
29
|
+
items: AuditTrailEntry[];
|
|
30
|
+
nextToken: string | null;
|
|
31
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Acción auditada en `SharedAuditTrail`; une las de Loan y Retail. */
|
|
2
|
+
export enum AuditTrailActionEnum {
|
|
3
|
+
CREATE = 'CREATE',
|
|
4
|
+
UPDATE = 'UPDATE',
|
|
5
|
+
DELETE = 'DELETE',
|
|
6
|
+
UPSERT = 'UPSERT',
|
|
7
|
+
STATUS_CHANGE = 'STATUS_CHANGE',
|
|
8
|
+
TRANSFER = 'TRANSFER',
|
|
9
|
+
KYC_VERIFIED = 'KYC_VERIFIED',
|
|
10
|
+
KYC_REVIEW = 'KYC_REVIEW',
|
|
11
|
+
ACCOUNT_RESULT = 'ACCOUNT_RESULT',
|
|
12
|
+
WELCOME_ACCREDITED = 'WELCOME_ACCREDITED',
|
|
13
|
+
WELCOME_ACCREDITATION_RESULT = 'WELCOME_ACCREDITATION_RESULT',
|
|
14
|
+
WELCOME_ACCREDITATION_RECONCILED = 'WELCOME_ACCREDITATION_RECONCILED',
|
|
15
|
+
SESSION_CREATE = 'SESSION_CREATE',
|
|
16
|
+
STEP_ADVANCE = 'STEP_ADVANCE',
|
|
17
|
+
OTP_SKIP = 'OTP_SKIP',
|
|
18
|
+
SESSION_RESUME = 'SESSION_RESUME',
|
|
19
|
+
SESSION_CANCEL = 'SESSION_CANCEL',
|
|
20
|
+
SESSION_CREDIT_ENABLED = 'SESSION_CREDIT_ENABLED',
|
|
21
|
+
PAYMENT_REGISTERED = 'PAYMENT_REGISTERED',
|
|
22
|
+
SALE_COMPLETE = 'SALE_COMPLETE',
|
|
23
|
+
SALE_CANCEL = 'SALE_CANCEL',
|
|
24
|
+
SALE_CARD_DELIVERED = 'SALE_CARD_DELIVERED',
|
|
25
|
+
KYC_CONFIRM = 'KYC_CONFIRM',
|
|
26
|
+
COMPLIANCE_VERDICT = 'COMPLIANCE_VERDICT',
|
|
27
|
+
EXCEPTION_CREATE = 'EXCEPTION_CREATE',
|
|
28
|
+
EXCEPTION_REVIEW = 'EXCEPTION_REVIEW',
|
|
29
|
+
EXCEPTION_RESOLVE = 'EXCEPTION_RESOLVE',
|
|
30
|
+
EXCEPTION_APPLY = 'EXCEPTION_APPLY',
|
|
31
|
+
EXCEPTION_NOTE = 'EXCEPTION_NOTE',
|
|
32
|
+
REPORT_RUN_REQUEST = 'REPORT_RUN_REQUEST',
|
|
33
|
+
PUBLISH = 'PUBLISH',
|
|
34
|
+
CLOSE = 'CLOSE',
|
|
35
|
+
ADJUST = 'ADJUST',
|
|
36
|
+
PAUSE = 'PAUSE',
|
|
37
|
+
RESUME = 'RESUME',
|
|
38
|
+
EXPIRE = 'EXPIRE',
|
|
39
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** `entityType` de bitácora que escriben los lambdas Loan; los valores son los que ya están en la pk. */
|
|
2
|
+
export enum LoanAuditEntityTypeEnum {
|
|
3
|
+
CREDIT = 'CREDIT',
|
|
4
|
+
INSTALLMENT = 'INSTALLMENT',
|
|
5
|
+
RESTRUCTURE = 'RESTRUCTURE',
|
|
6
|
+
CREDIT_PLAN = 'CREDIT_PLAN',
|
|
7
|
+
STORE_POLICY = 'STORE_POLICY',
|
|
8
|
+
SEGMENT = 'SEGMENT',
|
|
9
|
+
LOAN_PARAMETER = 'LoanParameter',
|
|
10
|
+
LOAN_ASSIGNMENT_RULE = 'LoanAssignmentRule',
|
|
11
|
+
LOAN_COLLECTOR_ASSIGNMENT = 'LoanCollectorAssignment',
|
|
12
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Tipo de recurso con PII; arma la pk `RESOURCE#<tipo>#<id>` de `SharedPiiAccessLog`. */
|
|
2
|
+
export enum PiiResourceTypeEnum {
|
|
3
|
+
RETAIL_CUSTOMER = 'RETAIL_CUSTOMER',
|
|
4
|
+
RETAIL_USER = 'RETAIL_USER',
|
|
5
|
+
RETAILER = 'RETAILER',
|
|
6
|
+
SALE = 'SALE',
|
|
7
|
+
PROSPECT = 'PROSPECT',
|
|
8
|
+
LOAN_PAYMENT = 'LOAN_PAYMENT',
|
|
9
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** `entityType` de bitácora que escriben los lambdas Retail (customer, org, wizard, commission). */
|
|
2
|
+
export enum RetailAuditEntityTypeEnum {
|
|
3
|
+
CUSTOMER = 'CUSTOMER',
|
|
4
|
+
RETAILER = 'RETAILER',
|
|
5
|
+
STORE = 'STORE',
|
|
6
|
+
RETAIL_USER = 'RETAIL_USER',
|
|
7
|
+
GOAL = 'GOAL',
|
|
8
|
+
WIZARD_SESSION = 'WIZARD_SESSION',
|
|
9
|
+
SALE = 'SALE',
|
|
10
|
+
SALE_EXCEPTION = 'SALE_EXCEPTION',
|
|
11
|
+
REPORT_RUN = 'REPORT_RUN',
|
|
12
|
+
COMMISSION_PLAN = 'COMMISSION_PLAN',
|
|
13
|
+
COMMISSION_PAYOUT = 'COMMISSION_PAYOUT',
|
|
14
|
+
COMMISSION_ADJUSTMENT = 'COMMISSION_ADJUSTMENT',
|
|
15
|
+
COMMISSION_RULE = 'COMMISSION_RULE',
|
|
16
|
+
COMMISSION_POLICY = 'COMMISSION_POLICY',
|
|
17
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
|
+
import { IsArray, IsIn, IsEnum, IsISO8601, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator';
|
|
3
|
+
import { AUDIT_TRAIL_ENTITY_TYPES, AuditTrailEntityType } from '../constants/auditTrailEntityTypes';
|
|
4
|
+
import { AuditTrailChange } from '../dtos/AuditTrailChange';
|
|
5
|
+
import { AuditTrailContextEntry } from '../dtos/AuditTrailContextEntry';
|
|
6
|
+
import { AuditTrailActionEnum } from '../enums/AuditTrailActionEnum';
|
|
7
|
+
|
|
8
|
+
/** Mensaje de la cola `LoanRetailAuditQueue`; el central lo guarda una sola vez por `eventId`. */
|
|
9
|
+
export class AuditTrailRecordedV1 {
|
|
10
|
+
@Expose()
|
|
11
|
+
@IsString()
|
|
12
|
+
@IsNotEmpty()
|
|
13
|
+
eventId!: string;
|
|
14
|
+
|
|
15
|
+
@Expose()
|
|
16
|
+
@IsIn(AUDIT_TRAIL_ENTITY_TYPES)
|
|
17
|
+
entityType!: AuditTrailEntityType;
|
|
18
|
+
|
|
19
|
+
@Expose()
|
|
20
|
+
@IsString()
|
|
21
|
+
@IsNotEmpty()
|
|
22
|
+
entityId!: string;
|
|
23
|
+
|
|
24
|
+
@Expose()
|
|
25
|
+
@IsEnum(AuditTrailActionEnum)
|
|
26
|
+
action!: AuditTrailActionEnum;
|
|
27
|
+
|
|
28
|
+
@Expose()
|
|
29
|
+
@IsArray()
|
|
30
|
+
@ValidateNested({ each: true })
|
|
31
|
+
@Type(() => AuditTrailChange)
|
|
32
|
+
changes!: AuditTrailChange[];
|
|
33
|
+
|
|
34
|
+
@Expose()
|
|
35
|
+
@IsArray()
|
|
36
|
+
@ValidateNested({ each: true })
|
|
37
|
+
@Type(() => AuditTrailContextEntry)
|
|
38
|
+
context!: AuditTrailContextEntry[];
|
|
39
|
+
|
|
40
|
+
/** userId del actor, o `system` si lo disparó un proceso interno. */
|
|
41
|
+
@Expose()
|
|
42
|
+
@IsString()
|
|
43
|
+
@IsNotEmpty()
|
|
44
|
+
performedBy!: string;
|
|
45
|
+
|
|
46
|
+
@Expose()
|
|
47
|
+
@IsString()
|
|
48
|
+
@IsNotEmpty()
|
|
49
|
+
sourceLambda!: string;
|
|
50
|
+
|
|
51
|
+
@Expose()
|
|
52
|
+
@IsISO8601()
|
|
53
|
+
occurredAt!: string;
|
|
54
|
+
|
|
55
|
+
@Expose()
|
|
56
|
+
@IsOptional()
|
|
57
|
+
@IsString()
|
|
58
|
+
@IsNotEmpty()
|
|
59
|
+
tenantId?: string;
|
|
60
|
+
|
|
61
|
+
@Expose()
|
|
62
|
+
@IsOptional()
|
|
63
|
+
@IsString()
|
|
64
|
+
reason?: string;
|
|
65
|
+
|
|
66
|
+
@Expose()
|
|
67
|
+
@IsOptional()
|
|
68
|
+
@IsString()
|
|
69
|
+
ip?: string;
|
|
70
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Enums
|
|
2
|
+
export * from './enums/LoanAuditEntityTypeEnum';
|
|
3
|
+
export * from './enums/RetailAuditEntityTypeEnum';
|
|
4
|
+
export * from './enums/AuditTrailActionEnum';
|
|
5
|
+
export * from './enums/PiiResourceTypeEnum';
|
|
6
|
+
export * from './enums/PiiAccessActionEnum';
|
|
7
|
+
|
|
8
|
+
// Constantes
|
|
9
|
+
export * from './constants/auditTrailEntityTypes';
|
|
10
|
+
|
|
11
|
+
// DTOs
|
|
12
|
+
export * from './dtos/AuditTrailChange';
|
|
13
|
+
export * from './dtos/AuditTrailContextEntry';
|
|
14
|
+
export * from './dtos/requests/CreatePiiAccessLogRequest';
|
|
15
|
+
export * from './dtos/requests/ListAuditTrailQuery';
|
|
16
|
+
export * from './dtos/responses/CreatePiiAccessLogResponse';
|
|
17
|
+
export * from './dtos/responses/ListAuditTrailResponse';
|
|
18
|
+
|
|
19
|
+
// Contratos de eventos
|
|
20
|
+
export * from './events/AuditTrailRecordedV1';
|
|
@@ -28,5 +28,7 @@ export interface MyCreditSummary {
|
|
|
28
28
|
totalInstallments: number;
|
|
29
29
|
paidInstallments: number;
|
|
30
30
|
remainingBalance: number | null;
|
|
31
|
+
/** Deuda total en pesos: capital, interés e IVA que faltan de las cuotas abiertas. `null` = no aplica. */
|
|
32
|
+
totalDebt?: number | null;
|
|
31
33
|
overdue?: MyOverdue;
|
|
32
34
|
}
|