@escapenavigator/types 2.0.32 → 2.0.34

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.
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Оценка площадки в Google для публичных страниц агрегатора.
3
+ *
4
+ * Рейтинг относится к локации целиком, а не к отдельной комнате, поэтому в UI
5
+ * его нужно подписывать как оценку площадки. В нашу разметку schema.org он не
6
+ * попадает: размечать чужие оценки как собственный `AggregateRating` запрещено
7
+ * правилами Google, показывать их пользователю с атрибуцией — можно.
8
+ */
9
+ export declare class AgregatorGooglePlaceRO {
10
+ placeId: string;
11
+ rating: number;
12
+ reviewsCount: number;
13
+ }
@@ -0,0 +1,36 @@
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.AgregatorGooglePlaceRO = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ /**
15
+ * Оценка площадки в Google для публичных страниц агрегатора.
16
+ *
17
+ * Рейтинг относится к локации целиком, а не к отдельной комнате, поэтому в UI
18
+ * его нужно подписывать как оценку площадки. В нашу разметку schema.org он не
19
+ * попадает: размечать чужие оценки как собственный `AggregateRating` запрещено
20
+ * правилами Google, показывать их пользователю с атрибуцией — можно.
21
+ */
22
+ class AgregatorGooglePlaceRO {
23
+ }
24
+ exports.AgregatorGooglePlaceRO = AgregatorGooglePlaceRO;
25
+ __decorate([
26
+ (0, class_transformer_1.Expose)(),
27
+ __metadata("design:type", String)
28
+ ], AgregatorGooglePlaceRO.prototype, "placeId", void 0);
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ __metadata("design:type", Number)
32
+ ], AgregatorGooglePlaceRO.prototype, "rating", void 0);
33
+ __decorate([
34
+ (0, class_transformer_1.Expose)(),
35
+ __metadata("design:type", Number)
36
+ ], AgregatorGooglePlaceRO.prototype, "reviewsCount", void 0);
@@ -2,6 +2,7 @@ import { ProfileCurrencyEnum } from '../profile/enum/profile-currency';
2
2
  import { QuestroomTypeEnum } from '../questroom/enum/questroom-type.enum';
3
3
  import { Languages } from '../shared/enum/languages.enum';
4
4
  import { SubwayLineRO } from '../subway-station/subway-station.ro';
