@fiado/type-kit 3.275.0 → 3.277.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 (52) hide show
  1. package/bin/biometrics/dtos/BiometricDelivery.d.ts +36 -4
  2. package/bin/biometrics/dtos/BiometricDelivery.js +40 -1
  3. package/bin/biometrics/dtos/requests/CreateBiometricVerificationRequest.d.ts +18 -0
  4. package/bin/biometrics/dtos/requests/CreateBiometricVerificationRequest.js +7 -0
  5. package/bin/biometrics/enums/BiometricDeliveryModeEnum.d.ts +14 -1
  6. package/bin/biometrics/enums/BiometricDeliveryModeEnum.js +14 -1
  7. package/bin/helpdesk/dtos/ZendeskInternalAlertRequest.d.ts +8 -2
  8. package/bin/helpdesk/dtos/ZendeskInternalAlertRequest.js +5 -3
  9. package/bin/retailOrg/dtos/GoalAmounts.d.ts +18 -0
  10. package/bin/retailOrg/dtos/GoalAmounts.js +2 -0
  11. package/bin/retailOrg/dtos/requests/GoalListQuery.d.ts +16 -0
  12. package/bin/retailOrg/dtos/requests/GoalListQuery.js +35 -0
  13. package/bin/retailOrg/dtos/requests/GoalPathParams.d.ts +14 -0
  14. package/bin/retailOrg/dtos/requests/GoalPathParams.js +41 -0
  15. package/bin/retailOrg/dtos/requests/GoalUpsertRequest.d.ts +34 -0
  16. package/bin/retailOrg/dtos/requests/GoalUpsertRequest.js +60 -0
  17. package/bin/retailOrg/dtos/requests/KpiQuery.d.ts +9 -0
  18. package/bin/retailOrg/dtos/requests/KpiQuery.js +29 -0
  19. package/bin/retailOrg/dtos/requests/PrivateSellerListQuery.d.ts +27 -0
  20. package/bin/retailOrg/dtos/requests/PrivateSellerListQuery.js +45 -0
  21. package/bin/retailOrg/dtos/responses/GoalListResponse.d.ts +18 -0
  22. package/bin/retailOrg/dtos/responses/GoalListResponse.js +2 -0
  23. package/bin/retailOrg/dtos/responses/GoalUpsertResponse.d.ts +10 -0
  24. package/bin/retailOrg/dtos/responses/GoalUpsertResponse.js +2 -0
  25. package/bin/retailOrg/dtos/responses/SellerKpiResponse.d.ts +27 -0
  26. package/bin/retailOrg/dtos/responses/SellerKpiResponse.js +2 -0
  27. package/bin/retailOrg/dtos/responses/StoreKpiResponse.d.ts +34 -0
  28. package/bin/retailOrg/dtos/responses/StoreKpiResponse.js +2 -0
  29. package/bin/retailOrg/dtos/validation/PrivateSellerListResponse.d.ts +30 -0
  30. package/bin/retailOrg/dtos/validation/PrivateSellerListResponse.js +2 -0
  31. package/bin/retailOrg/enums/GoalTargetTypeEnum.d.ts +11 -0
  32. package/bin/retailOrg/enums/GoalTargetTypeEnum.js +15 -0
  33. package/bin/retailOrg/index.d.ts +12 -0
  34. package/bin/retailOrg/index.js +14 -0
  35. package/package.json +1 -1
  36. package/src/biometrics/dtos/BiometricDelivery.ts +48 -4
  37. package/src/biometrics/dtos/requests/CreateBiometricVerificationRequest.ts +20 -0
  38. package/src/biometrics/enums/BiometricDeliveryModeEnum.ts +15 -1
  39. package/src/helpdesk/dtos/ZendeskInternalAlertRequest.ts +12 -4
  40. package/src/retailOrg/dtos/GoalAmounts.ts +18 -0
  41. package/src/retailOrg/dtos/requests/GoalListQuery.ts +25 -0
  42. package/src/retailOrg/dtos/requests/GoalPathParams.ts +25 -0
  43. package/src/retailOrg/dtos/requests/GoalUpsertRequest.ts +66 -0
  44. package/src/retailOrg/dtos/requests/KpiQuery.ts +15 -0
  45. package/src/retailOrg/dtos/requests/PrivateSellerListQuery.ts +43 -0
  46. package/src/retailOrg/dtos/responses/GoalListResponse.ts +20 -0
  47. package/src/retailOrg/dtos/responses/GoalUpsertResponse.ts +10 -0
  48. package/src/retailOrg/dtos/responses/SellerKpiResponse.ts +29 -0
  49. package/src/retailOrg/dtos/responses/StoreKpiResponse.ts +36 -0
  50. package/src/retailOrg/dtos/validation/PrivateSellerListResponse.ts +32 -0
  51. package/src/retailOrg/enums/GoalTargetTypeEnum.ts +11 -0
  52. package/src/retailOrg/index.ts +14 -0
