@fiado/type-kit 3.510.0 → 3.512.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 (38) hide show
  1. package/_test_/unit/loanCredit/updateLoanBorrowerSciRequest.test.ts +46 -0
  2. package/_test_/unit/rewards/enums.test.ts +20 -4
  3. package/_test_/unit/rewards/grantMessages.test.ts +6 -0
  4. package/_test_/unit/rewards/readResponses.test.ts +17 -0
  5. package/bin/datalakeReports/dtos/ReportDefinitionDto.d.ts +35 -0
  6. package/bin/datalakeReports/dtos/ReportDefinitionDto.js +12 -0
  7. package/bin/datalakeReports/dtos/ReportResultDto.d.ts +18 -0
  8. package/bin/datalakeReports/dtos/ReportResultDto.js +7 -0
  9. package/bin/datalakeReports/dtos/RunReportRequest.d.ts +4 -0
  10. package/bin/datalakeReports/dtos/RunReportRequest.js +21 -0
  11. package/bin/datalakeReports/enums/ReportStatusEnum.d.ts +5 -0
  12. package/bin/datalakeReports/enums/ReportStatusEnum.js +9 -0
  13. package/bin/datalakeReports/index.d.ts +4 -0
  14. package/bin/datalakeReports/index.js +22 -0
  15. package/bin/index.d.ts +1 -0
  16. package/bin/index.js +2 -1
  17. package/bin/loanCredit/dtos/requests/UpdateLoanBorrowerSciRequest.d.ts +13 -0
  18. package/bin/loanCredit/dtos/requests/UpdateLoanBorrowerSciRequest.js +46 -0
  19. package/bin/loanCredit/index.d.ts +1 -0
  20. package/bin/loanCredit/index.js +1 -0
  21. package/bin/rewards/enums/GrantFailedReasonEnum.d.ts +6 -2
  22. package/bin/rewards/enums/GrantFailedReasonEnum.js +6 -2
  23. package/bin/rewards/enums/GrantItemStatusEnum.d.ts +5 -0
  24. package/bin/rewards/enums/GrantItemStatusEnum.js +5 -0
  25. package/bin/rewards/enums/GrantRejectReasonEnum.d.ts +6 -1
  26. package/bin/rewards/enums/GrantRejectReasonEnum.js +5 -0
  27. package/package.json +1 -1
  28. package/src/datalakeReports/dtos/ReportDefinitionDto.ts +36 -0
  29. package/src/datalakeReports/dtos/ReportResultDto.ts +20 -0
  30. package/src/datalakeReports/dtos/RunReportRequest.ts +8 -0
  31. package/src/datalakeReports/enums/ReportStatusEnum.ts +5 -0
  32. package/src/datalakeReports/index.ts +7 -0
  33. package/src/index.ts +1 -0
  34. package/src/loanCredit/dtos/requests/UpdateLoanBorrowerSciRequest.ts +31 -0
  35. package/src/loanCredit/index.ts +1 -0
  36. package/src/rewards/enums/GrantFailedReasonEnum.ts +6 -2
  37. package/src/rewards/enums/GrantItemStatusEnum.ts +5 -0
  38. package/src/rewards/enums/GrantRejectReasonEnum.ts +5 -0
@@ -0,0 +1,46 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { UpdateLoanBorrowerSciRequest } from '../../../src/loanCredit/index';
5
+ import { ClientLevelEnum } from '../../../src/loanScoring/enums/ClientLevelEnum';
6
+
7
+ const errorsOf = async (body: Record<string, unknown>): Promise<string[]> => {
8
+ const errors = await validate(plainToInstance(UpdateLoanBorrowerSciRequest, body));
9
+ return errors.map((error) => error.property);
10
+ };
11
+
12
+ const VALID = { evaluationId: '01M4C1RZ0000000000000000AA', sciScore: 64, clientLevel: ClientLevelEnum.SILVER };
13
+
14
+ describe('UpdateLoanBorrowerSciRequest', () => {
15
+ it('acepta el resultado de una evaluación', async () => {
16
+ expect(await errorsOf(VALID)).toEqual([]);
17
+ });
18
+
19
+ it('acepta NOT_ELIGIBLE: también es el nivel de la última evaluación', async () => {
20
+ expect(await errorsOf({ ...VALID, sciScore: 12, clientLevel: ClientLevelEnum.NOT_ELIGIBLE })).toEqual([]);
21
+ });
22
+
23
+ it('exige los tres campos', async () => {
24
+ expect((await errorsOf({})).sort()).toEqual(['clientLevel', 'evaluationId', 'sciScore']);
25
+ });
26
+
27
+ it('rechaza un score fuera de 0-100 o con decimales', async () => {
28
+ expect(await errorsOf({ ...VALID, sciScore: 101 })).toEqual(['sciScore']);
29
+ expect(await errorsOf({ ...VALID, sciScore: -1 })).toEqual(['sciScore']);
30
+ expect(await errorsOf({ ...VALID, sciScore: 64.5 })).toEqual(['sciScore']);
31
+ });
32
+
33
+ it('rechaza un nivel que no está en el catálogo', async () => {
34
+ expect(await errorsOf({ ...VALID, clientLevel: 'PLATINUM' })).toEqual(['clientLevel']);
35
+ });
36
+
37
+ it('rechaza un evaluationId vacío', async () => {
38
+ expect(await errorsOf({ ...VALID, evaluationId: '' })).toEqual(['evaluationId']);
39
+ });
40
+
41
+ it('exige un ULID en mayúsculas: el acreditado ordena las evaluaciones comparando ids', async () => {
42
+ expect(await errorsOf({ ...VALID, evaluationId: '01m4c1rz0000000000000000aa' })).toEqual(['evaluationId']);
43
+ expect(await errorsOf({ ...VALID, evaluationId: '3f2b8c1e-9d4a-4c1b-8e2f-1a2b3c4d5e6f' })).toEqual(['evaluationId']);
44
+ expect(await errorsOf({ ...VALID, evaluationId: '01M4C1RZ0000000000000000A' })).toEqual(['evaluationId']);
45
+ });
46
+ });
@@ -29,7 +29,7 @@ describe('rewards: enums (los valores viajan por cola y por HTTP: no se renombra
29
29
  });