5
+ import { AgregatorGooglePlaceRO } from './agregator-google-place.ro';
5
6
  export declare class AgregatorQuestroomLocation {
6
7
  id: number;
7
8
  coordinates: [number, number];
@@ -19,6 +20,11 @@ export declare class AgregatorQuestroomLocation {
19
20
  * `lines.map(l => <Circle color={l.color}/>)` + `l.ref`.
20
21
  */
21
22
  subwayLines?: SubwayLineRO[];
23
+ /**
24
+ * Оценка площадки в Google. Приходит только с эндпоинтов, которые явно
25
+ * подмешивают её по `locationId`, иначе `undefined`.
26
+ */
27
+ googlePlace?: AgregatorGooglePlaceRO;
22
28
  }
23
29
  export declare class AgregatorQuestroomCardRO {
24
30
  id: number;
@@ -18,6 +18,7 @@ const profile_currency_1 = require("../profile/enum/profile-currency");
18
18
  const profile_step_enum_1 = require("../profile/enum/profile-step.enum");
19
19
  const questroom_type_enum_1 = require("../questroom/enum/questroom-type.enum");
20
20
  const languages_enum_1 = require("../shared/enum/languages.enum");
21
+ const agregator_google_place_ro_1 = require("./agregator-google-place.ro");
21
22
  const agregator_questroom_ro_1 = require("./agregator-questroom.ro");
22
23
  class AgregatorQuestroomLocation {
23
24
  }
@@ -45,6 +46,11 @@ __decorate([
45
46
  (0, class_transformer_1.Transform)(({ obj }) => { var _a, _b; return (_b = (_a = obj === null || obj === void 0 ? void 0 : obj.subwayStation) === null || _a === void 0 ? void 0 : _a.lines) !== null && _b !== void 0 ? _b : undefined; }),
46
47
  __metadata("design:type", Array)
47
48
  ], AgregatorQuestroomLocation.prototype, "subwayLines", void 0);
49
+ __decorate([
50
+ (0, class_transformer_1.Expose)(),
51
+ (0, class_transformer_1.Type)(() => agregator_google_place_ro_1.AgregatorGooglePlaceRO),
52
+ __metadata("design:type", agregator_google_place_ro_1.AgregatorGooglePlaceRO)
53
+ ], AgregatorQuestroomLocation.prototype, "googlePlace", void 0);
48
54
  class AgregatorQuestroomCardRO {
49
55
  }
50
56
  exports.AgregatorQuestroomCardRO = AgregatorQuestroomCardRO;
@@ -7,6 +7,7 @@ import { ExpertReviewRO } from '../review/expert-review.ro';
7
7
  import { CountriesEnum } from '../shared/enum/countries.enum';
8
8
  import { Languages } from '../shared/enum/languages.enum';
9
9
  import { TagsEnum } from '../shared/enum/tags.enum';
10
+ import { AgregatorGooglePlaceRO } from './agregator-google-place.ro';
10
11
  import { AgregatorQuestroomCardRO } from './agregator-questroom-card.ro';
11
12
  export declare const getRightLocale: ({ value, key, techLocales, locales, language, }: {
12
13
  value: string;
@@ -49,6 +50,11 @@ declare class Location {
49
50
  parking: boolean;
50
51
  waitingAreaSize: number;
51
52
  city: City;
53
+ /**
54
+ * Оценка площадки в Google. Приходит только с эндпоинтов, которые явно
55
+ * подмешивают её по `locationId`, иначе `undefined`.
56
+ */
57
+ googlePlace?: AgregatorGooglePlaceRO;
52
58
  }
53
59
  export declare class AgregatorQuestroomRO {
54
60
  id: number;
@@ -23,6 +23,7 @@ const questroom_meta_ro_1 = require("../questroom/questroom-meta.ro");
23
23
  const expert_review_ro_1 = require("../review/expert-review.ro");
24
24
  const countries_enum_1 = require("../shared/enum/countries.enum");
25
25
  const languages_enum_1 = require("../shared/enum/languages.enum");
26
+ const agregator_google_place_ro_1 = require("./agregator-google-place.ro");
26
27
  const agregator_questroom_card_ro_1 = require("./agregator-questroom-card.ro");
27
28
  const getRightLocale = ({ value, key, techLocales, locales, language, }) => {
28
29
  const techLocale = techLocales === null || techLocales === void 0 ? void 0 : techLocales.find((l) => l.language === language);
@@ -156,6 +157,11 @@ __decorate([
156
157
  (0, class_transformer_1.Type)(() => City),
157
158
  __metadata("design:type", City)
158
159
  ], Location.prototype, "city", void 0);
160
+ __decorate([
161
+ (0, class_transformer_1.Expose)(),
162
+ (0, class_transformer_1.Type)(() => agregator_google_place_ro_1.AgregatorGooglePlaceRO),
163
+ __metadata("design:type", agregator_google_place_ro_1.AgregatorGooglePlaceRO)
164
+ ], Location.prototype, "googlePlace", void 0);
159
165
  class AgregatorQuestroomRO {
160
166
  }
161
167
  exports.AgregatorQuestroomRO = AgregatorQuestroomRO;
@@ -2,6 +2,11 @@ import { WidgetBookingFiledEnum } from '../widget/enum/widget-booking-filed.enum
2
2
  import { ClientTypeEnum } from './emun/client-type.enum';
3
3
  export declare class ClientFormDto {
4
4
  clientType: ClientTypeEnum;
5
+ /**
6
+ * `fields` приходит извне и может отсутствовать, поэтому все `ValidateIf` ниже
7
+ * обращаются к нему через `?.`: иначе предикат падает TypeError внутри
8
+ * ValidationPipe и клиент получает 500 вместо 400 (ESCAPE-NAVIGATOR-API-R6).
9
+ */
5
10
  fields: WidgetBookingFiledEnum[];
6
11
  email: string;
7
12
  birthday: string;
@@ -30,25 +30,26 @@ __decorate([
30
30
  ], ClientFormDto.prototype, "fields", void 0);
31
31
  __decorate([
32
32
  (0, class_validator_1.IsEmail)(),
33
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.EMAIL)),
33
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.EMAIL))),
34
34
  (0, class_transformer_1.Transform)(({ value }) => value === null || value === void 0 ? void 0 : value.trim().toLowerCase()),
35
35
  (0, class_transformer_1.Expose)(),
36
36
  __metadata("design:type", String)
37
37
  ], ClientFormDto.prototype, "email", void 0);
38
38
  __decorate([
39
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.MINOR || fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.BIRTHDAY)),
39
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.MINOR ||
40
+ (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.BIRTHDAY))),
40
41
  (0, is_not_blank_1.IsNotBlank)(),
