@escapenavigator/types 2.0.25 → 2.0.26

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.
@@ -10,6 +10,8 @@ export declare class CreateAggregatorOrderDto {
10
10
  time: string;
11
11
  externalSlotId: string;
12
12
  price: number;
13
+ /** Количество игроков — обязательно для Partner Booking API (Morty-стандарт). */
14
+ players?: number;
13
15
  questroomId?: number;
14
16
  profileId?: number;
15
17
  }
@@ -73,6 +73,12 @@ __decorate([
73
73
  (0, class_transformer_1.Expose)(),
74
74
  __metadata("design:type", Number)
75
75
  ], CreateAggregatorOrderDto.prototype, "price", void 0);
76
+ __decorate([
77
+ (0, class_validator_1.IsOptional)(),
78
+ (0, class_validator_1.IsNumber)(),
79
+ (0, class_transformer_1.Expose)(),
80
+ __metadata("design:type", Number)
81
+ ], CreateAggregatorOrderDto.prototype, "players", void 0);
76
82
  __decorate([
77
83
  (0, class_validator_1.IsOptional)(),
78
84
  (0, class_validator_1.IsNumber)(),
@@ -56,7 +56,7 @@ __decorate([
56
56
  (0, class_transformer_1.Expose)(),
57
57
  (0, class_transformer_1.Transform)(({ obj }) => {
58
58
  var _a;
59
- return (obj.templateId || obj.integrationId) &&
59
+ return (obj.templateId || obj.integrationId || obj.partnerAttractionId) &&
60
60
  ((_a = obj.profile) === null || _a === void 0 ? void 0 : _a.partnerProgram) === partner_program_enum_1.PartnerProgramEnum.ACTIVE;
61
61
  }),
62
62
  __metadata("design:type", Boolean)
@@ -158,7 +158,7 @@ __decorate([
158
158
  (0, class_transformer_1.Expose)(),
159
159
  (0, class_transformer_1.Transform)(({ obj }) => {
160
160
  var _a;
161
- return (obj.templateId || obj.integrationId) &&
161
+ return (obj.templateId || obj.integrationId || obj.partnerAttractionId) &&
162
162
  ((_a = obj.profile) === null || _a === void 0 ? void 0 : _a.partnerProgram) === partner_program_enum_1.PartnerProgramEnum.ACTIVE;
163
163
  }),
164
164
  __metadata("design:type", Boolean)
@@ -326,7 +326,7 @@ __decorate([
326
326
  (0, class_transformer_1.Expose)(),
327
327
  (0, class_transformer_1.Transform)(({ obj }) => {
328
328
  var _a;
329
- return (obj.templateId || obj.integrationId) &&
329
+ return (obj.templateId || obj.integrationId || obj.partnerAttractionId) &&
330
330
  ((_a = obj.profile) === null || _a === void 0 ? void 0 : _a.partnerProgram) === partner_program_enum_1.PartnerProgramEnum.ACTIVE;
331
331
  }),
332
332
  __metadata("design:type", Boolean)
@@ -1,6 +1,6 @@
1
1
  import { OpenapiBokingRuleRO } from '../shared/openapi-booking-rule.ro';
2
2
  import { OpenapiSlotTariffRO } from './openapi-slot-tariff.ro';
3
- export type SlotType = 'bookeo' | 'crm' | 'myerp' | 'kvestadmin';
3
+ export type SlotType = 'bookeo' | 'crm' | 'myerp' | 'kvestadmin' | 'partner';
4
4
  export declare class OpenapiSlotRO {
5
5
  type: SlotType;
6
6
  questroomId: number;
@@ -22,6 +22,7 @@ var SType;
22
22
  SType["CRM"] = "crm";
23
23
  SType["MYERP"] = "myerp";
24
24
  SType["KVESTADMIN"] = "kvestadmin";
25
+ SType["PARTNER"] = "partner";
25
26
  })(SType || (SType = {}));
26
27
  class OpenapiSlotRO {
27
28
  }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Двухфазный импорт игр из CSV/Excel: upload → превью (маппинг колонок,
3
+ * матчинг квестов, статусы строк) → commit. Один файл может содержать
4
+ * брони по разным квестам — квест матчится по названию из колонки.
5
+ */
6
+ export type OrderImportField = 'questTitle' | 'date' | 'time' | 'name' | 'surname' | 'fullName' | 'email' | 'phone' | 'players' | 'total' | 'payed' | 'source';
7
+ /** Порядок дня/месяца в датах файла. auto — эвристика по всей колонке. */
8
+ export type OrderImportDateOrder = 'auto' | 'DMY' | 'MDY';
9
+ /** Маппинг «поле системы → индекс колонки файла». */
10
+ export type OrderImportColumnMapping = Partial<Record<OrderImportField, number>>;
11
+ export type OrderImportColumnRO = {
12
+ index: number;
13
+ header: string;
14
+ /** Распознанное поле (null — колонка не используется). */
15
+ field: OrderImportField | null;
16
+ /** Первые непустые значения колонки для превью. */
17
+ samples: string[];
18
+ };
19
+ export type OrderImportQuestMatchConfidence = 'exact' | 'fuzzy' | 'ai' | 'manual';
20
+ export type OrderImportQuestMatchRO = {
21
+ /** Название квеста как в файле (оригинал, до нормализации). */
22
+ title: string;
23
+ /** Сколько строк файла ссылаются на это название. */
24
+ rowsCount: number;
25
+ questroomId: number | null;
26
+ confidence: OrderImportQuestMatchConfidence | null;
27
+ };
28
+ export type OrderImportRowStatus = 'ok' | 'warning' | 'error' | 'duplicate';
29
+ export type OrderImportRowProblem =
30
+ /** Ошибки — строка не будет импортирована */
31
+ 'QUEST_NOT_MATCHED' | 'DATE_INVALID' | 'SLOT_NOT_FOUND' | 'SLOT_BUSY'
32
+ /** Предупреждения — строка импортируется, но стоит проверить */
33
+ | 'NO_CONTACTS' | 'NO_TIME' | 'NO_PLAYERS' | 'PRICE_MISMATCH' | 'TECHNICAL_SLOT'
34
+ /** Дубликат уже существующего заказа — будет пропущен */
35
+ | 'ALREADY_IMPORTED';
36
+ export type OrderImportRowRO = {
37
+ /** Индекс строки в файле (0 — первая строка данных). */
38
+ index: number;
39
+ status: OrderImportRowStatus;
40
+ problems: OrderImportRowProblem[];
41
+ isPast: boolean;
42
+ questTitle: string;
43
+ questroomId: number | null;
44
+ /** Wall-clock даты в таймзоне локации. */
45
+ date: string | null;
46
+ time: string | null;
47
+ clientLabel: string;
48
+ email: string | null;
49
+ phone: string | null;
50
+ players: number | null;
51
+ /** В центах. */
52
+ total: number | null;
53
+ payed: number | null;
54
+ };
55
+ export type OrderImportSummaryRO = {
56
+ total: number;
57
+ ok: number;
58
+ warnings: number;
59
+ errors: number;
60
+ duplicates: number;
61
+ past: number;
62
+ future: number;
63
+ newClients: number;
64
+ matchedClients: number;
65
+ };
66
+ export type OrderImportSessionStatus = 'draft' | 'committing' | 'committed';
67
+ export type OrderImportSessionRO = {
68
+ id: number;
69
+ status: OrderImportSessionStatus;
70
+ fileName: string;
71
+ dateOrder: OrderImportDateOrder;
72
+ /** Какой порядок дат реально применён после эвристики. */
73
+ resolvedDateOrder: 'DMY' | 'MDY';
74
+ columns: OrderImportColumnRO[];
75
+ mapping: OrderImportColumnMapping;
76
+ questMatches: OrderImportQuestMatchRO[];
77
+ rows: OrderImportRowRO[];
78
+ summary: OrderImportSummaryRO;
79
+ };
80
+ export type UpdateOrderImportDto = {
81
+ mapping?: OrderImportColumnMapping;
82
+ dateOrder?: OrderImportDateOrder;
83
+ /** Ручные метчи: «название из файла → questroomId» (null — сбросить). */
84
+ questOverrides?: Record<string, number | null>;
85
+ };
86
+ export type CommitOrderImportRO = {
87
+ createdOrders: number;
88
+ createdClients: number;
89
+ createdSlots: number;
90
+ skippedRows: number;
91
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Двухфазный импорт игр из CSV/Excel: upload → превью (маппинг колонок,
4
+ * матчинг квестов, статусы строк) → commit. Один файл может содержать
5
+ * брони по разным квестам — квест матчится по названию из колонки.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -2,5 +2,7 @@ export declare enum ProfileIntegrationTypeEnum {
2
2
  BOOKEO = "bookeo",
3
3
  MYERP = "myerp",
4
4
  KVESTADMIN = "kvestadmin",
5
+ /** Partner Booking API (зеркальный Morty-стандарт): расписание тянем из внешней системы. */
6
+ PARTNER = "partner",
5
7
  NONE = "none"
6
8
  }
@@ -6,5 +6,7 @@ var ProfileIntegrationTypeEnum;
6
6
  ProfileIntegrationTypeEnum["BOOKEO"] = "bookeo";
7
7
  ProfileIntegrationTypeEnum["MYERP"] = "myerp";
8
8
  ProfileIntegrationTypeEnum["KVESTADMIN"] = "kvestadmin";
9
+ /** Partner Booking API (зеркальный Morty-стандарт): расписание тянем из внешней системы. */
10
+ ProfileIntegrationTypeEnum["PARTNER"] = "partner";
9
11
  ProfileIntegrationTypeEnum["NONE"] = "none";
10
12
  })(ProfileIntegrationTypeEnum || (exports.ProfileIntegrationTypeEnum = ProfileIntegrationTypeEnum = {}));