@@ -22,6 +22,37 @@ export declare class RedirectDelivery {
22
22
  /** Hasta cuándo sirve el link. ISO-8601 UTC con `Z`. */
23
23
  expiresAt: string;
24
24
  }
25
+ /**
26
+ * `deliveryMode = EMBEDDED_SDK`. El caller monta el SDK del proveedor **en su propia pantalla** con
27
+ * estos parámetros, en vez de mandar al usuario a un link hospedado.
28
+ *
29
+ * Para qué: hay flujos donde el usuario está PRESENTE frente a un dispositivo que no es el suyo —el
30
+ * vendedor le pasa la tablet de la tienda— y sacarlo a un navegador externo rompe la atención.
31
+ * Mismo biométrico y mismo veredicto que `REDIRECT`; lo único distinto es dónde corre.
32
+ *
33
+ * ⚠️ **Ninguno de los tres campos es secreto.** El `clientId` y el `flowId` viajan al navegador como
34
+ * parámetros del widget y se leen en el inspector; el `metadata` lo devuelve el proveedor tal cual
35
+ * en cada webhook. Lo que SÍ es secreto —el Client Secret con el que se firma el
36
+ * `userPhotoLinkHash`— nunca sale de `metamap-connector` y no viaja acá.
37
+ */
38
+ export declare class EmbeddedSdkDelivery {
39
+ /** `merchantToken` del proveedor. Público: viaja al navegador. */
40
+ clientId: string;
41
+ /** El flow del proveedor a ejecutar. Sale del catálogo, no de una env var del caller. */
42
+ flowId: string;
43
+ /**
44
+ * El `metadata` ya serializado, **listo para pasárselo al SDK tal cual**.
45
+ *
46
+ * 🔴 Es un JSON string, NO un objeto y NO base64. El proveedor lo devuelve literal en cada
47
+ * webhook y es el único canal de correlación que existe. Si el caller lo re-serializa o lo
48
+ * codifica, el `userPhotoLink` que el proveedor reconstruye deja de ser idéntico al que se
49
+ * firmó, el hash del facematch no cuadra, y rechaza la verificación con «Invalid hash or url»
50
+ * DESPUÉS de que el usuario ya se tomó la selfie. Pasarlo sin tocarlo.
51
+ */
52
+ metadata: string;
53
+ /** Hasta cuándo sirven estos parámetros. ISO-8601 UTC con `Z`. */
54
+ expiresAt: string;
55
+ }
25
56
  /**
26
57
  * `deliveryMode = CHALLENGE`. El biométrico corre en el dispositivo (Apple Face ID, biometría de
27
58
  * Android) y el cliente devuelve una attestation firmada.
@@ -56,10 +87,11 @@ export declare class ImmediateDelivery {
56
87
  *
57
88
  * ```ts
58
89
  * switch (res.deliveryMode) {
59
- * case BiometricDeliveryModeEnum.REDIRECT: abrir((res.delivery as RedirectDelivery).link); break;
60
- * case BiometricDeliveryModeEnum.CHALLENGE: firmar(res.delivery as ChallengeDelivery); break;
61
- * case BiometricDeliveryModeEnum.IMMEDIATE: leer(res.result); break;
90
+ * case BiometricDeliveryModeEnum.REDIRECT: abrir((res.delivery as RedirectDelivery).link); break;
91
+ * case BiometricDeliveryModeEnum.EMBEDDED_SDK: montarSdk(res.delivery as EmbeddedSdkDelivery); break;
92
+ * case BiometricDeliveryModeEnum.CHALLENGE: firmar(res.delivery as ChallengeDelivery); break;
93
+ * case BiometricDeliveryModeEnum.IMMEDIATE: leer(res.result); break;
62
94
  * }
63
95
  * ```
64
96
  */