41
42
  (0, class_transformer_1.Expose)(),
42
43
  __metadata("design:type", String)
43
44
  ], ClientFormDto.prototype, "birthday", void 0);
44
45
  __decorate([
45
- (0, class_validator_1.ValidateIf)(({ fields }) => fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.NAME)),
46
+ (0, class_validator_1.ValidateIf)(({ fields }) => fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.NAME)),
46
47
  (0, is_not_blank_1.IsNotBlank)(),
47
48
  (0, class_transformer_1.Expose)(),
48
49
  __metadata("design:type", String)
49
50
  ], ClientFormDto.prototype, "name", void 0);
50
51
  __decorate([
51
- (0, class_validator_1.ValidateIf)(({ fields }) => fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.SURNAME)),
52
+ (0, class_validator_1.ValidateIf)(({ fields }) => fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.SURNAME)),
52
53
  (0, is_not_blank_1.IsNotBlank)(),
53
54
  (0, class_transformer_1.Expose)(),
54
55
  __metadata("design:type", String)
@@ -65,25 +66,25 @@ __decorate([
65
66
  __metadata("design:type", Boolean)
66
67
  ], ClientFormDto.prototype, "sendAds", void 0);
67
68
  __decorate([
68
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.PHONE)),
69
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.PHONE))),
69
70
  (0, is_not_blank_1.IsNotBlank)(),
70
71
  (0, class_transformer_1.Expose)(),
71
72
  __metadata("design:type", String)
72
73
  ], ClientFormDto.prototype, "phone", void 0);
73
74
  __decorate([
74
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS)),
75
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS))),
75
76
  (0, is_not_blank_1.IsNotBlank)(),
76
77
  (0, class_transformer_1.Expose)(),
77
78
  __metadata("design:type", String)
78
79
  ], ClientFormDto.prototype, "address", void 0);
79
80
  __decorate([
80
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS)),
81
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS))),
81
82
  (0, is_not_blank_1.IsNotBlank)(),
82
83
  (0, class_transformer_1.Expose)(),
83
84
  __metadata("design:type", String)
84
85
  ], ClientFormDto.prototype, "postcode", void 0);
85
86
  __decorate([
86
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS)),
87
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS))),
87
88
  (0, is_not_blank_1.IsNotBlank)(),
88
89
  (0, class_transformer_1.Expose)(),
89
90
  __metadata("design:type", String)