30
30
 
31
31
  it('GrantItemStatusEnum coincide con spec A 7.1', () => {
32
- expect(Object.values(GrantItemStatusEnum).sort()).toEqual(['FAILED', 'GRANTED', 'PENDING', 'SKIPPED']);
32
+ expect(Object.values(GrantItemStatusEnum).sort()).toEqual(['FAILED', 'GRANTED', 'PENDING', 'PROCESSING', 'SKIPPED']);
33
33
  });
34
34
 
35
35
  it('ItemErrorCategoryEnum coincide con spec A §8', () => {
@@ -38,10 +38,26 @@ describe('rewards: enums (los valores viajan por cola y por HTTP: no se renombra
38
38
  ]);
39
39
  });
40
40
 
41
- it('GrantFailedReasonEnum incluye todas las razones de rechazo más ITEMS_FAILED', () => {
42
- Object.values(GrantRejectReasonEnum).forEach((razon) => {
43
- expect(Object.values(GrantFailedReasonEnum)).toContain(razon);
41
+ it('GrantItemStatusEnum conserva los valores previos y agrega PROCESSING', () => {
42
+ ['PENDING', 'GRANTED', 'FAILED', 'SKIPPED'].forEach((v) => {
43
+ expect(Object.values(GrantItemStatusEnum)).toContain(v);
44
44
  });
45
+ expect(GrantItemStatusEnum.PROCESSING).toBe('PROCESSING');
46
+ });
47
+
48
+ it('GrantRejectReasonEnum conserva los valores previos y agrega UNSUPPORTED_REWARD_TYPE', () => {
49
+ expect(Object.values(GrantRejectReasonEnum).sort()).toEqual([
50
+ 'INPUT_INVALID', 'PACKAGE_INACTIVE', 'PACKAGE_NOT_FOUND', 'UNSUPPORTED_REWARD_TYPE',
51
+ ]);
52
+ });
53
+
54
+ it('GrantFailedReasonEnum incluye las razones de rechazo (salvo UNSUPPORTED_REWARD_TYPE, que se avisa como INPUT_INVALID) más ITEMS_FAILED', () => {
55
+ Object.values(GrantRejectReasonEnum)
56
+ .filter((razon) => razon !== GrantRejectReasonEnum.UNSUPPORTED_REWARD_TYPE)
57
+ .forEach((razon) => {
58
+ expect(Object.values(GrantFailedReasonEnum)).toContain(razon);
59
+ });
60
+ expect(Object.values(GrantFailedReasonEnum)).not.toContain('UNSUPPORTED_REWARD_TYPE');
45
61
  expect(GrantFailedReasonEnum.ITEMS_FAILED).toBe('ITEMS_FAILED');
46
62
  expect(Object.values(GrantFailedReasonEnum)).toHaveLength(4);
47
63
  });
@@ -105,6 +105,12 @@ describe('GrantFailedMessage (spec A 6.5)', () => {
105
105
  expect(dto.reason).toBe(GrantFailedReasonEnum.PACKAGE_INACTIVE);
106
106
  });
107
107
 
108
+ it('un REJECTED por UNSUPPORTED_REWARD_TYPE se avisa como INPUT_INVALID (GrantFailedReasonEnum no suma valores)', async () => {
109
+ expect(Object.values(GrantFailedReasonEnum)).not.toContain('UNSUPPORTED_REWARD_TYPE');
110
+ expect(await errorProps(failed({ ...baseFailed, reason: 'UNSUPPORTED_REWARD_TYPE' }))).toContain('reason');
111
+ expect(await validate(failed({ ...baseFailed, reason: GrantFailedReasonEnum.INPUT_INVALID }))).toHaveLength(0);
112
+ });
113
+
108
114
  it.each(Object.values(GrantFailedReasonEnum))('acepta la razón %s', async (reason) => {
109
115
  expect(await validate(failed({ ...baseFailed, reason }))).toHaveLength(0);
110
116
  });
@@ -112,6 +112,23 @@ describe('GrantResponse (GET /grants/{id}, spec A 6.4)', () => {
112
112
  expect(rechazada.rejectReason).toBe('PACKAGE_INACTIVE');
113
113
  });
114
114
 
115
+ it('una entrega REJECTED por UNSUPPORTED_REWARD_TYPE y un ítem PROCESSING viajan por JSON', () => {
116
+ const sinAdaptador: GrantResponse = {
117
+ ...entrega,
118
+ status: GrantStatusEnum.REJECTED,
119
+ rejectReason: GrantRejectReasonEnum.UNSUPPORTED_REWARD_TYPE,
120
+ items: [],
121
+ };
122
+ expect(JSON.parse(JSON.stringify(sinAdaptador)).rejectReason).toBe('UNSUPPORTED_REWARD_TYPE');
123
+
124
+ const enProceso: GrantResponse = {
125
+ ...entrega,
126
+ status: GrantStatusEnum.IN_PROGRESS,
127
+ items: [{ ...entrega.items[1], status: GrantItemStatusEnum.PROCESSING, grantedAt: undefined }],
128
+ };
129
+ expect(JSON.parse(JSON.stringify(enProceso)).items[0].status).toBe('PROCESSING');
130
+ });
131
+
115
132
  it('un INPUT_INVALID expone la lista de campos inválidos (spec A 6.2)', () => {
116
133
  const invalida: GrantResponse = {
117
134
  ...entrega,
@@ -0,0 +1,35 @@
1
+ export type ReportAudience = 'backoffice' | 'private' | 'public';
2
+ export type ReportParamType = 'date' | 'string' | 'int' | 'enum' | 'list' | 'boolean';
3
+ export declare class ReportParamSpecDto {
4
+ type: ReportParamType;
5
+ required?: boolean;
6
+ default?: string | number | boolean | string[];
7
+ values?: string[];
8
+ max?: number;
9
+ min?: number;
10
+ }
11
+ export declare class ReportColumnDto {
12
+ name: string;
13
+ type: 'string' | 'number' | 'date' | 'datetime' | 'boolean';
14
+ label: string;
15
+ }
16
+ export declare class ReportDefinitionDto {
17
+ /** dominio.nombre */
18
+ id: string;
19
+ version: number;
20
+ title: string;
21
+ description: string;
22
+ source: {
23
+ layer: 'gold' | 'silver';
24
+ databases: string[];
25
+ };
26
+ pii: boolean;
27
+ audiences: ReportAudience[];
28
+ permission: string;
29
+ mode: 'sync' | 'async';
30
+ cacheSeconds: number;
31
+ maxBytesScanned?: number;
32
+ params: Record<string, ReportParamSpecDto>;
33
+ principalParams: string[];
34
+ columns: ReportColumnDto[];
35
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReportDefinitionDto = exports.ReportColumnDto = exports.ReportParamSpecDto = void 0;
4
+ class ReportParamSpecDto {
5
+ }
6
+ exports.ReportParamSpecDto = ReportParamSpecDto;
7
+ class ReportColumnDto {
8
+ }
9
+ exports.ReportColumnDto = ReportColumnDto;
10
+ class ReportDefinitionDto {
11
+ }
12
+ exports.ReportDefinitionDto = ReportDefinitionDto;
@@ -0,0 +1,18 @@
1
+ import { ReportStatusEnum } from "../enums/ReportStatusEnum";
2
+ import { ReportColumnDto } from "./ReportDefinitionDto";
3
+ export type ReportRow = Record<string, string | number | boolean | null>;
4
+ /** Respuesta de run y de jobs. Con status RUNNING solo vienen reportId y jobId; con FAILED, jobId y reason. */
5
+ export declare class ReportResultDto {
6
+ status: ReportStatusEnum;
7
+ reportId?: string;
8
+ version?: number;
9
+ jobId: string;
10
+ columns?: ReportColumnDto[];
11
+ rows?: ReportRow[];
12
+ rowCount?: number;
13
+ nextToken?: string;
14
+ computedAt?: string;
15
+ fromCache?: boolean;
16
+ bytesScanned?: number;
17
+ reason?: string;
18
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReportResultDto = void 0;
4
+ /** Respuesta de run y de jobs. Con status RUNNING solo vienen reportId y jobId; con FAILED, jobId y reason. */
5
+ class ReportResultDto {
6
+ }
7
+ exports.ReportResultDto = ReportResultDto;
@@ -0,0 +1,4 @@
1
+ export declare class RunReportRequest {
2
+ /** Parámetros del reporte según su definición; los principalParams se ignoran (salen del token). */
3
+ params?: Record<string, unknown>;
4
+ }
@@ -0,0 +1,21 @@
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.RunReportRequest = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ class RunReportRequest {
15
+ }
16
+ exports.RunReportRequest = RunReportRequest;
17
+ __decorate([
18
+ (0, class_validator_1.IsObject)(),
19
+ (0, class_validator_1.IsOptional)(),
20
+ __metadata("design:type", Object)
21
+ ], RunReportRequest.prototype, "params", void 0);
@@ -0,0 +1,5 @@
1
+ export declare enum ReportStatusEnum {
2
+ RUNNING = "RUNNING",
3
+ DONE = "DONE",
4
+ FAILED = "FAILED"
5
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReportStatusEnum = void 0;
4
+ var ReportStatusEnum;
5
+ (function (ReportStatusEnum) {
6
+ ReportStatusEnum["RUNNING"] = "RUNNING";
7
+ ReportStatusEnum["DONE"] = "DONE";
8
+ ReportStatusEnum["FAILED"] = "FAILED";
9
+ })(ReportStatusEnum || (exports.ReportStatusEnum = ReportStatusEnum = {}));
@@ -0,0 +1,4 @@
1
+ export * from './enums/ReportStatusEnum';
2
+ export * from './dtos/ReportDefinitionDto';
3
+ export * from './dtos/RunReportRequest';
4
+ export * from './dtos/ReportResultDto';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ //enums
18
+ __exportStar(require("./enums/ReportStatusEnum"), exports);
19
+ //dtos
20
+ __exportStar(require("./dtos/ReportDefinitionDto"), exports);
21
+ __exportStar(require("./dtos/RunReportRequest"), exports);
22
+ __exportStar(require("./dtos/ReportResultDto"), exports);
package/bin/index.d.ts CHANGED
@@ -123,3 +123,4 @@ export * as FileStorage from './fileStorage';
123
123
  export * as DynamicForm from './dynamicForm';
124
124
  export * as Rewards from './rewards';
125
125
  export * as RewardsEligibility from './rewardsEligibility';
126
+ export * as DatalakeReports from './datalakeReports';
package/bin/index.js CHANGED
@@ -38,7 +38,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.IssuanceBusiness = exports.Blacklist = exports.CentralPayments = exports.Helpdesk = exports.FiadoApiResponse = exports.Auth = exports.LegalDocumentsBusiness = exports.Role = exports.STPAccount = exports.RiskProfile = exports.FraudPreventionEngine = exports.BBVARst = exports.Stp = exports.BenefitCenter = exports.BankAccount = exports.P2pContact = exports.CreditContract = exports.Contract = exports.ProductCatalog = exports.ContactInfo = exports.TransactionAnalytics = exports.Transaction = exports.TransactionProcessor = exports.GenericMessage = exports.EventBridgeMessage = exports.SessionActivity = exports.NotificationMessages = exports.ServicePayment = exports.Header = exports.Identity = exports.UserTags = exports.Group = exports.File = exports.ExchangeRate = exports.Directory = exports.Currency = exports.Country = exports.Card = exports.Authentication = exports.AppContent = exports.App = exports.Offices = exports.Places = exports.Address = exports.Beneficiary = exports.Activity = exports.Biometrics = exports.MetamapConnector = exports.Account = exports.Crypto = void 0;
40
40
  exports.RetailPromotions = exports.RetailWizard = exports.RetailCustomer = exports.RetailCards = exports.RetailCatalog = exports.RetailCommission = exports.RetailOrg = exports.EmailVerification = exports.NetworkConnector = exports.Modelias = exports.TotpSecurity = exports.Passport = exports.WalletFunding = exports.Remittance = exports.PlatformRbac = exports.CognitoBackofficeConnector = exports.WhatsappConnector = exports.TwilioConnector = exports.MessagesConnector = exports.Mdm = exports.MilestoneBusiness = exports.CirculoCredito = exports.CreditStatements = exports.Sentry = exports.AiEngine = exports.Funnel = exports.TeamsConnector = exports.PlatformErrorEvents = exports.CustomerFile = exports.CreditBackoffice = exports.CreditDashboard = exports.CreditEngine = exports.Credit = exports.ComissionBusiness = exports.ReferralBusiness = exports.ZendeskMessaging = exports.NotificationWS = exports.Event = exports.PayrollBusiness = exports.Cnbv = exports.DirectorySetting = exports.InvoiceCollector = exports.Collector = exports.Pricelist = exports.Company = exports.Services = exports.AccountIssuanceBusiness = exports.AppSelectionData = exports.Device = exports.Observations = void 0;
41
- exports.RewardsEligibility = exports.Rewards = exports.DynamicForm = exports.FileStorage = exports.MoneyTransfer = exports.RetailLoan = exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = exports.LoanConfig = exports.DatalakeQuery = exports.RetailIntegration = void 0;
41
+ exports.DatalakeReports = exports.RewardsEligibility = exports.Rewards = exports.DynamicForm = exports.FileStorage = exports.MoneyTransfer = exports.RetailLoan = exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = exports.LoanConfig = exports.DatalakeQuery = exports.RetailIntegration = void 0;
42
42
  exports.Crypto = __importStar(require("./crypto"));
43
43
  exports.Account = __importStar(require("./account"));
44
44
  exports.MetamapConnector = __importStar(require("./metamapConnector"));
@@ -244,3 +244,4 @@ exports.Rewards = __importStar(require("./rewards"));
244
244
  // RewardsEligibility: contrato del validador de elegibilidad (rewards-eligibility-business) hacia los
245
245
  // servicios emisores: POST /events (request/response) y GET /runs/{id}.
246
246
  exports.RewardsEligibility = __importStar(require("./rewardsEligibility"));
247
+ exports.DatalakeReports = __importStar(require("./datalakeReports"));
@@ -0,0 +1,13 @@
1
+ import { ClientLevelEnum } from '../../../loanScoring/enums/ClientLevelEnum';
2
+ /**
3
+ * Body de `PUT /private/borrowers/:borrowerId/sci` (loan-credit-business): el resultado de una
4
+ * evaluación SCI que loan-scoring deja en el acreditado al terminarla.
5
+ *
6
+ * El acreditado guarda la evaluación más reciente: una que llegue después de otra más nueva no
7
+ * cambia nada. `evaluationId` es el ULID de la evaluación, así que su orden es el cronológico.
8
+ */
9
+ export declare class UpdateLoanBorrowerSciRequest {
10
+ evaluationId: string;
11
+ sciScore: number;
12
+ clientLevel: ClientLevelEnum;
13
+ }
@@ -0,0 +1,46 @@
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.UpdateLoanBorrowerSciRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const ClientLevelEnum_1 = require("../../../loanScoring/enums/ClientLevelEnum");
16
+ /** ULID canónico (Crockford base32 en mayúsculas): solo así la comparación de texto sigue al tiempo. */
17
+ const EVALUATION_ID_PATTERN = /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/;
18
+ /**
19
+ * Body de `PUT /private/borrowers/:borrowerId/sci` (loan-credit-business): el resultado de una
20
+ * evaluación SCI que loan-scoring deja en el acreditado al terminarla.
21
+ *
22
+ * El acreditado guarda la evaluación más reciente: una que llegue después de otra más nueva no
23
+ * cambia nada. `evaluationId` es el ULID de la evaluación, así que su orden es el cronológico.
24
+ */
25
+ class UpdateLoanBorrowerSciRequest {
26
+ }
27
+ exports.UpdateLoanBorrowerSciRequest = UpdateLoanBorrowerSciRequest;
28
+ __decorate([
29
+ (0, class_transformer_1.Expose)(),
30
+ (0, class_validator_1.IsString)(),
31
+ (0, class_validator_1.IsNotEmpty)(),
32
+ (0, class_validator_1.Matches)(EVALUATION_ID_PATTERN, { message: 'evaluationId debe ser un ULID de 26 caracteres' }),
33
+ __metadata("design:type", String)
34
+ ], UpdateLoanBorrowerSciRequest.prototype, "evaluationId", void 0);
35
+ __decorate([
36
+ (0, class_transformer_1.Expose)(),
37
+ (0, class_validator_1.IsInt)(),
38
+ (0, class_validator_1.Min)(0),
39
+ (0, class_validator_1.Max)(100),
40
+ __metadata("design:type", Number)
41
+ ], UpdateLoanBorrowerSciRequest.prototype, "sciScore", void 0);
42
+ __decorate([
43
+ (0, class_transformer_1.Expose)(),
44
+ (0, class_validator_1.IsEnum)(ClientLevelEnum_1.ClientLevelEnum),
45
+ __metadata("design:type", String)
46
+ ], UpdateLoanBorrowerSciRequest.prototype, "clientLevel", void 0);
@@ -14,6 +14,7 @@ export * from './dtos/AppliedStorePolicySnapshot';
14
14
  export * from './dtos/CandidatePlanSnapshot';
15
15
  export * from './dtos/EffectiveTermsSnapshot';
16
16
  export * from './dtos/requests/UpsertLoanBorrowerRequest';
17
+ export * from './dtos/requests/UpdateLoanBorrowerSciRequest';
17
18
  export * from './dtos/requests/OriginateLoanCreditRequest';
18
19
  export * from './dtos/requests/QuoteLoanCreditRequest';
19
20
  export * from './dtos/requests/SignLoanCreditRequest';
@@ -36,6 +36,7 @@ __exportStar(require("./dtos/CandidatePlanSnapshot"), exports);
36
36
  __exportStar(require("./dtos/EffectiveTermsSnapshot"), exports);
37
37
  // Request DTOs
38
38
  __exportStar(require("./dtos/requests/UpsertLoanBorrowerRequest"), exports);
39
+ __exportStar(require("./dtos/requests/UpdateLoanBorrowerSciRequest"), exports);
39
40
  __exportStar(require("./dtos/requests/OriginateLoanCreditRequest"), exports);
40
41
  __exportStar(require("./dtos/requests/QuoteLoanCreditRequest"), exports);
41
42
  __exportStar(require("./dtos/requests/SignLoanCreditRequest"), exports);
@@ -1,7 +1,11 @@
1
1
  /**
2
- * `reason` de `GRANT_FAILED` (spec A 6.5). Las tres primeras son las de `GrantRejectReasonEnum`
3
- * (entrega REJECTED); `ITEMS_FAILED` es una entrega FAILED: ningún ítem se entregó.
2
+ * `reason` de `GRANT_FAILED` (spec A 6.5). `INPUT_INVALID`, `PACKAGE_NOT_FOUND` y `PACKAGE_INACTIVE` son las
3
+ * de `GrantRejectReasonEnum` (entrega REJECTED); `ITEMS_FAILED` es una entrega FAILED: ningún ítem se entregó.
4
4
  * Decisión P-2 aprobada.
5
+ *
6
+ * Excepción: un REJECTED por `GrantRejectReasonEnum.UNSUPPORTED_REWARD_TYPE` se avisa como `INPUT_INVALID`
7
+ * (el paquete pide algo que el núcleo no puede ejecutar, o sea una solicitud inválida para este lambda).
8
+ * No se agregó un valor nuevo para no ampliar el contrato de la cola.
5
9
  */
6
10
  export declare enum GrantFailedReasonEnum {
7
11
  INPUT_INVALID = "INPUT_INVALID",
@@ -2,9 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GrantFailedReasonEnum = void 0;
4
4
  /**
5
- * `reason` de `GRANT_FAILED` (spec A 6.5). Las tres primeras son las de `GrantRejectReasonEnum`
6
- * (entrega REJECTED); `ITEMS_FAILED` es una entrega FAILED: ningún ítem se entregó.
5
+ * `reason` de `GRANT_FAILED` (spec A 6.5). `INPUT_INVALID`, `PACKAGE_NOT_FOUND` y `PACKAGE_INACTIVE` son las
6
+ * de `GrantRejectReasonEnum` (entrega REJECTED); `ITEMS_FAILED` es una entrega FAILED: ningún ítem se entregó.
7
7
  * Decisión P-2 aprobada.
8
+ *
9
+ * Excepción: un REJECTED por `GrantRejectReasonEnum.UNSUPPORTED_REWARD_TYPE` se avisa como `INPUT_INVALID`
10
+ * (el paquete pide algo que el núcleo no puede ejecutar, o sea una solicitud inválida para este lambda).
11
+ * No se agregó un valor nuevo para no ampliar el contrato de la cola.
8
12
  */
9
13
  var GrantFailedReasonEnum;
10
14
  (function (GrantFailedReasonEnum) {
@@ -1,5 +1,10 @@
1
1
  export declare enum GrantItemStatusEnum {
2
2
  PENDING = "PENDING",
3
+ /**
4
+ * Reclamado por el worker antes de ejecutar; si un reintento lo encuentra así, el envío pudo haber
5
+ * ocurrido y el adaptador debe reconciliar antes de reintentar.
6
+ */
7
+ PROCESSING = "PROCESSING",
3
8
  GRANTED = "GRANTED",
4
9
  FAILED = "FAILED",
5
10
  SKIPPED = "SKIPPED"
@@ -4,6 +4,11 @@ exports.GrantItemStatusEnum = void 0;
4
4
  var GrantItemStatusEnum;
5
5
  (function (GrantItemStatusEnum) {
6
6
  GrantItemStatusEnum["PENDING"] = "PENDING";
7
+ /**
8
+ * Reclamado por el worker antes de ejecutar; si un reintento lo encuentra así, el envío pudo haber
9
+ * ocurrido y el adaptador debe reconciliar antes de reintentar.
10
+ */
11
+ GrantItemStatusEnum["PROCESSING"] = "PROCESSING";
7
12
  GrantItemStatusEnum["GRANTED"] = "GRANTED";
8
13
  GrantItemStatusEnum["FAILED"] = "FAILED";
9
14
  GrantItemStatusEnum["SKIPPED"] = "SKIPPED";
@@ -2,5 +2,10 @@
2
2
  export declare enum GrantRejectReasonEnum {
3
3
  INPUT_INVALID = "INPUT_INVALID",
4
4
  PACKAGE_NOT_FOUND = "PACKAGE_NOT_FOUND",
5
- PACKAGE_INACTIVE = "PACKAGE_INACTIVE"
5
+ PACKAGE_INACTIVE = "PACKAGE_INACTIVE",
6
+ /**
7
+ * El paquete contiene un tipo de recompensa sin adaptador registrado; se rechaza antes de ejecutar
8
+ * cualquier ítem.
9
+ */
10
+ UNSUPPORTED_REWARD_TYPE = "UNSUPPORTED_REWARD_TYPE"
6
11
  }
@@ -7,4 +7,9 @@ var GrantRejectReasonEnum;
7
7
  GrantRejectReasonEnum["INPUT_INVALID"] = "INPUT_INVALID";
8
8
  GrantRejectReasonEnum["PACKAGE_NOT_FOUND"] = "PACKAGE_NOT_FOUND";
9
9
  GrantRejectReasonEnum["PACKAGE_INACTIVE"] = "PACKAGE_INACTIVE";
10
+ /**
11
+ * El paquete contiene un tipo de recompensa sin adaptador registrado; se rechaza antes de ejecutar
12
+ * cualquier ítem.
13
+ */
14
+ GrantRejectReasonEnum["UNSUPPORTED_REWARD_TYPE"] = "UNSUPPORTED_REWARD_TYPE";
10
15
  })(GrantRejectReasonEnum || (exports.GrantRejectReasonEnum = GrantRejectReasonEnum = {}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.510.0",
3
+ "version": "3.512.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,36 @@
1
+ // Definición de un reporte del datalake (datalake-reports-business). Respuesta: sin validadores.
2
+ export type ReportAudience = 'backoffice' | 'private' | 'public';
3
+ export type ReportParamType = 'date' | 'string' | 'int' | 'enum' | 'list' | 'boolean';
4
+
5
+ export class ReportParamSpecDto {
6
+ type: ReportParamType;
7
+ required?: boolean;
8
+ default?: string | number | boolean | string[];
9
+ values?: string[];
10
+ max?: number;
11
+ min?: number;
12
+ }
13
+
14
+ export class ReportColumnDto {
15
+ name: string;
16
+ type: 'string' | 'number' | 'date' | 'datetime' | 'boolean';
17
+ label: string;
18
+ }
19
+
20
+ export class ReportDefinitionDto {
21
+ /** dominio.nombre */
22
+ id: string;
23
+ version: number;
24
+ title: string;
25
+ description: string;
26
+ source: { layer: 'gold' | 'silver'; databases: string[] };
27
+ pii: boolean;
28
+ audiences: ReportAudience[];
29
+ permission: string;
30
+ mode: 'sync' | 'async';
31
+ cacheSeconds: number;
32
+ maxBytesScanned?: number;
33
+ params: Record<string, ReportParamSpecDto>;
34
+ principalParams: string[];
35
+ columns: ReportColumnDto[];
36
+ }
@@ -0,0 +1,20 @@
1
+ import { ReportStatusEnum } from "../enums/ReportStatusEnum";
2
+ import { ReportColumnDto } from "./ReportDefinitionDto";
3
+
4
+ export type ReportRow = Record<string, string | number | boolean | null>;
5
+
6
+ /** Respuesta de run y de jobs. Con status RUNNING solo vienen reportId y jobId; con FAILED, jobId y reason. */
7
+ export class ReportResultDto {
8
+ status: ReportStatusEnum;
9
+ reportId?: string;
10
+ version?: number;
11
+ jobId: string;
12
+ columns?: ReportColumnDto[];
13
+ rows?: ReportRow[];
14
+ rowCount?: number;
15
+ nextToken?: string;
16
+ computedAt?: string;
17
+ fromCache?: boolean;
18
+ bytesScanned?: number;
19
+ reason?: string;
20
+ }
@@ -0,0 +1,8 @@
1
+ import { IsObject, IsOptional } from "class-validator";
2
+
3
+ export class RunReportRequest {
4
+ /** Parámetros del reporte según su definición; los principalParams se ignoran (salen del token). */
5
+ @IsObject()
6
+ @IsOptional()
7
+ params?: Record<string, unknown>;
8
+ }
@@ -0,0 +1,5 @@
1
+ export enum ReportStatusEnum {
2
+ RUNNING = 'RUNNING',
3
+ DONE = 'DONE',
4
+ FAILED = 'FAILED',
5
+ }
@@ -0,0 +1,7 @@
1
+ //enums
2
+ export * from './enums/ReportStatusEnum';
3
+
4
+ //dtos
5
+ export * from './dtos/ReportDefinitionDto';
6
+ export * from './dtos/RunReportRequest';
7
+ export * from './dtos/ReportResultDto';
package/src/index.ts CHANGED
@@ -207,3 +207,4 @@ export * as Rewards from './rewards';
207
207
  // RewardsEligibility: contrato del validador de elegibilidad (rewards-eligibility-business) hacia los
208
208
  // servicios emisores: POST /events (request/response) y GET /runs/{id}.
209
209
  export * as RewardsEligibility from './rewardsEligibility';
210
+ export * as DatalakeReports from './datalakeReports';
@@ -0,0 +1,31 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsEnum, IsInt, IsNotEmpty, IsString, Matches, Max, Min } from 'class-validator';
3
+ import { ClientLevelEnum } from '../../../loanScoring/enums/ClientLevelEnum';
4
+
5
+ /** ULID canónico (Crockford base32 en mayúsculas): solo así la comparación de texto sigue al tiempo. */
6
+ const EVALUATION_ID_PATTERN = /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/;
7
+
8
+ /**
9
+ * Body de `PUT /private/borrowers/:borrowerId/sci` (loan-credit-business): el resultado de una
10
+ * evaluación SCI que loan-scoring deja en el acreditado al terminarla.
11
+ *
12
+ * El acreditado guarda la evaluación más reciente: una que llegue después de otra más nueva no
13
+ * cambia nada. `evaluationId` es el ULID de la evaluación, así que su orden es el cronológico.
14
+ */
15
+ export class UpdateLoanBorrowerSciRequest {
16
+ @Expose()
17
+ @IsString()
18
+ @IsNotEmpty()
19
+ @Matches(EVALUATION_ID_PATTERN, { message: 'evaluationId debe ser un ULID de 26 caracteres' })
20
+ evaluationId!: string;
21
+
22
+ @Expose()
23
+ @IsInt()
24
+ @Min(0)
25
+ @Max(100)
26
+ sciScore!: number;
27
+
28
+ @Expose()
29
+ @IsEnum(ClientLevelEnum)
30
+ clientLevel!: ClientLevelEnum;
31
+ }
@@ -20,6 +20,7 @@ export * from './dtos/EffectiveTermsSnapshot';
20
20
 
21
21
  // Request DTOs
22
22
  export * from './dtos/requests/UpsertLoanBorrowerRequest';
23
+ export * from './dtos/requests/UpdateLoanBorrowerSciRequest';
23
24
  export * from './dtos/requests/OriginateLoanCreditRequest';
24
25
  export * from './dtos/requests/QuoteLoanCreditRequest';
25
26
  export * from './dtos/requests/SignLoanCreditRequest';
@@ -1,7 +1,11 @@
1
1
  /**
2
- * `reason` de `GRANT_FAILED` (spec A 6.5). Las tres primeras son las de `GrantRejectReasonEnum`
3
- * (entrega REJECTED); `ITEMS_FAILED` es una entrega FAILED: ningún ítem se entregó.
2
+ * `reason` de `GRANT_FAILED` (spec A 6.5). `INPUT_INVALID`, `PACKAGE_NOT_FOUND` y `PACKAGE_INACTIVE` son las
3
+ * de `GrantRejectReasonEnum` (entrega REJECTED); `ITEMS_FAILED` es una entrega FAILED: ningún ítem se entregó.
4
4
  * Decisión P-2 aprobada.
5
+ *
6
+ * Excepción: un REJECTED por `GrantRejectReasonEnum.UNSUPPORTED_REWARD_TYPE` se avisa como `INPUT_INVALID`
7
+ * (el paquete pide algo que el núcleo no puede ejecutar, o sea una solicitud inválida para este lambda).
8
+ * No se agregó un valor nuevo para no ampliar el contrato de la cola.
5
9
  */
6
10
  export enum GrantFailedReasonEnum {
7
11
  INPUT_INVALID = 'INPUT_INVALID',
@@ -1,5 +1,10 @@
1
1
  export enum GrantItemStatusEnum {
2
2
  PENDING = 'PENDING',
3
+ /**
4
+ * Reclamado por el worker antes de ejecutar; si un reintento lo encuentra así, el envío pudo haber
5
+ * ocurrido y el adaptador debe reconciliar antes de reintentar.
6
+ */
7
+ PROCESSING = 'PROCESSING',
3
8
  GRANTED = 'GRANTED',
4
9
  FAILED = 'FAILED',
5
10
  SKIPPED = 'SKIPPED',
@@ -3,4 +3,9 @@ export enum GrantRejectReasonEnum {
3
3
  INPUT_INVALID = 'INPUT_INVALID',
4
4
  PACKAGE_NOT_FOUND = 'PACKAGE_NOT_FOUND',
5
5
  PACKAGE_INACTIVE = 'PACKAGE_INACTIVE',
6
+ /**
7
+ * El paquete contiene un tipo de recompensa sin adaptador registrado; se rechaza antes de ejecutar
8
+ * cualquier ítem.
9
+ */
10
+ UNSUPPORTED_REWARD_TYPE = 'UNSUPPORTED_REWARD_TYPE',
6
11
  }