@fiado/type-kit 3.395.0 → 3.397.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 (34) hide show
  1. package/_test_/unit/loanCredit/creditAuditSnapshots.test.ts +75 -0
  2. package/_test_/unit/loanOfferings/simulationAudit.test.ts +70 -0
  3. package/bin/loanCredit/dtos/AppliedStorePolicySnapshot.d.ts +11 -0
  4. package/bin/loanCredit/dtos/AppliedStorePolicySnapshot.js +2 -0
  5. package/bin/loanCredit/dtos/CandidatePlanSnapshot.d.ts +8 -0
  6. package/bin/loanCredit/dtos/CandidatePlanSnapshot.js +2 -0
  7. package/bin/loanCredit/dtos/EffectiveTermsSnapshot.d.ts +12 -0
  8. package/bin/loanCredit/dtos/EffectiveTermsSnapshot.js +2 -0
  9. package/bin/loanCredit/dtos/responses/LoanCreditResponse.d.ts +18 -0
  10. package/bin/loanCredit/index.d.ts +3 -0
  11. package/bin/loanCredit/index.js +3 -0
  12. package/bin/loanOfferings/dtos/responses/SimulationResultResponse.d.ts +33 -0
  13. package/bin/loanOfferings/enums/FoldableTermEnum.d.ts +10 -0
  14. package/bin/loanOfferings/enums/FoldableTermEnum.js +14 -0
  15. package/bin/loanOfferings/index.d.ts +1 -0
  16. package/bin/loanOfferings/index.js +1 -0
  17. package/bin/loanScoring/dtos/requests/EvaluateSciRequest.d.ts +5 -0
  18. package/bin/loanScoring/dtos/requests/EvaluateSciRequest.js +6 -0
  19. package/bin/loanScoring/dtos/responses/ListSciEvaluationsResponse.d.ts +29 -0
  20. package/bin/loanScoring/dtos/responses/ListSciEvaluationsResponse.js +2 -0
  21. package/bin/loanScoring/index.d.ts +1 -0
  22. package/bin/loanScoring/index.js +1 -0
  23. package/package.json +1 -1
  24. package/src/loanCredit/dtos/AppliedStorePolicySnapshot.ts +12 -0
  25. package/src/loanCredit/dtos/CandidatePlanSnapshot.ts +8 -0
  26. package/src/loanCredit/dtos/EffectiveTermsSnapshot.ts +12 -0
  27. package/src/loanCredit/dtos/responses/LoanCreditResponse.ts +18 -0
  28. package/src/loanCredit/index.ts +3 -0
  29. package/src/loanOfferings/dtos/responses/SimulationResultResponse.ts +35 -0
  30. package/src/loanOfferings/enums/FoldableTermEnum.ts +10 -0
  31. package/src/loanOfferings/index.ts +1 -0
  32. package/src/loanScoring/dtos/requests/EvaluateSciRequest.ts +9 -0
  33. package/src/loanScoring/dtos/responses/ListSciEvaluationsResponse.ts +31 -0
  34. package/src/loanScoring/index.ts +1 -0
