@escapenavigator/types 2.0.46 → 2.0.48

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 (35) hide show
  1. package/dist/forms/widget/widget-players-form.dto.d.ts +7 -0
  2. package/dist/forms/widget/widget-players-form.dto.js +6 -0
  3. package/dist/lead/query-leads.dto.d.ts +4 -2
  4. package/dist/lead/query-leads.dto.js +20 -1
  5. package/dist/openapi/orders/openapi-create-preorder.dto.d.ts +9 -2
  6. package/dist/openapi/orders/openapi-create-preorder.dto.js +6 -0
  7. package/dist/openapi/orders/openapi-order.ro.d.ts +19 -5
  8. package/dist/openapi/orders/openapi-order.ro.js +8 -0
  9. package/dist/openapi/orders/openapi-update-order-players.dto.d.ts +9 -2
  10. package/dist/openapi/orders/openapi-update-order-players.dto.js +6 -0
  11. package/dist/openapi/orders/openapi-update-order.dto.d.ts +7 -0
  12. package/dist/openapi/orders/openapi-update-order.dto.js +6 -0
  13. package/dist/openapi/slots/openapi-slot-variation.ro.d.ts +2 -0
  14. package/dist/openapi/slots/openapi-slot-variation.ro.js +21 -1
  15. package/dist/order/create-order.dto.d.ts +8 -2
  16. package/dist/order/create-order.dto.js +6 -0
  17. package/dist/order/order.ro.d.ts +21 -4
  18. package/dist/order/order.ro.js +8 -0
  19. package/dist/order/update-order-slot.dto.d.ts +6 -0
  20. package/dist/order/update-order-slot.dto.js +6 -0
  21. package/dist/order/update-players.dto.d.ts +9 -3
  22. package/dist/order/update-players.dto.js +6 -0
  23. package/dist/profile/widget-customization/update-widget-customization.dto.js +1 -1
  24. package/dist/tariff/create-tariff.dto.d.ts +10 -0
  25. package/dist/tariff/create-tariff.dto.js +9 -0
  26. package/dist/tariff/enum/tariff-category-mode.enum.d.ts +20 -0
  27. package/dist/tariff/enum/tariff-category-mode.enum.js +24 -0
  28. package/dist/tariff/tariff-category.d.ts +51 -0
  29. package/dist/tariff/tariff-category.dto.d.ts +19 -0
  30. package/dist/tariff/tariff-category.dto.js +62 -0
  31. package/dist/tariff/tariff-category.js +9 -0
  32. package/dist/tariff/tariff-light.ro.d.ts +9 -2
  33. package/dist/tariff/tariff-light.ro.js +6 -2
  34. package/dist/tsconfig.build.tsbuildinfo +1 -1
  35. package/package.json +2 -2
@@ -1,4 +1,5 @@
1
1
  import { Languages } from '../../shared/enum/languages.enum';
