@fiado/type-kit 3.266.0 → 3.268.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.
@@ -2,4 +2,10 @@ export interface DeviceVariantImageUploadUrlResponseDto {
2
2
  uploadUrl: string;
3
3
  imageUrl: string;
4
4
  expiresIn: number;
5
+ /**
6
+ * Tamaño máximo permitido para la imagen, en bytes. Fuente de verdad del límite de producto
7
+ * (hoy 5MB, ver MAX_IMAGE_SIZE_BYTES en DeviceVariantImageService del lambda fiado-phone-sales) —
8
+ * antes solo vivía hardcodeado en el front.
9
+ */
10
+ maxSizeBytes: number;
5
11
  }
@@ -8,4 +8,12 @@ export declare class SaleResponseDto {
8
8
  trackingCode: string | null;
9
9
  providerStatus: string | null;
10
10
  status: string;
11
+ /**
12
+ * Modelo de la variante (resuelto server-side por `variantId`, incluyendo variantes con
13
+ * stock=0). `null` si la resolución falló (variante borrada o error de infraestructura) — ver
14
+ * GET /sales (backoffice) en cell-phone-sales-business.
15
+ */
16
+ variantModel: string | null;
17
+ /** Color de la variante — mismo criterio de resolución/degradación que `variantModel`. */
18
+ variantColor: string | null;
11
19
  }
@@ -0,0 +1,6 @@
1
+ export declare class UpdateDeviceVariantRequestDto {
2
+ model?: string;
3
+ color?: string;
4
+ storage?: string;
5
+ price?: number;
6
+ }
@@ -0,0 +1,37 @@
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.UpdateDeviceVariantRequestDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ class UpdateDeviceVariantRequestDto {
15
+ }
16
+ exports.UpdateDeviceVariantRequestDto = UpdateDeviceVariantRequestDto;
17
+ __decorate([
18
+ (0, class_validator_1.IsOptional)(),
19
+ (0, class_validator_1.IsString)(),
20
+ __metadata("design:type", String)
21
+ ], UpdateDeviceVariantRequestDto.prototype, "model", void 0);
22
+ __decorate([
23
+ (0, class_validator_1.IsOptional)(),
24
+ (0, class_validator_1.IsString)(),
25
+ __metadata("design:type", String)
26
+ ], UpdateDeviceVariantRequestDto.prototype, "color", void 0);
27
+ __decorate([
28
+ (0, class_validator_1.IsOptional)(),
29
+ (0, class_validator_1.IsString)(),
30
+ __metadata("design:type", String)
31
+ ], UpdateDeviceVariantRequestDto.prototype, "storage", void 0);
32
+ __decorate([
33
+ (0, class_validator_1.IsOptional)(),
34
+ (0, class_validator_1.IsNumber)(),
35
+ (0, class_validator_1.Min)(0),
36
+ __metadata("design:type", Number)
37
+ ], UpdateDeviceVariantRequestDto.prototype, "price", void 0);
@@ -1,5 +1,6 @@
1
1
  export * from './DeviceVariantResponseDto';
2
2
  export * from './CreateDeviceVariantRequestDto';
3
+ export * from './UpdateDeviceVariantRequestDto';
3
4
  export * from './CreateSaleRequestDto';
4
5
  export * from './SaleResponseDto';
5
6
  export * from './RedeemSaleCodeRequestDto';
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./DeviceVariantResponseDto"), exports);
18
18
  __exportStar(require("./CreateDeviceVariantRequestDto"), exports);
19
+ __exportStar(require("./UpdateDeviceVariantRequestDto"), exports);
19
20
  __exportStar(require("./CreateSaleRequestDto"), exports);
20
21
  __exportStar(require("./SaleResponseDto"), exports);
21
22
  __exportStar(require("./RedeemSaleCodeRequestDto"), exports);
