@fiado/api-invoker 5.47.0 → 5.49.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.
@@ -1,7 +1,7 @@
1
1
  import type { IHttpRequest } from "@fiado/http-client";
2
2
  import { StandardResponse } from "@fiado/gateway-adapter";
3
- import { DeviceAutoLockScheduleRequest, DeviceAutoLockScheduleResponse, DeviceEnrollInitiateResponse, DeviceEnrollRequest, DeviceEnrollStatusRequest, DeviceEnrollStatusResponse, DeviceLastSeenRequest, DeviceLastSeenResponse, DeviceLockRequest, DeviceLockResponse, DeviceStatusRequest, DeviceStatusResponse, DeviceUnlockRequest, DeviceUnlockResponse } from "@fiado/type-kit/bin/mdm/index.js";
4
- import { DeviceBatchRequest, DeviceBatchResult, IDatacultrConnectorApi } from "./interfaces/IDatacultrConnectorApi.js";
3
+ import { DeviceAutoLockScheduleRequest, DeviceAutoLockScheduleResponse, DeviceEnrollInitiateResponse, DeviceEnrollRequest, DeviceEnrollStatusRequest, DeviceEnrollStatusResponse, DeviceLastSeenRequest, DeviceLastSeenResponse, DeviceLockRequest, DeviceLockResponse, DeviceNotifyRequest, DeviceNotifyResponse, DevicePinUnlockRequest, DevicePinUnlockResponse, DeviceReleaseInitiateResponse, DeviceReleaseRequest, DeviceReleaseStatusRequest, DeviceReleaseStatusResponse, DeviceStatusRequest, DeviceStatusResponse, DeviceUnlockRequest, DeviceUnlockResponse } from "@fiado/type-kit/bin/mdm/index.js";
4
+ import { DeviceBatchRequest, DeviceBatchResult, DeviceSingleResult, IDatacultrConnectorApi } from "./interfaces/IDatacultrConnectorApi.js";
5
5
  /**
6
6
  * Publisher HTTP del lambda `datacultr-connector` (provider MDM de SureKeep). Contrato y semántica
7
7
  * completos → `IDatacultrConnectorApi` (paths sin prefijo `/private`, sin tenant, `StandardResponse`
@@ -25,4 +25,8 @@ export default class DatacultrConnectorApi implements IDatacultrConnectorApi {
25
25
  lockDevices(input: DeviceBatchRequest<DeviceLockRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceLockResponse>>>;
26
26
  unlockDevices(input: DeviceBatchRequest<DeviceUnlockRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceUnlockResponse>>>;
27
27
  autoLockSchedule(input: DeviceBatchRequest<DeviceAutoLockScheduleRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceAutoLockScheduleResponse>>>;
28
+ pinUnlock(input: DevicePinUnlockRequest): Promise<StandardResponse<DeviceSingleResult<DevicePinUnlockResponse>>>;
29
+ notifyDevices(input: DeviceBatchRequest<DeviceNotifyRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceNotifyResponse>>>;
30
+ releaseDevices(input: DeviceBatchRequest<DeviceReleaseRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceReleaseInitiateResponse>>>;
31
+ releaseStatus(input: DeviceBatchRequest<DeviceReleaseStatusRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceReleaseStatusResponse>>>;
28
32
  }
@@ -51,6 +51,18 @@ let DatacultrConnectorApi = class DatacultrConnectorApi {
51
51
  async autoLockSchedule(input) {
52
52
  return await this.httpRequest.post(`${this.baseUrl}/devices/auto-lock-schedule`, input);
53
53
  }
54
+ async pinUnlock(input) {
55
+ return await this.httpRequest.post(`${this.baseUrl}/devices/pin-unlock`, input);
56
+ }
57
+ async notifyDevices(input) {
58
+ return await this.httpRequest.post(`${this.baseUrl}/devices/notify`, input);
59
+ }
60
+ async releaseDevices(input) {
61
+ return await this.httpRequest.post(`${this.baseUrl}/devices/release`, input);
62
+ }
63
+ async releaseStatus(input) {
64
+ return await this.httpRequest.post(`${this.baseUrl}/devices/release/status`, input);
65
+ }
54
66
  };
55
67
  DatacultrConnectorApi = __decorate([
56
68
  injectable(),
@@ -1,5 +1,5 @@
1
1
  import { StandardResponse } from "@fiado/gateway-adapter";
2
- import { DeviceAutoLockScheduleRequest, DeviceAutoLockScheduleResponse, DeviceEnrollInitiateResponse, DeviceEnrollRequest, DeviceEnrollStatusRequest, DeviceEnrollStatusResponse, DeviceLastSeenRequest, DeviceLastSeenResponse, DeviceLockRequest, DeviceLockResponse, DeviceStatusRequest, DeviceStatusResponse, DeviceUnlockRequest, DeviceUnlockResponse } from "@fiado/type-kit/bin/mdm/index.js";
2
+ import { DeviceAutoLockScheduleRequest, DeviceAutoLockScheduleResponse, DeviceEnrollInitiateResponse, DeviceEnrollRequest, DeviceEnrollStatusRequest, DeviceEnrollStatusResponse, DeviceLastSeenRequest, DeviceLastSeenResponse, DeviceLockRequest, DeviceLockResponse, DeviceNotifyRequest, DeviceNotifyResponse, DevicePinUnlockRequest, DevicePinUnlockResponse, DeviceReleaseInitiateResponse, DeviceReleaseRequest, DeviceReleaseStatusRequest, DeviceReleaseStatusResponse, DeviceStatusRequest, DeviceStatusResponse, DeviceUnlockRequest, DeviceUnlockResponse } from "@fiado/type-kit/bin/mdm/index.js";
3
3
  /**
4
4
  * Contrato del publisher HTTP del lambda `datacultr-connector` — el provider MDM que traduce el
5
5
  * contrato agnóstico de dispositivo (`@fiado/type-kit/bin/mdm`) a la API de Datacultr. Su consumidor
@@ -58,6 +58,10 @@ export interface DeviceBatchRequest<TItem> {
58
58
  export interface DeviceBatchResult<TItem> {
59
59
  results: TItem[];
60
60
  }
61
+ /** Sobre de salida de los endpoints de UN solo IMEI. Hoy solo `pinUnlock` no es batch. */
62
+ export interface DeviceSingleResult<TItem> {
63
+ result: TItem;
64
+ }
61
65
  export interface IDatacultrConnectorApi {
62
66
  /**
63
67
  * POST `/devices/enroll` — pre-registra la expectativa de enrolamiento de cada IMEI.
@@ -102,4 +106,30 @@ export interface IDatacultrConnectorApi {
102
106
  * Es la vía real del bloqueo en Datacultr: el inmediato no surte efecto, el programado sí.
103
107
  */
104
108
  autoLockSchedule(input: DeviceBatchRequest<DeviceAutoLockScheduleRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceAutoLockScheduleResponse>>>;
109
+ /**
110
+ * POST `/devices/pin-unlock` — pide a Datacultr el passcode de desbloqueo del equipo.
111
+ *
112
+ * ⚠️ NO ES BATCH, a diferencia del resto del contrato: recibe UN `DevicePinUnlockRequest` y
113
+ * devuelve `{ result }`, no `{ results }`. El destino lo declara así en su `PrivateController`.
114
+ *
115
+ * Es el camino del "desbloqueo especial" del backoffice: el operador le dicta el PIN al cliente
116
+ * que se quedó sin señal. `pin`, `validitySeconds` y `generatedAt` solo vienen con `status`
117
+ * `SUCCESS`; si el proveedor no devolvió passcode, el ítem llega en `ERROR` con su `error.code`.
118
+ */
119
+ pinUnlock(input: DevicePinUnlockRequest): Promise<StandardResponse<DeviceSingleResult<DevicePinUnlockResponse>>>;
120
+ /**
121
+ * POST `/devices/notify` — manda una notificación al equipo de cada IMEI.
122
+ *
123
+ * ⚠️ `notificationCode` es OBLIGATORIO y sale del catálogo de mensajes predefinidos de Datacultr,
124
+ * que hoy NO tenemos. Sin ese catálogo el caller no puede armar un request válido: pedirlo antes
125
+ * de construir encima.
126
+ */
127
+ notifyDevices(input: DeviceBatchRequest<DeviceNotifyRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceNotifyResponse>>>;
128
+ /**
129
+ * POST `/devices/release` — libera definitivamente cada IMEI del MDM (crédito liquidado o
130
+ * cancelado). Es asíncrono: el ítem suele volver en `PENDING` y se confirma con `releaseStatus`.
131
+ */
132
+ releaseDevices(input: DeviceBatchRequest<DeviceReleaseRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceReleaseInitiateResponse>>>;
133
+ /** POST `/devices/release/status` — consulta en qué punto va la liberación de cada IMEI. */
134
+ releaseStatus(input: DeviceBatchRequest<DeviceReleaseStatusRequest>): Promise<StandardResponse<DeviceBatchResult<DeviceReleaseStatusResponse>>>;
105
135
  }
@@ -1,10 +1,10 @@
1
1
  import type { IHttpRequest } from "@fiado/http-client";
2
2
  import { StandardResponse } from "@fiado/gateway-adapter";
3
- import { CreditPlanResponse, FinancierResponse, SimulateCreditPlanRequest, SimulationResultResponse } from "@fiado/type-kit/bin/loanOfferings/index.js";
3
+ import { ConsumePromotionRequest, ConsumePromotionResponse, CreditPlanResponse, FinancierResponse, SimulateCreditPlanRequest, SimulationResultResponse } from "@fiado/type-kit/bin/loanOfferings/index.js";
4
4
  import { ILoanOfferingsBusinessApi } from "./interfaces/ILoanOfferingsBusinessApi.js";
5
5
  /**
6
- * Publisher HTTP del lambda `loan-offerings-business` (componente 07 SureKeep Fase 1) para sus 4
7
- * endpoints privados de lectura del catálogo. Contrato y semántica completos →
6
+ * Publisher HTTP del lambda `loan-offerings-business` (componente 07 SureKeep Fase 1) para sus 5
7
+ * endpoints privados. Contrato y semántica completos →
8
8
  * `ILoanOfferingsBusinessApi` (tenantId obligatorio, `StandardResponse` → leer `result.data`).
9
9
  *
10
10
  * Env var requerida en el consumer: `LOAN_OFFERINGS_BUSINESS_URL`.
@@ -22,4 +22,5 @@ export default class LoanOfferingsBusinessApi implements ILoanOfferingsBusinessA
22
22
  listActivePlansForRetailer(retailerId: string, tenantId: string): Promise<StandardResponse<CreditPlanResponse[]>>;
23
23
  listActiveFinanciers(tenantId: string): Promise<StandardResponse<FinancierResponse[]>>;
24
24
  simulate(planId: string, input: SimulateCreditPlanRequest, tenantId: string): Promise<StandardResponse<SimulationResultResponse>>;
25
+ consumePromotion(promotionId: string, input: ConsumePromotionRequest, tenantId: string): Promise<StandardResponse<ConsumePromotionResponse>>;
25
26
  }
@@ -12,8 +12,8 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  import { inject, injectable } from "inversify";
14
14
  /**
15
- * Publisher HTTP del lambda `loan-offerings-business` (componente 07 SureKeep Fase 1) para sus 4
16
- * endpoints privados de lectura del catálogo. Contrato y semántica completos →
15
+ * Publisher HTTP del lambda `loan-offerings-business` (componente 07 SureKeep Fase 1) para sus 5
16
+ * endpoints privados. Contrato y semántica completos →
17
17
  * `ILoanOfferingsBusinessApi` (tenantId obligatorio, `StandardResponse` → leer `result.data`).
18
18
  *
19
19
  * Env var requerida en el consumer: `LOAN_OFFERINGS_BUSINESS_URL`.
@@ -46,6 +46,10 @@ let LoanOfferingsBusinessApi = class LoanOfferingsBusinessApi {
46
46
  const url = `${this.baseUrl}/private/credit-plans/${encodeURIComponent(planId)}/simulate?tenantId=${encodeURIComponent(tenantId)}`;
47
47
  return await this.httpRequest.post(url, input);
48
48
  }
49
+ async consumePromotion(promotionId, input, tenantId) {
50
+ const url = `${this.baseUrl}/private/promotions/${encodeURIComponent(promotionId)}/consume?tenantId=${encodeURIComponent(tenantId)}`;
51
+ return await this.httpRequest.post(url, input);
52
+ }
49
53
  };
50
54
  LoanOfferingsBusinessApi = __decorate([
51
55
  injectable(),
@@ -1,8 +1,9 @@
1
1
  import { StandardResponse } from "@fiado/gateway-adapter";
2
- import { CreditPlanResponse, FinancierResponse, SimulateCreditPlanRequest, SimulationResultResponse } from "@fiado/type-kit/bin/loanOfferings/index.js";
2
+ import { ConsumePromotionRequest, ConsumePromotionResponse, CreditPlanResponse, FinancierResponse, SimulateCreditPlanRequest, SimulationResultResponse } from "@fiado/type-kit/bin/loanOfferings/index.js";
3
3
  /**
4
4
  * Contrato del publisher HTTP del lambda `loan-offerings-business` (componente 07 SureKeep Fase 1)
5
- * para sus 4 endpoints privados de LECTURA del catálogo SOFOM (service-to-service, VPC-only).
5
+ * para sus 5 endpoints privados service-to-service (VPC-only): 4 de LECTURA del catálogo SOFOM y
6
+ * 1 de ESCRITURA que registra el consumo de una promoción.
6
7
  *
7
8
  * loan-offerings es el catálogo comercial del SOFOM: planes de crédito + financieras + la relación
8
9
  * M:N retailer↔plan + el simulador de cuota. Consumidores previstos:
@@ -62,4 +63,15 @@ export interface ILoanOfferingsBusinessApi {
62
63
  * (`400 INVALID_PLAN_PARAMETERS`, ej. plazo fuera de `termWeeksOptions`).
63
64
  */
64
65
  simulate(planId: string, input: SimulateCreditPlanRequest, tenantId: string): Promise<StandardResponse<SimulationResultResponse>>;
66
+ /**
67
+ * POST /private/promotions/{promotionId}/consume — cuenta un crédito activado bajo esta
68
+ * promoción y suma su bono PCF al presupuesto. Al alcanzar el tope la promoción queda `PAUSED`.
69
+ *
70
+ * Idempotente por `creditId`: reenviar el mismo crédito devuelve 200 con
71
+ * `alreadyCounted: true` y NO mueve los contadores. Se llama al ACTIVAR, nunca al cotizar —
72
+ * una promoción que se cotiza y no se vende no consume nada.
73
+ *
74
+ * @throws si la promoción no existe (`404 PROMOTION_NOT_FOUND`).
75
+ */
76
+ consumePromotion(promotionId: string, input: ConsumePromotionRequest, tenantId: string): Promise<StandardResponse<ConsumePromotionResponse>>;
65
77
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/api-invoker",
3
- "version": "5.47.0",
3
+ "version": "5.49.0",
4
4
  "description": "Sirve como un puente entre diferentes funciones lambda, facilitando la comunicación entre ellas a través de invocaciones http",
5
5
  "type": "module",
6
6
  "main": "bin/index.js",
@@ -34,7 +34,7 @@
34
34
  "@fiado/gateway-adapter": "^3.9.0",
35
35
  "@fiado/http-client": "^2.0.1",
36
36
  "@fiado/logger": "^1.1.3",
37
- "@fiado/type-kit": "^3.368.0",
37
+ "@fiado/type-kit": "^3.370.0",
38
38
  "dotenv": "^16.4.7"
39
39
  },
40
40
  "peerDependencies": {
@@ -12,6 +12,14 @@ import {
12
12
  DeviceLastSeenResponse,
13
13
  DeviceLockRequest,
14
14
  DeviceLockResponse,
15
+ DeviceNotifyRequest,
16
+ DeviceNotifyResponse,
17
+ DevicePinUnlockRequest,
18
+ DevicePinUnlockResponse,
19
+ DeviceReleaseInitiateResponse,
20
+ DeviceReleaseRequest,
21
+ DeviceReleaseStatusRequest,
22
+ DeviceReleaseStatusResponse,
15
23
  DeviceStatusRequest,
16
24
  DeviceStatusResponse,
17
25
  DeviceUnlockRequest,
@@ -20,6 +28,7 @@ import {
20
28
  import {
21
29
  DeviceBatchRequest,
22
30
  DeviceBatchResult,
31
+ DeviceSingleResult,
23
32
  IDatacultrConnectorApi,
24
33
  } from "./interfaces/IDatacultrConnectorApi.js";
25
34
 
@@ -83,4 +92,28 @@ export default class DatacultrConnectorApi implements IDatacultrConnectorApi {
83
92
  ): Promise<StandardResponse<DeviceBatchResult<DeviceAutoLockScheduleResponse>>> {
84
93
  return await this.httpRequest.post(`${this.baseUrl}/devices/auto-lock-schedule`, input);
85
94
  }
95
+
96
+ async pinUnlock(
97
+ input: DevicePinUnlockRequest,
98
+ ): Promise<StandardResponse<DeviceSingleResult<DevicePinUnlockResponse>>> {
99
+ return await this.httpRequest.post(`${this.baseUrl}/devices/pin-unlock`, input);
100
+ }
101
+
102
+ async notifyDevices(
103
+ input: DeviceBatchRequest<DeviceNotifyRequest>,
104
+ ): Promise<StandardResponse<DeviceBatchResult<DeviceNotifyResponse>>> {
105
+ return await this.httpRequest.post(`${this.baseUrl}/devices/notify`, input);
106
+ }
107
+
108
+ async releaseDevices(
109
+ input: DeviceBatchRequest<DeviceReleaseRequest>,
110
+ ): Promise<StandardResponse<DeviceBatchResult<DeviceReleaseInitiateResponse>>> {
111
+ return await this.httpRequest.post(`${this.baseUrl}/devices/release`, input);
112
+ }
113
+
114
+ async releaseStatus(
115
+ input: DeviceBatchRequest<DeviceReleaseStatusRequest>,
116
+ ): Promise<StandardResponse<DeviceBatchResult<DeviceReleaseStatusResponse>>> {
117
+ return await this.httpRequest.post(`${this.baseUrl}/devices/release/status`, input);
118
+ }
86
119
  }
@@ -10,6 +10,14 @@ import {
10
10
  DeviceLastSeenResponse,
11
11
  DeviceLockRequest,
12
12
  DeviceLockResponse,
13
+ DeviceNotifyRequest,
14
+ DeviceNotifyResponse,
15
+ DevicePinUnlockRequest,
16
+ DevicePinUnlockResponse,
17
+ DeviceReleaseInitiateResponse,
18
+ DeviceReleaseRequest,
19
+ DeviceReleaseStatusRequest,
20
+ DeviceReleaseStatusResponse,
13
21
  DeviceStatusRequest,
14
22
  DeviceStatusResponse,
15
23
  DeviceUnlockRequest,
@@ -77,6 +85,11 @@ export interface DeviceBatchResult<TItem> {
77
85
  results: TItem[];
78
86
  }
79
87
 
88
+ /** Sobre de salida de los endpoints de UN solo IMEI. Hoy solo `pinUnlock` no es batch. */
89
+ export interface DeviceSingleResult<TItem> {
90
+ result: TItem;
91
+ }
92
+
80
93
  export interface IDatacultrConnectorApi {
81
94
  /**
82
95
  * POST `/devices/enroll` — pre-registra la expectativa de enrolamiento de cada IMEI.
@@ -141,4 +154,42 @@ export interface IDatacultrConnectorApi {
141
154
  autoLockSchedule(
142
155
  input: DeviceBatchRequest<DeviceAutoLockScheduleRequest>,
143
156
  ): Promise<StandardResponse<DeviceBatchResult<DeviceAutoLockScheduleResponse>>>;
157
+
158
+ /**
159
+ * POST `/devices/pin-unlock` — pide a Datacultr el passcode de desbloqueo del equipo.
160
+ *
161
+ * ⚠️ NO ES BATCH, a diferencia del resto del contrato: recibe UN `DevicePinUnlockRequest` y
162
+ * devuelve `{ result }`, no `{ results }`. El destino lo declara así en su `PrivateController`.
163
+ *
164
+ * Es el camino del "desbloqueo especial" del backoffice: el operador le dicta el PIN al cliente
165
+ * que se quedó sin señal. `pin`, `validitySeconds` y `generatedAt` solo vienen con `status`
166
+ * `SUCCESS`; si el proveedor no devolvió passcode, el ítem llega en `ERROR` con su `error.code`.
167
+ */
168
+ pinUnlock(
169
+ input: DevicePinUnlockRequest,
170
+ ): Promise<StandardResponse<DeviceSingleResult<DevicePinUnlockResponse>>>;
171
+
172
+ /**
173
+ * POST `/devices/notify` — manda una notificación al equipo de cada IMEI.
174
+ *
175
+ * ⚠️ `notificationCode` es OBLIGATORIO y sale del catálogo de mensajes predefinidos de Datacultr,
176
+ * que hoy NO tenemos. Sin ese catálogo el caller no puede armar un request válido: pedirlo antes
177
+ * de construir encima.
178
+ */
179
+ notifyDevices(
180
+ input: DeviceBatchRequest<DeviceNotifyRequest>,
181
+ ): Promise<StandardResponse<DeviceBatchResult<DeviceNotifyResponse>>>;
182
+
183
+ /**
184
+ * POST `/devices/release` — libera definitivamente cada IMEI del MDM (crédito liquidado o
185
+ * cancelado). Es asíncrono: el ítem suele volver en `PENDING` y se confirma con `releaseStatus`.
186
+ */
187
+ releaseDevices(
188
+ input: DeviceBatchRequest<DeviceReleaseRequest>,
189
+ ): Promise<StandardResponse<DeviceBatchResult<DeviceReleaseInitiateResponse>>>;
190
+
191
+ /** POST `/devices/release/status` — consulta en qué punto va la liberación de cada IMEI. */
192
+ releaseStatus(
193
+ input: DeviceBatchRequest<DeviceReleaseStatusRequest>,
194
+ ): Promise<StandardResponse<DeviceBatchResult<DeviceReleaseStatusResponse>>>;
144
195
  }
@@ -2,6 +2,8 @@ import { inject, injectable } from "inversify";
2
2
  import type { IHttpRequest } from "@fiado/http-client";
3
3
  import { StandardResponse } from "@fiado/gateway-adapter";
4
4
  import {
5
+ ConsumePromotionRequest,
6
+ ConsumePromotionResponse,
5
7
  CreditPlanResponse,
6
8
  FinancierResponse,
7
9
  SimulateCreditPlanRequest,
@@ -10,8 +12,8 @@ import {
10
12
  import { ILoanOfferingsBusinessApi } from "./interfaces/ILoanOfferingsBusinessApi.js";
11
13
 
12
14
  /**
13
- * Publisher HTTP del lambda `loan-offerings-business` (componente 07 SureKeep Fase 1) para sus 4
14
- * endpoints privados de lectura del catálogo. Contrato y semántica completos →
15
+ * Publisher HTTP del lambda `loan-offerings-business` (componente 07 SureKeep Fase 1) para sus 5
16
+ * endpoints privados. Contrato y semántica completos →
15
17
  * `ILoanOfferingsBusinessApi` (tenantId obligatorio, `StandardResponse` → leer `result.data`).
16
18
  *
17
19
  * Env var requerida en el consumer: `LOAN_OFFERINGS_BUSINESS_URL`.
@@ -59,4 +61,13 @@ export default class LoanOfferingsBusinessApi implements ILoanOfferingsBusinessA
59
61
  const url = `${this.baseUrl}/private/credit-plans/${encodeURIComponent(planId)}/simulate?tenantId=${encodeURIComponent(tenantId)}`;
60
62
  return await this.httpRequest.post(url, input);
61
63
  }
64
+
65
+ async consumePromotion(
66
+ promotionId: string,
67
+ input: ConsumePromotionRequest,
68
+ tenantId: string,
69
+ ): Promise<StandardResponse<ConsumePromotionResponse>> {
70
+ const url = `${this.baseUrl}/private/promotions/${encodeURIComponent(promotionId)}/consume?tenantId=${encodeURIComponent(tenantId)}`;
71
+ return await this.httpRequest.post(url, input);
72
+ }
62
73
  }
@@ -1,5 +1,7 @@
1
1
  import { StandardResponse } from "@fiado/gateway-adapter";
2
2
  import {
3
+ ConsumePromotionRequest,
4
+ ConsumePromotionResponse,
3
5
  CreditPlanResponse,
4
6
  FinancierResponse,
5
7
  SimulateCreditPlanRequest,
@@ -8,7 +10,8 @@ import {
8
10
 
9
11
  /**
10
12
  * Contrato del publisher HTTP del lambda `loan-offerings-business` (componente 07 SureKeep Fase 1)
11
- * para sus 4 endpoints privados de LECTURA del catálogo SOFOM (service-to-service, VPC-only).
13
+ * para sus 5 endpoints privados service-to-service (VPC-only): 4 de LECTURA del catálogo SOFOM y
14
+ * 1 de ESCRITURA que registra el consumo de una promoción.
12
15
  *
13
16
  * loan-offerings es el catálogo comercial del SOFOM: planes de crédito + financieras + la relación
14
17
  * M:N retailer↔plan + el simulador de cuota. Consumidores previstos:
@@ -83,4 +86,20 @@ export interface ILoanOfferingsBusinessApi {
83
86
  input: SimulateCreditPlanRequest,
84
87
  tenantId: string,
85
88
  ): Promise<StandardResponse<SimulationResultResponse>>;
89
+
90
+ /**
91
+ * POST /private/promotions/{promotionId}/consume — cuenta un crédito activado bajo esta
92
+ * promoción y suma su bono PCF al presupuesto. Al alcanzar el tope la promoción queda `PAUSED`.
93
+ *
94
+ * Idempotente por `creditId`: reenviar el mismo crédito devuelve 200 con
95
+ * `alreadyCounted: true` y NO mueve los contadores. Se llama al ACTIVAR, nunca al cotizar —
96
+ * una promoción que se cotiza y no se vende no consume nada.
97
+ *
98
+ * @throws si la promoción no existe (`404 PROMOTION_NOT_FOUND`).
99
+ */
100
+ consumePromotion(
101
+ promotionId: string,
102
+ input: ConsumePromotionRequest,
103
+ tenantId: string,
104
+ ): Promise<StandardResponse<ConsumePromotionResponse>>;
86
105
  }