@fiado/type-kit 3.531.0 → 3.533.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.
@@ -0,0 +1,33 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { ValidationError, validate } from 'class-validator';
4
+ import { PreviewLoanContractRequest } from '../../../src/loanCredit/index';
5
+
6
+ const pathsOf = (errors: ValidationError[], prefix = ''): string[] =>
7
+ errors.flatMap((error) => {
8
+ const path = prefix ? `${prefix}.${error.property}` : error.property;
9
+ return error.children?.length ? pathsOf(error.children, path) : [path];
10
+ });
11
+
12
+ const errorsOf = async (body: Record<string, unknown>): Promise<string[]> =>
13
+ pathsOf(await validate(plainToInstance(PreviewLoanContractRequest, body))).sort();
14
+
15
+ const DETAILS = {
16
+ borrower: { fullName: 'María López', curp: 'LOHM900215MMCPRR09', address: 'Av. Ejemplo 123, Toluca' },
17
+ device: { brand: 'Samsung', model: 'Galaxy A15' },
18
+ };
19
+
20
+ describe('PreviewLoanContractRequest', () => {
21
+ it('acepta los datos del contrato', async () => {
22
+ expect(await errorsOf({ contractDetails: DETAILS })).toEqual([]);
23
+ });
24
+
25
+ it('sin datos del contrato no hay vista previa que armar', async () => {
26
+ expect(await errorsOf({})).toEqual(['contractDetails']);
27
+ });
28
+
29
+ it('valida los datos anidados igual que la firma', async () => {
30
+ const details = { ...DETAILS, device: { brand: 'Samsung' } };
31
+ expect(await errorsOf({ contractDetails: details })).toEqual(['contractDetails.device.model']);
32
+ });
33
+ });
@@ -61,6 +61,21 @@ describe('SignLoanCreditRequest', () => {
61
61
  expect(await errorsOf({ contractDetails: details })).toEqual(['contractDetails.device.imei']);
62
62
  });
63
63
 