65
- export type BiometricDelivery = RedirectDelivery | ChallengeDelivery | ImmediateDelivery;
97
+ export type BiometricDelivery = RedirectDelivery | EmbeddedSdkDelivery | ChallengeDelivery | ImmediateDelivery;
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.ImmediateDelivery = exports.ChallengeDelivery = exports.RedirectDelivery = void 0;
12
+ exports.ImmediateDelivery = exports.ChallengeDelivery = exports.EmbeddedSdkDelivery = exports.RedirectDelivery = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  /**
@@ -41,6 +41,45 @@ __decorate([
41
41
  (0, class_validator_1.IsISO8601)({ strict: true }),
42
42
  __metadata("design:type", String)
43
43
  ], RedirectDelivery.prototype, "expiresAt", void 0);
44
+ /**
45
+ * `deliveryMode = EMBEDDED_SDK`. El caller monta el SDK del proveedor **en su propia pantalla** con
46
+ * estos parámetros, en vez de mandar al usuario a un link hospedado.
47
+ *
48
+ * Para qué: hay flujos donde el usuario está PRESENTE frente a un dispositivo que no es el suyo —el
49
+ * vendedor le pasa la tablet de la tienda— y sacarlo a un navegador externo rompe la atención.
50
+ * Mismo biométrico y mismo veredicto que `REDIRECT`; lo único distinto es dónde corre.
51
+ *
52
+ * ⚠️ **Ninguno de los tres campos es secreto.** El `clientId` y el `flowId` viajan al navegador como
53
+ * parámetros del widget y se leen en el inspector; el `metadata` lo devuelve el proveedor tal cual
54
+ * en cada webhook. Lo que SÍ es secreto —el Client Secret con el que se firma el
55
+ * `userPhotoLinkHash`— nunca sale de `metamap-connector` y no viaja acá.
56
+ */
57
+ class EmbeddedSdkDelivery {
58
+ }
59
+ exports.EmbeddedSdkDelivery = EmbeddedSdkDelivery;
60
+ __decorate([
61
+ (0, class_transformer_1.Expose)(),
62
+ (0, class_validator_1.IsString)(),
63
+ (0, class_validator_1.IsNotEmpty)(),
64
+ __metadata("design:type", String)
65
+ ], EmbeddedSdkDelivery.prototype, "clientId", void 0);
66
+ __decorate([
67
+ (0, class_transformer_1.Expose)(),
68
+ (0, class_validator_1.IsString)(),
69
+ (0, class_validator_1.IsNotEmpty)(),
70
+ __metadata("design:type", String)
71
+ ], EmbeddedSdkDelivery.prototype, "flowId", void 0);
72
+ __decorate([
73
+ (0, class_transformer_1.Expose)(),
74
+ (0, class_validator_1.IsString)(),
75
+ (0, class_validator_1.IsNotEmpty)(),
76
+ __metadata("design:type", String)
77
+ ], EmbeddedSdkDelivery.prototype, "metadata", void 0);
78
+ __decorate([
79
+ (0, class_transformer_1.Expose)(),
80
+ (0, class_validator_1.IsISO8601)({ strict: true }),
81
+ __metadata("design:type", String)
82
+ ], EmbeddedSdkDelivery.prototype, "expiresAt", void 0);
44
83
  /**
45
84
  * `deliveryMode = CHALLENGE`. El biométrico corre en el dispositivo (Apple Face ID, biometría de
46
85
  * Android) y el cliente devuelve una attestation firmada.
@@ -1,3 +1,4 @@
1
+ import { BiometricDeliveryModeEnum } from '../../enums/BiometricDeliveryModeEnum';
1
2
  import { BiometricProviderEnum } from '../../enums/BiometricProviderEnum';
2
3
  import { BiometricTypeEnum } from '../../enums/BiometricTypeEnum';
3
4
  import { BiometricSubject } from '../BiometricSubject';
@@ -70,4 +71,21 @@ export declare class CreateBiometricVerificationRequest {
70
71
  * sesión, de orden, de lo que sea que estés correlacionando.
71
72
  */
72
73
  callerContext?: string;
74
+ /**
75
+ * CÓMO quieres recibir lo que hace falta para ejecutar el biométrico. Default `REDIRECT`.
76
+ *
77
+ * Es una **preferencia, no una orden**: el servicio responde con el modo que el proveedor
78
+ * elegido soporta de verdad, y el modo real siempre viene en `deliveryMode` de la respuesta.
79
+ * Nunca asumas que te tocó el que pediste — discrimina por el de la respuesta.
80
+ *
81
+ * Con `METAMAP` hoy:
82
+ * - `REDIRECT` → link hospedado y acortado. Para mandárselo al usuario a SU dispositivo.
83
+ * - `EMBEDDED_SDK` → los parámetros para montar el widget en TU pantalla. Para cuando el
84
+ * usuario está presente frente a un dispositivo que no es el suyo.
85
+ *
86
+ * Pedir un modo que el proveedor no soporta responde `422 DELIVERY_MODE_NOT_SUPPORTED` — no se
87
+ * degrada en silencio al default, porque el caller que pidió SDK y recibe un link no tiene
88
+ * dónde montarlo y se entera hasta que la pantalla queda en blanco.
89
+ */
90
+ deliveryMode?: BiometricDeliveryModeEnum;
73
91
  }
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.CreateBiometricVerificationRequest = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
+ const BiometricDeliveryModeEnum_1 = require("../../enums/BiometricDeliveryModeEnum");
15
16
  const BiometricProviderEnum_1 = require("../../enums/BiometricProviderEnum");
16
17
  const BiometricTypeEnum_1 = require("../../enums/BiometricTypeEnum");