2
+ import { OrderComposition } from '../../tariff/tariff-category';
2
3
  export declare class WidgetPlayersFormDto {
3
4
  upsellings: Array<{
4
5
  id: number;
@@ -11,6 +12,12 @@ export declare class WidgetPlayersFormDto {
11
12
  children: number;
12
13
  /** Сколько мест гость выбрал по льготной ставке тарифа. */
13
14
  reducedPlayers?: number;
15
+ /**
16
+ * Состав по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`. Ведущее
17
+ * поле формы — `players` / `children` / `reducedPlayers` считаются из него
18
+ * и уезжают на бэк ради не обновлённых клиентов.
19
+ */
20
+ composition?: OrderComposition;
14
21
  /**
15
22
  * «Определимся на месте» (playersSelectMode=OPTIONAL/HIDDEN): состав не
16
23
  * определён, `players` засеян минимумом квеста, дети скрыты/сброшены.
@@ -55,6 +55,12 @@ __decorate([
55
55
  (0, class_transformer_1.Expose)(),
56
56
  __metadata("design:type", Number)
57
57
  ], WidgetPlayersFormDto.prototype, "reducedPlayers", void 0);
58
+ __decorate([
59
+ (0, class_validator_1.IsOptional)(),
60
+ (0, class_validator_1.IsObject)(),
61
+ (0, class_transformer_1.Expose)(),
62
+ __metadata("design:type", Object)
63
+ ], WidgetPlayersFormDto.prototype, "composition", void 0);
58
64
  __decorate([
59
65
  (0, class_validator_1.IsOptional)(),
60
66
  (0, class_transformer_1.Expose)(),
@@ -15,6 +15,8 @@ export declare class QueryLeadsDto {
15
15
  dateFrom?: string;
16
16
  dateTo?: string;
17
17
  }
18
+ /** Axios шлёт `where` строкой; таблица и тесты — объектом. */
19
+ export declare const parseQueryWhere: (value: unknown) => Record<string, unknown> | undefined;
18
20
  /** Постраничный список для табличного вида. */
19
21
  export declare class QueryLeadsListDto extends QueryLeadsDto {
20
22
  page: number;
@@ -22,8 +24,8 @@ export declare class QueryLeadsListDto extends QueryLeadsDto {
22
24
  sort?: string;
23
25
  order?: 'ASC' | 'DESC';
24
26
  /**
25
- * Таблица CRM держит фильтры в `where` (см. `QueryDto`), значения там —
26
- * сырые строки из URL. Бэк приводит их к плоским полям сам.
27
+ * Таблица CRM кладёт фильтры в `where`. Axios 0.21 сериализует вложенный
28
+ * объект как JSON-строку (`where=%7B%7D`), поэтому сначала парсим.
27
29
  */
28
30
  where?: Record<string, unknown>;
29
31
  }
@@ -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.QueryLeadsListDto = exports.QueryLeadsDto = void 0;
12
+ exports.QueryLeadsListDto = exports.parseQueryWhere = exports.QueryLeadsDto = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const normalize_search_text_1 = require("../shared/normalize-search-text");
@@ -80,6 +80,24 @@ __decorate([
80
80
  (0, class_validator_1.IsString)(),
81
81
  __metadata("design:type", String)
82
82
  ], QueryLeadsDto.prototype, "dateTo", void 0);
83
+ /** Axios шлёт `where` строкой; таблица и тесты — объектом. */
84
+ const parseQueryWhere = (value) => {
85
+ if (value == null || value === '')
86
+ return undefined;
87
+ if (typeof value === 'object' && !Array.isArray(value)) {
88
+ return value;
89
+ }
90
+ if (typeof value !== 'string')
91
+ return undefined;
92
+ try {
93
+ const parsed = JSON.parse(value);
94
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : undefined;
95
+ }
96
+ catch (_a) {
97
+ return undefined;
98
+ }
99
+ };
100
+ exports.parseQueryWhere = parseQueryWhere;
83
101
  /** Постраничный список для табличного вида. */
84
102
  class QueryLeadsListDto extends QueryLeadsDto {
85
103
  }
@@ -106,6 +124,7 @@ __decorate([
106
124
  ], QueryLeadsListDto.prototype, "order", void 0);
107
125
  __decorate([
108
126
  (0, class_validator_1.IsOptional)(),
127
+ (0, class_transformer_1.Transform)(({ value }) => (0, exports.parseQueryWhere)(value)),
109
128
  (0, class_validator_1.IsObject)(),
110
129
  __metadata("design:type", Object)
111
130
  ], QueryLeadsListDto.prototype, "where", void 0);
@@ -2,6 +2,7 @@ import { ClientFormDto } from '../../client/client-form.dto';
2
2
  import { CustomFieldTypeEnum } from '../../custom-field/enum/custom-field-type.enum';
3
3
  import { Utm } from '../../order/order.ro';
4
4
  import { Languages } from '../../shared/enum/languages.enum';
5
+ import { OrderComposition } from '../../tariff/tariff-category';
5
6
  export declare class CustomFiled {
6
7
  id: number;
7
8
  title: string;
@@ -25,10 +26,16 @@ export declare class OpenapiCreatePreorderDto extends ClientFormDto {
25
26
  children: number;
26
27
  /**
27
28
  * Сколько мест из `players` идёт по льготной ставке тарифа (школьники,
28
- * студенты). Верхнюю границу считает бэкенд из минимальной стоимости игры
29
- * превышение отклоняется как `reducedPlayersLimitExceeded`.
29
+ * студенты). Не больше состава иначе `reducedPlayersLimitExceeded`.
30
+ * Минимум игры режет сумму, а не это число.
30
31
  */
31
32
  reducedPlayers?: number;
33
+ /**
34
+ * Состав по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`.
35
+ * Приоритетнее `players` / `children` / `reducedPlayers` — те оставлены
36
+ * для не обновлённых клиентов и пересчитываются из состава на бэке.
37
+ */
38
+ composition?: OrderComposition;
32
39
  /**
33
40
  * Состав группы не определён: гость выбрал «Определимся на месте»
34
41
  * (playersSelectMode=OPTIONAL) или квест вовсе не спрашивает количество
@@ -92,6 +92,12 @@ __decorate([
92
92
  (0, class_transformer_1.Expose)(),
93
93
  __metadata("design:type", Number)
94
94
  ], OpenapiCreatePreorderDto.prototype, "reducedPlayers", void 0);
95
+ __decorate([
96
+ (0, class_validator_1.IsOptional)(),
97
+ (0, class_validator_1.IsObject)(),
98
+ (0, class_transformer_1.Expose)(),
99
+ __metadata("design:type", Object)
100
+ ], OpenapiCreatePreorderDto.prototype, "composition", void 0);
95
101
  __decorate([
96
102
  (0, class_validator_1.IsOptional)(),
97
103
  (0, class_validator_1.IsBoolean)(),
@@ -3,6 +3,7 @@ import { ProfileCurrencyEnum } from '../../profile/enum/profile-currency';
3
3
  import { QuestroomCancelationTypeEnum } from '../../questroom/enum/questroom-cancelation-type.enum';
4
4
  import { Languages } from '../../shared/enum/languages.enum';
5
5
  import { TariffReducedRateModeEnum } from '../../tariff/enum/tariff-reduced-rate-mode.enum';
6
+ import { OrderComposition, TariffCategory } from '../../tariff/tariff-category';
6
7
  import { OpenapiClientRO } from '../shared/openapi-client.ro';
7
8
  import { OpenapiOrderCertificateRO } from '../shared/openapi-order-certificate.ro';
8
9
  import { OpenapiOrderTransactionRO } from '../shared/openapi-order-transaction.ro';
@@ -56,20 +57,33 @@ export declare class OpenapiOrderRO extends QuestroomRow {
56
57
  canceledWithFine: boolean;
57
58
  toPay: number;
58
59
  total: number;
60
+ /**
61
+ * Состав брони по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`.
62
+ * Вместе со снимком `categories` — источник истины для цены.
63
+ */
64
+ composition: OrderComposition;
65
+ /**
66
+ * Снимок категорий тарифа на момент брони. Пустой у броней, оформленных
67
+ * до перехода на категории: их цена считается из полей ниже.
68
+ * Динамический массив, поэтому без `@Type(() => …)`.
69
+ */
70
+ categories: TariffCategory[];
71
+ /** Гостей, занимающих место в сетке цен. Денорм из `composition`. */
59
72
  players: number;
73
+ /** Гостей, оплачиваемых надбавкой сверх групповой цены. Денорм из `composition`. */
60
74
  children: number;
61
75
  /**
62
- * Сколько мест из `players` идёт по льготной ставке тарифа (школьники,
63
- * студенты). Каждое такое место уменьшает цену уровня, но не добавляет
64
- * участника цена по-прежнему ищется по `players`.
76
+ * Сколько мест из `players` идёт не по базовой ставке (школьники,
77
+ * студенты, пенсионеры). Денорм из `composition`: при нескольких
78
+ * скидочных категориях это их сумма, и цену по нему не восстановить.
65
79
  */
66
80
  reducedPlayers: number;
67
81
  /** Название льготной категории на момент брони, например «Школьники». */
68
82
  reducedTitle?: string | null;
69
83
  /**
70
84
  * Снимок льготной ставки и минимальной стоимости игры с тарифа. Виджет
71
- * считает по ним цену и лимит льготных мест той же формулой, что бэкенд,
72
- * поэтому показанная сумма совпадает с той, по которой оформится бронь.
85
+ * считает по ним цену той же формулой, что бэкенд: группа минус ставка,
86
+ * не ниже минимума.
73
87
  */
74
88
  reducedRateMode?: TariffReducedRateModeEnum | null;
75
89
  reducedRate: number;
@@ -164,6 +164,14 @@ __decorate([
164
164
  (0, class_transformer_1.Expose)(),
165
165
  __metadata("design:type", Number)
166
166
  ], OpenapiOrderRO.prototype, "total", void 0);
167
+ __decorate([
168
+ (0, class_transformer_1.Expose)(),
169
+ __metadata("design:type", Object)
170
+ ], OpenapiOrderRO.prototype, "composition", void 0);
171
+ __decorate([
172
+ (0, class_transformer_1.Expose)(),
173
+ __metadata("design:type", Array)
174
+ ], OpenapiOrderRO.prototype, "categories", void 0);
167
175
  __decorate([
168
176
  (0, class_transformer_1.Expose)(),
169
177
  __metadata("design:type", Number)
@@ -1,3 +1,4 @@
1
+ import { OrderComposition } from '../../tariff/tariff-category';
1
2
  export declare class OpenapiUpdateOrderPLayersDto {
2
3
  orderToken: string;
3
4
  maxPlayers: number;
@@ -5,8 +6,14 @@ export declare class OpenapiUpdateOrderPLayersDto {
5
6
  players: number;
6
7
  children: number;
7
8
  /**
8
- * Льготные места. Не передано — остаётся прежнее значение брони. Лимит
9
- * пересчитывает бэкенд из минимальной стоимости игры.
9
+ * Льготные места. Не передано — остаётся прежнее значение брони.
10
+ * Не больше состава; минимум игры режет сумму, а не это число.
10
11
  */
11
12
  reducedPlayers?: number;
13
+ /**
14
+ * Состав по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`.
15
+ * Приоритетнее `players` / `children` / `reducedPlayers` — те оставлены
16
+ * для не обновлённых клиентов и пересчитываются из состава на бэке.
17
+ */
18
+ composition?: OrderComposition;
12
19
  }
@@ -49,3 +49,9 @@ __decorate([
49
49
  (0, class_transformer_1.Expose)(),
50
50
  __metadata("design:type", Number)
51
51
  ], OpenapiUpdateOrderPLayersDto.prototype, "reducedPlayers", void 0);
52
+ __decorate([
53
+ (0, class_validator_1.IsOptional)(),
54
+ (0, class_validator_1.IsObject)(),
55
+ (0, class_transformer_1.Expose)(),
56
+ __metadata("design:type", Object)
57
+ ], OpenapiUpdateOrderPLayersDto.prototype, "composition", void 0);
@@ -1,5 +1,6 @@
1
1
  import { ClientFormDto } from '../../client/client-form.dto';
2
2
  import { Languages } from '../../shared/enum/languages.enum';
3
+ import { OrderComposition } from '../../tariff/tariff-category';
3
4
  import { CustomFiled } from './openapi-create-preorder.dto';
4
5
  export declare class OpenapiUpdateOrderDto extends ClientFormDto {
5
6
  orderToken?: string;
@@ -10,6 +11,12 @@ export declare class OpenapiUpdateOrderDto extends ClientFormDto {
10
11
  * лимит всё равно пересчитывается по новому составу.
11
12
  */
12
13
  reducedPlayers?: number;
14
+ /**
15
+ * Состав по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`.
16
+ * Приоритетнее `players` / `children` / `reducedPlayers` — те оставлены
17
+ * для не обновлённых клиентов и пересчитываются из состава на бэке.
18
+ */
19
+ composition?: OrderComposition;
13
20
  /**
14
21
  * Состав не определён («Определимся на месте»). Прокидывается при
15
22
  * повторном сабмите шага «Контакт» (retry-путь виджета), чтобы флаг на
@@ -42,6 +42,12 @@ __decorate([
42
42
  (0, class_transformer_1.Expose)(),
43
43
  __metadata("design:type", Number)
44
44
  ], OpenapiUpdateOrderDto.prototype, "reducedPlayers", void 0);
45
+ __decorate([
46
+ (0, class_validator_1.IsOptional)(),
47
+ (0, class_validator_1.IsObject)(),
48
+ (0, class_transformer_1.Expose)(),
49
+ __metadata("design:type", Object)
50
+ ], OpenapiUpdateOrderDto.prototype, "composition", void 0);
45
51
  __decorate([
46
52
  (0, class_validator_1.IsOptional)(),
47
53
  (0, class_validator_1.IsBoolean)(),
@@ -1,4 +1,5 @@
1
1
  import { TariffReducedRateModeEnum } from '../../tariff/enum/tariff-reduced-rate-mode.enum';
2
+ import { TariffCategory } from '../../tariff/tariff-category';
2
3
  export declare class OpenapiSlotVariationRO {
3
4
  id: string;
4
5
  tariffId: number;
@@ -8,6 +9,7 @@ export declare class OpenapiSlotVariationRO {
8
9
  isDefault: boolean;
9
10
  isFree: boolean;
10
11
  tariff: Record<string, number>;
12
+ categories: TariffCategory[];
11
13
  childPriceDescription?: string | null;
12
14
  minGameAmount: number;
13
15
  reducedRateMode?: TariffReducedRateModeEnum | null;
@@ -87,8 +87,28 @@ __decorate([
87
87
  ], OpenapiSlotVariationRO.prototype, "tariff", void 0);
88
88
  __decorate([
89
89
  (0, swagger_1.ApiProperty)({
90
- description: 'Optional note for child pricing (e.g. age rules), shown next to the children count picker',
90
+ description: 'Participant categories of the variation: one stepper row each in the composition picker. ' +
91
+ 'Exactly one category has `mode: "base"` and is priced as a full share of the group price ' +
92
+ '`tariff[N] / N`. The others are relative to that share: `delta` — cheaper by `value` minor ' +
93
+ 'units, `percent` — cheaper by `value` basis points (1% = 100), `fixed` — costs exactly ' +
94
+ '`value` per guest. `countsInPrice: false` means the guest does not affect which `tariff[N]` ' +
95
+ 'level is used and is charged on top of the group price. ' +
96
+ 'Dynamic array, therefore NOT wrapped in @Type(() => …).',
97
+ example: [
98
+ { key: 'adult', title: 'Adults', mode: 'base', value: 0, countsInPrice: true },
99
+ { key: 'child', title: 'Under 7', mode: 'fixed', value: 0, countsInPrice: false },
100
+ ],
101
+ isArray: true,
102
+ }),
103
+ (0, class_transformer_1.Expose)(),
104
+ __metadata("design:type", Array)
105
+ ], OpenapiSlotVariationRO.prototype, "categories", void 0);
106
+ __decorate([
107
+ (0, swagger_1.ApiProperty)({
108
+ description: 'Optional note for child pricing (e.g. age rules), shown next to the children count picker. ' +
109
+ 'Legacy: superseded by the `description` of the corresponding entry in `categories`.',
91
110
  required: false,
111
+ deprecated: true,
92
112
  }),
93
113
  (0, class_transformer_1.Expose)(),
94
114
  __metadata("design:type", String)
@@ -1,4 +1,5 @@
1
1
  import { Languages } from '../shared/enum/languages.enum';
2
+ import { OrderComposition } from '../tariff/tariff-category';
2
3
  export declare class CreateOrderDto {
3
4
  slotId?: number;
4
5
  questroomId: number;
@@ -10,10 +11,15 @@ export declare class CreateOrderDto {
10
11
  children: number;
11
12
  /**
12
13
  * Сколько мест из `players` идёт по льготной ставке тарифа (школьники,
13
- * студенты). Лимит считает бэк из минимальной стоимости игры клиенту
14
- * здесь не верим.
14
+ * студенты). Не больше состава; ниже минимума игры цену не опустит бэк.
15
15
  */
16
16
  reducedPlayers?: number;
17
+ /**
18
+ * Состав по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`.
19
+ * Приоритетнее `players` / `children` / `reducedPlayers` — те оставлены
20
+ * для не обновлённых клиентов и пересчитываются из состава на бэке.
21
+ */
22
+ composition?: OrderComposition;
17
23
  mode: string;
18
24
  promocodeId?: number;
19
25
  certificateId?: number;
@@ -67,6 +67,12 @@ __decorate([
67
67
  (0, class_transformer_1.Expose)(),
68
68
  __metadata("design:type", Number)
69
69
  ], CreateOrderDto.prototype, "reducedPlayers", void 0);
70
+ __decorate([
71
+ (0, class_validator_1.IsOptional)(),
72
+ (0, class_validator_1.IsObject)(),
73
+ (0, class_transformer_1.Expose)(),
74
+ __metadata("design:type", Object)
75
+ ], CreateOrderDto.prototype, "composition", void 0);
70
76
  __decorate([
71
77
  (0, class_validator_1.IsOptional)(),
72
78
  (0, class_transformer_1.Expose)(),
@@ -9,6 +9,7 @@ import { Languages } from '../shared/enum/languages.enum';
9
9
  import { RO } from '../shared/ro-class';
10
10
  import { SourceEnum } from '../shared/source.enum';
11
11
  import { TariffReducedRateModeEnum } from '../tariff/enum/tariff-reduced-rate-mode.enum';
12
+ import { OrderComposition, TariffCategory } from '../tariff/tariff-category';
12
13
  import { TransactionSourceEnum } from '../transaction/enum/transaction-source.enum';
13
14
  import { TransactionTypeEnum } from '../transaction/enum/transaction-type.enum';
14
15
  import { UserMessageResponseObject } from '../user-message/user-message.ro';
@@ -244,14 +245,30 @@ export declare class OrderRO extends RO {
244
245
  refundedAmount: number;
245
246
  groupId?: number;
246
247
  groupShare?: number;
248
+ /**
249
+ * Состав брони по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`.
250
+ * Вместе со снимком `categories` — источник истины для цены.
251
+ */
252
+ composition: OrderComposition;
253
+ /**
254
+ * Снимок категорий тарифа на момент брони. Пустой у броней, оформленных
255
+ * до перехода на категории: их цена считается из полей ниже.
256
+ * Динамический массив, поэтому без `@Type(() => …)`.
257
+ */
258
+ categories: TariffCategory[];
259
+ /** Гостей, занимающих место в сетке цен. Денорм из `composition`. */
247
260
  players: number;
261
+ /** Гостей, оплачиваемых надбавкой сверх групповой цены. Денорм из `composition`. */
248
262
  children: number;
249
- /** Сколько мест из `players` идёт по льготной ставке (школьники и т.п.). */
263
+ /**
264
+ * Сколько мест из `players` идёт не по базовой ставке (школьники и т.п.).
265
+ * Денорм из `composition`.
266
+ */
250
267
  reducedPlayers: number;
251
268
  /**
252
- * Снимок льготной ставки и минимальной стоимости игры с тарифа. Пикер в
253
- * карточке брони считает по ним лимит льготных мест, поэтому смотрит на
254
- * условия, действовавшие при бронировании, а не на текущий тариф.
269
+ * Снимок льготной ставки и минимальной стоимости игры с тарифа. Пикер
270
+ * считает по ним цену (группа минус ставка, не ниже минимума) на условиях
271
+ * брони, а не текущего тарифа.
255
272
  */
256
273
  minGameAmount: number;
257
274
  reducedRateMode?: TariffReducedRateModeEnum | null;
@@ -561,6 +561,14 @@ __decorate([
561
561
  (0, class_transformer_1.Expose)(),
562
562
  __metadata("design:type", Number)
563
563
  ], OrderRO.prototype, "groupShare", void 0);
564
+ __decorate([
565
+ (0, class_transformer_1.Expose)(),
566
+ __metadata("design:type", Object)
567
+ ], OrderRO.prototype, "composition", void 0);
568
+ __decorate([
569
+ (0, class_transformer_1.Expose)(),
570
+ __metadata("design:type", Array)
571
+ ], OrderRO.prototype, "categories", void 0);
564
572
  __decorate([
565
573
  (0, class_transformer_1.Expose)(),
566
574
  __metadata("design:type", Number)
@@ -1,3 +1,4 @@
1
+ import { OrderComposition } from '../tariff/tariff-category';
1
2
  export declare class UpdateOrderSlotDto {
2
3
  slotId?: number;
3
4
  questroomId: number;
@@ -21,6 +22,11 @@ export declare class UpdateOrderSlotDto {
21
22
  * game price — a cheaper tariff may fit fewer reduced seats).
22
23
  */
23
24
  reducedPlayers?: number;
25
+ /**
26
+ * Состав по категориям нового тарифа. Не передан — переносится состав
27
+ * брони: категории, которых в новом тарифе нет, схлопываются в базовую.
28
+ */
29
+ composition?: OrderComposition;
24
30
  /**
25
31
  * Free-form text describing the resolved variation/duration (e.g. the
26
32
  * variation title for fix slots or `${duration} мин` for flex slots).
@@ -66,6 +66,12 @@ __decorate([
66
66
  (0, class_transformer_1.Expose)(),
67
67
  __metadata("design:type", Number)
68
68
  ], UpdateOrderSlotDto.prototype, "reducedPlayers", void 0);
69
+ __decorate([
70
+ (0, class_validator_1.IsOptional)(),
71
+ (0, class_validator_1.IsObject)(),
72
+ (0, class_transformer_1.Expose)(),
73
+ __metadata("design:type", Object)
74
+ ], UpdateOrderSlotDto.prototype, "composition", void 0);
69
75
  __decorate([
70
76
  (0, class_validator_1.IsOptional)(),
71
77
  (0, class_validator_1.IsString)(),
@@ -1,10 +1,16 @@
1
+ import { OrderComposition } from '../tariff/tariff-category';
1
2
  export declare class UpdatePlayersrDto {
2
3
  players: number;
3
4
  children: number;
4
5
  /**
5
- * Сколько мест идёт по льготной ставке. Не передан — оставляем как было
6
- * (эндпоинт правит только состав). Верхнюю границу считает бэк из
7
- * минимальной стоимости игры, а не доверяет клиенту.
6
+ * Сколько мест идёт по льготной ставке. Не передан — оставляем как было.
7
+ * Не больше состава; минимум игры режет сумму, а не это число.
8
8
  */
9
9
  reducedPlayers?: number;
10
+ /**
11
+ * Состав по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`.
12
+ * Приоритетнее `players` / `children` / `reducedPlayers` — те оставлены
13
+ * для не обновлённых клиентов и пересчитываются из состава на бэке.
14
+ */
15
+ composition?: OrderComposition;
10
16
  }
@@ -32,3 +32,9 @@ __decorate([
32
32
  (0, class_transformer_1.Expose)(),
33
33
  __metadata("design:type", Number)
34
34
  ], UpdatePlayersrDto.prototype, "reducedPlayers", void 0);
35
+ __decorate([
36
+ (0, class_validator_1.IsOptional)(),
37
+ (0, class_validator_1.IsObject)(),
38
+ (0, class_transformer_1.Expose)(),
39
+ __metadata("design:type", Object)
40
+ ], UpdatePlayersrDto.prototype, "composition", void 0);
@@ -56,7 +56,7 @@ __decorate([
56
56
  __metadata("design:type", Boolean)
57
57
  ], UpdateWidgetCustomizationDto.prototype, "showCertificatesButton", void 0);
58
58
  __decorate([
59
- (0, class_transformer_1.Transform)(({ value }) => (value === '' || value === null || value === undefined ? true : value)),
59
+ (0, class_transformer_1.Transform)(({ value }) => value === '' || value === null || value === undefined ? true : value),
60
60
  (0, class_validator_1.IsBoolean)(),
61
61
  (0, class_transformer_1.Expose)(),
62
62
  __metadata("design:type", Boolean)
@@ -1,9 +1,19 @@
1
1
  import { TariffReducedRateModeEnum } from './enum/tariff-reduced-rate-mode.enum';
2
+ import { TariffCategoryDto } from './tariff-category.dto';
2
3
  export declare class CreateTariffDto {
3
4
  title: string;
4
5
  price: {
5
6
  [x: string]: number;
6
7
  };
8
+ /**
9
+ * Категории участников: единый список строк в пикере состава. Ровно одна
10
+ * категория с `mode: base`.
11
+ *
12
+ * Опционально ради совместимости: старые клиенты (мобильное приложение,
13
+ * не обновлённые интеграции) шлют `childPriceDescription` + `reduced*`,
14
+ * и бэкенд собирает категории из них сам (см. `categoriesFromTariff`).
15
+ */
16
+ categories?: TariffCategoryDto[];
7
17
  isVariationEligible?: boolean;
8
18
  /**
9
19
  * Доступен ли альтернативный тариф (вариация) для выбора в виджете.
@@ -15,6 +15,7 @@ const class_transformer_1 = require("class-transformer");
15
15
  const class_validator_1 = require("class-validator");
16
16
  const is_not_blank_1 = require("../shared/is-not-blank");
17
17
  const tariff_reduced_rate_mode_enum_1 = require("./enum/tariff-reduced-rate-mode.enum");
18
+ const tariff_category_dto_1 = require("./tariff-category.dto");
18
19
  class CreateTariffDto {
19
20
  }
20
21
  exports.CreateTariffDto = CreateTariffDto;
@@ -28,6 +29,14 @@ __decorate([
28
29
  (0, class_transformer_1.Expose)(),
29
30
  __metadata("design:type", Object)
30
31
  ], CreateTariffDto.prototype, "price", void 0);
32
+ __decorate([
33
+ (0, class_validator_1.IsOptional)(),
34
+ (0, class_validator_1.IsArray)(),
35
+ (0, class_validator_1.ValidateNested)({ each: true }),
36
+ (0, class_transformer_1.Type)(() => tariff_category_dto_1.TariffCategoryDto),
37
+ (0, class_transformer_1.Expose)(),
38
+ __metadata("design:type", Array)
39
+ ], CreateTariffDto.prototype, "categories", void 0);
31
40
  __decorate([
32
41
  (0, class_validator_1.IsOptional)(),
33
42
  (0, class_validator_1.IsBoolean)(),
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Как считается цена одного гостя категории относительно базовой доли —
3
+ * `price[состав] / состав`.
4
+ *
5
+ * Категория заменяет три прежние независимые оси состава (взрослые,
6
+ * `price.child` сверху, `reducedPlayers` внутри группы) одним списком строк
7
+ * в пикере. Прежние настройки выражаются без потерь: детская надбавка — это
8
+ * `FIXED` с `countsInPrice: false`, льготная ставка `delta` — `DELTA`, а
9
+ * льготная ставка `fixed` — `FIXED` с `countsInPrice: true`.
10
+ */
11
+ export declare enum TariffCategoryModeEnum {
12
+ /** Полная доля групповой цены. Ровно одна категория тарифа. */
13
+ BASE = "base",
14
+ /** На `value` минорных единиц дешевле базовой доли. */
15
+ DELTA = "delta",
16
+ /** Ровно `value` минорных единиц за гостя. */
17
+ FIXED = "fixed",
18
+ /** На `value` базисных пунктов (1% = 100) дешевле базовой доли. */
19
+ PERCENT = "percent"
20
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TariffCategoryModeEnum = void 0;
4
+ /**
5
+ * Как считается цена одного гостя категории относительно базовой доли —
6
+ * `price[состав] / состав`.
7
+ *
8
+ * Категория заменяет три прежние независимые оси состава (взрослые,
9
+ * `price.child` сверху, `reducedPlayers` внутри группы) одним списком строк
10
+ * в пикере. Прежние настройки выражаются без потерь: детская надбавка — это
11
+ * `FIXED` с `countsInPrice: false`, льготная ставка `delta` — `DELTA`, а
12
+ * льготная ставка `fixed` — `FIXED` с `countsInPrice: true`.
13
+ */
14
+ var TariffCategoryModeEnum;
15
+ (function (TariffCategoryModeEnum) {
16
+ /** Полная доля групповой цены. Ровно одна категория тарифа. */
17
+ TariffCategoryModeEnum["BASE"] = "base";
18
+ /** На `value` минорных единиц дешевле базовой доли. */
19
+ TariffCategoryModeEnum["DELTA"] = "delta";
20
+ /** Ровно `value` минорных единиц за гостя. */
21
+ TariffCategoryModeEnum["FIXED"] = "fixed";
22
+ /** На `value` базисных пунктов (1% = 100) дешевле базовой доли. */
23
+ TariffCategoryModeEnum["PERCENT"] = "percent";
24
+ })(TariffCategoryModeEnum || (exports.TariffCategoryModeEnum = TariffCategoryModeEnum = {}));
@@ -0,0 +1,51 @@
1
+ import { TariffCategoryModeEnum } from './enum/tariff-category-mode.enum';
2
+ /**
3
+ * Категория участников тарифа: одна строка со степпером в пикере состава.
4
+ *
5
+ * Заменяет три прежние оси (`players` по сетке, `price.child` сверху,
6
+ * `reducedPlayers` внутри группы) единым списком. Групповая сетка `price`
7
+ * при этом остаётся: категория описывает не абсолютный билет, а как цена
8
+ * гостя относится к базовой доле состава — иначе нелинейное ценообразование
9
+ * квестов (2 гостя дороже за человека, чем 5) выразить нельзя.
10
+ */
11
+ export type TariffCategory = {
12
+ /**
13
+ * Стабильный идентификатор внутри тарифа. Уезжает в состав заказа и в
14
+ * снимок на броне, поэтому переименование категории цену не меняет.
15
+ */
16
+ key: string;
17
+ /** Название для гостя: «Взрослые», «Дети до 7 лет», «Студенты». */
18
+ title: string;
19
+ /** Правила категории: возраст, документы. Рендерится под названием. */
20
+ description?: string | null;
21
+ mode: TariffCategoryModeEnum;
22
+ /**
23
+ * Смысл зависит от `mode`: скидка (`DELTA`), цена гостя (`FIXED`),
24
+ * скидка в базисных пунктах (`PERCENT`). Для `BASE` игнорируется.
25
+ */
26
+ value: number;
27
+ /**
28
+ * Считается ли гость при выборе уровня сетки `price[N]`.
29
+ *
30
+ * `true` — гость занимает место в составе, цена группы берётся с учётом
31
+ * его головы (так работают льготные места сейчас). `false` — гость идёт
32
+ * надбавкой сверх групповой цены и на выбор уровня не влияет (так
33
+ * работает `price.child` сейчас). На вместимость слота влияют обе.
34
+ */
35
+ countsInPrice: boolean;
36
+ /** Потолок гостей категории в одной броне. `null` — ограничен составом. */
37
+ max?: number | null;
38
+ };
39
+ /** Ключ базовой категории у тарифов, прошедших бэкфилл. */
40
+ export declare const BASE_CATEGORY_KEY = "adult";
41
+ /** Ключ категории, в которую бэкфилл переносит `price.child`. */
42
+ export declare const CHILD_CATEGORY_KEY = "child";
43
+ /** Ключ категории, в которую бэкфилл переносит льготную ставку. */
44
+ export declare const REDUCED_CATEGORY_KEY = "reduced";
45
+ /**
46
+ * Состав брони: сколько гостей в каждой категории тарифа.
47
+ *
48
+ * Названо не `participants`, потому что это имя на заказе занято связью с
49
+ * подписантами waiver'ов (`OrderParticipantEntity`).
50
+ */
51
+ export type OrderComposition = Record<string, number>;