@escapenavigator/types 2.0.30 → 2.0.32

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 (39) hide show
  1. package/dist/certificate-sale/create-certificatesale.dto.d.ts +4 -4
  2. package/dist/certificate-sale/create-certificatesale.dto.js +4 -4
  3. package/dist/google-calendar/initial-google-calendar.ro.d.ts +4 -0
  4. package/dist/google-calendar/initial-google-calendar.ro.js +8 -0
  5. package/dist/openapi/profiles/openapi-profile-booking-list-item.ro.d.ts +2 -0
  6. package/dist/openapi/profiles/openapi-profile-booking-list-item.ro.js +16 -0
  7. package/dist/order/order.ro.d.ts +7 -0
  8. package/dist/order/order.ro.js +8 -0
  9. package/dist/parse-results/parse-result-payload.d.ts +30 -2
  10. package/dist/parse-results/parse-result.ro.d.ts +3 -0
  11. package/dist/parse-results/parse-result.ro.js +9 -0
  12. package/dist/questroom/create-questroom-admin.dto.js +5 -4
  13. package/dist/questroom/create-questroom.dto.js +5 -4
  14. package/dist/role/create-role.dto.d.ts +1 -0
  15. package/dist/role/create-role.dto.js +6 -0
  16. package/dist/role/role.ro.d.ts +1 -0
  17. package/dist/role/role.ro.js +4 -0
  18. package/dist/slot/enum/slot-staff-policy.enum.d.ts +13 -0
  19. package/dist/slot/enum/slot-staff-policy.enum.js +17 -0
  20. package/dist/slot/set-slot-resource-override.dto.d.ts +7 -0
  21. package/dist/slot/set-slot-resource-override.dto.js +24 -0
  22. package/dist/slot/slot.ro.d.ts +11 -0
  23. package/dist/slot-rule/create-rule.dto.d.ts +2 -0
  24. package/dist/slot-rule/create-rule.dto.js +8 -0
  25. package/dist/slot-rule/defailt-rule.d.ts +2 -0
  26. package/dist/slot-rule/defailt-rule.js +2 -0
  27. package/dist/slot-rule/rule.ro.d.ts +2 -0
  28. package/dist/slot-rule/rule.ro.js +5 -0
  29. package/dist/statistics/certificates.d.ts +9 -5
  30. package/dist/tsconfig.build.tsbuildinfo +1 -1
  31. package/dist/upselling/create-upselling.dto.d.ts +3 -0
  32. package/dist/upselling/create-upselling.dto.js +8 -0
  33. package/dist/upselling/enum/upselling-icon.enum.d.ts +23 -0
  34. package/dist/upselling/enum/upselling-icon.enum.js +27 -0
  35. package/dist/upselling/upselling.ro.d.ts +2 -0
  36. package/dist/upselling/upselling.ro.js +5 -0
  37. package/dist/user/task/user-task.ro.d.ts +1 -0
  38. package/dist/user/task/user-task.ro.js +4 -0
  39. package/package.json +2 -2
@@ -2,10 +2,10 @@ import { CertificatesaleDeliveryTypeEnum } from './enum/certificatesales-deliver
2
2
  /**
3
3
  * Payload для ручного оформления продажи сертификата сотрудником из app.
4
4
  * После миграции на v2-магазин продажа создаётся из `designId` + либо
5
- * `nominalId` (каталожный номинал), либо `customNominal` (произвольная сумма
6
- * по `settings.allowFreeNominal`). В отличие от виджета покупатель — это
7
- * существующий клиент (`clientId`), а `cashboxId` позволяет сразу отметить
8
- * сертификат оплаченным через офлайн-кассу.
5
+ * `nominalId` (каталожный номинал), либо `customNominal` (произвольная сумма;
6
+ * в CRM доступна всегда, без `settings.allowFreeNominal`). В отличие от
7
+ * виджета покупатель — это существующий клиент (`clientId`), а `cashboxId`
8
+ * позволяет сразу отметить сертификат оплаченным через офлайн-кассу.
9
9
  */
