@escapenavigator/types 2.0.47 → 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.
- package/dist/forms/widget/widget-players-form.dto.d.ts +7 -0
- package/dist/forms/widget/widget-players-form.dto.js +6 -0
- package/dist/lead/query-leads.dto.d.ts +4 -2
- package/dist/lead/query-leads.dto.js +20 -1
- package/dist/openapi/orders/openapi-create-preorder.dto.d.ts +7 -0
- package/dist/openapi/orders/openapi-create-preorder.dto.js +6 -0
- package/dist/openapi/orders/openapi-order.ro.d.ts +17 -3
- package/dist/openapi/orders/openapi-order.ro.js +8 -0
- package/dist/openapi/orders/openapi-update-order-players.dto.d.ts +7 -0
- package/dist/openapi/orders/openapi-update-order-players.dto.js +6 -0
- package/dist/openapi/orders/openapi-update-order.dto.d.ts +7 -0
- package/dist/openapi/orders/openapi-update-order.dto.js +6 -0
- package/dist/openapi/slots/openapi-slot-variation.ro.d.ts +2 -0
- package/dist/openapi/slots/openapi-slot-variation.ro.js +21 -1
- package/dist/order/create-order.dto.d.ts +7 -0
- package/dist/order/create-order.dto.js +6 -0
- package/dist/order/order.ro.d.ts +18 -1
- package/dist/order/order.ro.js +8 -0
- package/dist/order/update-order-slot.dto.d.ts +6 -0
- package/dist/order/update-order-slot.dto.js +6 -0
- package/dist/order/update-players.dto.d.ts +7 -0
- package/dist/order/update-players.dto.js +6 -0
- package/dist/tariff/create-tariff.dto.d.ts +10 -0
- package/dist/tariff/create-tariff.dto.js +9 -0
- package/dist/tariff/enum/tariff-category-mode.enum.d.ts +20 -0
- package/dist/tariff/enum/tariff-category-mode.enum.js +24 -0
- package/dist/tariff/tariff-category.d.ts +51 -0
- package/dist/tariff/tariff-category.dto.d.ts +19 -0
- package/dist/tariff/tariff-category.dto.js +62 -0
- package/dist/tariff/tariff-category.js +9 -0
- package/dist/tariff/tariff-light.ro.d.ts +7 -0
- package/dist/tariff/tariff-light.ro.js +4 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- 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
|
|
26
|
-
*
|
|
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;
|
|
@@ -29,6 +30,12 @@ export declare class OpenapiCreatePreorderDto extends ClientFormDto {
|
|
|
29
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,12 +57,25 @@ 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
|
-
*
|
|
76
|
+
* Сколько мест из `players` идёт не по базовой ставке (школьники,
|
|
77
|
+
* студенты, пенсионеры). Денорм из `composition`: при нескольких
|
|
78
|
+
* скидочных категориях это их сумма, и цену по нему не восстановить.
|
|
65
79
|
*/
|
|
66
80
|
reducedPlayers: number;
|
|
67
81
|
/** Название льготной категории на момент брони, например «Школьники». */
|
|
@@ -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;
|
|
@@ -9,4 +10,10 @@ export declare class OpenapiUpdateOrderPLayersDto {
|
|
|
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: '
|
|
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;
|
|
@@ -13,6 +14,12 @@ export declare class CreateOrderDto {
|
|
|
13
14
|
* студенты). Не больше состава; ниже минимума игры цену не опустит бэк.
|
|
14
15
|
*/
|
|
15
16
|
reducedPlayers?: number;
|
|
17
|
+
/**
|
|
18
|
+
* Состав по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`.
|
|
19
|
+
* Приоритетнее `players` / `children` / `reducedPlayers` — те оставлены
|
|
20
|
+
* для не обновлённых клиентов и пересчитываются из состава на бэке.
|
|
21
|
+
*/
|
|
22
|
+
composition?: OrderComposition;
|
|
16
23
|
mode: string;
|
|
17
24
|
promocodeId?: number;
|
|
18
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)(),
|
package/dist/order/order.ro.d.ts
CHANGED
|
@@ -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,9 +245,25 @@ 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
|
-
/**
|
|
263
|
+
/**
|
|
264
|
+
* Сколько мест из `players` идёт не по базовой ставке (школьники и т.п.).
|
|
265
|
+
* Денорм из `composition`.
|
|
266
|
+
*/
|
|
250
267
|
reducedPlayers: number;
|
|
251
268
|
/**
|
|
252
269
|
* Снимок льготной ставки и минимальной стоимости игры с тарифа. Пикер
|
package/dist/order/order.ro.js
CHANGED
|
@@ -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,3 +1,4 @@
|
|
|
1
|
+
import { OrderComposition } from '../tariff/tariff-category';
|
|
1
2
|
export declare class UpdatePlayersrDto {
|
|
2
3
|
players: number;
|
|
3
4
|
children: number;
|
|
@@ -6,4 +7,10 @@ export declare class UpdatePlayersrDto {
|
|
|
6
7
|
* Не больше состава; минимум игры режет сумму, а не это число.
|
|
7
8
|
*/
|
|
8
9
|
reducedPlayers?: number;
|
|
10
|
+
/**
|
|
11
|
+
* Состав по категориям тарифа: `{ adult: 2, student: 1, kid: 2 }`.
|
|
12
|
+
* Приоритетнее `players` / `children` / `reducedPlayers` — те оставлены
|
|
13
|
+
* для не обновлённых клиентов и пересчитываются из состава на бэке.
|
|
14
|
+
*/
|
|
15
|
+
composition?: OrderComposition;
|
|
9
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);
|
|
@@ -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>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TariffCategoryModeEnum } from './enum/tariff-category-mode.enum';
|
|
2
|
+
export declare class TariffCategoryDto {
|
|
3
|
+
/**
|
|
4
|
+
* Латиница/цифры/дефис: ключ уезжает в JSONB состава заказа и в ключи
|
|
5
|
+
* форм, поэтому пробелы и юникод здесь только мешают.
|
|
6
|
+
*/
|
|
7
|
+
key: string;
|
|
8
|
+
title: string;
|
|
9
|
+
description?: string | null;
|
|
10
|
+
mode: TariffCategoryModeEnum;
|
|
11
|
+
/**
|
|
12
|
+
* У базовой категории цена — доля групповой, поэтому значение не нужно.
|
|
13
|
+
* У остальных 0 допустим: «бесплатно» для `FIXED` и «без скидки» для
|
|
14
|
+
* `DELTA` — валидные настройки.
|
|
15
|
+
*/
|
|
16
|
+
value: number;
|
|
17
|
+
countsInPrice: boolean;
|
|
18
|
+
max?: number | null;
|
|
19
|
+
}
|