@@ -0,0 +1,75 @@
1
+ import 'reflect-metadata';
2
+ import {
3
+ AppliedStorePolicySnapshot,
4
+ CandidatePlanSnapshot,
5
+ EffectiveTermsSnapshot,
6
+ LoanCreditResponse,
7
+ } from '../../../src/loanCredit/index';
8
+ import { FoldableTermEnum, PromotionEffectKindEnum } from '../../../src/loanOfferings/index';
9
+
10
+ describe('snapshots de auditoría del crédito', () => {
11
+ it('congela la política especial con los términos que ganó', () => {
12
+ const policy: AppliedStorePolicySnapshot = {
13
+ policyId: 'POL#1',
14
+ name: 'Freno de riesgo Norte',
15
+ appliedTerms: [FoldableTermEnum.MAX_FINANCED_AMOUNT_CENTS],
16
+ };
17
+ expect(policy.appliedTerms[0]).toBe('maxFinancedAmountCents');
18
+ });
19
+
20
+ it('congela el plan candidato con su id y su código', () => {
21
+ const candidate: CandidatePlanSnapshot = { planId: 'PLAN#1', code: 'SK-12' };
22
+ expect(candidate.planId).toBe('PLAN#1');
23
+ });
24
+
25
+ it('admite un tope de enganche nulo: el plan puede no acotarlo', () => {
26
+ const terms: EffectiveTermsSnapshot = {
27
+ minDownPaymentPct: 0.1,
28
+ maxDownPaymentPct: null,
29
+ maxFinancedAmountCents: 2_500_000,
30
+ };
31
+ expect(terms.maxDownPaymentPct).toBeNull();
32
+ });
33
+ });
34
+
35
+ describe('LoanCreditResponse', () => {
36
+ it('deja la auditoría opcional y nullable: los créditos viejos no la tienen', () => {
37
+ const legacy: Pick<
38
+ LoanCreditResponse,
39
+ | 'appliedPromotions'
40
+ | 'appliedStorePolicies'
41
+ | 'candidatePlans'
42
+ | 'planVersionAtOrigination'
43
+ | 'segmentIdsAtQuote'
44
+ | 'effectiveTerms'
45
+ > = {
46
+ appliedPromotions: null,
47
+ appliedStorePolicies: null,
48
+ candidatePlans: null,
49
+ planVersionAtOrigination: null,
50
+ segmentIdsAtQuote: null,
51
+ effectiveTerms: null,
52
+ };
53
+ expect(Object.values(legacy).every((value) => value === null)).toBe(true);
54
+ });
55
+
56
+ it('convive con la promoción primaria singular, que no cambia', () => {
57
+ const audited: Pick<LoanCreditResponse, 'appliedPromotion' | 'appliedPromotions'> = {
58
+ appliedPromotion: {
59
+ promotionId: 'PROMO#1',
60
+ name: 'Buen Fin',
61
+ version: 2,
62
+ appliedEffects: [PromotionEffectKindEnum.DOWN_PAYMENT_DELTA],
63
+ },
64
+ appliedPromotions: [
65
+ {
66
+ promotionId: 'PROMO#1',
67
+ name: 'Buen Fin',
68
+ version: 2,
69
+ appliedEffects: [PromotionEffectKindEnum.DOWN_PAYMENT_DELTA],
70
+ },
71
+ ],
72
+ };
73
+ expect(audited.appliedPromotions?.[0].name).toBe(audited.appliedPromotion?.name);
74
+ });
75
+ });
@@ -0,0 +1,70 @@
1
+ import 'reflect-metadata';
2
+ import {
3
+ AppliedStorePolicyResponse,
4
+ CandidatePlanResponse,
5
+ FoldableTermEnum,
6
+ PromotionEffectKindEnum,
7
+ SimulationResultResponse,
8
+ } from '../../../src/loanOfferings/index';
9
+
10
+ /** Los valores del enum son las claves literales de los términos que el motor pliega. */
11
+ describe('FoldableTermEnum', () => {
12
+ it('expone exactamente los tres términos plegables con su clave literal', () => {
13
+ expect(Object.values(FoldableTermEnum).sort()).toEqual(
14
+ ['maxFinancedAmountCents', 'minDownPaymentPct', 'tnaAnnual'],
15
+ );
16
+ });
17
+ });
18
+
19
+ describe('auditoría de la simulación', () => {
20
+ it('tipa el plan candidato con su id y su código', () => {
21
+ const candidate: CandidatePlanResponse = { planId: 'PLAN#1', code: 'SK-12' };
22
+ expect(candidate.code).toBe('SK-12');
23
+ });
24
+
25
+ it('tipa la política aplicada con los términos que ganó', () => {
26
+ const policy: AppliedStorePolicyResponse = {
27
+ policyId: 'POL#1',
28
+ name: 'Freno de riesgo Norte',
29
+ appliedTerms: [FoldableTermEnum.TNA_ANNUAL, FoldableTermEnum.MIN_DOWN_PAYMENT_PCT],
30
+ };
31
+ expect(policy.appliedTerms).toHaveLength(2);
32
+ });
33
+
34
+ it('deja los tres bloques de auditoría opcionales y conviviendo con la promoción primaria', () => {
35
+ const minimal: Pick<SimulationResultResponse, 'appliedPromotion'> = { appliedPromotion: null };
36
+ expect(minimal.appliedPromotion).toBeNull();
37
+
38
+ const audited: Pick<
39
+ SimulationResultResponse,
40
+ 'appliedPromotion' | 'appliedPromotions' | 'candidatePlans' | 'appliedStorePolicies'
41
+ > = {
42
+ appliedPromotion: {
43
+ promotionId: 'PROMO#1',
44
+ name: 'Buen Fin',
45
+ version: 2,
46
+ appliedEffects: [PromotionEffectKindEnum.TNA_OVERRIDE],
47
+ },
48
+ appliedPromotions: [
49
+ {
50
+ promotionId: 'PROMO#1',
51
+ name: 'Buen Fin',
52
+ version: 2,
53
+ appliedEffects: [PromotionEffectKindEnum.TNA_OVERRIDE],
54
+ },
55
+ {
56
+ promotionId: 'PROMO#2',
57
+ name: 'Bono tarjeta',
58
+ version: 1,
59
+ appliedEffects: [PromotionEffectKindEnum.PCF_BONUS],
60
+ },
61
+ ],
62
+ candidatePlans: [{ planId: 'PLAN#1', code: 'SK-12' }],
63
+ appliedStorePolicies: [
64
+ { policyId: 'POL#1', name: 'Freno Norte', appliedTerms: [FoldableTermEnum.TNA_ANNUAL] },
65
+ ],
66
+ };
67
+ expect(audited.appliedPromotions).toHaveLength(2);
68
+ expect(audited.appliedPromotion?.promotionId).toBe(audited.appliedPromotions?.[0].promotionId);
69
+ });
70
+ });
@@ -0,0 +1,11 @@
1
+ import { FoldableTermEnum } from '../../loanOfferings/enums/FoldableTermEnum';
2
+ /**
3
+ * Política especial que ganó algún término de este crédito, congelada al cotizar. El catálogo de
4
+ * políticas es editable: sin esta copia, una edición posterior deja la cuota sin explicación.
5
+ */
6
+ export interface AppliedStorePolicySnapshot {
7
+ policyId: string;
8
+ name: string;
9
+ /** Términos del plan que esta política ganó en el pliegue final. */
10
+ appliedTerms: FoldableTermEnum[];
11
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `CreditPlan` que el motor consideró al cotizar este crédito, haya ganado algún término o no.
3
+ * Es lo que contesta por qué se cotizó con este plan y no con otro.
4
+ */
5
+ export interface CandidatePlanSnapshot {
6
+ planId: string;
7
+ code: string;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Cotas con las que se cotizó este crédito de verdad, ya pisadas por promociones y políticas.
3
+ * NO son las del plan: una promoción puede bajar el enganche mínimo o subir el techo de monto.
4
+ */
5
+ export interface EffectiveTermsSnapshot {
6
+ /** Enganche mínimo exigible, en decimal sobre 1 (`0.10` = 10%). */
7
+ minDownPaymentPct: number;
8
+ /** Tope de enganche, o `null` si el plan no lo acota. */
9
+ maxDownPaymentPct: number | null;
10
+ /** Techo de capital financiable. */
11
+ maxFinancedAmountCents: number;
12
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,6 +1,9 @@
1
1
  import { ClientLevelEnum } from '../../../loanScoring/enums/ClientLevelEnum';
2
2
  import { LoanCreditStatusEnum } from '../../enums/LoanCreditStatusEnum';
3
3
  import { AppliedPromotionSnapshot } from '../AppliedPromotionSnapshot';
4
+ import { AppliedStorePolicySnapshot } from '../AppliedStorePolicySnapshot';
5
+ import { CandidatePlanSnapshot } from '../CandidatePlanSnapshot';
6
+ import { EffectiveTermsSnapshot } from '../EffectiveTermsSnapshot';
4
7
  /**
5
8
  * Response de los endpoints de LoanCredit (loan-credit-business). Montos en cents; TNA decimal.
6
9
  */
@@ -31,6 +34,21 @@ export interface LoanCreditResponse {
31
34
  clientLevelAtOrigination?: ClientLevelEnum;
32
35
  /** Promoción con la que se cotizó, o `null` si ninguna alcanzaba a esta venta. */
33
36
  appliedPromotion?: AppliedPromotionSnapshot | null;
37
+ /**
38
+ * TODAS las promociones aplicadas: `appliedPromotion` es la primaria y esto es la auditoría
39
+ * completa. Los términos de arriba YA las incluyen, no son un extra a sumar.
40
+ */
41
+ appliedPromotions?: AppliedPromotionSnapshot[] | null;
42
+ /** Políticas especiales que ganaron algún término: qué frenó o aflojó la cuota. */
43
+ appliedStorePolicies?: AppliedStorePolicySnapshot[] | null;
44
+ /** Los planes que compitieron: contesta por qué este plan y no otro. */
45
+ candidatePlans?: CandidatePlanSnapshot[] | null;
46
+ /** Edición del plan al originar: contesta con qué reglas se cotizó, aunque después se edite. */
47
+ planVersionAtOrigination?: number | null;
48
+ /** Segmentos del cliente al cotizar: contesta por qué le alcanzó esa promoción. */
49
+ segmentIdsAtQuote?: string[] | null;
50
+ /** Cotas con las que se cotizó de verdad, ya pisadas por promociones y políticas. */
51
+ effectiveTerms?: EffectiveTermsSnapshot | null;
34
52
  activatedAt?: string;
35
53
  voluntaryCancelDeadline?: string;
36
54
  firstDueDate?: string;
@@ -9,6 +9,9 @@ export * from './dtos/LoanInstallment';
9
9
  export * from './dtos/LoanContract';
10
10
  export * from './dtos/ActivationChecklist';
11
11
  export * from './dtos/AppliedPromotionSnapshot';
12
+ export * from './dtos/AppliedStorePolicySnapshot';
13
+ export * from './dtos/CandidatePlanSnapshot';
14
+ export * from './dtos/EffectiveTermsSnapshot';
12
15
  export * from './dtos/requests/UpsertLoanBorrowerRequest';
13
16
  export * from './dtos/requests/OriginateLoanCreditRequest';
14
17
  export * from './dtos/requests/QuoteLoanCreditRequest';
@@ -30,6 +30,9 @@ __exportStar(require("./dtos/LoanInstallment"), exports);
30
30
  __exportStar(require("./dtos/LoanContract"), exports);
31
31
  __exportStar(require("./dtos/ActivationChecklist"), exports);
32
32
  __exportStar(require("./dtos/AppliedPromotionSnapshot"), exports);
33
+ __exportStar(require("./dtos/AppliedStorePolicySnapshot"), exports);
34
+ __exportStar(require("./dtos/CandidatePlanSnapshot"), exports);
35
+ __exportStar(require("./dtos/EffectiveTermsSnapshot"), exports);
33
36
  // Request DTOs
34
37
  __exportStar(require("./dtos/requests/UpsertLoanBorrowerRequest"), exports);
35
38
  __exportStar(require("./dtos/requests/OriginateLoanCreditRequest"), exports);
@@ -1,3 +1,4 @@
1
+ import { FoldableTermEnum } from '../../enums/FoldableTermEnum';
1
2
  import { PromotionEffectKindEnum } from '../../enums/PromotionEffectKindEnum';
2
3
  import { PlanTermProvenance } from './StorePolicyResponse';
3
4
  /**
@@ -27,6 +28,24 @@ export interface AppliedPromotionResponse {
27
28
  /** Palancas del plan que la promoción pisó. */
28
29
  appliedEffects: PromotionEffectKindEnum[];
29
30
  }
31
+ /**
32
+ * Una `CreditPlan` que el paso Base consideró para esta venta, haya ganado algún término o no.
33
+ * Es lo que contesta por qué ganó este plan y no otro.
34
+ */
35
+ export interface CandidatePlanResponse {
36
+ planId: string;
37
+ code: string;
38
+ }
39
+ /**
40
+ * Política especial que ganó al menos un término de esta cotización. Las políticas en alcance que
41
+ * no ganaron nada no se reportan: no explican la cuota.
42
+ */
43
+ export interface AppliedStorePolicyResponse {
44
+ policyId: string;
45
+ name: string;
46
+ /** Términos del plan que esta política ganó en el pliegue final. */
47
+ appliedTerms: FoldableTermEnum[];
48
+ }
30
49
  /**
31
50
  * Cotas con las que se cotizó de verdad, ya pisadas por la promoción y las políticas. NO son las
32
51
  * del plan: una promoción puede bajar el enganche mínimo o subir el techo de monto.
@@ -84,4 +103,18 @@ export interface SimulationResultResponse {
84
103
  * Las cotas efectivas de ESTA cotización. Ausente si el lambda todavía no las emite.
85
104
  */
86
105
  effectiveTerms?: EffectiveTermsResponse;
106
+ /**
107
+ * Todas las `CreditPlan` candidatas del paso Base. Ausente si el lambda todavía no lo emite.
108
+ */
109
+ candidatePlans?: CandidatePlanResponse[];
110
+ /**
111
+ * TODAS las promociones aplicadas: `appliedPromotion` es la primaria y esto es la auditoría
112
+ * completa. Los montos de arriba YA las incluyen, no son un extra a sumar. Ausente si el
113
+ * lambda todavía no lo emite.
114
+ */
115
+ appliedPromotions?: AppliedPromotionResponse[];
116
+ /**
117
+ * Políticas especiales que ganaron algún término. Ausente si el lambda todavía no lo emite.
118
+ */
119
+ appliedStorePolicies?: AppliedStorePolicyResponse[];
87
120
  }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Términos del plan que el motor de cotización pliega capa por capa (plan base, promociones,
3
+ * políticas especiales). El valor es la clave literal del término en el contrato.
4
+ * @enum {string}
5
+ */
6
+ export declare enum FoldableTermEnum {
7
+ MIN_DOWN_PAYMENT_PCT = "minDownPaymentPct",
8
+ TNA_ANNUAL = "tnaAnnual",
9
+ MAX_FINANCED_AMOUNT_CENTS = "maxFinancedAmountCents"
10
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FoldableTermEnum = void 0;
4
+ /**
5
+ * Términos del plan que el motor de cotización pliega capa por capa (plan base, promociones,
6
+ * políticas especiales). El valor es la clave literal del término en el contrato.
7
+ * @enum {string}
8
+ */
9
+ var FoldableTermEnum;
10
+ (function (FoldableTermEnum) {
11
+ FoldableTermEnum["MIN_DOWN_PAYMENT_PCT"] = "minDownPaymentPct";
12
+ FoldableTermEnum["TNA_ANNUAL"] = "tnaAnnual";
13
+ FoldableTermEnum["MAX_FINANCED_AMOUNT_CENTS"] = "maxFinancedAmountCents";
14
+ })(FoldableTermEnum || (exports.FoldableTermEnum = FoldableTermEnum = {}));
@@ -6,6 +6,7 @@ export * from './enums/FinancierTypeEnum';
6
6
  export * from './enums/FinancierStatusEnum';
7
7
  export * from './enums/PromotionStatusEnum';
8
8
  export * from './enums/PromotionEffectKindEnum';
9
+ export * from './enums/FoldableTermEnum';
9
10
  export * from './enums/PromotionBonusStatusEnum';
10
11
  export * from './enums/PromotionPhaseEnum';
11
12
  export * from './enums/PromotionLogEventEnum';
@@ -23,6 +23,7 @@ __exportStar(require("./enums/FinancierTypeEnum"), exports);
23
23
  __exportStar(require("./enums/FinancierStatusEnum"), exports);
24
24
  __exportStar(require("./enums/PromotionStatusEnum"), exports);
25
25
  __exportStar(require("./enums/PromotionEffectKindEnum"), exports);
26
+ __exportStar(require("./enums/FoldableTermEnum"), exports);
26
27
  __exportStar(require("./enums/PromotionBonusStatusEnum"), exports);
27
28
  __exportStar(require("./enums/PromotionPhaseEnum"), exports);
28
29
  __exportStar(require("./enums/PromotionLogEventEnum"), exports);
@@ -8,6 +8,11 @@ import { SciInternalHistoryInput } from './SciInternalHistoryInput';
8
8
  export declare class EvaluateSciRequest {
9
9
  /** Acreditado a evaluar (`LoanBorrower`). La evaluación queda ligada a él en el historial. */
10
10
  borrowerId: string;
11
+ /**
12
+ * Cliente retail dueño del acreditado. Se guarda en el snapshot para que el listado del
13
+ * backoffice resuelva el nombre sin volver a preguntarle a loan-credit de quién es.
14
+ */
15
+ retailCustomerId?: string;
11
16
  /** CURP del solicitante (requerido por los proveedores de scoring). */
12
17
  curp: string;
13
18
  /** Celular del solicitante (requerido por Modelias). */
@@ -27,6 +27,12 @@ __decorate([
27
27
  (0, class_validator_1.IsNotEmpty)(),
28
28
  __metadata("design:type", String)
29
29
  ], EvaluateSciRequest.prototype, "borrowerId", void 0);
30
+ __decorate([
31
+ (0, class_validator_1.IsOptional)(),
32
+ (0, class_validator_1.IsString)(),
33
+ (0, class_validator_1.IsNotEmpty)(),
34
+ __metadata("design:type", String)
35
+ ], EvaluateSciRequest.prototype, "retailCustomerId", void 0);
30
36
  __decorate([
31
37
  (0, class_validator_1.IsString)(),
32
38
  (0, class_validator_1.IsNotEmpty)(),
@@ -0,0 +1,29 @@
1
+ import { PaginatedResult } from '../../../retailOrg/dtos/PaginatedResult';
2
+ import { SciEvaluationResponse } from './SciEvaluationResponse';
3
+ /**
4
+ * Fila lista para pintar del listado de evaluaciones del tenant: la evaluación más el contexto
5
+ * del cliente ya resuelto por el motor. El front no cruza nada.
6
+ */
7
+ export interface SciEvaluationListItem {
8
+ evaluation: SciEvaluationResponse;
9
+ /** Cliente retail dueño del acreditado. `null` en las evaluaciones anteriores al campo. */
10
+ retailCustomerId: string | null;
11
+ /** `null` cuando el nombre no se pudo resolver; el front pinta el id, nunca un vacío. */
12
+ customerName: string | null;
13
+ /**
14
+ * `null` mientras el lote del padrón no devuelva teléfono: hoy solo proyecta el nombre.
15
+ * Viaja igual para que el contrato de la fila no cambie cuando lo devuelva.
16
+ */
17
+ customerPhone: string | null;
18
+ }
19
+ /**
20
+ * Página del listado de evaluaciones del tenant, ordenada de la más nueva a la más vieja.
21
+ * Usa el sobre paginado canónico (`items` + `count` + `nextToken` ausente en la última página).
22
+ */
23
+ export interface ListSciEvaluationsResponse extends PaginatedResult<SciEvaluationListItem> {
24
+ /**
25
+ * Filas con `retailCustomerId` cuyo nombre no se resolvió — porque el padrón no lo tiene o
26
+ * porque no contestó. La pantalla lo anuncia en vez de dejar huecos sin explicación.
27
+ */
28
+ unresolvedCustomerCount: number;
29
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -9,3 +9,4 @@ export * from './dtos/requests/EvaluateSciRequest';
9
9
  export * from './dtos/requests/SciInternalHistoryInput';
10
10
  export * from './dtos/responses/EvaluateSciResponse';
11
11
  export * from './dtos/responses/SciEvaluationResponse';
12
+ export * from './dtos/responses/ListSciEvaluationsResponse';
@@ -29,3 +29,4 @@ __exportStar(require("./dtos/requests/SciInternalHistoryInput"), exports);
29
29
  // Response DTOs
30
30
  __exportStar(require("./dtos/responses/EvaluateSciResponse"), exports);
31
31
  __exportStar(require("./dtos/responses/SciEvaluationResponse"), exports);
32
+ __exportStar(require("./dtos/responses/ListSciEvaluationsResponse"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.395.0",
3
+ "version": "3.397.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,12 @@
1
+ import { FoldableTermEnum } from '../../loanOfferings/enums/FoldableTermEnum';
2
+
3
+ /**
4
+ * Política especial que ganó algún término de este crédito, congelada al cotizar. El catálogo de
5
+ * políticas es editable: sin esta copia, una edición posterior deja la cuota sin explicación.
6
+ */
7
+ export interface AppliedStorePolicySnapshot {
8
+ policyId: string;
9
+ name: string;
10
+ /** Términos del plan que esta política ganó en el pliegue final. */
11
+ appliedTerms: FoldableTermEnum[];
12
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `CreditPlan` que el motor consideró al cotizar este crédito, haya ganado algún término o no.
3
+ * Es lo que contesta por qué se cotizó con este plan y no con otro.
4
+ */
5
+ export interface CandidatePlanSnapshot {
6
+ planId: string;
7
+ code: string;
8
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Cotas con las que se cotizó este crédito de verdad, ya pisadas por promociones y políticas.
3
+ * NO son las del plan: una promoción puede bajar el enganche mínimo o subir el techo de monto.
4
+ */
5
+ export interface EffectiveTermsSnapshot {
6
+ /** Enganche mínimo exigible, en decimal sobre 1 (`0.10` = 10%). */
7
+ minDownPaymentPct: number;
8
+ /** Tope de enganche, o `null` si el plan no lo acota. */
9
+ maxDownPaymentPct: number | null;
10
+ /** Techo de capital financiable. */
11
+ maxFinancedAmountCents: number;
12
+ }
@@ -1,6 +1,9 @@
1
1
  import { ClientLevelEnum } from '../../../loanScoring/enums/ClientLevelEnum';
2
2
  import { LoanCreditStatusEnum } from '../../enums/LoanCreditStatusEnum';
3
3
  import { AppliedPromotionSnapshot } from '../AppliedPromotionSnapshot';
4
+ import { AppliedStorePolicySnapshot } from '../AppliedStorePolicySnapshot';
5
+ import { CandidatePlanSnapshot } from '../CandidatePlanSnapshot';
6
+ import { EffectiveTermsSnapshot } from '../EffectiveTermsSnapshot';
4
7
 
5
8
  /**
6
9
  * Response de los endpoints de LoanCredit (loan-credit-business). Montos en cents; TNA decimal.
@@ -32,6 +35,21 @@ export interface LoanCreditResponse {
32
35
  clientLevelAtOrigination?: ClientLevelEnum;
33
36
  /** Promoción con la que se cotizó, o `null` si ninguna alcanzaba a esta venta. */
34
37
  appliedPromotion?: AppliedPromotionSnapshot | null;
38
+ /**
39
+ * TODAS las promociones aplicadas: `appliedPromotion` es la primaria y esto es la auditoría
40
+ * completa. Los términos de arriba YA las incluyen, no son un extra a sumar.
41
+ */
42
+ appliedPromotions?: AppliedPromotionSnapshot[] | null;
43
+ /** Políticas especiales que ganaron algún término: qué frenó o aflojó la cuota. */
44
+ appliedStorePolicies?: AppliedStorePolicySnapshot[] | null;
45
+ /** Los planes que compitieron: contesta por qué este plan y no otro. */
46
+ candidatePlans?: CandidatePlanSnapshot[] | null;
47
+ /** Edición del plan al originar: contesta con qué reglas se cotizó, aunque después se edite. */
48
+ planVersionAtOrigination?: number | null;
49
+ /** Segmentos del cliente al cotizar: contesta por qué le alcanzó esa promoción. */
50
+ segmentIdsAtQuote?: string[] | null;
51
+ /** Cotas con las que se cotizó de verdad, ya pisadas por promociones y políticas. */
52
+ effectiveTerms?: EffectiveTermsSnapshot | null;
35
53
  activatedAt?: string;
36
54
  voluntaryCancelDeadline?: string;
37
55
  firstDueDate?: string;
@@ -13,6 +13,9 @@ export * from './dtos/LoanInstallment';
13
13
  export * from './dtos/LoanContract';
14
14
  export * from './dtos/ActivationChecklist';
15
15
  export * from './dtos/AppliedPromotionSnapshot';
16
+ export * from './dtos/AppliedStorePolicySnapshot';
17
+ export * from './dtos/CandidatePlanSnapshot';
18
+ export * from './dtos/EffectiveTermsSnapshot';
16
19
 
17
20
  // Request DTOs
18
21
  export * from './dtos/requests/UpsertLoanBorrowerRequest';
@@ -1,3 +1,4 @@
1
+ import { FoldableTermEnum } from '../../enums/FoldableTermEnum';
1
2
  import { PromotionEffectKindEnum } from '../../enums/PromotionEffectKindEnum';
2
3
  import { PlanTermProvenance } from './StorePolicyResponse';
3
4
 
@@ -30,6 +31,26 @@ export interface AppliedPromotionResponse {
30
31
  appliedEffects: PromotionEffectKindEnum[];
31
32
  }
32
33
 
34
+ /**
35
+ * Una `CreditPlan` que el paso Base consideró para esta venta, haya ganado algún término o no.
36
+ * Es lo que contesta por qué ganó este plan y no otro.
37
+ */
38
+ export interface CandidatePlanResponse {
39
+ planId: string;
40
+ code: string;
41
+ }
42
+
43
+ /**
44
+ * Política especial que ganó al menos un término de esta cotización. Las políticas en alcance que
45
+ * no ganaron nada no se reportan: no explican la cuota.
46
+ */
47
+ export interface AppliedStorePolicyResponse {
48
+ policyId: string;
49
+ name: string;
50
+ /** Términos del plan que esta política ganó en el pliegue final. */
51
+ appliedTerms: FoldableTermEnum[];
52
+ }
53
+
33
54
  /**
34
55
  * Cotas con las que se cotizó de verdad, ya pisadas por la promoción y las políticas. NO son las
35
56
  * del plan: una promoción puede bajar el enganche mínimo o subir el techo de monto.
@@ -88,4 +109,18 @@ export interface SimulationResultResponse {
88
109
  * Las cotas efectivas de ESTA cotización. Ausente si el lambda todavía no las emite.
89
110
  */
90
111
  effectiveTerms?: EffectiveTermsResponse;
112
+ /**
113
+ * Todas las `CreditPlan` candidatas del paso Base. Ausente si el lambda todavía no lo emite.
114
+ */
115
+ candidatePlans?: CandidatePlanResponse[];
116
+ /**
117
+ * TODAS las promociones aplicadas: `appliedPromotion` es la primaria y esto es la auditoría
118
+ * completa. Los montos de arriba YA las incluyen, no son un extra a sumar. Ausente si el
119
+ * lambda todavía no lo emite.
120
+ */
121
+ appliedPromotions?: AppliedPromotionResponse[];
122
+ /**
123
+ * Políticas especiales que ganaron algún término. Ausente si el lambda todavía no lo emite.
124
+ */
125
+ appliedStorePolicies?: AppliedStorePolicyResponse[];
91
126
  }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Términos del plan que el motor de cotización pliega capa por capa (plan base, promociones,
3
+ * políticas especiales). El valor es la clave literal del término en el contrato.
4
+ * @enum {string}
5
+ */
6
+ export enum FoldableTermEnum {
7
+ MIN_DOWN_PAYMENT_PCT = 'minDownPaymentPct',
8
+ TNA_ANNUAL = 'tnaAnnual',
9
+ MAX_FINANCED_AMOUNT_CENTS = 'maxFinancedAmountCents',
10
+ }
@@ -7,6 +7,7 @@ export * from './enums/FinancierTypeEnum';
7
7
  export * from './enums/FinancierStatusEnum';
8
8
  export * from './enums/PromotionStatusEnum';
9
9
  export * from './enums/PromotionEffectKindEnum';
10
+ export * from './enums/FoldableTermEnum';
10
11
  export * from './enums/PromotionBonusStatusEnum';
11
12
  export * from './enums/PromotionPhaseEnum';
12
13
  export * from './enums/PromotionLogEventEnum';
@@ -14,6 +14,15 @@ export class EvaluateSciRequest {
14
14
  @IsNotEmpty()
15
15
  borrowerId!: string;
16
16
 
17
+ /**
18
+ * Cliente retail dueño del acreditado. Se guarda en el snapshot para que el listado del
19
+ * backoffice resuelva el nombre sin volver a preguntarle a loan-credit de quién es.
20
+ */
21
+ @IsOptional()
22
+ @IsString()
23
+ @IsNotEmpty()
24
+ retailCustomerId?: string;
25
+
17
26
  /** CURP del solicitante (requerido por los proveedores de scoring). */
18
27
  @IsString()
19
28
  @IsNotEmpty()
@@ -0,0 +1,31 @@
1
+ import { PaginatedResult } from '../../../retailOrg/dtos/PaginatedResult';
2
+ import { SciEvaluationResponse } from './SciEvaluationResponse';
3
+
4
+ /**
5
+ * Fila lista para pintar del listado de evaluaciones del tenant: la evaluación más el contexto
6
+ * del cliente ya resuelto por el motor. El front no cruza nada.
7
+ */
8
+ export interface SciEvaluationListItem {
9
+ evaluation: SciEvaluationResponse;
10
+ /** Cliente retail dueño del acreditado. `null` en las evaluaciones anteriores al campo. */
11
+ retailCustomerId: string | null;
12
+ /** `null` cuando el nombre no se pudo resolver; el front pinta el id, nunca un vacío. */
13
+ customerName: string | null;
14
+ /**
15
+ * `null` mientras el lote del padrón no devuelva teléfono: hoy solo proyecta el nombre.
16
+ * Viaja igual para que el contrato de la fila no cambie cuando lo devuelva.
17
+ */
18
+ customerPhone: string | null;
19
+ }
20
+
21
+ /**
22
+ * Página del listado de evaluaciones del tenant, ordenada de la más nueva a la más vieja.
23
+ * Usa el sobre paginado canónico (`items` + `count` + `nextToken` ausente en la última página).
24
+ */
25
+ export interface ListSciEvaluationsResponse extends PaginatedResult<SciEvaluationListItem> {
26
+ /**
27
+ * Filas con `retailCustomerId` cuyo nombre no se resolvió — porque el padrón no lo tiene o
28
+ * porque no contestó. La pantalla lo anuncia en vez de dejar huecos sin explicación.
29
+ */
30
+ unresolvedCustomerCount: number;
31
+ }
@@ -16,3 +16,4 @@ export * from './dtos/requests/SciInternalHistoryInput';
16
16
  // Response DTOs
17
17
  export * from './dtos/responses/EvaluateSciResponse';
18
18
  export * from './dtos/responses/SciEvaluationResponse';
19
+ export * from './dtos/responses/ListSciEvaluationsResponse';