@escapenavigator/types 1.10.106 → 1.10.107

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.
@@ -107,7 +107,28 @@ declare class ReturnedPromocode {
107
107
  discount: number;
108
108
  }
109
109
  export declare class OrderRO extends RO {
110
- utm: Utm;
110
+ /**
111
+ * UTM-метки — flat-поля прямо на ордере. Источник истины:
112
+ * денормализованные колонки `OrderEntity.utm*`. Legacy-relation
113
+ * `OrderEntity.utm` (eager:false) и сам `OrderUtmEntity` остались
114
+ * только под refill, в RO/UI больше не пробрасываются.
115
+ */
116
+ utmSource?: string | null;
117
+ utmMedium?: string | null;
118
+ utmCampaign?: string | null;
119
+ utmContent?: string | null;
120
+ utmTerm?: string | null;
121
+ /**
122
+ * Внутренний (escapenavigator) FK на `profile-marketing-email-campaign.id`.
123
+ * В отличие от `utmCampaign`, не редактируется юзером — используется
124
+ * для точной атрибуции кампаний без `LIKE`-матчинга по slug-у.
125
+ */
126
+ enCampaignId?: number | null;
127
+ /**
128
+ * Last-click ID конкретной ссылки внутри письма (`cta_primary`,
129
+ * `section_${i}` и т.п.). При повторном клике перезаписывается.
130
+ */
131
+ enLinkId?: string | null;
111
132
  customFields: CustomFiled[];
112
133
  otherId: string;
113
134
  updatedAt: Date;
@@ -315,9 +315,32 @@ class OrderRO extends ro_class_1.RO {
315
315
  exports.OrderRO = OrderRO;
316
316
  __decorate([
317
317
  (0, class_transformer_1.Expose)(),
318
- (0, class_transformer_1.Type)(() => Utm),
319
- __metadata("design:type", Utm)
320
- ], OrderRO.prototype, "utm", void 0);
318
+ __metadata("design:type", String)
319
+ ], OrderRO.prototype, "utmSource", void 0);
320
+ __decorate([
321
+ (0, class_transformer_1.Expose)(),
322
+ __metadata("design:type", String)
323
+ ], OrderRO.prototype, "utmMedium", void 0);
324
+ __decorate([
325
+ (0, class_transformer_1.Expose)(),
326
+ __metadata("design:type", String)
327
+ ], OrderRO.prototype, "utmCampaign", void 0);
328
+ __decorate([
329
+ (0, class_transformer_1.Expose)(),
330
+ __metadata("design:type", String)
331
+ ], OrderRO.prototype, "utmContent", void 0);
332
+ __decorate([
333
+ (0, class_transformer_1.Expose)(),
334
+ __metadata("design:type", String)
335
+ ], OrderRO.prototype, "utmTerm", void 0);
336
+ __decorate([
337
+ (0, class_transformer_1.Expose)(),
338
+ __metadata("design:type", Number)
339
+ ], OrderRO.prototype, "enCampaignId", void 0);
340
+ __decorate([
341
+ (0, class_transformer_1.Expose)(),
342
+ __metadata("design:type", String)
343
+ ], OrderRO.prototype, "enLinkId", void 0);
321
344
  __decorate([
322
345
  (0, class_transformer_1.Expose)(),
323
346
  (0, class_transformer_1.Type)(() => CustomFiled),
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Единые лимиты на размер XLSX-выгрузок. Импортится и бэком
3
+ * (`*.Service.EXPORT_LIMIT` + count-precheck в контроллере), и
4
+ * фронтом (`ExportAndCount` дизейблит кнопку, если `count > limit`).
5
+ *
6
+ * Зачем общая константа: иначе магическое `5000` живёт в двух местах,
7
+ * и при апдейте бэка фронт продолжит разрешать клик на 5001-й строке,
8
+ * валя пользователя в 400 `EXPORT_TOO_LARGE`.
9
+ *
10
+ * Реализованные на бэке потолки:
11
+ * - `OrderService.EXPORT_LIMIT` — `GET /orders/export`
12
+ * - `ClientService.EXPORT_LIMIT` — `GET /clients/export`
13
+ *
14
+ * Не покрыты лимитом (TODO): `transactions/export`, `users/sessions/export`.
15
+ * Когда добавится — взять отсюда же.
16
+ */
17
+ export declare const EXPORT_LIMITS: {
18
+ readonly ORDERS: 5000;
19
+ readonly CLIENTS: 5000;
20
+ };
21
+ export type ExportLimitKey = keyof typeof EXPORT_LIMITS;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EXPORT_LIMITS = void 0;
4
+ /**
5
+ * Единые лимиты на размер XLSX-выгрузок. Импортится и бэком
6
+ * (`*.Service.EXPORT_LIMIT` + count-precheck в контроллере), и
7
+ * фронтом (`ExportAndCount` дизейблит кнопку, если `count > limit`).
8
+ *
9
+ * Зачем общая константа: иначе магическое `5000` живёт в двух местах,
10
+ * и при апдейте бэка фронт продолжит разрешать клик на 5001-й строке,
11
+ * валя пользователя в 400 `EXPORT_TOO_LARGE`.
12
+ *
13
+ * Реализованные на бэке потолки:
14
+ * - `OrderService.EXPORT_LIMIT` — `GET /orders/export`
15
+ * - `ClientService.EXPORT_LIMIT` — `GET /clients/export`
16
+ *
17
+ * Не покрыты лимитом (TODO): `transactions/export`, `users/sessions/export`.
18
+ * Когда добавится — взять отсюда же.
19
+ */
20
+ exports.EXPORT_LIMITS = {
21
+ ORDERS: 5000,
22
+ CLIENTS: 5000,
23
+ };
@@ -1,4 +1,13 @@
1
1
  import { PromocodeKindEnum } from '../promocode/emun/promocode-kind.enum';
2
+ import { DashboardQueryDto } from './pnl';
3
+ /**
4
+ * Запрос отчёта по промокодам. Расширяет общий `DashboardQueryDto`
5
+ * опциональным фильтром по типу промокода (`kind`). При отсутствии
6
+ * `kind` бекенд считает по всем типам как раньше.
7
+ */
8
+ export declare class PromocodesQueryDto extends DashboardQueryDto {
9
+ kind?: PromocodeKindEnum;
10
+ }
2
11
  /**
3
12
  * Богатый отчёт по промокодам за выбранный период.
4
13
  *
@@ -37,22 +46,9 @@ export type PromocodesTopRow = {
37
46
  applications: number;
38
47
  discountAmount: number;
39
48
  };
40
- export type PromocodesTimelineRow = {
41
- period: string;
42
- created: number;
43
- applied: number;
44
- discountAmount: number;
45
- };
46
- export type PromocodesByUtmRow = {
47
- utmCampaign: string;
48
- applications: number;
49
- discountAmount: number;
50
- };
51
49
  export type PromocodesReportRO = {
52
50
  kpi: PromocodesKpi;
53
51
  byKind: PromocodesByKindRow[];
54
52
  byChannel: PromocodesByChannelRow[];
55
53
  topPromocodes: PromocodesTopRow[];
56
- timeline: PromocodesTimelineRow[];
57
- topUtmCampaigns: PromocodesByUtmRow[];
58
54
  };
@@ -1,2 +1,28 @@
1
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
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PromocodesQueryDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ const promocode_kind_enum_1 = require("../promocode/emun/promocode-kind.enum");
15
+ const pnl_1 = require("./pnl");
16
+ /**
17
+ * Запрос отчёта по промокодам. Расширяет общий `DashboardQueryDto`
18
+ * опциональным фильтром по типу промокода (`kind`). При отсутствии
19
+ * `kind` бекенд считает по всем типам как раньше.
20
+ */
21
+ class PromocodesQueryDto extends pnl_1.DashboardQueryDto {
22
+ }
23
+ exports.PromocodesQueryDto = PromocodesQueryDto;
24
+ __decorate([
25
+ (0, class_validator_1.IsOptional)(),
26
+ (0, class_validator_1.IsEnum)(promocode_kind_enum_1.PromocodeKindEnum),
27
+ __metadata("design:type", String)
28
+ ], PromocodesQueryDto.prototype, "kind", void 0);