@@ -32,12 +32,52 @@ export type ParsedQuest = {
32
32
  /** Возраст, как он написан на сайте (до приведения к лестнице). */
33
33
  minAgeRaw?: number;
34
34
  type?: QuestroomTypeEnum;
35
- /** Тематические теги квеста. */
35
+ /**
36
+ * Итоговый набор тегов, который уедет в карточку. У сматченного квеста это
37
+ * теги из базы плюс найденные на сайте, дальше их правит модератор.
38
+ */
36
39
  tags?: TagsEnum[];
40
+ /** Что нашёл на сайте парсер — показывается модератору рядом с итогом. */
41
+ parsedTags?: TagsEnum[];
42
+ /** Теги сматченного квеста в базе: видно, что именно заменяется. */
43
+ existingTags?: TagsEnum[];
37
44
  /** Важная информация для посетителей (ограничения, что взять с собой). */
38
45
  importantInfo?: string;
39
- /** URL фото с сайта-источника (в S3 загружаются при применении). */
46
+ /**
47
+ * Цена, как напечатана на сайте, в единицах валюты (не в центах): «ab 89 €»
48
+ * даёт priceFromRaw 89. Что именно покупается за эти деньги — в priceBasis.
49
+ */
50
+ priceFromRaw?: number;
51
+ priceToRaw?: number;
52
+ /**
53
+ * За что заплачено: за игру целиком или за одного участника. Без этого
54
+ * цену принять нельзя — «25 €» за место и за комнату отличаются в разы.
55
+ */
56
+ priceBasis?: 'per_group' | 'per_person';
57
+ /** Валюта с сайта (ISO 4217), как её распознал экстрактор. */
58
+ priceCurrencyRaw?: string;
59
+ /**
60
+ * Цена за группу в минорных единицах после нормализации — ровно то, что
61
+ * уедет в `questrooms.minPrice`/`maxPrice`. Совпадает по смыслу с ценой из
62
+ * тарифа: сколько стоит игра целиком, а не место.
63
+ */
64
+ minPrice?: number;
65
+ maxPrice?: number;
66
+ /**
67
+ * Почему цена с сайта не принята (чужая валюта, цена только за место без
68
+ * известного размера группы). Показывается модератору, в каталог не идёт.
69
+ */
70
+ priceNote?: string;
71
+ /**
72
+ * Фото, которые уедут в карточку: с сайта-источника у нового квеста плюс
73
+ * добавленные модератором. Первое становится обложкой, в S3 загружаются
74
+ * при применении.
75
+ */
40
76
  photos?: string[];
77
+ /** Что нашёл на сайте парсер — чтобы вернуть список после смены привязки. */
78
+ parsedPhotos?: string[];
79
+ /** Фото сматченного квеста в базе: новые доливаются к ним, а не затирают. */
80
+ existingPhotos?: string[];
41
81
  /** URL страницы квеста. */
42
82
  sourceUrl?: string;
43
83
  /** ID существующего квеста, если сматчен (для диффа). */
@@ -46,6 +86,12 @@ export type ParsedQuest = {
46
86
  matchCandidates?: ParseMatchCandidate[];
47
87
  /** Исключён модератором из применения. */
48
88
  excluded?: boolean;
89
+ /**
90
+ * Поля, которые модератор поправил руками. Применяются, даже если парсер
91
+ * по ним расхождения не нашёл: важную информацию и теги он находит редко,
92
+ * а вписать их при разборе задачи всё равно нужно.
93
+ */
94
+ editedFields?: string[];
49
95
  };
50
96
  export type ParsedLocation = {
51
97
  address: string;
@@ -1,4 +1,9 @@
1
1
  export declare class CreateProfileContactDto {
2
+ /**
3
+ * `profile-contact.name` — NOT NULL в БД, и контакт без имени всё равно
4
+ * бесполезен: сохранение «только ссылки» падало 500 из БД вместо
5
+ * валидации формы (ESCAPE-NAVIGATOR-API-Q3).
6
+ */
2
7
  name: string;
3
8
  facebook: string;
4
9
  linkedin: string;
@@ -12,11 +12,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.CreateProfileContactDto = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
+ const is_not_blank_1 = require("../../shared/is-not-blank");
15
16
  class CreateProfileContactDto {
16
17
  }
17
18
  exports.CreateProfileContactDto = CreateProfileContactDto;
18
19
  __decorate([
19
- (0, class_validator_1.IsOptional)(),
20
+ (0, is_not_blank_1.IsNotBlank)(),
20
21
  (0, class_transformer_1.Expose)(),
21
22
  __metadata("design:type", String)
22
23
  ], CreateProfileContactDto.prototype, "name", void 0);
@@ -24,13 +24,16 @@ exports.MARKETING_AUTOMATION_CAPABILITIES = {
24
24
  supportsSendImmediately: false,
25
25
  supportsDiscount: true,
26
26
  },
27
+ // `min: 0` — «поздравить в сам день рождения»: тик крутится каждый час и
28
+ // отправляет в 09:00 по календарю компании, поэтому нулевое смещение
29
+ // работает так же, как любое другое (см. MarketingAutomationBirthdayService).
27
30
  [marketing_automation_type_enum_1.MarketingAutomationTypeEnum.BIRTHDAY_ADULT]: {
28
- timing: { direction: 'before', unit: 'days', min: 2, max: 7, default: 3 },
31
+ timing: { direction: 'before', unit: 'days', min: 0, max: 7, default: 3 },
29
32
  supportsSendImmediately: false,
30
33
  supportsDiscount: true,
31
34
  },
32
35
  [marketing_automation_type_enum_1.MarketingAutomationTypeEnum.BIRTHDAY_CHILD]: {
33
- timing: { direction: 'before', unit: 'days', min: 2, max: 7, default: 3 },
36
+ timing: { direction: 'before', unit: 'days', min: 0, max: 7, default: 3 },
34
37
  supportsSendImmediately: false,
35
38
  supportsDiscount: true,
36
39
  },
@@ -6,8 +6,8 @@
6
6
  * Здесь умышленно НЕТ направления (до/после события) и единицы
7
7
  * (часы/дни) для `sendOffset` — это свойство ТИПА, а не записи, и
8
8
  * живёт в `MARKETING_AUTOMATION_CAPABILITIES`. Границы значения
9
- * (min/max) валидируются динамически по типу там же, поэтому тут
10
- * достаточно базовой проверки «положительное целое».
9
+ * (min/max) тоже свойство типа, поэтому тут достаточно базовой
10
+ * проверки «неотрицательное целое».
11
11
  */
12
12
  export declare class MarketingAutomationConfigDto {
13
13
  /**
@@ -17,6 +17,12 @@ export declare class MarketingAutomationConfigDto {
17
17
  * Для `retargeting` — часы после покидания бронирования (дефолт 24).
18
18
  * `undefined` — у типов без настраиваемого тайминга
19
19
  * (`custom_booking` — транзакционно).
20
+ *
21
+ * 0 — «в день самого события»: для поздравлений с днём рождения это
22
+ * штатный сценарий (письмо уходит в сам ДР в 09:00 по календарю
23
+ * компании), поэтому здесь `@Min(0)`, а не `@IsPositive`. Типы, где 0
24
+ * не имеет смысла, защищены своим `timing.min` — планировщик кламмит
25
+ * значение при расчёте `sendAt` (`clampSendOffset`).
20
26
  */
21
27
  sendOffset?: number;
22
28
  /**
@@ -20,8 +20,8 @@ const class_validator_1 = require("class-validator");
20
20
  * Здесь умышленно НЕТ направления (до/после события) и единицы
21
21
  * (часы/дни) для `sendOffset` — это свойство ТИПА, а не записи, и
22
22
  * живёт в `MARKETING_AUTOMATION_CAPABILITIES`. Границы значения
23
- * (min/max) валидируются динамически по типу там же, поэтому тут
24
- * достаточно базовой проверки «положительное целое».
23
+ * (min/max) тоже свойство типа, поэтому тут достаточно базовой
24
+ * проверки «неотрицательное целое».
25
25
  */
26
26
  class MarketingAutomationConfigDto {
27
27
  }
@@ -29,7 +29,7 @@ exports.MarketingAutomationConfigDto = MarketingAutomationConfigDto;
29
29
  __decorate([
30
30
  (0, class_validator_1.IsOptional)(),
31
31
  (0, class_validator_1.IsInt)(),
32
- (0, class_validator_1.IsPositive)(),
32
+ (0, class_validator_1.Min)(0),
33
33
  (0, class_transformer_1.Expose)(),
34
34
  __metadata("design:type", Number)
35
35
  ], MarketingAutomationConfigDto.prototype, "sendOffset", void 0);
@@ -2,8 +2,8 @@ import { MarketingAutomationTiming } from './marketing-automation-capabilities';
2
2
  /**
3
3
  * Единый источник правды для расчёта тайминга автоматизаций.
4
4
  *
5
- * Величина смещения хранится в `config.sendOffset` (всегда положительное
6
- * число), а направление (`before`/`after`) и единица (`hours`/`days`)
5
+ * Величина смещения хранится в `config.sendOffset` (неотрицательное число;
6
+ * 0 = в день события), а направление (`before`/`after`) и единица (`hours`/`days`)
7
7
  * задаются типом письма через `MARKETING_AUTOMATION_CAPABILITIES`. Функция
8
8
  * сводит их к знаковому смещению В ЧАСАХ относительно опорного события
9
9
  * (для order-linked — `order.utcDate`, т.е. дата игры):
@@ -5,8 +5,8 @@ exports.clampSendOffset = clampSendOffset;
5
5
  /**
6
6
  * Единый источник правды для расчёта тайминга автоматизаций.
7
7
  *
8
- * Величина смещения хранится в `config.sendOffset` (всегда положительное
9
- * число), а направление (`before`/`after`) и единица (`hours`/`days`)
8
+ * Величина смещения хранится в `config.sendOffset` (неотрицательное число;
9
+ * 0 = в день события), а направление (`before`/`after`) и единица (`hours`/`days`)
10
10
  * задаются типом письма через `MARKETING_AUTOMATION_CAPABILITIES`. Функция
11
11
  * сводит их к знаковому смещению В ЧАСАХ относительно опорного события
12
12
  * (для order-linked — `order.utcDate`, т.е. дата игры):
@@ -24,7 +24,8 @@ export declare class QueryAdminProfileDto {
24
24
  techStatus?: ProfileTechStatusEnum;
25
25
  country?: CountriesEnum;
26
26
  city?: number;
27
- crm?: string;
27
+ /** Прежняя CRM компании (`profile.crm`); фильтр в админке — мультиселект. */
28
+ crm?: string | string[];
28
29
  lastEmailSendId?: string;
29
30
  notlastEmailSendId?: string;
30
31
  integrationType?: ProfileIntegrationTypeEnum;
@@ -82,7 +82,7 @@ __decorate([
82
82
  ], QueryAdminProfileDto.prototype, "city", void 0);
83
83
  __decorate([
84
84
  (0, class_transformer_1.Expose)(),
85
- __metadata("design:type", String)
85
+ __metadata("design:type", Object)
86
86
  ], QueryAdminProfileDto.prototype, "crm", void 0);
87
87
  __decorate([
88
88
  (0, class_transformer_1.Expose)(),
@@ -17,4 +17,11 @@ export declare class CreateQuestroomAdminDto {
17
17
  time: number;
18
18
  playersMin: number;
19
19
  playersMax: number;
20
+ /**
21
+ * Цена за всю группу в минорных единицах. Заполняется парсингом сайта при
22
+ * апруве модератором — у квестов без расписания другого источника нет.
23
+ * Тариф, если он появится, перезапишет это значение.
24
+ */
25
+ minPrice?: number;
26
+ maxPrice?: number;
20
27
  }
@@ -125,3 +125,17 @@ __decorate([
125
125
  (0, class_transformer_1.Expose)(),
126
126
  __metadata("design:type", Number)
127
127
  ], CreateQuestroomAdminDto.prototype, "playersMax", void 0);
128
+ __decorate([
129
+ (0, class_validator_1.IsOptional)(),
130
+ (0, class_validator_1.IsInt)(),
131
+ (0, class_validator_1.Min)(0),
132
+ (0, class_transformer_1.Expose)(),
133
+ __metadata("design:type", Number)
134
+ ], CreateQuestroomAdminDto.prototype, "minPrice", void 0);
135
+ __decorate([
136
+ (0, class_validator_1.IsOptional)(),
137
+ (0, class_validator_1.IsInt)(),
138
+ (0, class_validator_1.Min)(0),
139
+ (0, class_transformer_1.Expose)(),
140
+ __metadata("design:type", Number)
141
+ ], CreateQuestroomAdminDto.prototype, "maxPrice", void 0);