10
10
  export declare class CreateCertificatesaleDto {
11
11
  clientId: number;
@@ -17,10 +17,10 @@ const certificatesales_delivery_type_enum_1 = require("./enum/certificatesales-d
17
17
  /**
18
18
  * Payload для ручного оформления продажи сертификата сотрудником из app.
19
19
  * После миграции на v2-магазин продажа создаётся из `designId` + либо
20
- * `nominalId` (каталожный номинал), либо `customNominal` (произвольная сумма
21
- * по `settings.allowFreeNominal`). В отличие от виджета покупатель — это
22
- * существующий клиент (`clientId`), а `cashboxId` позволяет сразу отметить
23
- * сертификат оплаченным через офлайн-кассу.
20
+ * `nominalId` (каталожный номинал), либо `customNominal` (произвольная сумма;
21
+ * в CRM доступна всегда, без `settings.allowFreeNominal`). В отличие от
22
+ * виджета покупатель — это существующий клиент (`clientId`), а `cashboxId`
23
+ * позволяет сразу отметить сертификат оплаченным через офлайн-кассу.
24
24
  */
25
25
  class CreateCertificatesaleDto {
26
26
  }
@@ -2,4 +2,8 @@ export declare class InitialGoogleCalendarRO {
2
2
  calendarId: string;
3
3
  title: string;
4
4
  token: string;
5
+ /** Уже есть живая интеграция с этим calendarId — повторно создавать нельзя. */
6
+ alreadyConnected: boolean;
7
+ /** Есть запись с disconnectedAt — это путь «Переподключить». */
8
+ canReconnect: boolean;
5
9
  }
@@ -26,3 +26,11 @@ __decorate([
26
26
  (0, class_transformer_1.Expose)(),
27
27
  __metadata("design:type", String)
28
28
  ], InitialGoogleCalendarRO.prototype, "token", void 0);
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ __metadata("design:type", Boolean)
32
+ ], InitialGoogleCalendarRO.prototype, "alreadyConnected", void 0);
33
+ __decorate([
34
+ (0, class_transformer_1.Expose)(),
35
+ __metadata("design:type", Boolean)
36
+ ], InitialGoogleCalendarRO.prototype, "canReconnect", void 0);
@@ -1,3 +1,4 @@
1
+ import { Utm } from '../../order/order.ro';
1
2
  import { ProfileCurrencyEnum } from '../../profile/enum/profile-currency';
2
3
  import { SourceEnum } from '../../shared/source.enum';