64
+ it('acepta la cuenta Pago Confiado con su CLABE de 18 dígitos', async () => {
65
+ const details = { ...DETAILS, pcfAccount: { clabe: '646180157000000004' } };
66
+ expect(await errorsOf({ contractDetails: details })).toEqual([]);
67
+ });
68
+
69
+ it('la cuenta Pago Confiado es opcional', async () => {
70
+ expect(DETAILS).not.toHaveProperty('pcfAccount');
71
+ expect(await errorsOf({ contractDetails: DETAILS })).toEqual([]);
72
+ });
73
+
74
+ it('rechaza una CLABE que no tiene 18 dígitos', async () => {
75
+ const details = { ...DETAILS, pcfAccount: { clabe: 'dummy' } };
76
+ expect(await errorsOf({ contractDetails: details })).toEqual(['contractDetails.pcfAccount.clabe']);
77
+ });
78
+
64
79
  it('rechaza un texto más largo que el máximo', async () => {
65
80
  const details = { ...DETAILS, provider: { legalName: 'x'.repeat(301) } };
66
81
  expect(await errorsOf({ contractDetails: details })).toEqual(['contractDetails.provider.legalName']);
@@ -29,6 +29,10 @@ export declare class LoanContractDeviceDetails {
29
29
  export declare class LoanContractProviderDetails {
30
30
  legalName: string;
31
31
  }
32
+ /** Cuenta Pago Confiado del acreditado, de la que se cobra el crédito (Secciones VI y VIII). */
33
+ export declare class LoanContractPcfAccountDetails {
34
+ clabe: string;
35
+ }
32
36
  /**
33
37
  * Datos del contrato que el motor de crédito no guarda: los aporta el wizard al iniciar la firma
34
38
  * y se imprimen en las plantillas de pdf-render-business. Son PII transitoria: no se persisten ni
@@ -39,4 +43,6 @@ export declare class LoanContractDetails {
39
43
  device: LoanContractDeviceDetails;
40
44
  /** Si falta, el motor lo resuelve con la tienda del crédito. */
41
45
  provider?: LoanContractProviderDetails;
46
+ /** Si falta, el contrato deja la cuenta en blanco. */
47
+ pcfAccount?: LoanContractPcfAccountDetails;
42
48
  }
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.LoanContractDetails = exports.LoanContractProviderDetails = exports.LoanContractDeviceDetails = exports.LoanContractBorrowerDetails = void 0;
12
+ exports.LoanContractDetails = exports.LoanContractPcfAccountDetails = exports.LoanContractProviderDetails = exports.LoanContractDeviceDetails = exports.LoanContractBorrowerDetails = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  /** Largo máximo de un texto corto del contrato (RFC, ocupación, marca…). */
@@ -18,6 +18,8 @@ const SHORT_TEXT = 120;
18
18
  const LONG_TEXT = 300;
19
19
  /** IMEI: exactamente 15 dígitos. */
20
20
  const IMEI_PATTERN = /^\d{15}$/;
21
+ /** CLABE: exactamente 18 dígitos. */
22
+ const CLABE_PATTERN = /^\d{18}$/;
21
23
  /** Datos del acreditado tal como se imprimen en el contrato (Sección II.1). */
22
24
  class LoanContractBorrowerDetails {
23
25
  }
@@ -156,6 +158,16 @@ __decorate([
156
158
  (0, class_validator_1.MaxLength)(LONG_TEXT),
157
159
  __metadata("design:type", String)
158
160
  ], LoanContractProviderDetails.prototype, "legalName", void 0);
161
+ /** Cuenta Pago Confiado del acreditado, de la que se cobra el crédito (Secciones VI y VIII). */
162
+ class LoanContractPcfAccountDetails {
163
+ }
164
+ exports.LoanContractPcfAccountDetails = LoanContractPcfAccountDetails;
165
+ __decorate([
166
+ (0, class_transformer_1.Expose)(),
167
+ (0, class_validator_1.IsString)(),
168
+ (0, class_validator_1.Matches)(CLABE_PATTERN, { message: 'clabe admite solo 18 dígitos' }),
169
+ __metadata("design:type", String)
170
+ ], LoanContractPcfAccountDetails.prototype, "clabe", void 0);
159
171
  /**
160
172
  * Datos del contrato que el motor de crédito no guarda: los aporta el wizard al iniciar la firma
161
173
  * y se imprimen en las plantillas de pdf-render-business. Son PII transitoria: no se persisten ni
@@ -185,3 +197,10 @@ __decorate([
185
197
  (0, class_transformer_1.Type)(() => LoanContractProviderDetails),
186
198
  __metadata("design:type", LoanContractProviderDetails)
187
199
  ], LoanContractDetails.prototype, "provider", void 0);
200
+ __decorate([
201
+ (0, class_transformer_1.Expose)(),
202
+ (0, class_validator_1.IsOptional)(),
203
+ (0, class_validator_1.ValidateNested)(),
204
+ (0, class_transformer_1.Type)(() => LoanContractPcfAccountDetails),
205
+ __metadata("design:type", LoanContractPcfAccountDetails)
206
+ ], LoanContractDetails.prototype, "pcfAccount", void 0);
@@ -0,0 +1,9 @@
1
+ import { LoanContractDetails } from '../LoanContractDetails';
2
+ /**
3
+ * POST /private/credits/{creditId}/contract/preview — vista previa del contrato antes de enviar el
4
+ * código de firma. Lleva los mismos datos del acreditado y del equipo que el inicio de la firma; los
5
+ * términos salen del crédito guardado. PII transitoria: no se persiste ni se loguea.
6
+ */
7
+ export declare class PreviewLoanContractRequest {
8
+ contractDetails: LoanContractDetails;
9
+ }
@@ -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.PreviewLoanContractRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const LoanContractDetails_1 = require("../LoanContractDetails");
16
+ /**
17
+ * POST /private/credits/{creditId}/contract/preview — vista previa del contrato antes de enviar el
18
+ * código de firma. Lleva los mismos datos del acreditado y del equipo que el inicio de la firma; los
19
+ * términos salen del crédito guardado. PII transitoria: no se persiste ni se loguea.
20
+ */
21
+ class PreviewLoanContractRequest {
22
+ }
23
+ exports.PreviewLoanContractRequest = PreviewLoanContractRequest;
24
+ __decorate([
25
+ (0, class_transformer_1.Expose)(),
26
+ (0, class_validator_1.IsDefined)(),
27
+ (0, class_validator_1.ValidateNested)(),
28
+ (0, class_transformer_1.Type)(() => LoanContractDetails_1.LoanContractDetails),
29
+ __metadata("design:type", LoanContractDetails_1.LoanContractDetails)
30
+ ], PreviewLoanContractRequest.prototype, "contractDetails", void 0);
@@ -0,0 +1,5 @@
1
+ /** Enlace prefirmado y temporal a la vista previa del contrato. `expiresAt` en ISO-8601. */
2
+ export interface LoanContractPreview {
3
+ url: string;
4
+ expiresAt: string;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -19,6 +19,7 @@ export * from './dtos/requests/UpdateLoanBorrowerSciRequest';
19
19
  export * from './dtos/requests/OriginateLoanCreditRequest';
20
20
  export * from './dtos/requests/QuoteLoanCreditRequest';
21
21
  export * from './dtos/requests/SignLoanCreditRequest';
22
+ export * from './dtos/requests/PreviewLoanContractRequest';
22
23
  export * from './dtos/requests/ActivationCheckRequest';
23
24
  export * from './dtos/requests/CreditPaymentAppliedRequest';
24
25
  export * from './dtos/requests/CreditSettledRequest';
@@ -37,6 +38,7 @@ export * from './dtos/responses/LoanBorrowerCreditItem';
37
38
  export * from './dtos/responses/LoanCreditDetail';
38
39
  export * from './dtos/responses/LoanPaymentListItem';
39
40
  export * from './dtos/responses/LoanContractDownloadUrl';
41
+ export * from './dtos/responses/LoanContractPreview';
40
42
  export * from './dtos/responses/LoanContractResponse';
41
43
  export * from './dtos/responses/OriginateLoanCreditResponse';
42
44
  export * from './dtos/responses/QuoteLoanCreditResponse';
@@ -41,6 +41,7 @@ __exportStar(require("./dtos/requests/UpdateLoanBorrowerSciRequest"), exports);
41
41
  __exportStar(require("./dtos/requests/OriginateLoanCreditRequest"), exports);
42
42
  __exportStar(require("./dtos/requests/QuoteLoanCreditRequest"), exports);
43
43
  __exportStar(require("./dtos/requests/SignLoanCreditRequest"), exports);
44
+ __exportStar(require("./dtos/requests/PreviewLoanContractRequest"), exports);
44
45
  __exportStar(require("./dtos/requests/ActivationCheckRequest"), exports);
45
46
  __exportStar(require("./dtos/requests/CreditPaymentAppliedRequest"), exports);
46
47
  __exportStar(require("./dtos/requests/CreditSettledRequest"), exports);
@@ -61,6 +62,7 @@ __exportStar(require("./dtos/responses/LoanBorrowerCreditItem"), exports);
61
62
  __exportStar(require("./dtos/responses/LoanCreditDetail"), exports);
62
63
  __exportStar(require("./dtos/responses/LoanPaymentListItem"), exports);
63
64
  __exportStar(require("./dtos/responses/LoanContractDownloadUrl"), exports);
65
+ __exportStar(require("./dtos/responses/LoanContractPreview"), exports);
64
66
  __exportStar(require("./dtos/responses/LoanContractResponse"), exports);
65
67
  __exportStar(require("./dtos/responses/OriginateLoanCreditResponse"), exports);
66
68
  __exportStar(require("./dtos/responses/QuoteLoanCreditResponse"), exports);
@@ -0,0 +1,10 @@
1
+ /**
2
+ * GET /wizard/sessions/:id/contract/document — enlace prefirmado y temporal al PDF del contrato del
3
+ * paso 08. Antes de enviar el código es una vista previa (`preview: true`) con el mismo contenido;
4
+ * desde el envío del código es el contrato que se firma.
5
+ */
6
+ export interface ContractDocumentResponse {
7
+ url: string;
8
+ expiresAt: string;
9
+ preview: boolean;
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -101,6 +101,7 @@ export * from './dtos/responses/ScoreResultResponse';
101
101
  export * from './dtos/responses/QuoteResponse';
102
102
  export * from './dtos/responses/DownPaymentResponse';
103
103
  export * from './dtos/responses/ContractPreviewResponse';
104
+ export * from './dtos/responses/ContractDocumentResponse';
104
105
  export * from './dtos/responses/SignatureSendOtpResponse';
105
106
  export * from './dtos/responses/SignatureSignResponse';
106
107
  export * from './dtos/responses/RegisterDeviceResponse';
@@ -127,6 +127,7 @@ __exportStar(require("./dtos/responses/ScoreResultResponse"), exports);
127
127
  __exportStar(require("./dtos/responses/QuoteResponse"), exports);
128
128
  __exportStar(require("./dtos/responses/DownPaymentResponse"), exports);
129
129
  __exportStar(require("./dtos/responses/ContractPreviewResponse"), exports);
130
+ __exportStar(require("./dtos/responses/ContractDocumentResponse"), exports);
130
131
  __exportStar(require("./dtos/responses/SignatureSendOtpResponse"), exports);
131
132
  __exportStar(require("./dtos/responses/SignatureSignResponse"), exports);
132
133
  __exportStar(require("./dtos/responses/RegisterDeviceResponse"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.531.0",
3
+ "version": "3.533.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -7,6 +7,8 @@ const SHORT_TEXT = 120;
7
7
  const LONG_TEXT = 300;
8
8
  /** IMEI: exactamente 15 dígitos. */
9
9
  const IMEI_PATTERN = /^\d{15}$/;
10
+ /** CLABE: exactamente 18 dígitos. */
11
+ const CLABE_PATTERN = /^\d{18}$/;
10
12
 
11
13
  /** Datos del acreditado tal como se imprimen en el contrato (Sección II.1). */
12
14
  export class LoanContractBorrowerDetails {
@@ -129,6 +131,14 @@ export class LoanContractProviderDetails {
129
131
  legalName: string;
130
132
  }
131
133
 
134
+ /** Cuenta Pago Confiado del acreditado, de la que se cobra el crédito (Secciones VI y VIII). */
135
+ export class LoanContractPcfAccountDetails {
136
+ @Expose()
137
+ @IsString()
138
+ @Matches(CLABE_PATTERN, { message: 'clabe admite solo 18 dígitos' })
139
+ clabe: string;
140
+ }
141
+
132
142
  /**
133
143
  * Datos del contrato que el motor de crédito no guarda: los aporta el wizard al iniciar la firma
134
144
  * y se imprimen en las plantillas de pdf-render-business. Son PII transitoria: no se persisten ni
@@ -153,4 +163,11 @@ export class LoanContractDetails {
153
163
  @ValidateNested()
154
164
  @Type(() => LoanContractProviderDetails)
155
165
  provider?: LoanContractProviderDetails;
166
+
167
+ /** Si falta, el contrato deja la cuenta en blanco. */
168
+ @Expose()
169
+ @IsOptional()
170
+ @ValidateNested()
171
+ @Type(() => LoanContractPcfAccountDetails)
172
+ pcfAccount?: LoanContractPcfAccountDetails;
156
173
  }
@@ -0,0 +1,16 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsDefined, ValidateNested } from 'class-validator';
3
+ import { LoanContractDetails } from '../LoanContractDetails';
4
+
5
+ /**
6
+ * POST /private/credits/{creditId}/contract/preview — vista previa del contrato antes de enviar el
7
+ * código de firma. Lleva los mismos datos del acreditado y del equipo que el inicio de la firma; los
8
+ * términos salen del crédito guardado. PII transitoria: no se persiste ni se loguea.
9
+ */
10
+ export class PreviewLoanContractRequest {
11
+ @Expose()
12
+ @IsDefined()
13
+ @ValidateNested()
14
+ @Type(() => LoanContractDetails)
15
+ contractDetails: LoanContractDetails;
16
+ }
@@ -0,0 +1,5 @@
1
+ /** Enlace prefirmado y temporal a la vista previa del contrato. `expiresAt` en ISO-8601. */
2
+ export interface LoanContractPreview {
3
+ url: string;
4
+ expiresAt: string;
5
+ }
@@ -25,6 +25,7 @@ export * from './dtos/requests/UpdateLoanBorrowerSciRequest';
25
25
  export * from './dtos/requests/OriginateLoanCreditRequest';
26
26
  export * from './dtos/requests/QuoteLoanCreditRequest';
27
27
  export * from './dtos/requests/SignLoanCreditRequest';
28
+ export * from './dtos/requests/PreviewLoanContractRequest';
28
29
  export * from './dtos/requests/ActivationCheckRequest';
29
30
  export * from './dtos/requests/CreditPaymentAppliedRequest';
30
31
  export * from './dtos/requests/CreditSettledRequest';
@@ -46,6 +47,7 @@ export * from './dtos/responses/LoanBorrowerCreditItem';
46
47
  export * from './dtos/responses/LoanCreditDetail';
47
48
  export * from './dtos/responses/LoanPaymentListItem';
48
49
  export * from './dtos/responses/LoanContractDownloadUrl';
50
+ export * from './dtos/responses/LoanContractPreview';
49
51
  export * from './dtos/responses/LoanContractResponse';
50
52
  export * from './dtos/responses/OriginateLoanCreditResponse';
51
53
  export * from './dtos/responses/QuoteLoanCreditResponse';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * GET /wizard/sessions/:id/contract/document — enlace prefirmado y temporal al PDF del contrato del
3
+ * paso 08. Antes de enviar el código es una vista previa (`preview: true`) con el mismo contenido;
4
+ * desde el envío del código es el contrato que se firma.
5
+ */
6
+ export interface ContractDocumentResponse {
7
+ url: string;
8
+ expiresAt: string;
9
+ preview: boolean;
10
+ }
@@ -114,6 +114,7 @@ export * from './dtos/responses/ScoreResultResponse';
114
114
  export * from './dtos/responses/QuoteResponse';
115
115
  export * from './dtos/responses/DownPaymentResponse';
116
116
  export * from './dtos/responses/ContractPreviewResponse';
117
+ export * from './dtos/responses/ContractDocumentResponse';
117
118
  export * from './dtos/responses/SignatureSendOtpResponse';
118
119
  export * from './dtos/responses/SignatureSignResponse';
119
120
  export * from './dtos/responses/RegisterDeviceResponse';