@@ -0,0 +1,25 @@
1
+ import type { SalesReportRun } from '../SalesReportRun';
2
+ /**
3
+ * POST /backoffice/reports/{reportId}/run — el reporte generado, SÍNCRONO.
4
+ * SureKeep Fase 3 — pista Retail.
5
+ *
6
+ * El archivo viaja **en la respuesta**, no por una URL de descarga: el más grande del catálogo son
7
+ * ~96 KB, muy por debajo del límite de 6 MB de payload de Lambda. Eso evita bucket, URL prefirmada y
8
+ * endpoint de descarga para algo que se arma en milisegundos.
9
+ *
10
+ * ⚠️ El contenido puede traer **PII** (nombre del cliente en el reporte por período). Su lectura queda
11
+ * registrada en `PiiAccessLog` igual que las demás pantallas del BO. **Nunca loguear `content`.**
12
+ *
13
+ * Si algún reporte creciera hasta no entrar en la respuesta, el camino es S3 + `downloadUrl` (que ya
14
+ * está en `SalesReportRun`) + estado `QUEUED`: el contrato NO hay que romperlo, ya lo contempla.
15
+ */
16
+ export interface RunSalesReportResponse {
17
+ /** La corrida registrada en el log, con su estado final y el conteo de filas. */
18
+ run: SalesReportRun;
19
+ /** Nombre sugerido del archivo, ej. `RVL-01_2026-08-03.csv`. */
20
+ filename: string;
21
+ /** Tipo MIME, ej. `text/csv`. */
22
+ contentType: string;
23
+ /** El archivo completo. El front lo baja con un `Blob`. */
24
+ content: string;
25
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,14 +1,21 @@
1
1
  /**
2
- * Estado de una corrida de reporte. La generación es ASÍNCRONA: el `POST .../run` devuelve `QUEUED` y
3
- * el front poletea el listado. SureKeep Fase 3 — pista Retail.
2
+ * Estado de una corrida de reporte. SureKeep Fase 3 pista Retail.
4
3
  *
5
- * Es async desde el día uno por el límite de 29 s de API Gateway: un reporte de red completa no entra
6
- * en una respuesta síncrona. Mismo error que ya se corrigió en el cierre de corte de comisiones.
4
+ * El ciclo real es **`RUNNING READY | FAILED`, todo dentro de la MISMA llamada**: la generación es
5
+ * SÍNCRONA. Es el mismo patrón del reporte SIC de `credit-worker-business`, que abre la fila en
6
+ * `RUNNING` antes de procesar (`createMetadata`) y la cierra al terminar (`finalizeMetadata`).
7
7
  *
8
- * QUEUED - Encolada, sin arrancar.
9
- * RUNNING - Generándose.
10
- * READY - Lista para descargar (`downloadUrl` presente).
8
+ * Es síncrono porque los volúmenes lo permiten: el reporte más grande del catálogo son **320 filas
9
+ * (~96 KB)** — el propio mockup lo declara. Encolarlo sería infraestructura (worker + cola + bucket)
10
+ * para un archivo que se arma en milisegundos.
11
+ *
12
+ * RUNNING - Generándose. La fila se escribe ANTES de procesar, para que una corrida que muera a
13
+ * mitad deje rastro en vez de desaparecer.
14
+ * READY - Terminó bien. `rowCount` trae las filas generadas.
11
15
  * FAILED - Falló; `failureReason` explica por qué.
16
+ * QUEUED - **RESERVADO, hoy no se emite.** Existe para poder volver a asíncrono si algún reporte
17
+ * crece de verdad, **sin romper el contrato del front**: la pantalla ya sabe que un estado
18
+ * intermedio es posible. Sacarlo del enum ahora obligaría a versionar el DTO después.
12
19
  */
13
20
  export declare enum ReportRunStatusEnum {
14
21
  QUEUED = "QUEUED",
@@ -2,16 +2,23 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ReportRunStatusEnum = void 0;
4
4
  /**
5
- * Estado de una corrida de reporte. La generación es ASÍNCRONA: el `POST .../run` devuelve `QUEUED` y
6
- * el front poletea el listado. SureKeep Fase 3 — pista Retail.
5
+ * Estado de una corrida de reporte. SureKeep Fase 3 pista Retail.
7
6
  *
8
- * Es async desde el día uno por el límite de 29 s de API Gateway: un reporte de red completa no entra
9
- * en una respuesta síncrona. Mismo error que ya se corrigió en el cierre de corte de comisiones.
7
+ * El ciclo real es **`RUNNING READY | FAILED`, todo dentro de la MISMA llamada**: la generación es
8
+ * SÍNCRONA. Es el mismo patrón del reporte SIC de `credit-worker-business`, que abre la fila en
9
+ * `RUNNING` antes de procesar (`createMetadata`) y la cierra al terminar (`finalizeMetadata`).
10
10
  *
11
- * QUEUED - Encolada, sin arrancar.
12
- * RUNNING - Generándose.
13
- * READY - Lista para descargar (`downloadUrl` presente).
11
+ * Es síncrono porque los volúmenes lo permiten: el reporte más grande del catálogo son **320 filas
12
+ * (~96 KB)** — el propio mockup lo declara. Encolarlo sería infraestructura (worker + cola + bucket)
13
+ * para un archivo que se arma en milisegundos.
14
+ *
15
+ * RUNNING - Generándose. La fila se escribe ANTES de procesar, para que una corrida que muera a
16
+ * mitad deje rastro en vez de desaparecer.
17
+ * READY - Terminó bien. `rowCount` trae las filas generadas.
14
18
  * FAILED - Falló; `failureReason` explica por qué.
19
+ * QUEUED - **RESERVADO, hoy no se emite.** Existe para poder volver a asíncrono si algún reporte
20
+ * crece de verdad, **sin romper el contrato del front**: la pantalla ya sabe que un estado
21
+ * intermedio es posible. Sacarlo del enum ahora obligaría a versionar el DTO después.
15
22
  */
16
23
  var ReportRunStatusEnum;
17
24
  (function (ReportRunStatusEnum) {
@@ -90,6 +90,7 @@ export * from './dtos/requests/BackofficeCancelSaleRequest';
90
90
  export * from './dtos/responses/BackofficeSalesStatsResponse';
91
91
  export * from './dtos/responses/BackofficeSalesKpisResponse';
92
92
  export * from './dtos/responses/BackofficeReportsResponse';
93
+ export * from './dtos/responses/RunSalesReportResponse';
93
94
  export * from './dtos/RetailCustomerListItem';
94
95
  export * from './dtos/responses/BackofficeCustomersResponse';
95
96
  export * from './dtos/responses/BackofficeCustomerPurchasesResponse';
@@ -118,6 +118,7 @@ __exportStar(require("./dtos/requests/BackofficeCancelSaleRequest"), exports);
118
118
  __exportStar(require("./dtos/responses/BackofficeSalesStatsResponse"), exports);
119
119
  __exportStar(require("./dtos/responses/BackofficeSalesKpisResponse"), exports);
120
120
  __exportStar(require("./dtos/responses/BackofficeReportsResponse"), exports);
121
+ __exportStar(require("./dtos/responses/RunSalesReportResponse"), exports);
121
122
  // A1-A4 · agregados del portal (D17)
122
123
  __exportStar(require("./dtos/RetailCustomerListItem"), exports);
123
124
  __exportStar(require("./dtos/responses/BackofficeCustomersResponse"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.266.0",
3
+ "version": "3.268.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -2,4 +2,10 @@ export interface DeviceVariantImageUploadUrlResponseDto {
2
2
  uploadUrl: string;
3
3
  imageUrl: string;
4
4
  expiresIn: number;
5
+ /**
6
+ * Tamaño máximo permitido para la imagen, en bytes. Fuente de verdad del límite de producto
7
+ * (hoy 5MB, ver MAX_IMAGE_SIZE_BYTES en DeviceVariantImageService del lambda fiado-phone-sales) —
8
+ * antes solo vivía hardcodeado en el front.
9
+ */
10
+ maxSizeBytes: number;
5
11
  }
@@ -8,4 +8,17 @@ export class SaleResponseDto {
8
8
  trackingCode!: string | null;
9
9
  providerStatus!: string | null;
10
10
  status!: string;
11
+ /**
12
+ * Modelo de la variante (resuelto server-side por `variantId`, incluyendo variantes con
13
+ * stock=0). `null` si la resolución falló (variante borrada o error de infraestructura) — ver
14
+ * GET /sales (backoffice) en cell-phone-sales-business.
15
+ */
16
+ variantModel!: string | null;
17
+ /** Color de la variante — mismo criterio de resolución/degradación que `variantModel`. */
18
+ variantColor!: string | null;
19
+ // Nota (v1, 2026-08-03): `buyerDirectorId` (arriba) sigue siendo el ID crudo del comprador a
20
+ // propósito. Se evaluó agregar `buyerName` resuelto server-side (vía servicio de directorios,
21
+ // @fiado/api-invoker IDirectoriesApi) pero requería wiring de infra pendiente
22
+ // (DIRECTORIES_LAMBDA_URL) — el líder de producto confirmó que para v1 alcanza con el ID
23
+ // crudo. Pospuesto a v2.
11
24
  }
@@ -0,0 +1,20 @@
1
+ import { IsString, IsNumber, IsOptional, Min } from 'class-validator';
2
+
3
+ export class UpdateDeviceVariantRequestDto {
4
+ @IsOptional()
5
+ @IsString()
6
+ model?: string;
7
+
8
+ @IsOptional()
9
+ @IsString()
10
+ color?: string;
11
+
12
+ @IsOptional()
13
+ @IsString()
14
+ storage?: string;
15
+
16
+ @IsOptional()
17
+ @IsNumber()
18
+ @Min(0)
19
+ price?: number;
20
+ }
@@ -1,5 +1,6 @@
1
1
  export * from './DeviceVariantResponseDto';
2
2
  export * from './CreateDeviceVariantRequestDto';
3
+ export * from './UpdateDeviceVariantRequestDto';
3
4
  export * from './CreateSaleRequestDto';
4
5
  export * from './SaleResponseDto';
5
6
  export * from './RedeemSaleCodeRequestDto';
@@ -0,0 +1,26 @@
1
+ import type { SalesReportRun } from '../SalesReportRun';
2
+
3
+ /**
4
+ * POST /backoffice/reports/{reportId}/run — el reporte generado, SÍNCRONO.
5
+ * SureKeep Fase 3 — pista Retail.
6
+ *
7
+ * El archivo viaja **en la respuesta**, no por una URL de descarga: el más grande del catálogo son
8
+ * ~96 KB, muy por debajo del límite de 6 MB de payload de Lambda. Eso evita bucket, URL prefirmada y
9
+ * endpoint de descarga para algo que se arma en milisegundos.
10
+ *
11
+ * ⚠️ El contenido puede traer **PII** (nombre del cliente en el reporte por período). Su lectura queda
12
+ * registrada en `PiiAccessLog` igual que las demás pantallas del BO. **Nunca loguear `content`.**
13
+ *
14
+ * Si algún reporte creciera hasta no entrar en la respuesta, el camino es S3 + `downloadUrl` (que ya
15
+ * está en `SalesReportRun`) + estado `QUEUED`: el contrato NO hay que romperlo, ya lo contempla.
16
+ */
17
+ export interface RunSalesReportResponse {
18
+ /** La corrida registrada en el log, con su estado final y el conteo de filas. */
19
+ run: SalesReportRun;
20
+ /** Nombre sugerido del archivo, ej. `RVL-01_2026-08-03.csv`. */
21
+ filename: string;
22
+ /** Tipo MIME, ej. `text/csv`. */
23
+ contentType: string;
24
+ /** El archivo completo. El front lo baja con un `Blob`. */
25
+ content: string;
26
+ }
@@ -1,14 +1,21 @@
1
1
  /**
2
- * Estado de una corrida de reporte. La generación es ASÍNCRONA: el `POST .../run` devuelve `QUEUED` y
3
- * el front poletea el listado. SureKeep Fase 3 — pista Retail.
2
+ * Estado de una corrida de reporte. SureKeep Fase 3 pista Retail.
4
3
  *
5
- * Es async desde el día uno por el límite de 29 s de API Gateway: un reporte de red completa no entra
6
- * en una respuesta síncrona. Mismo error que ya se corrigió en el cierre de corte de comisiones.
4
+ * El ciclo real es **`RUNNING READY | FAILED`, todo dentro de la MISMA llamada**: la generación es
5
+ * SÍNCRONA. Es el mismo patrón del reporte SIC de `credit-worker-business`, que abre la fila en
6
+ * `RUNNING` antes de procesar (`createMetadata`) y la cierra al terminar (`finalizeMetadata`).
7
7
  *
8
- * QUEUED - Encolada, sin arrancar.
9
- * RUNNING - Generándose.
10
- * READY - Lista para descargar (`downloadUrl` presente).
8
+ * Es síncrono porque los volúmenes lo permiten: el reporte más grande del catálogo son **320 filas
9
+ * (~96 KB)** — el propio mockup lo declara. Encolarlo sería infraestructura (worker + cola + bucket)
10
+ * para un archivo que se arma en milisegundos.
11
+ *
12
+ * RUNNING - Generándose. La fila se escribe ANTES de procesar, para que una corrida que muera a
13
+ * mitad deje rastro en vez de desaparecer.
14
+ * READY - Terminó bien. `rowCount` trae las filas generadas.
11
15
  * FAILED - Falló; `failureReason` explica por qué.
16
+ * QUEUED - **RESERVADO, hoy no se emite.** Existe para poder volver a asíncrono si algún reporte
17
+ * crece de verdad, **sin romper el contrato del front**: la pantalla ya sabe que un estado
18
+ * intermedio es posible. Sacarlo del enum ahora obligaría a versionar el DTO después.
12
19
  */
13
20
  export enum ReportRunStatusEnum {
14
21
  QUEUED = 'QUEUED',
@@ -112,6 +112,7 @@ export * from './dtos/requests/BackofficeCancelSaleRequest';
112
112
  export * from './dtos/responses/BackofficeSalesStatsResponse';
113
113
  export * from './dtos/responses/BackofficeSalesKpisResponse';
114
114
  export * from './dtos/responses/BackofficeReportsResponse';
115
+ export * from './dtos/responses/RunSalesReportResponse';
115
116
  // A1-A4 · agregados del portal (D17)
116
117
  export * from './dtos/RetailCustomerListItem';
117
118
  export * from './dtos/responses/BackofficeCustomersResponse';