17
18
  const BiometricSubject_1 = require("../BiometricSubject");
@@ -79,3 +80,9 @@ __decorate([
79
80
  (0, class_validator_1.MaxLength)(256),
80
81
  __metadata("design:type", String)
81
82
  ], CreateBiometricVerificationRequest.prototype, "callerContext", void 0);
83
+ __decorate([
84
+ (0, class_transformer_1.Expose)(),
85
+ (0, class_validator_1.IsOptional)(),
86
+ (0, class_validator_1.IsEnum)(BiometricDeliveryModeEnum_1.BiometricDeliveryModeEnum),
87
+ __metadata("design:type", String)
88
+ ], CreateBiometricVerificationRequest.prototype, "deliveryMode", void 0);
@@ -17,11 +17,24 @@
17
17
  *
18
18
  * El `GET` de polling NO cambia entre modos: devuelve estado, no mecanismo.
19
19
  *
20
- * `biometrics-business` — Entrega 1 (solo `REDIRECT` produce valores reales).
20
+ * `biometrics-business` — Entrega 1: `REDIRECT` y `EMBEDDED_SDK` producen valores reales.
21
21
  */
22
22
  export declare enum BiometricDeliveryModeEnum {
23
23
  /** `delivery` trae `{ link, expiresAt }`. El usuario abre el link y ejecuta ahí. */
24
24
  REDIRECT = "REDIRECT",
25
+ /**
26
+ * `delivery` trae `{ clientId, flowId, metadata, expiresAt }`. El caller monta el SDK del
27
+ * proveedor **en su propia pantalla** con esos parámetros, en vez de mandar al usuario a un
28
+ * link hospedado.
29
+ *
30
+ * Existe porque hay flujos donde el usuario está PRESENTE frente a un dispositivo que no es el
31
+ * suyo — el vendedor le pasa la tablet de la tienda — y sacarlo a un navegador externo rompe la
32
+ * atención. Mismo biométrico, mismo veredicto, distinta superficie.
33
+ *
34
+ * Es exactamente lo que hoy arma a mano `retail-wizard-business` para su modalidad
35
+ * `STORE_DEVICE`; este modo existe para que deje de armarlo.
36
+ */
37
+ EMBEDDED_SDK = "EMBEDDED_SDK",
25
38
  /** `delivery` trae `{ challenge, nonce, expiresAt }`. El dispositivo firma y devuelve. */
26
39
  CHALLENGE = "CHALLENGE",
27
40
  /** `delivery` viene vacío: el biométrico ya corrió y `result` viene poblado en la misma respuesta. */
@@ -20,12 +20,25 @@ exports.BiometricDeliveryModeEnum = void 0;
20
20
  *
21
21
  * El `GET` de polling NO cambia entre modos: devuelve estado, no mecanismo.
22
22
  *
23
- * `biometrics-business` — Entrega 1 (solo `REDIRECT` produce valores reales).
23
+ * `biometrics-business` — Entrega 1: `REDIRECT` y `EMBEDDED_SDK` producen valores reales.
24
24
  */
25
25
  var BiometricDeliveryModeEnum;
26
26
  (function (BiometricDeliveryModeEnum) {
27
27
  /** `delivery` trae `{ link, expiresAt }`. El usuario abre el link y ejecuta ahí. */
28
28
  BiometricDeliveryModeEnum["REDIRECT"] = "REDIRECT";
29
+ /**
30
+ * `delivery` trae `{ clientId, flowId, metadata, expiresAt }`. El caller monta el SDK del
31
+ * proveedor **en su propia pantalla** con esos parámetros, en vez de mandar al usuario a un
32
+ * link hospedado.
33
+ *
34
+ * Existe porque hay flujos donde el usuario está PRESENTE frente a un dispositivo que no es el
35
+ * suyo — el vendedor le pasa la tablet de la tienda — y sacarlo a un navegador externo rompe la
36
+ * atención. Mismo biométrico, mismo veredicto, distinta superficie.
37
+ *
38
+ * Es exactamente lo que hoy arma a mano `retail-wizard-business` para su modalidad
39
+ * `STORE_DEVICE`; este modo existe para que deje de armarlo.
40
+ */
41
+ BiometricDeliveryModeEnum["EMBEDDED_SDK"] = "EMBEDDED_SDK";
29
42
  /** `delivery` trae `{ challenge, nonce, expiresAt }`. El dispositivo firma y devuelve. */
30
43
  BiometricDeliveryModeEnum["CHALLENGE"] = "CHALLENGE";
31
44
  /** `delivery` viene vacío: el biométrico ya corrió y `result` viene poblado en la misma respuesta. */
@@ -11,8 +11,14 @@ export declare class ZendeskInternalAlertRequest {
11
11
  directoryId: string;
12
12
  /** Detalle del problema. Acá va lo sensible: es lo que se escribe como nota interna. */
13
13
  note: string;
14
- /** Decide el ruteo en Zendesk (tag, vista y equipo). */
15
- channel: InternalAlertChannel;
14
+ /**
15
+ * Equipos que deben ver la alerta. Un mismo hecho puede requerir a los dos: por ejemplo un
16
+ * status de verificación que Compliance evalúa y el equipo interno corrige.
17
+ *
18
+ * Los hilos se agrupan por combinación exacta: una alerta `[COMPLIANCE]` no cae en el ticket
19
+ * de `[INTERNAL, COMPLIANCE]`, para que restringir un canal por rol siga siendo posible.
20
+ */
21
+ channels: InternalAlertChannel[];
16
22
  /** Id del evento origen, para rastrear la alerta de vuelta. */
17
23
  reference?: string;
18
24
  }
@@ -33,9 +33,11 @@ __decorate([
33
33
  __metadata("design:type", String)
34
34
  ], ZendeskInternalAlertRequest.prototype, "note", void 0);
35
35
  __decorate([
36
- (0, class_validator_1.IsEnum)(InternalAlertChannelEnum_1.InternalAlertChannel),
37
- __metadata("design:type", String)
38
- ], ZendeskInternalAlertRequest.prototype, "channel", void 0);
36
+ (0, class_validator_1.IsArray)(),
37
+ (0, class_validator_1.ArrayNotEmpty)(),
38
+ (0, class_validator_1.IsEnum)(InternalAlertChannelEnum_1.InternalAlertChannel, { each: true }),
39
+ __metadata("design:type", Array)
40
+ ], ZendeskInternalAlertRequest.prototype, "channels", void 0);
39
41
  __decorate([
40
42
  (0, class_validator_1.IsString)(),
41
43
  (0, class_validator_1.IsOptional)(),
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Las tres cifras de una meta — y las tres salen de UNA SOLA captura.
3
+ *
4
+ * 🔴 Solo `monthCents` se guarda. `weekCents` (`mes/4`) y `dayCents` (`mes/28`) las DERIVA el backend
5
+ * en cada lectura, y por eso `PUT /backoffice/goals` las RECHAZA si vienen en el request: aceptarlas
6
+ * del cliente abre la puerta a que lleguen desincronizadas entre sí y a que dos pantallas midan el
7
+ * mismo avance contra números distintos.
8
+ *
9
+ * Se devuelven ya calculadas para que ninguna pantalla repita la división.
10
+ */
11
+ export interface GoalAmounts {
12
+ /** La meta mensual en centavos — lo único persistido. */
13
+ monthCents: number;
14
+ /** Derivada: `monthCents / 4`, redondeada. */
15
+ weekCents: number;
16
+ /** Derivada: `monthCents / 28`, redondeada. */
17
+ dayCents: number;
18
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,16 @@
1
+ import { GoalTargetTypeEnum } from '../../enums/GoalTargetTypeEnum';
2
+ /**
3
+ * Query de `GET /backoffice/goals` — las metas de un periodo.
4
+ *
5
+ * ⚠️ `retailerId` NO es parámetro: sale del token (D10). Un `?retailerId=` en el request se ignora a
6
+ * propósito — aceptarlo dejaría que un Admin VL mire las metas de la cadena de al lado.
7
+ */
8
+ export declare class GoalListQuery {
9
+ /**
10
+ * Mes calendario `YYYY-MM`. El regex acota el mes a 01-12: `\d{2}` a secas aceptaría `2026-13`,
11
+ * que escribiría una partición que ninguna consulta vuelve a encontrar.
12
+ */
13
+ periodId: string;
14
+ /** Si falta, devuelve los dos tipos — el `begins_with` del periodo ya los trae juntos. */
15
+ targetType?: GoalTargetTypeEnum;
16
+ }
@@ -0,0 +1,35 @@
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.GoalListQuery = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const GoalTargetTypeEnum_1 = require("../../enums/GoalTargetTypeEnum");
16
+ /**
17
+ * Query de `GET /backoffice/goals` — las metas de un periodo.
18
+ *
19
+ * ⚠️ `retailerId` NO es parámetro: sale del token (D10). Un `?retailerId=` en el request se ignora a
20
+ * propósito — aceptarlo dejaría que un Admin VL mire las metas de la cadena de al lado.
21
+ */
22
+ class GoalListQuery {
23
+ }
24
+ exports.GoalListQuery = GoalListQuery;
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.Matches)(/^\d{4}-(0[1-9]|1[0-2])$/, { message: 'periodId debe tener formato YYYY-MM (mes 01-12)' }),
28
+ __metadata("design:type", String)
29
+ ], GoalListQuery.prototype, "periodId", void 0);
30
+ __decorate([
31
+ (0, class_transformer_1.Expose)(),
32
+ (0, class_validator_1.IsOptional)(),
33
+ (0, class_validator_1.IsEnum)(GoalTargetTypeEnum_1.GoalTargetTypeEnum),
34
+ __metadata("design:type", String)
35
+ ], GoalListQuery.prototype, "targetType", void 0);
@@ -0,0 +1,14 @@
1
+ import { GoalTargetTypeEnum } from '../../enums/GoalTargetTypeEnum';
2
+ /**
3
+ * Path params de `DELETE /backoffice/goals/{periodId}/{targetType}/{targetId}`.
4
+ *
5
+ * Una meta NO tiene id propio: se identifica por la terna *(periodo, tipo, target)*, que es
6
+ * exactamente su sort key. Por eso los tres van en el path y por eso hay un DTO para validarlos —
7
+ * un `targetType` fuera del enum arma una sk que nunca matchea y devolvería un 404 mentiroso en vez
8
+ * del 400 que corresponde.
9
+ */
10
+ export declare class GoalPathParams {
11
+ periodId: string;
12
+ targetType: GoalTargetTypeEnum;
13
+ targetId: string;
14
+ }
@@ -0,0 +1,41 @@
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.GoalPathParams = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const GoalTargetTypeEnum_1 = require("../../enums/GoalTargetTypeEnum");
16
+ /**
17
+ * Path params de `DELETE /backoffice/goals/{periodId}/{targetType}/{targetId}`.
18
+ *
19
+ * Una meta NO tiene id propio: se identifica por la terna *(periodo, tipo, target)*, que es
20
+ * exactamente su sort key. Por eso los tres van en el path y por eso hay un DTO para validarlos —
21
+ * un `targetType` fuera del enum arma una sk que nunca matchea y devolvería un 404 mentiroso en vez
22
+ * del 400 que corresponde.
23
+ */
24
+ class GoalPathParams {
25
+ }
26
+ exports.GoalPathParams = GoalPathParams;
27
+ __decorate([
28
+ (0, class_transformer_1.Expose)(),
29
+ (0, class_validator_1.Matches)(/^\d{4}-(0[1-9]|1[0-2])$/, { message: 'periodId debe tener formato YYYY-MM (mes 01-12)' }),
30
+ __metadata("design:type", String)
31
+ ], GoalPathParams.prototype, "periodId", void 0);
32
+ __decorate([
33
+ (0, class_transformer_1.Expose)(),
34
+ (0, class_validator_1.IsEnum)(GoalTargetTypeEnum_1.GoalTargetTypeEnum),
35
+ __metadata("design:type", String)
36
+ ], GoalPathParams.prototype, "targetType", void 0);
37
+ __decorate([
38
+ (0, class_transformer_1.Expose)(),
39
+ (0, class_validator_1.IsString)(),
40
+ __metadata("design:type", String)
41
+ ], GoalPathParams.prototype, "targetId", void 0);
@@ -0,0 +1,34 @@
1
+ import { GoalTargetTypeEnum } from '../../enums/GoalTargetTypeEnum';
2
+ /** Una meta del lote. */
3
+ export declare class GoalUpsertTarget {
4
+ /** ULID de la tienda o del vendedor. */
5
+ targetId: string;
6
+ targetType: GoalTargetTypeEnum;
7
+ /**
8
+ * La meta MENSUAL en centavos — lo único que se guarda.
9
+ *
10
+ * 🔴 `0` NO borra: cero significa «la meta es cero» y rompe el `goalPct` con una división entre
11
+ * cero. Para quitar una meta está `DELETE /backoffice/goals/{periodId}/{targetType}/{targetId}`;
12
+ * sin fila significa «no se fijó» y la UI pinta `—`.
13
+ */
14
+ monthCents: number;
15
+ }
16
+ /**
17
+ * Body de `PUT /backoffice/goals` — upsert POR LOTE de las metas de un periodo.
18
+ *
19
+ * ⚠️ `weekCents` y `dayCents` NO están declarados a propósito, y el manager los RECHAZA con 400 si
20
+ * llegan: son derivadas (`mes/4`, `mes/28`). El `@Expose()` + `excludeExtraneousValues` los
21
+ * descartaría en silencio, y un descarte silencioso sobre un número contra el que se le paga a la
22
+ * gente es peor que un error — el cliente creería que los guardó.
23
+ */
24
+ export declare class GoalUpsertRequest {
25
+ /** Mes calendario `YYYY-MM`, mes acotado a 01-12. */
26
+ periodId: string;
27
+ /**
28
+ * El lote: 1..50 metas.
29
+ *
30
+ * 🔴 El tope es 50, no 100: `TransactWriteItems` acepta 100 ítems y **cada meta consume dos** (la
31
+ * fila de la meta + su fila de auditoría, que va en la MISMA transacción).
32
+ */
33
+ targets: GoalUpsertTarget[];
34
+ }
@@ -0,0 +1,60 @@
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.GoalUpsertRequest = exports.GoalUpsertTarget = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const GoalTargetTypeEnum_1 = require("../../enums/GoalTargetTypeEnum");
16
+ /** Una meta del lote. */
17
+ class GoalUpsertTarget {
18
+ }
19
+ exports.GoalUpsertTarget = GoalUpsertTarget;
20
+ __decorate([
21
+ (0, class_transformer_1.Expose)(),
22
+ (0, class_validator_1.IsString)(),
23
+ __metadata("design:type", String)
24
+ ], GoalUpsertTarget.prototype, "targetId", void 0);
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ (0, class_validator_1.IsEnum)(GoalTargetTypeEnum_1.GoalTargetTypeEnum),
28
+ __metadata("design:type", String)
29
+ ], GoalUpsertTarget.prototype, "targetType", void 0);
30
+ __decorate([
31
+ (0, class_transformer_1.Expose)(),
32
+ (0, class_validator_1.IsInt)(),
33
+ (0, class_validator_1.Min)(0),
34
+ __metadata("design:type", Number)
35
+ ], GoalUpsertTarget.prototype, "monthCents", void 0);
36
+ /**
37
+ * Body de `PUT /backoffice/goals` — upsert POR LOTE de las metas de un periodo.
38
+ *
39
+ * ⚠️ `weekCents` y `dayCents` NO están declarados a propósito, y el manager los RECHAZA con 400 si
40
+ * llegan: son derivadas (`mes/4`, `mes/28`). El `@Expose()` + `excludeExtraneousValues` los
41
+ * descartaría en silencio, y un descarte silencioso sobre un número contra el que se le paga a la
42
+ * gente es peor que un error — el cliente creería que los guardó.
43
+ */
44
+ class GoalUpsertRequest {
45
+ }
46
+ exports.GoalUpsertRequest = GoalUpsertRequest;
47
+ __decorate([
48
+ (0, class_transformer_1.Expose)(),
49
+ (0, class_validator_1.Matches)(/^\d{4}-(0[1-9]|1[0-2])$/, { message: 'periodId debe tener formato YYYY-MM (mes 01-12)' }),
50
+ __metadata("design:type", String)
51
+ ], GoalUpsertRequest.prototype, "periodId", void 0);
52
+ __decorate([
53
+ (0, class_transformer_1.Expose)(),
54
+ (0, class_validator_1.IsArray)(),
55
+ (0, class_validator_1.ArrayMinSize)(1),
56
+ (0, class_validator_1.ArrayMaxSize)(50),
57
+ (0, class_validator_1.ValidateNested)({ each: true }),
58
+ (0, class_transformer_1.Type)(() => GoalUpsertTarget),
59
+ __metadata("design:type", Array)
60
+ ], GoalUpsertRequest.prototype, "targets", void 0);
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Query compartido por los dos drawers de KPIs del Portal Admin VL
3
+ * (`GET /backoffice/stores/{storeId}/kpis` y `GET /backoffice/sellers/{sellerId}/kpis`).
4
+ *
5
+ * `periodId` es OPCIONAL: sin él se usa el mes en curso — el drawer se abre sin elegir periodo.
6
+ */
7
+ export declare class KpiQuery {
8
+ periodId?: string;
9
+ }
@@ -0,0 +1,29 @@
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.KpiQuery = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * Query compartido por los dos drawers de KPIs del Portal Admin VL
17
+ * (`GET /backoffice/stores/{storeId}/kpis` y `GET /backoffice/sellers/{sellerId}/kpis`).
18
+ *
19
+ * `periodId` es OPCIONAL: sin él se usa el mes en curso — el drawer se abre sin elegir periodo.
20
+ */
21
+ class KpiQuery {
22
+ }
23
+ exports.KpiQuery = KpiQuery;
24
+ __decorate([
25
+ (0, class_transformer_1.Expose)(),
26
+ (0, class_validator_1.IsOptional)(),
27
+ (0, class_validator_1.Matches)(/^\d{4}-(0[1-9]|1[0-2])$/, { message: 'periodId debe tener formato YYYY-MM (mes 01-12)' }),
28
+ __metadata("design:type", String)
29
+ ], KpiQuery.prototype, "periodId", void 0);
@@ -0,0 +1,27 @@
1
+ import { RetailUserStatusEnum } from '../../enums/RetailUserStatusEnum';
2
+ /**
3
+ * Query de `GET /private/sellers` — el padrón de una cadena, M2M.
4
+ *
5
+ * 🔴 Acá el `retailerId` **viene en el request**, al revés que en los `/backoffice/` (donde se impone
6
+ * desde el token). Es el modelo M2M de la casa: el endpoint es VPC-only y su seguridad es de RED, no
7
+ * de identidad. Cualquier lambda dentro de la VPC puede pedir cualquier retailer — decisión
8
+ * consciente, no un descuido.
9
+ */
10
+ export declare class PrivateSellerListQuery {
11
+ retailerId: string;
12
+ /**
13
+ * ⚠️ **Sin `status` vienen TODOS los estados, no solo los activos.**
14
+ *
15
+ * El diseño original proponía default `ACTIVE`, pero con este enum eso deja al motor de comisiones
16
+ * sin ninguna forma de pedir el padrón completo — y un vendedor dado de baja el día 20 sí tiene
17
+ * comisión por lo que vendió hasta el 19. Filtrar por default sería perderlo en silencio.
18
+ */
19
+ status?: RetailUserStatusEnum;
20
+ /**
21
+ * Quién llama. `Feature.ANONIMUS` no trae actor, y este endpoint exporta la nómina completa de una
22
+ * cadena: sin esto el registro de acceso a PII quedaría sin nadie a quien atribuírselo. Lo llena el
23
+ * publisher de `@fiado/api-invoker`; si falta, el lambda registra `m2m:unknown` y loguea un WARN —
24
+ * nunca omite el registro.
25
+ */
26
+ callerService?: string;
27
+ }
@@ -0,0 +1,45 @@
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.PrivateSellerListQuery = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const RetailUserStatusEnum_1 = require("../../enums/RetailUserStatusEnum");
16
+ /** ULID canónico: 26 chars Crockford base32, primer char 0-7 (el timestamp cabe en 48 bits). */
17
+ const ULID = /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/;
18
+ /**
19
+ * Query de `GET /private/sellers` — el padrón de una cadena, M2M.
20
+ *
21
+ * 🔴 Acá el `retailerId` **viene en el request**, al revés que en los `/backoffice/` (donde se impone
22
+ * desde el token). Es el modelo M2M de la casa: el endpoint es VPC-only y su seguridad es de RED, no
23
+ * de identidad. Cualquier lambda dentro de la VPC puede pedir cualquier retailer — decisión
24
+ * consciente, no un descuido.
25
+ */
26
+ class PrivateSellerListQuery {
27
+ }
28
+ exports.PrivateSellerListQuery = PrivateSellerListQuery;
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ (0, class_validator_1.Matches)(ULID, { message: 'retailerId debe ser un ULID' }),
32
+ __metadata("design:type", String)
33
+ ], PrivateSellerListQuery.prototype, "retailerId", void 0);
34
+ __decorate([
35
+ (0, class_transformer_1.Expose)(),
36
+ (0, class_validator_1.IsOptional)(),
37
+ (0, class_validator_1.IsEnum)(RetailUserStatusEnum_1.RetailUserStatusEnum),
38
+ __metadata("design:type", String)
39
+ ], PrivateSellerListQuery.prototype, "status", void 0);
40
+ __decorate([
41
+ (0, class_transformer_1.Expose)(),
42
+ (0, class_validator_1.IsOptional)(),
43
+ (0, class_validator_1.Matches)(/^[a-z0-9-]{1,64}$/, { message: 'callerService debe ser el nombre del lambda (kebab-case)' }),
44
+ __metadata("design:type", String)
45
+ ], PrivateSellerListQuery.prototype, "callerService", void 0);
@@ -0,0 +1,18 @@
1
+ import type { GoalAmounts } from '../GoalAmounts';
2
+ import type { GoalTargetTypeEnum } from '../../enums/GoalTargetTypeEnum';
3
+ /** Una meta del periodo, con las tres cifras ya derivadas. */
4
+ export interface GoalDto extends GoalAmounts {
5
+ targetId: string;
6
+ targetType: GoalTargetTypeEnum;
7
+ }
8
+ /**
9
+ * Respuesta de `GET /backoffice/goals`.
10
+ *
11
+ * ⚠️ Un periodo sin metas devuelve `goals: []`, **no un 404**: que no se hayan fijado es un estado
12
+ * válido del negocio, no una ruta que no existe. Y una meta borrada simplemente no viene en la
13
+ * lista — no hay estado «borrada», la fila deja de existir.
14
+ */
15
+ export interface GoalListResponse {
16
+ periodId: string;
17
+ goals: GoalDto[];
18
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Respuesta de `PUT /backoffice/goals` — cuántas metas quedaron escritas.
3
+ *
4
+ * `updated` siempre iguala `targets.length` del request: el lote es todo-o-nada (una sola
5
+ * `TransactWriteItems`). Nunca hay un lote parcial que explicar.
6
+ */
7
+ export interface GoalUpsertResponse {
8
+ periodId: string;
9
+ updated: number;
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });