@fiado/type-kit 3.213.0 → 3.215.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 (60) hide show
  1. package/bin/kyc/dtos/KycAddress.d.ts +24 -0
  2. package/bin/kyc/dtos/KycAddress.js +85 -0
  3. package/bin/kyc/events/KycVerificationChangedV1.d.ts +7 -5
  4. package/bin/kyc/events/KycVerificationChangedV1.js +3 -3
  5. package/bin/kyc/index.d.ts +1 -0
  6. package/bin/kyc/index.js +2 -0
  7. package/bin/retailWizard/dtos/WizardCreditSummary.d.ts +26 -0
  8. package/bin/retailWizard/dtos/WizardCreditSummary.js +2 -0
  9. package/bin/retailWizard/dtos/WizardLoan.d.ts +24 -0
  10. package/bin/retailWizard/dtos/WizardLoan.js +58 -0
  11. package/bin/retailWizard/dtos/WizardSession.d.ts +3 -0
  12. package/bin/retailWizard/dtos/requests/DownPaymentRequest.d.ts +16 -0
  13. package/bin/retailWizard/dtos/requests/DownPaymentRequest.js +46 -0
  14. package/bin/retailWizard/dtos/requests/QuoteRequest.d.ts +11 -0
  15. package/bin/retailWizard/dtos/requests/QuoteRequest.js +36 -0
  16. package/bin/retailWizard/dtos/requests/RegisterDeviceRequest.d.ts +9 -0
  17. package/bin/retailWizard/dtos/requests/RegisterDeviceRequest.js +29 -0
  18. package/bin/retailWizard/dtos/requests/SignatureSignRequest.d.ts +9 -0
  19. package/bin/retailWizard/dtos/requests/SignatureSignRequest.js +29 -0
  20. package/bin/retailWizard/dtos/responses/ContractPreviewResponse.d.ts +12 -0
  21. package/bin/retailWizard/dtos/responses/ContractPreviewResponse.js +2 -0
  22. package/bin/retailWizard/dtos/responses/DownPaymentResponse.d.ts +14 -0
  23. package/bin/retailWizard/dtos/responses/DownPaymentResponse.js +2 -0
  24. package/bin/retailWizard/dtos/responses/QuoteResponse.d.ts +23 -0
  25. package/bin/retailWizard/dtos/responses/QuoteResponse.js +2 -0
  26. package/bin/retailWizard/dtos/responses/RegisterDeviceResponse.d.ts +14 -0
  27. package/bin/retailWizard/dtos/responses/RegisterDeviceResponse.js +2 -0
  28. package/bin/retailWizard/dtos/responses/ScoreConsultResponse.d.ts +20 -0
  29. package/bin/retailWizard/dtos/responses/ScoreConsultResponse.js +2 -0
  30. package/bin/retailWizard/dtos/responses/ScoreResultResponse.d.ts +14 -0
  31. package/bin/retailWizard/dtos/responses/ScoreResultResponse.js +2 -0
  32. package/bin/retailWizard/dtos/responses/SessionFinanciersResponse.d.ts +26 -0
  33. package/bin/retailWizard/dtos/responses/SessionFinanciersResponse.js +2 -0
  34. package/bin/retailWizard/dtos/responses/SignatureSendOtpResponse.d.ts +10 -0
  35. package/bin/retailWizard/dtos/responses/SignatureSendOtpResponse.js +2 -0
  36. package/bin/retailWizard/dtos/responses/SignatureSignResponse.d.ts +10 -0
  37. package/bin/retailWizard/dtos/responses/SignatureSignResponse.js +2 -0
  38. package/bin/retailWizard/index.d.ts +15 -0
  39. package/bin/retailWizard/index.js +15 -0
  40. package/package.json +1 -1
  41. package/src/kyc/dtos/KycAddress.ts +46 -0
  42. package/src/kyc/events/KycVerificationChangedV1.ts +8 -6
  43. package/src/kyc/index.ts +3 -0
  44. package/src/retailWizard/dtos/WizardCreditSummary.ts +27 -0
  45. package/src/retailWizard/dtos/WizardLoan.ts +45 -0
  46. package/src/retailWizard/dtos/WizardSession.ts +3 -0
  47. package/src/retailWizard/dtos/requests/DownPaymentRequest.ts +30 -0
  48. package/src/retailWizard/dtos/requests/QuoteRequest.ts +21 -0
  49. package/src/retailWizard/dtos/requests/RegisterDeviceRequest.ts +15 -0
  50. package/src/retailWizard/dtos/requests/SignatureSignRequest.ts +15 -0
  51. package/src/retailWizard/dtos/responses/ContractPreviewResponse.ts +13 -0
  52. package/src/retailWizard/dtos/responses/DownPaymentResponse.ts +15 -0
  53. package/src/retailWizard/dtos/responses/QuoteResponse.ts +25 -0
  54. package/src/retailWizard/dtos/responses/RegisterDeviceResponse.ts +15 -0
  55. package/src/retailWizard/dtos/responses/ScoreConsultResponse.ts +21 -0
  56. package/src/retailWizard/dtos/responses/ScoreResultResponse.ts +15 -0
  57. package/src/retailWizard/dtos/responses/SessionFinanciersResponse.ts +28 -0
  58. package/src/retailWizard/dtos/responses/SignatureSendOtpResponse.ts +10 -0
  59. package/src/retailWizard/dtos/responses/SignatureSignResponse.ts +11 -0
  60. package/src/retailWizard/index.ts +15 -0
@@ -0,0 +1,26 @@
1
+ import { FinancierTypeEnum } from '../../../loanOfferings/enums/FinancierTypeEnum';
2
+ /**
3
+ * Una opción de financiamiento del paso 04 (pantalla forma de pago): la unión de las financieras
4
+ * ACTIVE del catálogo SOFOM (`loan-offerings GET /private/financiers/active` — display + orden)
5
+ * con la elegibilidad del producto reservado (`eligibleFinanciers` del catálogo retail).
6
+ */
7
+ export interface SessionFinancierOption {
8
+ code: string;
9
+ name: string;
10
+ /** Texto de display de la card (viene del catálogo SOFOM). */
11
+ label: string;
12
+ /** INTERNAL = SureKeep (pista crédito propia); EXTERNAL = derivación (PayJoy, CrediYa…). */
13
+ type: FinancierTypeEnum;
14
+ displayOrder: number;
15
+ /** Solo EXTERNAL: URL de derivación. */
16
+ externalRedirectUrl: string | null;
17
+ /** El producto reservado admite esta financiera (INTERNAL siempre elegible). */
18
+ eligible: boolean;
19
+ }
20
+ /**
21
+ * GET /wizard/sessions/:id/financiers — las opciones de financiamiento del paso 04 para la sesión
22
+ * (según su producto reservado). Ordenadas por `displayOrder`. SureKeep Fase 2 — pista SOFOM.
23
+ */
24
+ export interface SessionFinanciersResponse {
25
+ financiers: SessionFinancierOption[];
26
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ /**
2
+ * POST /wizard/sessions/:id/signature/send-otp — firma FES tiempo 1 (paso 08): loan-credit
3
+ * congela términos, genera los PDFs y despacha el OTP dedicado de firma (4 dígitos, 5 min) al
4
+ * teléfono del cliente vía messages-business. SureKeep Fase 2 — pista SOFOM.
5
+ */
6
+ export interface SignatureSendOtpResponse {
7
+ otpSent: boolean;
8
+ /** Teléfono destino enmascarado para la pantalla (`****1234`) — nunca el número completo. */
9
+ otpDestinationMasked: string;
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ import { ActivationChecklist } from '../../../loanCredit/dtos/ActivationChecklist';
2
+ /**
3
+ * POST /wizard/sessions/:id/signature/sign — resultado de la firma FES tiempo 2 (paso 08).
4
+ * `signed: true` implica `checklist.contractSigned: true` (condición 2 de activación).
5
+ * SureKeep Fase 2 — pista SOFOM.
6
+ */
7
+ export interface SignatureSignResponse {
8
+ signed: boolean;
9
+ checklist: ActivationChecklist;
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -18,6 +18,8 @@ export * from './dtos/WizardWelcome';
18
18
  export * from './dtos/SalePaymentDetail';
19
19
  export * from './dtos/ProspectNewCustomer';
20
20
  export * from './dtos/WizardBeneficiary';
21
+ export * from './dtos/WizardLoan';
22
+ export * from './dtos/WizardCreditSummary';
21
23
  export * from './dtos/WizardSession';
22
24
  export * from './dtos/OtpVerification';
23
25
  export * from './dtos/Sale';
@@ -49,7 +51,20 @@ export * from './dtos/requests/CreateProspectRequest';
49
51
  export * from './dtos/requests/UpdateProspectRequest';
50
52
  export * from './dtos/requests/MarkProspectLostRequest';
51
53
  export * from './dtos/requests/CancelSaleRequest';
54
+ export * from './dtos/requests/QuoteRequest';
55
+ export * from './dtos/requests/DownPaymentRequest';
56
+ export * from './dtos/requests/SignatureSignRequest';
57
+ export * from './dtos/requests/RegisterDeviceRequest';
52
58
  export * from './dtos/responses/KycPrepareResponse';
59
+ export * from './dtos/responses/SessionFinanciersResponse';
60
+ export * from './dtos/responses/ScoreConsultResponse';
61
+ export * from './dtos/responses/ScoreResultResponse';
62
+ export * from './dtos/responses/QuoteResponse';
63
+ export * from './dtos/responses/DownPaymentResponse';
64
+ export * from './dtos/responses/ContractPreviewResponse';
65
+ export * from './dtos/responses/SignatureSendOtpResponse';
66
+ export * from './dtos/responses/SignatureSignResponse';
67
+ export * from './dtos/responses/RegisterDeviceResponse';
53
68
  export * from './events/SaleCompletedV1';
54
69
  export * from './events/SaleCancelledV1';
55
70
  export * from './events/SessionExpiredV1';
@@ -36,6 +36,8 @@ __exportStar(require("./dtos/WizardWelcome"), exports);
36
36
  __exportStar(require("./dtos/SalePaymentDetail"), exports);
37
37
  __exportStar(require("./dtos/ProspectNewCustomer"), exports);
38
38
  __exportStar(require("./dtos/WizardBeneficiary"), exports);
39
+ __exportStar(require("./dtos/WizardLoan"), exports);
40
+ __exportStar(require("./dtos/WizardCreditSummary"), exports);
39
41
  // Entidades principales (shapes de estado/persistencia — planas)
40
42
  __exportStar(require("./dtos/WizardSession"), exports);
41
43
  __exportStar(require("./dtos/OtpVerification"), exports);
@@ -70,8 +72,21 @@ __exportStar(require("./dtos/requests/CreateProspectRequest"), exports);
70
72
  __exportStar(require("./dtos/requests/UpdateProspectRequest"), exports);
71
73
  __exportStar(require("./dtos/requests/MarkProspectLostRequest"), exports);
72
74
  __exportStar(require("./dtos/requests/CancelSaleRequest"), exports);
75
+ __exportStar(require("./dtos/requests/QuoteRequest"), exports);
76
+ __exportStar(require("./dtos/requests/DownPaymentRequest"), exports);
77
+ __exportStar(require("./dtos/requests/SignatureSignRequest"), exports);
78
+ __exportStar(require("./dtos/requests/RegisterDeviceRequest"), exports);
73
79
  // Response DTOs (output tipado por endpoint)
74
80
  __exportStar(require("./dtos/responses/KycPrepareResponse"), exports);
81
+ __exportStar(require("./dtos/responses/SessionFinanciersResponse"), exports);
82
+ __exportStar(require("./dtos/responses/ScoreConsultResponse"), exports);
83
+ __exportStar(require("./dtos/responses/ScoreResultResponse"), exports);
84
+ __exportStar(require("./dtos/responses/QuoteResponse"), exports);
85
+ __exportStar(require("./dtos/responses/DownPaymentResponse"), exports);
86
+ __exportStar(require("./dtos/responses/ContractPreviewResponse"), exports);
87
+ __exportStar(require("./dtos/responses/SignatureSendOtpResponse"), exports);
88
+ __exportStar(require("./dtos/responses/SignatureSignResponse"), exports);
89
+ __exportStar(require("./dtos/responses/RegisterDeviceResponse"), exports);
75
90
  // Contratos de eventos (PascalCase + sufijo V1)
76
91
  __exportStar(require("./events/SaleCompletedV1"), exports);
77
92
  __exportStar(require("./events/SaleCancelledV1"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.213.0",
3
+ "version": "3.215.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,46 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsNumber, IsOptional, IsString } from 'class-validator';
3
+
4
+ /**
5
+ * Domicilio del INE ya normalizado por `places-business` (AWS Location), listo para que el consumidor
6
+ * arme su `AddressBase` local. Mapea el `AddressCandidate` de places a un shape con `@Expose`, porque
7
+ * el consumer parsea el evento con `excludeExtraneousValues` y descartaría todo campo sin exponer.
8
+ *
9
+ * Todos los campos son opcionales: el domicilio es best-effort (la OCR del INE + el geocoding pueden
10
+ * no resolver todo). ⚠️ PII: nunca loguear esta estructura.
11
+ */
12
+ export class KycAddress {
13
+ /** Etiqueta completa legible (equivalente a Place.Label). */
14
+ @Expose() @IsOptional() @IsString()
15
+ label?: string;
16
+
17
+ @Expose() @IsOptional() @IsString()
18
+ street?: string;
19
+
20
+ /** Número exterior (Place.AddressNumber). */
21
+ @Expose() @IsOptional() @IsString()
22
+ addressNumber?: string;
23
+
24
+ @Expose() @IsOptional() @IsString()
25
+ neighborhood?: string;
26
+
27
+ @Expose() @IsOptional() @IsString()
28
+ municipality?: string;
29
+
30
+ /** Estado/provincia (Place.Region). */
31
+ @Expose() @IsOptional() @IsString()
32
+ region?: string;
33
+
34
+ @Expose() @IsOptional() @IsString()
35
+ postalCode?: string;
36
+
37
+ /** ISO3 del país (Place.Country). */
38
+ @Expose() @IsOptional() @IsString()
39
+ country?: string;
40
+
41
+ @Expose() @IsOptional() @IsNumber()
42
+ latitude?: number;
43
+
44
+ @Expose() @IsOptional() @IsNumber()
45
+ longitude?: number;
46
+ }
@@ -4,7 +4,7 @@ import { IdentificationDocumentStatus } from '../../identity/enums/Identificatio
4
4
  import { KycVerificationStatusEnum } from '../enums/KycVerificationStatusEnum';
5
5
  import { KycSubChecks } from '../dtos/KycSubChecks';
6
6
  import { KycPersonData } from '../dtos/responses/KycPersonData';
7
- import { AddressBase } from '../../address/dtos/AddressBase';
7
+ import { KycAddress } from '../dtos/KycAddress';
8
8
 
9
9
  /**
10
10
  * Cambio terminal de una verificación KYC, tal como lo publica `kyc-metamap-webhook` directo en
@@ -74,10 +74,12 @@ export class KycVerificationChangedV1 {
74
74
  person?: KycPersonData;
75
75
 
76
76
  /**
77
- * Domicilio del INE ya ESTRUCTURADO por `places-business` (paso 02e), listo para copiarse a
78
- * `RetailCustomer.address` en el upsert. OPCIONAL y aditivo: el webhook lo puebla cuando la OCR trae
79
- * domicilio y `places` resuelve; si no, el upsert corre sin dirección y se completa después. ⚠️ PII.
77
+ * Domicilio del INE ya normalizado por `places-business` (paso 02e). El webhook manda el resultado
78
+ * del geocoding (`KycAddress`); el CONSUMIDOR (wizard) arma con esto su `AddressBase` local, porque
79
+ * ese objeto lleva contexto de SureKeep (tenant, tipo) que el webhook no tiene. OPCIONAL y aditivo:
80
+ * si la OCR no trae domicilio o `places` no resuelve, viaja ausente y el upsert corre sin dirección.
81
+ * ⚠️ PII: nunca loguear.
80
82
  */
81
- @Expose() @IsOptional() @ValidateNested() @Type(() => AddressBase)
82
- address?: AddressBase;
83
+ @Expose() @IsOptional() @ValidateNested() @Type(() => KycAddress)
84
+ address?: KycAddress;
83
85
  }
package/src/kyc/index.ts CHANGED
@@ -7,6 +7,9 @@ export * from './enums/KycWatchlistStatusEnum';
7
7
  // Sub-pasos descompuestos (SureKeep F2)
8
8
  export * from './dtos/KycSubChecks';
9
9
 
10
+ // Domicilio del INE normalizado por places (SureKeep F2)
11
+ export * from './dtos/KycAddress';
12
+
10
13
  // Response DTOs
11
14
  export * from './dtos/responses/KycPersonData';
12
15
  export * from './dtos/responses/KycByDirectoryResponse';
@@ -0,0 +1,27 @@
1
+ import { ClientLevelEnum } from '../../loanScoring/enums/ClientLevelEnum';
2
+ import { LoanCreditStatusEnum } from '../../loanCredit/enums/LoanCreditStatusEnum';
3
+
4
+ /**
5
+ * Resumen financiero TRANSITORIO del crédito para las pantallas del wizard (06 cotización /
6
+ * 08 firma). Se arma en cada response desde `loan-credit GET|originate|quote` — NO se persiste
7
+ * en la sesión (regla punteros-no-datos del sub-objeto `loan`). Montos en cents; TNA decimal.
8
+ * SureKeep Fase 2 — pista SOFOM.
9
+ */
10
+ export interface WizardCreditSummary {
11
+ creditId: string;
12
+ status: LoanCreditStatusEnum;
13
+ planId: string;
14
+ termWeeks: number;
15
+ equipmentPriceCents: number;
16
+ downPaymentCents: number;
17
+ financedCapitalCents: number;
18
+ tnaAnnual: number;
19
+ /** Cuota semanal sin IVA (amortización francesa, constante). */
20
+ weeklyPaymentCents: number;
21
+ /** Cuota semanal con IVA — el número que ve el cliente. */
22
+ weeklyPaymentWithIvaCents: number;
23
+ totalInterestCents: number;
24
+ totalIvaCents: number;
25
+ totalToPayCents: number;
26
+ clientLevelAtOrigination?: ClientLevelEnum;
27
+ }
@@ -0,0 +1,45 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsEnum, IsOptional, IsString } from 'class-validator';
3
+ import { ClientLevelEnum } from '../../loanScoring/enums/ClientLevelEnum';
4
+
5
+ /**
6
+ * Contexto de crédito de la sesión (`WizardSession.loan`) — pista SOFOM, pasos 04-09 del wizard.
7
+ *
8
+ * Guarda SOLO PUNTEROS al dominio loan-*: el detalle financiero (montos, cuota, checklist,
9
+ * estado) se lee de `loan-credit GET /private/credits/{creditId}`; la oferta/decisión del score
10
+ * de `loan-scoring GET /private/scoring/evaluations/{sciEvaluationId}`. Nunca denormalizar datos
11
+ * financieros acá (única excepción: `level`, para el chip de nivel sin refetch).
12
+ *
13
+ * `null` en ventas de contado/externa; se hidrata paso a paso solo en la venta a crédito.
14
+ * SureKeep Fase 2 — pista SOFOM.
15
+ */
16
+ export class WizardLoan {
17
+ /** Paso 04 — acreditado creado on-demand al elegir SureKeep (`POST /private/borrowers`). */
18
+ @Expose()
19
+ @IsString()
20
+ borrowerId!: string;
21
+
22
+ /** Paso 05 — snapshot inmutable de la evaluación SCI (`POST /private/scoring/evaluate`). */
23
+ @Expose()
24
+ @IsOptional()
25
+ @IsString()
26
+ sciEvaluationId?: string;
27
+
28
+ /** Paso 05 — nivel denormalizado (display del chip de nivel; el snapshot es la fuente). */
29
+ @Expose()
30
+ @IsOptional()
31
+ @IsEnum(ClientLevelEnum)
32
+ level?: ClientLevelEnum;
33
+
34
+ /** Paso 06 — plan del catálogo SOFOM resuelto por nivel (loan-offerings). */
35
+ @Expose()
36
+ @IsOptional()
37
+ @IsString()
38
+ planId?: string;
39
+
40
+ /** Paso 06 — crédito originado en `PENDING_ACTIVATION` (`POST /private/credits/originate`). */
41
+ @Expose()
42
+ @IsOptional()
43
+ @IsString()
44
+ creditId?: string;
45
+ }
@@ -5,6 +5,7 @@ import type { PaymentMethodEnum } from '../enums/PaymentMethodEnum';
5
5
  import type { ExternalProviderEnum } from '../enums/ExternalProviderEnum';
6
6
  import type { OccupationEnum } from '../enums/OccupationEnum';
7
7
  import type { WizardConsents } from './WizardConsents';
8
+ import type { WizardLoan } from './WizardLoan';
8
9
  import type { WizardPayment } from './WizardPayment';
9
10
  import type { WizardWelcome } from './WizardWelcome';
10
11
 
@@ -55,6 +56,8 @@ export interface WizardSession {
55
56
  folio: string | null;
56
57
  payment: WizardPayment | null;
57
58
  welcome: WizardWelcome | null;
59
+ /** Contexto de crédito (pista SOFOM, pasos 04-09): PUNTEROS al dominio loan-*. Null en contado/externa. */
60
+ loan: WizardLoan | null;
58
61
  saleId: string | null;
59
62
  /** Prospecto vinculado (si la sesión se reanudó desde un prospecto): se cierra al cerrar la venta (D-prospecto). */
60
63
  prospectId: string | null;
@@ -0,0 +1,30 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsEnum, IsInt, IsOptional, Min, ValidateNested } from 'class-validator';
3
+ import { SalePaymentMethodEnum } from '../../enums/SalePaymentMethodEnum';
4
+ import { SalePaymentDetail } from '../SalePaymentDetail';
5
+
6
+ /**
7
+ * POST /wizard/sessions/:id/down-payment — cobro del ENGANCHE de la venta a crédito (paso 07,
8
+ * pista SOFOM). Endpoint propio, separado del cobro de contado (`/payment`): acá la regla dura es
9
+ * `amountCents == downPaymentCents` del crédito (`loan-credit GET /credits/{id}`), NO el precio
10
+ * full. Idempotente por sesión. El folio `SK-…-ENG-…` lo genera el server (no viaja en el body).
11
+ * Al confirmar, el wizard marca la condición 1 del checklist (`activate-check { downPayment }`).
12
+ * SPEI: el vendedor captura el comprobante (`speiTrackingKey`+`senderClabe`) y avanza.
13
+ * SureKeep Fase 2 — pista SOFOM.
14
+ */
15
+ export class DownPaymentRequest {
16
+ @Expose()
17
+ @IsEnum(SalePaymentMethodEnum)
18
+ method!: SalePaymentMethodEnum;
19
+
20
+ @Expose()
21
+ @IsInt()
22
+ @Min(0)
23
+ amountCents!: number;
24
+
25
+ @Expose()
26
+ @IsOptional()
27
+ @Type(() => SalePaymentDetail)
28
+ @ValidateNested()
29
+ detail?: SalePaymentDetail;
30
+ }
@@ -0,0 +1,21 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsInt, Min } from 'class-validator';
3
+
4
+ /**
5
+ * POST /wizard/sessions/:id/quote — términos elegidos en el cotizador del paso 06 (slider de
6
+ * enganche + botones de plazo). El wizard valida contra los bounds del PLAN resuelto por nivel
7
+ * (`minDownPaymentPct`/`maxDownPaymentPct`/`termWeeksOptions`) y origina (o re-cotiza) el crédito
8
+ * en loan-credit. El precio del equipo NO viaja: es el ancla `reservedCashPriceCents` de la sesión.
9
+ * SureKeep Fase 2 — pista SOFOM.
10
+ */
11
+ export class QuoteRequest {
12
+ @Expose()
13
+ @IsInt()
14
+ @Min(0)
15
+ downPaymentCents!: number;
16
+
17
+ @Expose()
18
+ @IsInt()
19
+ @Min(1)
20
+ termWeeks!: number;
21
+ }
@@ -0,0 +1,15 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsString, Matches } from 'class-validator';
3
+
4
+ /**
5
+ * POST /wizard/sessions/:id/device — registro del IMEI del equipo entregado (paso 09, variante
6
+ * crédito). El wizard valida el formato (15 dígitos); el Luhn y la unicidad (`IMEI_IN_USE`) los
7
+ * valida loan-credit en el `activate-check`, que además dispara el enrolamiento MDM (condiciones
8
+ * 3-4 del checklist). SureKeep Fase 2 — pista SOFOM.
9
+ */
10
+ export class RegisterDeviceRequest {
11
+ @Expose()
12
+ @IsString()
13
+ @Matches(/^\d{15}$/, { message: 'imei debe ser de 15 dígitos' })
14
+ imei!: string;
15
+ }
@@ -0,0 +1,15 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsString, Matches } from 'class-validator';
3
+
4
+ /**
5
+ * POST /wizard/sessions/:id/signature/sign — firma FES tiempo 2 (paso 08): verifica el OTP de
6
+ * firma (4 dígitos — M2 §4.4) y firma los contratos en loan-credit (sha256 + `signedAt` +
7
+ * condición 2 del checklist). Errores: `OTP_INVALID` · `OTP_EXPIRED` · `OTP_MAX_ATTEMPTS`.
8
+ * SureKeep Fase 2 — pista SOFOM.
9
+ */
10
+ export class SignatureSignRequest {
11
+ @Expose()
12
+ @IsString()
13
+ @Matches(/^\d{4}$/, { message: 'otpCode debe ser de 4 dígitos' })
14
+ otpCode!: string;
15
+ }
@@ -0,0 +1,13 @@
1
+ import { WizardCreditSummary } from '../WizardCreditSummary';
2
+
3
+ /**
4
+ * GET /wizard/sessions/:id/contract/preview — resumen previo a la firma FES (paso 08): el estado
5
+ * financiero del crédito (fuente: loan-credit) + las variables del template del contrato que el
6
+ * wizard armará para el sign tiempo-1 (`contractData`: nombre, CURP, domicilio… — PII TRANSITORIA,
7
+ * viaja solo en esta response, NO se persiste ni loggea). El PDF real lo genera el sign tiempo-1
8
+ * en loan-credit; este preview no llama a document-generator. SureKeep Fase 2 — pista SOFOM.
9
+ */
10
+ export interface ContractPreviewResponse {
11
+ credit: WizardCreditSummary;
12
+ contractData: Record<string, string>;
13
+ }
@@ -0,0 +1,15 @@
1
+ import { ActivationChecklist } from '../../../loanCredit/dtos/ActivationChecklist';
2
+
3
+ /**
4
+ * POST /wizard/sessions/:id/down-payment — confirmación del cobro del enganche (paso 07).
5
+ * `paymentId` = el folio de enganche `SK-…-ENG-…` (identificador natural del cobro en caja;
6
+ * concilia contra el depósito semanal del retailer). `checklist` refleja el estado post
7
+ * `activate-check { downPayment: true }` en loan-credit. SureKeep Fase 2 — pista SOFOM.
8
+ */
9
+ export interface DownPaymentResponse {
10
+ paymentId: string;
11
+ folio: string;
12
+ /** ISO 8601 del registro del cobro en la sesión. */
13
+ registeredAt: string;
14
+ checklist: ActivationChecklist;
15
+ }
@@ -0,0 +1,25 @@
1
+ import { WizardCreditSummary } from '../WizardCreditSummary';
2
+
3
+ /** Bounds y parámetros del plan que gobiernan el cotizador (slider + plazos) del paso 06. */
4
+ export interface QuotePlanBounds {
5
+ planId: string;
6
+ code: string;
7
+ /** Enganche mínimo como decimal sobre 1 (`0.40` = 40%). */
8
+ minDownPaymentPct: number;
9
+ /** Techo de enganche (decimal sobre 1); `null` = sin techo definido. */
10
+ maxDownPaymentPct: number | null;
11
+ termWeeksOptions: number[];
12
+ /** TNA decimal (`2.60` = 260%) — la tasa que manda es la del PLAN. */
13
+ tnaAnnual: number;
14
+ openingCommissionPct: number;
15
+ }
16
+
17
+ /**
18
+ * POST /wizard/sessions/:id/quote — respuesta del cotizador del paso 06: el plan resuelto por
19
+ * nivel + el snapshot financiero del crédito originado/re-cotizado (transitorio, NO se persiste
20
+ * en la sesión — la fuente es loan-credit). SureKeep Fase 2 — pista SOFOM.
21
+ */
22
+ export interface QuoteResponse {
23
+ plan: QuotePlanBounds;
24
+ credit: WizardCreditSummary;
25
+ }
@@ -0,0 +1,15 @@
1
+ import { LoanCreditStatusEnum } from '../../../loanCredit/enums/LoanCreditStatusEnum';
2
+ import { ActivationChecklist } from '../../../loanCredit/dtos/ActivationChecklist';
3
+
4
+ /**
5
+ * POST /wizard/sessions/:id/device — resultado del registro de IMEI + candado (paso 09).
6
+ * `active: true` cuando el checklist quedó 4/4 y el crédito pasó a `ACTIVE` (el front bloquea
7
+ * "Continuar a Bienvenida" hasta entonces; `missingItems` lista lo que falta).
8
+ * SureKeep Fase 2 — pista SOFOM.
9
+ */
10
+ export interface RegisterDeviceResponse {
11
+ creditStatus: LoanCreditStatusEnum;
12
+ checklist: ActivationChecklist;
13
+ missingItems: string[];
14
+ active: boolean;
15
+ }
@@ -0,0 +1,21 @@
1
+ import { ClientLevelEnum } from '../../../loanScoring/enums/ClientLevelEnum';
2
+ import { ScoringDecisionEnum } from '../../../loanScoring/enums/ScoringDecisionEnum';
3
+ import { ScoringOffer } from '../../../loanScoring/dtos/ScoringOffer';
4
+
5
+ /**
6
+ * POST /wizard/sessions/:id/score/consult — resultado de la evaluación SCI del paso 05.
7
+ *
8
+ * El wizard es idempotente por sesión: si la sesión ya tiene `loan.sciEvaluationId`, devuelve el
9
+ * snapshot existente (no re-evalúa — cada evaluate del motor genera un snapshot NUEVO).
10
+ * `REJECTED`/`NO_ELIGIBLE` no matan la venta: el front ofrece financiera externa o contado.
11
+ * SureKeep Fase 2 — pista SOFOM.
12
+ */
13
+ export interface ScoreConsultResponse {
14
+ /** Decisión normalizada del motor de scoring. */
15
+ status: ScoringDecisionEnum;
16
+ level: ClientLevelEnum;
17
+ /** Puntero al snapshot inmutable en loan-scoring (se persiste en `WizardSession.loan`). */
18
+ sciEvaluationId: string;
19
+ /** Oferta del proveedor (display del paso 05; la cotización del 06 usa el PLAN, no esto). */
20
+ offer: ScoringOffer | null;
21
+ }
@@ -0,0 +1,15 @@
1
+ import { ClientLevelEnum } from '../../../loanScoring/enums/ClientLevelEnum';
2
+ import { ScoringDecisionEnum } from '../../../loanScoring/enums/ScoringDecisionEnum';
3
+ import { ScoringOffer } from '../../../loanScoring/dtos/ScoringOffer';
4
+
5
+ /**
6
+ * GET /wizard/sessions/:id/score/result — lectura del resultado del score del paso 05 (la tablet
7
+ * lee el snapshot ya persistido vía `loan.sciEvaluationId`; no dispara evaluación).
8
+ * SureKeep Fase 2 — pista SOFOM.
9
+ */
10
+ export interface ScoreResultResponse {
11
+ status: ScoringDecisionEnum;
12
+ level: ClientLevelEnum;
13
+ sciEvaluationId: string;
14
+ offer: ScoringOffer | null;
15
+ }
@@ -0,0 +1,28 @@
1
+ import { FinancierTypeEnum } from '../../../loanOfferings/enums/FinancierTypeEnum';
2
+
3
+ /**
4
+ * Una opción de financiamiento del paso 04 (pantalla forma de pago): la unión de las financieras
5
+ * ACTIVE del catálogo SOFOM (`loan-offerings GET /private/financiers/active` — display + orden)
6
+ * con la elegibilidad del producto reservado (`eligibleFinanciers` del catálogo retail).
7
+ */
8
+ export interface SessionFinancierOption {
9
+ code: string;
10
+ name: string;
11
+ /** Texto de display de la card (viene del catálogo SOFOM). */
12
+ label: string;
13
+ /** INTERNAL = SureKeep (pista crédito propia); EXTERNAL = derivación (PayJoy, CrediYa…). */
14
+ type: FinancierTypeEnum;
15
+ displayOrder: number;
16
+ /** Solo EXTERNAL: URL de derivación. */
17
+ externalRedirectUrl: string | null;
18
+ /** El producto reservado admite esta financiera (INTERNAL siempre elegible). */
19
+ eligible: boolean;
20
+ }
21
+
22
+ /**
23
+ * GET /wizard/sessions/:id/financiers — las opciones de financiamiento del paso 04 para la sesión
24
+ * (según su producto reservado). Ordenadas por `displayOrder`. SureKeep Fase 2 — pista SOFOM.
25
+ */
26
+ export interface SessionFinanciersResponse {
27
+ financiers: SessionFinancierOption[];
28
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * POST /wizard/sessions/:id/signature/send-otp — firma FES tiempo 1 (paso 08): loan-credit
3
+ * congela términos, genera los PDFs y despacha el OTP dedicado de firma (4 dígitos, 5 min) al
4
+ * teléfono del cliente vía messages-business. SureKeep Fase 2 — pista SOFOM.
5
+ */
6
+ export interface SignatureSendOtpResponse {
7
+ otpSent: boolean;
8
+ /** Teléfono destino enmascarado para la pantalla (`****1234`) — nunca el número completo. */
9
+ otpDestinationMasked: string;
10
+ }
@@ -0,0 +1,11 @@
1
+ import { ActivationChecklist } from '../../../loanCredit/dtos/ActivationChecklist';
2
+
3
+ /**
4
+ * POST /wizard/sessions/:id/signature/sign — resultado de la firma FES tiempo 2 (paso 08).
5
+ * `signed: true` implica `checklist.contractSigned: true` (condición 2 de activación).
6
+ * SureKeep Fase 2 — pista SOFOM.
7
+ */
8
+ export interface SignatureSignResponse {
9
+ signed: boolean;
10
+ checklist: ActivationChecklist;
11
+ }
@@ -21,6 +21,8 @@ export * from './dtos/WizardWelcome';
21
21
  export * from './dtos/SalePaymentDetail';
22
22
  export * from './dtos/ProspectNewCustomer';
23
23
  export * from './dtos/WizardBeneficiary';
24
+ export * from './dtos/WizardLoan';
25
+ export * from './dtos/WizardCreditSummary';
24
26
 
25
27
  // Entidades principales (shapes de estado/persistencia — planas)
26
28
  export * from './dtos/WizardSession';
@@ -58,9 +60,22 @@ export * from './dtos/requests/CreateProspectRequest';
58
60
  export * from './dtos/requests/UpdateProspectRequest';
59
61
  export * from './dtos/requests/MarkProspectLostRequest';
60
62
  export * from './dtos/requests/CancelSaleRequest';
63
+ export * from './dtos/requests/QuoteRequest';
64
+ export * from './dtos/requests/DownPaymentRequest';
65
+ export * from './dtos/requests/SignatureSignRequest';
66
+ export * from './dtos/requests/RegisterDeviceRequest';
61
67
 
62
68
  // Response DTOs (output tipado por endpoint)
63
69
  export * from './dtos/responses/KycPrepareResponse';
70
+ export * from './dtos/responses/SessionFinanciersResponse';
71
+ export * from './dtos/responses/ScoreConsultResponse';
72
+ export * from './dtos/responses/ScoreResultResponse';
73
+ export * from './dtos/responses/QuoteResponse';
74
+ export * from './dtos/responses/DownPaymentResponse';
75
+ export * from './dtos/responses/ContractPreviewResponse';
76
+ export * from './dtos/responses/SignatureSendOtpResponse';
77
+ export * from './dtos/responses/SignatureSignResponse';
78
+ export * from './dtos/responses/RegisterDeviceResponse';
64
79
 
65
80
  // Contratos de eventos (PascalCase + sufijo V1)
66
81
  export * from './events/SaleCompletedV1';