3
4
  export declare class OpenapiProfileBookingQuestroomRO {
@@ -23,6 +24,7 @@ export declare class OpenapiProfileBookingListItemRO {
23
24
  toPay: number;
24
25
  currency: ProfileCurrencyEnum;
25
26
  source: SourceEnum;
27
+ utm: Utm | null;
26
28
  confirmed: boolean;
27
29
  createdAt: Date;
28
30
  client: OpenapiProfileBookingClientRO | null;
@@ -14,6 +14,7 @@ exports.OpenapiProfileBookingListItemRO = exports.OpenapiProfileBookingClientRO
14
14
  /* eslint-disable @typescript-eslint/no-unused-vars */
15
15
  const swagger_1 = require("@nestjs/swagger");
16
16
  const class_transformer_1 = require("class-transformer");
17
+ const order_ro_1 = require("../../order/order.ro");
17
18
  const profile_currency_1 = require("../../profile/enum/profile-currency");
18
19
  const source_enum_1 = require("../../shared/source.enum");
19
20
  class OpenapiProfileBookingQuestroomRO {
@@ -144,6 +145,21 @@ __decorate([
144
145
  }),
145
146
  __metadata("design:type", String)
146
147
  ], OpenapiProfileBookingListItemRO.prototype, "source", void 0);
148
+ __decorate([
149
+ (0, class_transformer_1.Expose)(),
150
+ (0, class_transformer_1.Type)(() => order_ro_1.Utm),
151
+ (0, swagger_1.ApiProperty)({
152
+ type: () => order_ro_1.Utm,
153
+ nullable: true,
154
+ description: 'UTM attribution captured at booking time (utm_source / utm_medium / utm_campaign / …). Null when none were set.',
155
+ example: {
156
+ utmSource: 'google',
157
+ utmMedium: 'cpc',
158
+ utmCampaign: 'spring_sale',
159
+ },
160
+ }),
161
+ __metadata("design:type", order_ro_1.Utm)
162
+ ], OpenapiProfileBookingListItemRO.prototype, "utm", void 0);
147
163
  __decorate([
148
164
  (0, class_transformer_1.Expose)(),
149
165
  (0, swagger_1.ApiProperty)({ example: true, description: 'Whether the booking is confirmed.' }),
@@ -95,6 +95,8 @@ declare class Upsellings extends RO {
95
95
  userId: number;
96
96
  count: number;
97
97
  nonRefundable: boolean;
98
+ /** Снимок иконки каталога на момент добавления в заказ. */
99
+ icon?: string | null;
98
100
  }
99
101
  declare class Participant {
100
102
  id: number;
@@ -211,6 +213,11 @@ export declare class OrderRO extends RO {
211
213
  certificateTotal: number;
212
214
  /** Сумма допуслуг (Σ amount × count). Денорм для бейджа на слоте. */
213
215
  upsellingsTotal: number;
216
+ /**
217
+ * Уникальные иконки допуслуг (снимки OrderUpselling.icon).
218
+ * Денорм для бейджей на слоте без JOIN к order-upsellings.
219
+ */
220
+ upsellingIcons: string[];
214
221
  /** Проблема доставки письма клиенту (красный имейл-бейдж на слоте). */
215
222
  emailTrouble: boolean;
216
223
  refundedAmount: number;
@@ -250,6 +250,10 @@ __decorate([
250
250
  (0, class_transformer_1.Expose)(),
251
251
  __metadata("design:type", Boolean)
252
252
  ], Upsellings.prototype, "nonRefundable", void 0);
253
+ __decorate([
254
+ (0, class_transformer_1.Expose)(),
255
+ __metadata("design:type", String)
256
+ ], Upsellings.prototype, "icon", void 0);
253
257
  class Participant {
254
258
  }
255
259
  __decorate([
@@ -506,6 +510,10 @@ __decorate([
506
510
  (0, class_transformer_1.Expose)(),
507
511
  __metadata("design:type", Number)
508
512
  ], OrderRO.prototype, "upsellingsTotal", void 0);
513
+ __decorate([
514
+ (0, class_transformer_1.Expose)(),
515
+ __metadata("design:type", Array)
516
+ ], OrderRO.prototype, "upsellingIcons", void 0);
509
517
  __decorate([
510
518
  (0, class_transformer_1.Expose)(),
511
519
  __metadata("design:type", Boolean)
@@ -1,4 +1,5 @@
1
1
  import { QuestroomTypeEnum } from '../questroom/enum/questroom-type.enum';
2
+ import { TagsEnum } from '../shared/enum/tags.enum';
2
3
  /** Кандидат матча для модератора (локация или квест). */
3
4
  export type ParseMatchCandidate = {
4
5
  id: number;
@@ -14,12 +15,27 @@ export type ParsedQuest = {
14
15
  playersMax?: number;
15
16
  /** Длительность, минуты. */
16
17
  time?: number;
17
- /** Сложность 1-6. */
18
+ /** Сложность 1-6 (после пересчёта из шкалы сайта). */
18
19
  difficult?: number;
19
- /** Страх 0-5. */
20
+ /** Оценка сложности как она указана на сайте (например 4 из 5). */
21
+ difficultRaw?: number;
22
+ /** Максимум шкалы сложности сайта (5 в примере выше). */
23
+ difficultScale?: number;
24
+ /** Страх 1-5 (после пересчёта из шкалы сайта). */
20
25
  fear?: number;
26
+ /** Оценка «страшности» как она указана на сайте. */
27
+ fearRaw?: number;
28
+ /** Максимум шкалы страха сайта. */
29
+ fearScale?: number;
30
+ /** Возраст, приведённый к разрешённым в форме значениям. */
21
31
  minAge?: number;
32
+ /** Возраст, как он написан на сайте (до приведения к лестнице). */
33
+ minAgeRaw?: number;
22
34
  type?: QuestroomTypeEnum;
35
+ /** Тематические теги квеста. */
36
+ tags?: TagsEnum[];
37
+ /** Важная информация для посетителей (ограничения, что взять с собой). */
38
+ importantInfo?: string;
23
39
  /** URL фото с сайта-источника (в S3 загружаются при применении). */
24
40
  photos?: string[];
25
41
  /** URL страницы квеста. */
@@ -33,6 +49,12 @@ export type ParsedQuest = {
33
49
  };
34
50
  export type ParsedLocation = {
35
51
  address: string;
52
+ /**
53
+ * Город площадки. У сетевых компаний адрес на городской подстранице часто
54
+ * написан без города, а без него геокодер уводит локацию в другой город.
55
+ */
56
+ city?: string;
57
+ postalCode?: string;
36
58
  phone?: string;
37
59
  /** ID существующей локации, если сматчена по координатам/адресу. */
38
60
  matchedLocationId?: number;
@@ -61,6 +83,12 @@ export type ParseDiffOperation = {
61
83
  from: unknown;
62
84
  to: unknown;
63
85
  }>;
86
+ /**
87
+ * Поля из changes, которые применять не нужно. Переименование квеста и
88
+ * замена легенды попадают сюда сразу: это подсказка модератору, а не
89
+ * автоматическое действие.
90
+ */
91
+ excludedFields?: string[];
64
92
  /** Исключена модератором из Apply. */
65
93
  excluded?: boolean;
66
94
  /** Score матча (если применимо). */
@@ -1,3 +1,4 @@
1
+ import { CountriesEnum } from '../shared/enum/countries.enum';
1
2
  import { ParseDiffOperation, ParseResultPayload } from './parse-result-payload';
2
3
  import { ParseResultSourceEnum } from './parse-result-source.enum';
3
4
  import { ParseResultStatusEnum } from './parse-result-status.enum';
@@ -5,6 +6,8 @@ declare class ParseResultProfile {
5
6
  id: number;
6
7
  title: string;
7
8
  site: string;
9
+ country: CountriesEnum;
10
+ mainEmail: string;
8
11
  }
9
12
  export declare class ParseResultRO {
10
13
  id: number;
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ParseResultRO = void 0;
13
13
  /* eslint-disable max-classes-per-file */
14
14
  const class_transformer_1 = require("class-transformer");
15
+ const countries_enum_1 = require("../shared/enum/countries.enum");
15
16
  const parse_result_source_enum_1 = require("./parse-result-source.enum");
16
17
  const parse_result_status_enum_1 = require("./parse-result-status.enum");
17
18
  class ParseResultProfile {
@@ -28,6 +29,14 @@ __decorate([
28
29
  (0, class_transformer_1.Expose)(),
29
30
  __metadata("design:type", String)
30
31
  ], ParseResultProfile.prototype, "site", void 0);
32
+ __decorate([
33
+ (0, class_transformer_1.Expose)(),
34
+ __metadata("design:type", String)
35
+ ], ParseResultProfile.prototype, "country", void 0);
36
+ __decorate([
37
+ (0, class_transformer_1.Expose)(),
38
+ __metadata("design:type", String)
39
+ ], ParseResultProfile.prototype, "mainEmail", void 0);
31
40
  class ParseResultRO {
32
41
  }
33
42
  exports.ParseResultRO = ParseResultRO;
@@ -87,7 +87,7 @@ __decorate([
87
87
  (0, class_validator_1.IsPositive)(),
88
88
  (0, class_validator_1.Max)(6),
89
89
  (0, class_validator_1.Min)(1),
90
- (0, class_transformer_1.Transform)(({ value }) => value || 6),
90
+ (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : 6),
91
91
  (0, class_transformer_1.Expose)(),
92
92
  __metadata("design:type", Number)
93
93
  ], CreateQuestroomAdminDto.prototype, "difficult", void 0);
@@ -96,21 +96,22 @@ __decorate([
96
96
  (0, class_validator_1.IsPositive)(),
97
97
  (0, class_validator_1.Max)(5),
98
98
  (0, class_validator_1.Min)(1),
99
- (0, class_transformer_1.Transform)(({ value }) => value || 0),
99
+ (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : 1),
100
100
  (0, class_transformer_1.Expose)(),
101
101
  __metadata("design:type", Number)
102
102
  ], CreateQuestroomAdminDto.prototype, "fear", void 0);
103
103
  __decorate([
104
104
  (0, class_validator_1.ValidateIf)(lounge_questroom_1.isClassicQuestroomFieldsRequired),
105
105
  (0, class_validator_1.IsInt)(),
106
- (0, class_transformer_1.Transform)(({ value }) => value || 12),
106
+ (0, class_validator_1.Min)(0),
107
+ (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : 12),
107
108
  (0, class_transformer_1.Expose)(),
108
109
  __metadata("design:type", Number)
109
110
  ], CreateQuestroomAdminDto.prototype, "minAge", void 0);
110
111
  __decorate([
111
112
  (0, class_validator_1.ValidateIf)(lounge_questroom_1.isClassicQuestroomFieldsRequired),
112
113
  (0, class_validator_1.IsPositive)(),
113
- (0, class_transformer_1.Transform)(({ value }) => value || 60),
114
+ (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : 60),
114
115
  (0, class_transformer_1.Expose)(),
115
116
  __metadata("design:type", Number)
116
117
  ], CreateQuestroomAdminDto.prototype, "time", void 0);
@@ -122,7 +122,7 @@ __decorate([
122
122
  (0, class_validator_1.IsPositive)(),
123
123
  (0, class_validator_1.Max)(6),
124
124
  (0, class_validator_1.Min)(1),
125
- (0, class_transformer_1.Transform)(({ value }) => value || 6),
125
+ (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : 6),
126
126
  (0, class_transformer_1.Expose)(),
127
127
  __metadata("design:type", Number)
128
128
  ], CreateQuestroomDto.prototype, "difficult", void 0);
@@ -131,14 +131,15 @@ __decorate([
131
131
  (0, class_validator_1.IsPositive)(),
132
132
  (0, class_validator_1.Max)(5),
133
133
  (0, class_validator_1.Min)(1),
134
- (0, class_transformer_1.Transform)(({ value }) => value || 0),
134
+ (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : 1),
135
135
  (0, class_transformer_1.Expose)(),
136
136
  __metadata("design:type", Number)
137
137
  ], CreateQuestroomDto.prototype, "fear", void 0);
138
138
  __decorate([
139
139
  (0, class_validator_1.ValidateIf)(lounge_questroom_1.isClassicQuestroomFieldsRequired),
140
140
  (0, class_validator_1.IsInt)(),
141
- (0, class_transformer_1.Transform)(({ value }) => value || 12),
141
+ (0, class_validator_1.Min)(0),
142
+ (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : 12),
142
143
  (0, class_transformer_1.Expose)(),
143
144
  __metadata("design:type", Number)
144
145
  ], CreateQuestroomDto.prototype, "minAge", void 0);
@@ -194,7 +195,7 @@ __decorate([
194
195
  __decorate([
195
196
  (0, class_validator_1.ValidateIf)(lounge_questroom_1.isClassicQuestroomFieldsRequired),
196
197
  (0, class_validator_1.IsPositive)(),
197
- (0, class_transformer_1.Transform)(({ value }) => value || 60),
198
+ (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : 60),
198
199
  (0, class_transformer_1.Expose)(),
199
200
  __metadata("design:type", Number)
200
201
  ], CreateQuestroomDto.prototype, "time", void 0);
@@ -18,6 +18,7 @@ export declare class CreateRoleDto {
18
18
  canCreateBreaks: boolean;
19
19
  canEditOwnWorkedHours: boolean;
20
20
  canDeleteFines: boolean;
21
+ canDeleteComments: boolean;
21
22
  canAddRefunds: boolean;
22
23
  canEditModerators: boolean;
23
24
  canEditSchedule: boolean;
@@ -129,6 +129,12 @@ __decorate([
129
129
  (0, class_transformer_1.Expose)(),
130
130
  __metadata("design:type", Boolean)
131
131
  ], CreateRoleDto.prototype, "canDeleteFines", void 0);
132
+ __decorate([
133
+ (0, class_validator_1.IsBoolean)(),
134
+ (0, class_transformer_1.Transform)(({ value }) => (value !== undefined ? value : false)),
135
+ (0, class_transformer_1.Expose)(),
136
+ __metadata("design:type", Boolean)
137
+ ], CreateRoleDto.prototype, "canDeleteComments", void 0);
132
138
  __decorate([
133
139
  (0, class_validator_1.IsBoolean)(),
134
140
  (0, class_transformer_1.Transform)(({ value }) => (value !== undefined ? value : false)),
@@ -17,6 +17,7 @@ export declare class RoleRO extends RoleLightRO {
17
17
  canCreateBreaks: boolean;
18
18
  canEditOwnWorkedHours: boolean;
19
19
  canDeleteFines: boolean;
20
+ canDeleteComments: boolean;
20
21
  canAddRefunds: boolean;
21
22
  canEditModerators: boolean;
22
23
  canEditSchedule: boolean;
@@ -83,6 +83,10 @@ __decorate([
83
83
  (0, class_transformer_1.Expose)(),
84
84
  __metadata("design:type", Boolean)
85
85
  ], RoleRO.prototype, "canDeleteFines", void 0);
86
+ __decorate([
87
+ (0, class_transformer_1.Expose)(),
88
+ __metadata("design:type", Boolean)
89
+ ], RoleRO.prototype, "canDeleteComments", void 0);
86
90
  __decorate([
87
91
  (0, class_transformer_1.Expose)(),
88
92
  __metadata("design:type", Boolean)
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Что делать со слотом, если ни одна смена сотрудника на локации его не
3
+ * покрывает. В отличие от окон `minMinutesForBooking`/`blockingMinutes`
4
+ * действует на всём горизонте календаря, а не только перед началом игры.
5
+ */
6
+ export declare enum SlotStaffPolicyEnum {
7
+ /** Смены не влияют на доступность слота. */
8
+ OFF = "off",
9
+ /** Без смены слот доступен только по телефону. */
10
+ PHONE = "phone",
11
+ /** Без смены онлайн-бронь закрыта. */
12
+ CLOSED = "closed"
13
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SlotStaffPolicyEnum = void 0;
4
+ /**
5
+ * Что делать со слотом, если ни одна смена сотрудника на локации его не
6
+ * покрывает. В отличие от окон `minMinutesForBooking`/`blockingMinutes`
7
+ * действует на всём горизонте календаря, а не только перед началом игры.
8
+ */
9
+ var SlotStaffPolicyEnum;
10
+ (function (SlotStaffPolicyEnum) {
11
+ /** Смены не влияют на доступность слота. */
12
+ SlotStaffPolicyEnum["OFF"] = "off";
13
+ /** Без смены слот доступен только по телефону. */
14
+ SlotStaffPolicyEnum["PHONE"] = "phone";
15
+ /** Без смены онлайн-бронь закрыта. */
16
+ SlotStaffPolicyEnum["CLOSED"] = "closed";
17
+ })(SlotStaffPolicyEnum || (exports.SlotStaffPolicyEnum = SlotStaffPolicyEnum = {}));
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Ручное открытие слота вопреки нехватке общего ресурса (статус
3
+ * `no-resources`) и возврат обычной блокировки.
4
+ */
5
+ export declare class SetSlotResourceOverrideDto {
6
+ enabled: boolean;
7
+ }
@@ -0,0 +1,24 @@
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.SetSlotResourceOverrideDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ /**
15
+ * Ручное открытие слота вопреки нехватке общего ресурса (статус
16
+ * `no-resources`) и возврат обычной блокировки.
17
+ */
18
+ class SetSlotResourceOverrideDto {
19
+ }
20
+ exports.SetSlotResourceOverrideDto = SetSlotResourceOverrideDto;
21
+ __decorate([
22
+ (0, class_validator_1.IsBoolean)(),
23
+ __metadata("design:type", Boolean)
24
+ ], SetSlotResourceOverrideDto.prototype, "enabled", void 0);
@@ -28,6 +28,12 @@ export type SlotRO = {
28
28
  discount?: number;
29
29
  onlyPhone?: boolean;
30
30
  forceOnlineBooking?: boolean;
31
+ /**
32
+ * Слот открыт администратором вопреки нехватке общего ресурса: проверка
33
+ * `no-resources` для него отключена. Календарь показывает такой слот как
34
+ * свободный с маркером.
35
+ */
36
+ ignoreResourceLimit?: boolean;
31
37
  breakReason?: string | null;
32
38
  availableTeams?: number;
33
39
  numSeatsAvailable?: number;
@@ -54,6 +60,11 @@ export type SlotRO = {
54
60
  promocodeTotal?: number;
55
61
  certificateTotal?: number;
56
62
  upsellingsTotal?: number;
63
+ /**
64
+ * Уникальные иконки допуслуг заказа (денорм `orders.upsellingIcons`)
65
+ * для бейджей на слоте — без JOIN к order-upsellings.
66
+ */
67
+ upsellingIcons?: string[];
57
68
  /** Проблема доставки письма клиенту (красный имейл-бейдж). */
58
69
  emailTrouble?: boolean;
59
70
  /** No-show: слот сохранён, игра не состоялась. */
@@ -1,5 +1,6 @@
1
1
  import { QuestroomCancelationTypeEnum } from '../questroom/enum/questroom-cancelation-type.enum';
2
2
  import { PrepaymentTypeEnum } from '../slot/enum/prepayment-type.enum';
3
+ import { SlotStaffPolicyEnum } from '../slot/enum/slot-staff-policy.enum';
3
4
  export declare class CreateRuleDto {
4
5
  ruleId?: number;
5
6
  title: string;
@@ -14,6 +15,7 @@ export declare class CreateRuleDto {
14
15
  blockingHours: number;
15
16
  blockingMinutes: number;
16
17
  openSlotWhenUserInCalendar: boolean;
18
+ noStaffPolicy: SlotStaffPolicyEnum;
17
19
  clientCanCancel: boolean;
18
20
  prepayForTourists: boolean;
19
21
  minHoursForFullFine: number;
@@ -15,6 +15,7 @@ const class_validator_1 = require("class-validator");
15
15
  const questroom_cancelation_type_enum_1 = require("../questroom/enum/questroom-cancelation-type.enum");
16
16
  const is_not_blank_1 = require("../shared/is-not-blank");
17
17
  const prepayment_type_enum_1 = require("../slot/enum/prepayment-type.enum");
18
+ const slot_staff_policy_enum_1 = require("../slot/enum/slot-staff-policy.enum");
18
19
  class CreateRuleDto {
19
20
  }
20
21
  exports.CreateRuleDto = CreateRuleDto;
@@ -122,6 +123,13 @@ __decorate([
122
123
  (0, class_transformer_1.Expose)(),
123
124
  __metadata("design:type", Boolean)
124
125
  ], CreateRuleDto.prototype, "openSlotWhenUserInCalendar", void 0);
126
+ __decorate([
127
+ (0, class_validator_1.ValidateIf)((o) => !o.ruleId),
128
+ (0, class_transformer_1.Transform)(({ value }) => value || slot_staff_policy_enum_1.SlotStaffPolicyEnum.OFF),
129
+ (0, class_validator_1.IsEnum)(slot_staff_policy_enum_1.SlotStaffPolicyEnum),
130
+ (0, class_transformer_1.Expose)(),
131
+ __metadata("design:type", String)
132
+ ], CreateRuleDto.prototype, "noStaffPolicy", void 0);
125
133
  __decorate([
126
134
  (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : true),
127
135
  (0, class_validator_1.IsBoolean)(),
@@ -1,5 +1,6 @@
1
1
  import { QuestroomCancelationTypeEnum } from '../questroom/enum/questroom-cancelation-type.enum';
2
2
  import { PrepaymentTypeEnum } from '../slot/enum/prepayment-type.enum';
3
+ import { SlotStaffPolicyEnum } from '../slot/enum/slot-staff-policy.enum';
3
4
  export declare const defaultRule: {
4
5
  title: string;
5
6
  prepayment: number;
@@ -12,6 +13,7 @@ export declare const defaultRule: {
12
13
  blockingHours: number;
13
14
  blockingMinutes: number;
14
15
  openSlotWhenUserInCalendar: boolean;
16
+ noStaffPolicy: SlotStaffPolicyEnum;
15
17
  clientCanCancel: boolean;
16
18
  prepayForTourists: boolean;
17
19
  cancelationAmount: number;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.defaultRule = void 0;
4
4
  const questroom_cancelation_type_enum_1 = require("../questroom/enum/questroom-cancelation-type.enum");
5
5
  const prepayment_type_enum_1 = require("../slot/enum/prepayment-type.enum");
6
+ const slot_staff_policy_enum_1 = require("../slot/enum/slot-staff-policy.enum");
6
7
  exports.defaultRule = {
7
8
  title: 'System rule',
8
9
  prepayment: 0,
@@ -15,6 +16,7 @@ exports.defaultRule = {
15
16
  blockingHours: 2,
16
17
  blockingMinutes: 2 * 60,
17
18
  openSlotWhenUserInCalendar: true,
19
+ noStaffPolicy: slot_staff_policy_enum_1.SlotStaffPolicyEnum.OFF,
18
20
  clientCanCancel: true,
19
21
  prepayForTourists: false,
20
22
  cancelationAmount: 0,
@@ -1,5 +1,6 @@
1
1
  import { QuestroomCancelationTypeEnum } from '../questroom/enum/questroom-cancelation-type.enum';
2
2
  import { PrepaymentTypeEnum } from '../slot/enum/prepayment-type.enum';
3
+ import { SlotStaffPolicyEnum } from '../slot/enum/slot-staff-policy.enum';
3
4
  export declare class RuleRO {
4
5
  id: number;
5
6
  profileId: number;
@@ -16,6 +17,7 @@ export declare class RuleRO {
16
17
  blockingHours: number;
17
18
  blockingMinutes: number;
18
19
  openSlotWhenUserInCalendar: boolean;
20
+ noStaffPolicy: SlotStaffPolicyEnum;
19
21
  clientCanCancel: boolean;
20
22
  prepayForTourists: boolean;
21
23
  minHoursForFullFine: number;
@@ -13,6 +13,7 @@ exports.RuleRO = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const questroom_cancelation_type_enum_1 = require("../questroom/enum/questroom-cancelation-type.enum");
15
15
  const prepayment_type_enum_1 = require("../slot/enum/prepayment-type.enum");
16
+ const slot_staff_policy_enum_1 = require("../slot/enum/slot-staff-policy.enum");
16
17
  class RuleRO {
17
18
  }
18
19
  exports.RuleRO = RuleRO;
@@ -76,6 +77,10 @@ __decorate([
76
77
  (0, class_transformer_1.Expose)(),
77
78
  __metadata("design:type", Boolean)
78
79
  ], RuleRO.prototype, "openSlotWhenUserInCalendar", void 0);
80
+ __decorate([
81
+ (0, class_transformer_1.Expose)(),
82
+ __metadata("design:type", String)
83
+ ], RuleRO.prototype, "noStaffPolicy", void 0);
79
84
  __decorate([
80
85
  (0, class_transformer_1.Expose)(),
81
86
  __metadata("design:type", Boolean)
@@ -3,15 +3,17 @@
3
3
  *
4
4
  * Все денежные суммы — в минимальных единицах валюты (копейки/центы).
5
5
  *
6
- * Когорта периода = `code != NOT_GENERATED_CODE` + `annul = false` +
7
- * `paidAt ∈ [start, end)`. ВСЕ агрегаты overview (включая остаток
8
- * номиналов, количество полностью использованных и аннулированных)
9
- * считаются по одной и той же когорте — это снимает прежний разнобой,
10
- * когда `outstandingBalance` суммировался по всей истории профиля.
6
+ * Когорта периода = `code != NOT_GENERATED_CODE` + `paidAt [start, end)`.
7
+ * ВСЕ агрегаты overview (включая остаток номиналов, количество полностью
8
+ * использованных и аннулированных) считаются по одной и той же когорте — это
9
+ * снимает прежний разнобой, когда `outstandingBalance` суммировался по всей
10
+ * истории профиля. Аннулированные из когорты не выбрасываются: их деньги
11
+ * остаются доходом, пока по ним не проведён возврат.
11
12
  *
12
13
  * Семантика финансовых полей:
13
14
  * - gross — стоимость по прайсу (SUM(total)). Не выручка.
14
15
  * - cash — нетто-выручка: SUM(cashReceived), возвраты уже учтены в транзакциях со знаком.
16
+ * - refunded — сколько вернули клиентам (SUM(refundedAmount)), уже вычтено из cash.
15
17
  * - discount — сумма ручных скидок (SUM(discountTotal)).
16
18
  * - promocode — сумма промокодов (SUM(promocodeTotal)).
17
19
  * - nominalSold — суммарный номинал когорты (SUM(nominal)).
@@ -31,6 +33,8 @@ export type CertificatesOverview = {
31
33
  gross: number;
32
34
  /** Нетто-выручка: SUM(cashReceived), возвраты уже внутри. */
33
35
  cash: number;
36
+ /** Возвращено клиентам: SUM(refundedAmount). Уже вычтено из `cash`. */
37
+ refunded: number;
34
38
  discount: number;
35
39
  promocode: number;
36
40
  /** Средний чек по cash: cash / soldCount, 0 если нет продаж. */