Пользовательский мануал · версия кода от 01.09.2026

Настольная книга Asia Expeditions

Как платформа работает на самом деле — по сценариям, от входа в систему до сформированного Booking List. Всё описанное ниже сверено с кодом бэкенда (NestJS) и веб-приложения; ничего не додумано.

6 ролей18 справочников4 статуса заявки2 статуса тура~150 операций API

00Как устроена система

Платформа ведёт коммерческий цикл туроператора: обращение клиента → расчёт себестоимости и цены → коммерческое предложение → подтверждение → операционная подготовка тура. Всё это опирается на справочники, которые вы наполняете заранее.

Три слоя, из которых складывается всё остальное

  1. Справочники — страны, валюты, точки маршрутов, партнёры, контакты, гостиницы, типы транспорта, сезоны, категории и сами расценки. Это «прайс-лист» компании. Без них расчёт физически не может посчитать ни одной суммы.
  2. Заявка — коммерческая сущность. Внутри неё живут версии расчёта, программа тура по дням и коммерческое предложение (КП).
  3. Резервирование (тур) — операционная сущность. Создаётся вручную из подтверждённой заявки, дальше живёт своей жизнью: расписание, брони у поставщиков, туристы, документы.

Ключевые термины, без которых текст ниже не читается

PAX
Количество платных туристов. Расчёт делается не одной цифрой, а матрицей: цена считается сразу для нескольких вариантов численности группы (напр. 2, 4, 6, 8, 10).
FOC
Free of charge — бесплатные места (сопровождающий). Начисляются, когда число человек достигает порога. Занимают место в транспорте и койку в гостинице, то есть попадают в себестоимость, но в делитель цены на человека не входят.
Версия расчёта
Слепок сценария: набор точек PAX, программа, параметры и зафиксированные курсы валют. Версий у заявки может быть много, активная — одна.
Quotation / КП
Коммерческое предложение клиенту. Строится по активной версии расчёта, выгружается в PDF или Word.
Организация (tenant)
Компания-арендатор. Все данные, кроме справочников стран и валют, изолированы по организации. В текущей поставке организация одна — «Asia Expeditions».
Тарификация
Способ, которым услуга умножается на количество: «на человека», «фиксированная ставка в день», «произвольная».
Booking List
Итоговый операционный документ по резервированию: расписание, брони, список туристов. PDF или XLSX.
Единица измерения времени

Все внутренние деньги считаются в валюте тура — по умолчанию KGS (кыргызский сом). Курсы тянутся из Национального банка Кыргызской Республики. Базой пересчёта всегда служит KGS: курс = «сколько сомов за 1 единицу валюты».

01Роли и что видит каждая

В системе шесть ролей. Роль у пользователя ровно одна и задаётся администратором. Права проверяются дважды: интерфейс прячет недоступные разделы, а сервер независимо отклоняет запрос — обойти через прямой вызов API не получится.

РольКодСутьСтартовый экран после входа
АдминистраторadminПолный доступ ко всему: справочники, пользователи, настройки, заявки, туры, аналитика, сброс чужой 2FA.Дашборд
ТуроператорoperatorЗаявки: создание, расчёт, программа, КП, отправка. Создаёт резервирование из подтверждённой заявки. Справочники — не видит.Список заявок
Менеджер бронированияbooking_managerОперационная работа по турам: расписание, брони, туристы, документы, Booking List. Заявки — только чтение списка.Список резервирований
РуководительmanagerАналитика и просмотр заявок и туров. Ничего не создаёт и не меняет.Дашборд
Просмотр справочниковreference_viewerТолько смотрит справочники и свой аккаунт. Ни добавить, ни импортировать, ни удалить.Справочник «Страны»
Заполнение справочниковreference_editorСмотрит и наполняет справочники: добавление, импорт, редактирование, удаление. Заявки и туры недоступны.Справочник «Страны»
Жёсткое ограничение справочных ролей

Пользователь с ролью reference_viewer или reference_editor заблокирован на уровне точки входа: любой запрос, кроме справочников, своего профиля, смены пароля и настроек 2FA, отклоняется с сообщением «Роль имеет доступ только к справочникам и аккаунту». Это не настройка меню — это проверка в самом ядре авторизации.

Чего в системе нет

Роли «супер-администратор» больше не существует — она была слита с ролью «Администратор». Настраиваемых прав тоже нет: набор из шести ролей зашит в код, добавить седьмую или переопределить права роли через интерфейс нельзя.

02Вход, двухфакторная аутентификация, пароль

2.1

все ролиЯ вхожу в систему по email и паролю

Экран /sign-in. Система ищет пользователя по email и сверяет пароль.

  • Пароль неверный или email неизвестен → «Неверный email или пароль». Формулировка одна на оба случая — чтобы нельзя было перебором выяснить, какие адреса заведены. Более того, при неизвестном email система намеренно тратит столько же времени на проверку, сколько и на настоящую, — чтобы нельзя было вычислить существование аккаунта по скорости ответа.
  • Аккаунт деактивирован → отдельное сообщение «Ваш аккаунт деактивирован. Свяжитесь с поддержкой…». Здесь система сознательно раскрывает причину, чтобы человек не бился о «неверный пароль».
  • 2FA выключена → вы сразу в системе.
  • 2FA включена → выдаётся временный промежуточный токен на 5 минут и вас перебрасывает на экран ввода кода. Этим токеном нельзя открыть ничего, кроме проверки кода.

После успешного входа выдаются два токена: рабочий на 24 часа и токен продления на 7 дней. Пока вы пользуетесь системой, сессия продлевается незаметно. Если не заходить неделю — придётся логиниться заново.

2.2

все ролиЯ подтверждаю вход кодом из приложения-аутентификатора

Экран /two-factor. Принимается либо шестизначный TOTP-код, либо один из резервных кодов.

  • Допуск по времени — одно окно в 30 секунд в обе стороны, то есть код, который только что сменился, ещё сработает.
  • Резервный код сгорает при использовании — второй раз тот же код не примут.
  • Если за 5 минут код не введён — промежуточный токен истёк, надо начинать вход заново.
  • Если пока вы искали телефон, администратор деактивировал ваш аккаунт — вход не завершится.
2.3

все ролиЯ включаю себе 2FA

Настройки → вкладка безопасности. Порядок жёсткий и его нельзя пропустить:

  1. Система генерирует секрет и QR-код (подпись в приложении будет «Asia Expeditions (ваш email)») и сразу сохраняет секрет в вашем профиле — но 2FA пока выключена.
  2. Вы сканируете QR и вводите текущий код. Код неверный — включения не происходит.
  3. 2FA включается, и система единожды показывает 10 резервных кодов. Повторно их посмотреть невозможно.
Точка невозврата

Резервные коды показываются один раз. Не сохранив их, при потере телефона пользователь сможет вернуться только через администратора (сценарий 3.7).

2.4

все ролиЯ перевыпускаю резервные коды или выключаю 2FA

Обе операции требуют ввести действующий TOTP-код. Перевыпуск аннулирует все старые 10 кодов и выдаёт новые 10. Выключение 2FA стирает и секрет, и все резервные коды.

2.5

все ролиЯ меняю свой пароль

Настройки → аккаунт. Нужен текущий пароль. Если у вас включена 2FA — дополнительно требуется TOTP-код. Новый пароль обязан отличаться от текущего и пройти проверку сложности:

  • от 8 до 128 символов;
  • минимум одна заглавная, одна строчная, одна цифра и один спецсимвол;
  • не больше двух одинаковых символов подряд («aaa» — запрещено);
  • не должен содержать имя из вашего email (для ivanov@… пароль с «ivanov» не примут).
2.6

все ролиЯ забыл пароль и восстанавливаю доступ

Экран /forgot-password. Система всегда отвечает одинаково, независимо от того, есть такой email или нет. Письмо со ссылкой уходит только если аккаунт реально существует и уже активирован.

  • Ссылка живёт 15 минут.
  • Каждый новый запрос аннулирует предыдущую ссылку.
  • Приглашённому пользователю, который ещё не принял приглашение, ссылка сброса не отправляется — такому человеку нужна ссылка-приглашение, а не сброс. Если он всё-таки где-то раздобудет токен сброса, система откажет: «Аккаунт ещё не активирован — воспользуйтесь ссылкой из приглашения».
  • Новый пароль проходит ту же проверку сложности.
Если письмо не пришло

Сбой отправки почты не считается ошибкой пользователя: система молча пишет проблему в свой журнал и отвечает «успешно». Человек будет ждать письма, которого нет. Это единственный способ поймать проблему — попросить администратора проверить логи почты.

03Пользователи

Раздел /users виден только администратору. Самостоятельной регистрации в системе нет — попасть внутрь можно исключительно по приглашению.

3.1

администраторЯ создаю нового пользователя и отправляю ему приглашение

Заполняются пять полей:

ПолеПравилаЗачем ещё нужно
Имя2–100 символов, только буквы (рус./лат.), дефис, пробелФИО в журналах статусов, подписи документов
Фамилия2–100 символов, те же символысортировка в списках
Emailкорректный адрес, уникаленлогин и адрес приглашения
Идентификатордо 8 символов, только латиница и цифры, уникален в организацииподставляется в номер заявки как {USERID}
Рольодна из шестиопределяет весь доступ

Что происходит дальше, по шагам:

  1. Создаётся аккаунт со статусом «Ожидает приглашение» (pending) и случайным временным паролем, который никому не показывается и которым нельзя войти.
  2. Генерируется одноразовый токен со сроком жизни 7 дней.
  3. На почту уходит письмо со ссылкой вида /accept-invitation?token=…&email=….
  4. Администратору возвращается сама ссылка и флаг «письмо ушло / не ушло».
Если письмо не ушло

Пользователь всё равно создан — ошибка почты не откатывает создание. Администратор видит признак неудачной отправки и может либо переслать приглашение (3.4), либо передать ссылку человеку напрямую любым каналом.

3.2

приглашённыйЯ принимаю приглашение и задаю себе пароль

По ссылке из письма человек вводит пароль (та же проверка сложности, что в 2.5). Проверяется, что токен жив, что email в ссылке совпадает с email аккаунта и что приглашение ещё не принято. После успеха статус меняется на «Активен», а токен удаляется — ссылка одноразовая.

3.3

администраторЯ редактирую пользователя

Меняются имя, фамилия, email, роль, идентификатор и инициалы. Инициалы — отдельное поле (до 16 символов): именно они подставляются в номер заявки как {INITIALS}. Если поле пустое, система соберёт инициалы из имени и фамилии автоматически.

Смена роли действует немедленно и меняет весь набор доступных разделов. Email и идентификатор проверяются на уникальность.

Смена идентификатора не переписывает историю

Номера уже созданных заявок останутся со старым идентификатором — номер присваивается один раз и после этого неизменен.

3.4

администраторЯ повторно отправляю приглашение

Доступно только для пользователей в статусе «Ожидает приглашение». Старый токен удаляется, выпускается новый на 7 дней. Для уже активного пользователя кнопка вернёт отказ.

3.5

администраторЯ деактивирую пользователя

Статус становится «Неактивен», предыдущий статус запоминается. Эффект мгновенный и жёсткий: даже если у человека на руках действующий токен сессии, каждый его запрос будет отклонён с сообщением «Ваш аккаунт деактивирован. У вас больше нет доступа к платформе». Разлогинивать принудительно не требуется.

3.6

администраторЯ возвращаю доступ деактивированному сотруднику

Кнопка активации возвращает тот статус, который был до деактивации, а не просто «Активен»:

  • был активен → снова активен, работает сразу;
  • был «ожидает приглашение» → снова «ожидает приглашение», и система прямо об этом предупреждает: доступа не будет, пока не отправите приглашение повторно;
  • уже активен → отказ «Пользователь уже активен»;
  • «ожидает приглашение» напрямую активировать нельзя — человек обязан пройти по ссылке-приглашению.
3.7

администраторЯ сбрасываю чужую 2FA

Сценарий «сотрудник потерял телефон и резервные коды». Администратор отключает пользователю 2FA без ввода кода. Секрет и резервные коды стираются, человек входит по одному паролю и может настроить 2FA заново.

Организационный риск

Это единственная операция в системе, которая снимает второй фактор без подтверждения владельцем. Кто угодно с ролью «Администратор» может обнулить 2FA любого сотрудника, включая другого администратора. Регламент выдачи роли администратора — это, по сути, ваш периметр безопасности.

3.8

администраторЯ ищу и фильтрую пользователей

Список поддерживает поиск, сортировку и фильтры по роли, статусу и признаку «2FA включена / выключена». Последний фильтр — практичный способ проверить, кто из сотрудников ещё не защитил аккаунт.

Отдельно есть «пользователи для выбора» — облегчённый список активных сотрудников с поиском, который подставляется в поля «Ответственный» в заявках и турах. Он доступен всем ролям, кроме справочных.

Удаления пользователей не существует

В системе нет операции удаления аккаунта — только деактивация. Это осознанно: пользователь связан с заявками, журналами статусов и снимками цен, удаление порвало бы историю.

04Настройки организации

Раздел «Настройки» → вкладка «Платформа». Доступен только администратору. Это самые влиятельные поля во всей системе: они задают, как считаются деньги и как называются заявки.

4.1

администраторЯ настраиваю маску номера заявки

По умолчанию {INITIALS}{YY}-{NNNN}. Доступные подстановки:

ПеременнаяВо что превращаетсяПример
{YYYY}год из четырёх цифр2026
{YY}год из двух цифр26
{MM}месяц с ведущим нулём09
{NNNN}порядковый номер; сколько букв N — столько разрядов0028
{INITIALS}инициалы автора заявкиМК
{USERID}идентификатор автора заявкиKERIMOV

Маска обязана содержать порядковый номер — сохранить её без {N…} система не даст. Длина — до 64 символов.

Как работает счётчик: он свой у каждой организации и у каждого календарного года. С наступлением нового года нумерация начинается заново с единицы. Инкремент атомарный — два оператора, создающие заявку в одну секунду, гарантированно получат разные номера.

Пропуски в нумерации — норма

Номер выдаётся до сохранения заявки. Если заявку потом удалили, номер в счётчик не возвращается, и в нумерации будет дырка. Это не ошибка.

4.2

администраторЯ задаю комиссию компании

Комиссия разбита на три независимых поля, каждое от 0 до 100 % с двумя знаками после запятой:

  • Налог, %
  • Комиссия продавца, %
  • Административные расходы, %

В расчёте применяется их сумма. Разбивка нужна, чтобы понимать, из чего сложился процент; ни одно из полей не работает отдельно.

Изменение процента не влияет на существующие расчёты

Три процента фиксируются в момент создания версии расчёта — как фотография. Поменяли комиссию сегодня — все ранее созданные версии считаются по старым цифрам. Чтобы применить новые проценты к конкретной заявке, нужно создать в ней новую версию расчёта.

4.3

администраторЯ задаю порог FOC и стандартные точки PAX

  • Порог FOC — с какого числа человек начисляется бесплатное место. По умолчанию 10. Значение 0 означает «FOC начисляется всегда». Как и комиссия, фиксируется в версии расчёта при её создании.
  • Стандартные точки PAX — например [2, 4, 6, 8, 10]. Не больше 20 значений, каждое — целое ≥ 1. Система сама убирает дубли и сортирует по возрастанию. Эти точки подставляются в первую версию расчёта новой заявки и в каждую новую пустую версию.
4.4

администраторЯ задаю тексты КП по умолчанию

Два свободных текстовых поля — «Включено в стоимость» и «Не включено». Они копируются в заявку в момент её создания и дальше редактируются в каждой заявке независимо. Изменение шаблона не подтягивается в уже созданные заявки.

4.5

администраторЯ задаю корректировку курса по валютам

По каждой валюте отдельно задаётся поправка к курсу Нацбанка — в процентах либо фиксированной суммой в сомах. Подробнее в разделе 06.

Вкладка «Общее» и «Аккаунт»

Вкладки «Общее» и «Аккаунт» открыты всем ролям, включая справочные, — там профиль, смена пароля и 2FA. Вкладки «Платформа» и «ИИ-инструменты» открыты только администратору: попытка зайти по прямой ссылке перебросит на «Общее».

05Справочники и импорт

Раздел /references. Доступ: администратор (полный), «Заполнение справочников» (полный по справочникам), «Просмотр справочников» (только чтение). Туроператор, менеджер бронирования и руководитель справочники не видят вообще — они работают на готовых данных.

Что за чем заполнять

Порядок в меню не случаен — он повторяет порядок заполнения. Каждый следующий блок опирается на предыдущий.

ГруппаСправочникОт чего зависитГде используется
База и географияСтраныкарточка партнёра, точки маршрутов, заявка (мультивыбор стран)
Валютыцены во всех расценках, валюта тура, курсы
Точки маршрутовстранаотправление/прибытие транспорта, город гостиницы и услуги
Партнёры и людиПартнёрыстрана, категория партнёраклиент в заявке, поставщик услуг и гостиниц, поставщик в бронях
Категории партнёровзадают наценку %, которая прибавляется к комиссии
Контактыгиды, водители, менеджеры, экстренная связь — в бронях тура
Параметры туровТипы транспортавместимость и участие в подборе транспорта
Категории маршрутовтипы транспортаограничивают подбор транспорта в заявке
Сезонывместе с годом заменяют даты тура в заявке
Категории расценокпитание, билеты, гиды и т. п.; флаг «начислять наценку»
Объекты и расценкиГостиницыпартнёр, точка маршрутакарточка объекта: звёзды, адрес, номерной фонд
Расценки на гостиницыгостиница, валютацены за номер с историей по датам
Расценки на транспортточки маршрутов, типы транспорта, валютацена за рейс по направлению, по каждому типу ТС
Расценки за услугикатегория расценки, партнёр-поставщик, валютапитание, входные билеты, гиды, орграсходы
Страны и валюты — общесистемные

Эти два справочника едины для всей платформы и не привязаны к организации. Всё остальное изолировано: данные одной организации не видны другой.

Как устроены расценки: история цен вместо одного числа

У каждой расценки — не одна цена, а список цен с датами начала действия. При расчёте система берёт ту цену, у которой дата начала максимальная из тех, что не превышают дату начала тура.

Цены гостиницы «Ала-Арча»: с 2026-01-01 → 4000 KGS ← действует для тура 15.03.2026 с 2026-05-01 → 5200 KGS ← действует для тура 10.06.2026 Тур 15.03.2026 → 4000 KGS Тур 10.06.2026 → 5200 KGS Тур 20.12.2025 → цены нет, строка не попадёт в расчёт

При сохранении система проверяет: хотя бы одна цена обязательна, дублирующихся дат начала быть не должно, список автоматически сортируется. Валюта задаётся у каждой цены отдельно — одна и та же услуга может иметь долларовую цену на один период и сомовую на другой.

Особенности отдельных расценок

  • Гостиницы: в каждой цене два поля — «двухместное за ночь» (обязательно, цена за номер) и «одноместное за ночь» (может быть пустым). Одна гостиница = одна запись расценки.
  • Транспорт: одна запись — это именованный вариант направления («Бишкек → Каракол, горная»). Внутри — набор типов транспорта, и у каждого типа своя история цен. Цена — за рейс за одну машину. Для одного направления можно завести несколько записей с разными названиями.
  • Услуги: запись однозначно определяется тройкой «категория + поставщик + наименование» — повторить её нельзя. У каждой услуги свой тип тарификации и способ оплаты (наличные / безнал). Плюс справочные поля: город, адрес, телефон, ссылка на документы, комментарий — они выводятся оператору в расчёте и программе.

Три типа тарификации услуги — и что они делают с числом

ТипКодФормула суммы на турЧто означает «количество»
На человекаper_personцена × кол-во × (PAX + FOC)сколько раз на одного человека
Фиксированная в деньfixed_per_dayцена × кол-вомножитель за блок программы или за тур
Произвольнаяcustomценафиксированная сумма за услугу
Контринтуитивное

Несмотря на название «фиксированная ставка в день», длительность блока или тура в стоимость услуги не входит. Дни надо явным образом проставить в количестве. Это ровно то место, где чаще всего ошибаются при заполнении программы.

Ещё две настройки, которые незаметно управляют расчётом

  • Категория расценки → «Начислять наценку». Если флаг снят, услуги этой категории попадают в себестоимость, но комиссия компании на них не начисляется. Так оформляются сквозные расходы, которые перевыставляются клиенту без маржи.
  • Тип транспорта → «Участвует в расчёте». Снятый флаг исключает тип из автоподбора машин, при этом сам тип остаётся в справочнике.
5.1

администраторзаполнение справочниковЯ импортирую справочник из Excel

У каждого справочника один и тот же трёхшаговый маршрут:

  1. Скачать шаблон. Система формирует .xlsx с готовыми заголовками, листом «Инструкция», примерами значений и выпадающими списками там, где значение должно быть из фиксированного набора. Заголовки в шаблоне совпадают с тем, что ждёт парсер, — переименовывать колонки нельзя.
  2. Проверить файл. Кнопка предпросмотра прогоняет файл без сохранения и показывает, сколько строк пройдёт и какие сломаются, с номером строки и причиной.
  3. Импортировать. Корректные строки сохраняются, ошибочные пропускаются. В ответе — сколько создано, сколько не прошло и список ошибок.

Отдельной кнопкой скачивается файл с ошибочными строками: исправляете в нём и загружаете повторно, не разбирая исходный файл целиком.

Как файл читается

Берётся только первый лист книги. Первая строка — заголовки. Полностью пустые строки пропускаются. Связи подставляются по человекочитаемым значениям: партнёр — по наименованию, страна — по ISO-коду («KZ»), валюта — по коду («USD»).

5.2

администраторзаполнение справочниковЯ удаляю запись справочника

Удаление возможно, но связанные записи защищены ссылками в базе: гостиницу, на которую заведена расценка, или партнёра, привязанного к заявке, удалить не получится — операция вернёт ошибку. Порядок всегда обратный порядку создания: сначала расценка, потом объект.

06Курсы валют

Экран «Курсы валют» внутри справочников. Просмотр доступен также роли «Просмотр справочников»; менять курсы может только администратор.

Два курса, а не один

Курс ЦБ
То, что отдал Нацбанк КР: сколько сомов за 1 единицу валюты. Если Нацбанк даёт котировку за 100 единиц, система делит на номинал сама.
Расчётный курс
Курс ЦБ + ваша корректировка. Именно он используется во всех расчётах.
Режим «процент»: расчётный = курс ЦБ × (1 + процент / 100) Режим «фиксированный»: расчётный = курс ЦБ + сумма Без корректировки: расчётный = курс ЦБ KGS всегда: курс ЦБ = 1, расчётный = 1
6.1

системаКурсы обновляются автоматически каждый день

Ежедневно в 06:00 система обращается к официальному файлу Нацбанка КР (nbkr.kg/XML/daily.xml), забирает котировки и пересчитывает расчётные курсы по вашим корректировкам. Таймаут запроса — 15 секунд. Валюта, которой в фиде нет, просто пропускается с пометкой в журнале.

6.2

администраторЯ обновляю курсы вручную прямо сейчас

Кнопка «Загрузить курсы». Делает то же самое, что ночной процесс, но по вашей команде. Если Нацбанк недоступен, вернётся понятная ошибка.

6.3

администраторЯ задаю курс валюты вручную

Для валюты, которой нет в фиде Нацбанка. Указываете курс ЦБ (обязательно положительный), расчётный система выведет сама по корректировке. Источник записи помечается как «ручной».

Ручной курс не «затирается» автообновлением

Система берёт по каждой валюте её собственный последний известный курс, а не общую свежую дату. Поэтому ручной курс продолжает действовать сколько угодно долго — пока вы его не измените, — даже когда у остальных валют курсы обновляются ежедневно.

6.4

администраторЯ задаю корректировку курса

Выбираете режим (процент или фиксированная сумма) и значение — допускается отрицательное. Сохранение немедленно пересчитывает расчётные курсы по всем последним котировкам.

Главное про курсы

Изменение курса или корректировки не пересчитывает уже созданные версии расчёта. Каждая версия хранит собственный снимок курсов на момент создания. Так предложение, отправленное клиенту, не «поедет» на следующий день. Чтобы применить свежие курсы — создайте новую версию расчёта.

07Заявки

Раздел /applications. Видят администратор, туроператор, менеджер бронирования и руководитель. Создавать и менять — только администратор и туроператор.

Жизненный цикл заявки

Расчёт Отправлена партнёру Подтверждена
Отправлена партнёру Отклонена Расчёт (новый номер)
Из статусаКуда можноКто/что запускает переход
РасчётОтправлена партнёруавтоматически при отправке КП
Отправлена партнёруПодтвержденаоператор/администратор — кнопка «Подтвердить»
Отправлена партнёруОтклоненаоператор/администратор — кнопка «Отклонить»
Подтвержденаникудатупик по матрице переходов
ОтклоненаРасчётреактивация (отдельная операция)
7.1

туроператорадминистраторЯ создаю заявку

Обязательные поля: партнёр-клиент, одна или несколько стран маршрута, категория отеля (3★/4★/5★), источник обращения (WhatsApp, Telegram, email, личный кабинет, звонок, прямое обращение). Опционально: категория маршрута, ответственный, код тура партнёра, комментарий.

Даты задаются одним из двух способов, третьего нет:

  • Год + сезон. Система выводит даты из сезона: начало = день/месяц начала сезона в указанном году. Если сезон переходит через Новый год (напр. 15.11 → 20.02), конец берётся в следующем году.
  • Прямые даты начала и окончания.

Указать только год или только сезон нельзя — система потребует и то и другое либо обе даты.

Что происходит в момент создания — цепочка из шести шагов:

  1. Проверяется, что партнёр — клиент (роль «client» или «both»). Поставщика в заявку выбрать нельзя.
  2. Из профиля партнёра копируется его тип (B2B / B2C).
  3. Считается длительность в днях (включая обе даты).
  4. Генерируется номер по маске организации, с инициалами и идентификатором автора заявки.
  5. Из настроек организации копируются тексты КП «включено» и «не включено».
  6. Автоматически создаётся первая версия расчёта со стандартными точками PAX, снимком комиссии, снимком наценки категории партнёра и снимком всех курсов валют. Она сразу становится активной.

В журнал статусов пишется запись «создана → Расчёт» с автором и временем.

7.2

туроператорадминистраторЯ редактирую заявку

Правило простое, но с исключением:

  • Ответственного можно менять в любом статусе, включая подтверждённую заявку.
  • Всё остальное — партнёр, страны, даты, год/сезон, категория отеля, категория маршрута, источник, комментарий — только в статусах «Расчёт» и «Отправлена». После подтверждения коммерческая информация замораживается.

Смена года или сезона заново выводит даты и пересчитывает длительность. Смена стран корректно обновляет список: основной страной остаётся первая в списке.

7.3

туроператорадминистраторЯ подтверждаю или отклоняю заявку

Обе кнопки работают только из статуса «Отправлена партнёру». Из «Расчёта» подтвердить нельзя — сначала нужно отправить КП. Каждый переход пишется в журнал с автором и временем.

7.4

туроператорадминистраторЯ реактивирую отклонённую заявку

Клиент передумал. Кнопка реактивации делает три вещи разом:

  1. Присваивает заявке новый номер (счётчик двигается вперёд).
  2. Возвращает статус «Расчёт».
  3. Клонирует активную версию расчёта в новую: копируются точки PAX, параметры, строки затрат и блоки программы, но курсы валют фиксируются заново, на текущий момент. Старая версия остаётся в истории.

Реактивация доступна только из статуса «Отклонена».

7.5

администраторЯ вручную ставлю заявке произвольный статус

Администратор может выставить любой статус в обход матрицы переходов — например, вернуть подтверждённую заявку в «Расчёт». В журнале такая запись помечается каналом «manual».

Ручная смена не запускает побочные эффекты

Обычный переход тянет за собой действия: отправка КП двигает статус, реактивация клонирует версию. Ручная смена статуса ничего этого не делает — она просто переставляет метку. Ставя вручную «Расчёт» вместо «Отклонена», вы не получите новую версию расчёта и новый номер.

7.6

администраторЯ удаляю заявку

Удаление необратимо и уносит с собой всё: журнал статусов, все версии расчёта со строками, точками PAX и курсами, программу тура и коммерческие предложения.

Единственная защита: заявку, из которой создан хотя бы один тур, удалить нельзя — система вернёт отказ.

Ограничение прав

Право на удаление и ручную смену статуса есть у роли «Администратор». Роль «Туроператор» такие операции выполнить не может.

7.7

все, кто видит заявкиЯ ищу заявку и смотрю журнал её статусов

Поиск идёт по номеру заявки, коду тура партнёра и названию партнёра одновременно. Фильтры: статус, партнёр, направление, ответственный, месяц начала тура, диапазон дат начала тура, диапазон дат создания заявки. Сортировка: по номеру, дате начала, дате создания, статусу.

Журнал статусов показывает каждый переход: откуда, куда, кто инициировал (ФИО или «система»), канал отправки и точное время в вашем часовом поясе.

7.8

туроператорадминистраторЯ импортирую заявки из Excel

Тот же трёхшаговый маршрут, что у справочников. Колонки: Партнёр, Код страны, Дата начала, Дата окончания, Категория отеля (3/4/5), Источник, Код тура партнёра, Комментарий. Даты принимаются в двух форматах: ГГГГ-ММ-ДД и ДД.ММ.ГГГГ. Источник понимает и английские коды, и русские слова («почта», «звонок», «прямой»).

Каждая импортированная строка проходит полный сценарий создания — с номером, копированием текстов КП и созданием первой версии расчёта.

Импорт не умеет год+сезон

Через Excel заявка создаётся только с прямыми датами и одной страной. Сезон, категорию маршрута и мультистрановость нужно проставлять руками после импорта.

Карточка заявки: три вкладки

Внутри заявки — «Программа», «Расчёт» и «КП». Порядок в интерфейсе именно такой, потому что программа является источником затрат для расчёта, а расчёт — источником цифр для КП.

08Программа тура

Вкладка «Программа» в карточке заявки. Доступна туроператору и администратору. Программа хранится внутри версии расчёта: у каждой версии своя программа.

Из чего состоит программа

Программа — это последовательность блоков. Блок это не обязательно один день:

Номер блока
Порядок в программе, 1…N.
Длительность
Сколько дней занимает блок. Сумма длительностей всех блоков = длительность тура.
Точка выезда / прибытия
Из справочника точек маршрутов. Опционально.
Описание
Текст на языке партнёра — то, что увидит клиент в КП. Может быть сгенерирован ИИ (раздел 13).
Фотографии
Загружаются прямо в объектное хранилище. JPEG, PNG, WEBP, GIF.
Мероприятия
Ссылки на конкретные строки справочников расценок + количество.

Мероприятие — это ссылка, а не цена

Ключевая механика: мероприятие хранит только тип, идентификатор расценки и количество. Цена в программе не хранится — она подтягивается из справочника по дате начала тура каждый раз при расчёте.

Тип мероприятияСсылается наЧто означает количество
Гостиницарасценку на гостиницучисло ночей
Транспортрасценку на транспорт (направление)число рейсов
Услугарасценку за услугузависит от тарификации (см. 05)
8.1

туроператорадминистраторЯ собираю программу по дням

Программа сохраняется целиком, одним действием: старые блоки удаляются, новые записываются. Порядок мероприятий внутри блока сохраняется как есть.

Побочный эффект сохранения: длительность заявки пересчитывается как сумма длительностей всех блоков — но только если редактируемая версия является активной у заявки.

Оператору при просмотре программы показываются подтянутые из справочников названия, актуальные цены на дату начала тура, звёзды и номерной фонд гостиницы, поставщик, категория услуги, город, адрес, телефон, ссылка на документы и комментарии. Всё это — справочная обвязка, помогающая собрать программу, не выходя из вкладки.

8.2

туроператорадминистраторЯ задаю свою цену вместо справочной

Для услуг с тарификацией «произвольная» можно указать собственную цену вместо справочной. В программе она задаётся в валюте расценки и конвертируется в валюту тура по курсу, зафиксированному в версии.

Не путайте с доп. услугами

В ручных дополнительных услугах на вкладке «Расчёт» своя цена задаётся сразу в валюте тура и не конвертируется. Одно и то же поле, две разные логики — зависит от того, где вы его заполняете.

09Расчёт стоимости

Вкладка «Расчёт». Сердце системы. Доступна туроператору и администратору.

Версии расчёта

У заявки может быть много версий; активная — ровно одна. Активная версия используется для КП и для создания резервирования.

ОперацияЧто делаетОграничение
Новая версияСоздаёт пустую версию: без строк и программы, но со стандартными точками PAX из настроек. Свежие курсы, свежая комиссия. Становится активной.заявка должна быть в «Расчёт» или «Отправлена»
ДублироватьКопирует выбранную версию целиком: параметры, точки PAX, строки затрат, блоки программы. Курсы фиксируются заново. Копия становится активной.то же
Сделать активнойПереключает активную версию заявки.то же
Подпись версииЗаметка до 120 символов, чтобы различать сценарии («вариант с джипами»).то же
Удалить версиюУдаляет версию со всем содержимым.нельзя активную и нельзя последнюю
После подтверждения заявки расчёт замораживается

Любая правка расчёта — версии, точки PAX, строки, параметры, программа, доп. услуги — блокируется, как только заявка перешла в «Подтверждена» или «Отклонена». Сообщение: «Расчёт нельзя изменять после подтверждения заявки. Создайте тур из подтверждённой заявки».

Что версия фиксирует в момент создания

  • Курсы всех валют относительно валюты тура.
  • Три процента комиссии и их сумма.
  • Наценку категории партнёра.
  • Порог FOC из настроек организации.

Валюта тура по умолчанию — KGS; её можно сменить, и тогда курсы пересчитываются заново от новой базы.

Как считается матрица — шаг за шагом

Для каждой точки PAX система проходит один и тот же путь.

Шаг 1. Сколько человек реально едет

FOC = (PAX ≥ порог FOC) ? число FOC : 0 Людей = PAX + FOC ← занимают места и койки

FOC — фиксированное число мест, а не процент: при пороге 10 и одном FOC группа из 10 и группа из 40 человек получат по одному бесплатному месту.

Шаг 2. Гостиницы

Цены гостиниц — за номер. Туристы размещаются по двухместному, FOC — по одноместному:

цена на человека за ночь = двухместный номер / 2 цена FOC за ночь = одноместный номер (если задан) иначе двухместный / 2 Себестоимость гостиницы = (PAX × цена/чел + FOC × цена FOC) × ночи × курс

Даже при нечётном числе туристов делитель остаётся два — доплата за одноместное показывается отдельно.

Шаг 3. Доплата за одноместное размещение

по каждой гостинице: (одноместный − двухместный / 2) × ночи × курс если одноместный не задан → доплата 0 Итого + комиссия = (сумма доплат) × (1 + эффективная комиссия / 100)

Доплата не зависит от числа туристов и показывается отдельным блоком под матрицей, с расшифровкой по каждой гостинице.

Шаг 4. Транспорт — автоподбор машин

Для каждого направления и каждой точки PAX система подбирает парк под (PAX + FOC) человек:

  1. Берутся все типы транспорта этого направления, у которых есть действующая цена на дату начала тура, стоит флаг «участвует в расчёте» и которые разрешены категорией маршрута заявки.
  2. Для каждого типа считается число машин = ceil(люди / вместимость).
  3. На весь рейс выбирается один тип. Побеждает тот, у кого меньше машин; при равенстве — тот, у кого дешевле общая сумма за рейс (уже в валюте тура, поэтому типы в разных валютах сравниваются корректно).
  4. Сумма на тур = число машин × цена за рейс × количество рейсов.
Пример: 60 человек, направление Бишкек → Каракол Минивэн (8 мест, 6 000) → 8 машин × 6 000 = 48 000 Автобус (33 места, 22 000) → 2 машины × 22 000 = 44 000 ← выбран: меньше машин
Смешанный парк не поддерживается

Система не составит «автобус + минивэн» на один рейс. Всегда один тип, размноженный до нужного количества машин. Если ни у одного типа направления нет действующей цены на дату — направление молча выпадает из расчёта.

Шаг 5. Услуги

Каждая услуга считается по своему типу тарификации (таблица в разделе 05) и раскладывается в две корзины:

  • с наценкой — категория расценки имеет флаг «начислять наценку»;
  • без наценки — флаг снят; сумма входит в себестоимость, но комиссия на неё не начисляется.

Услуги, у которых на дату тура нет действующей цены и не задана своя, показываются в списке строк затрат, но в матрицу не попадают.

Шаг 6. Итог

эффективная комиссия = налог + комиссия продавца + адм. расходы + наценка категории партнёра база под комиссию = транспорт + гостиницы + услуги с наценкой себестоимость = база под комиссию + услуги без наценки комиссия = база под комиссию × эффективная комиссия / 100 ИТОГО ТУР = себестоимость + комиссия цена на человека = ИТОГО ТУР / PAX ← FOC в делитель не входит

Все суммы округляются до двух знаков.

9.1

туроператорадминистраторЯ задаю точки PAX и вижу матрицу цен

Список точек задаётся вручную; дубли убираются, порядок — по возрастанию. Матрица показывает по каждой точке: PAX, FOC, себестоимость транспорта, гостиниц, услуг, базу под комиссию, себестоимость без наценки, общую себестоимость, комиссию, итого по туру, цену на человека и доплату за одноместное.

По каждой цифре доступна расшифровка-подсказка с формулой: например, «Ала-Арча: 8 000 KGS / 2 × 6 + 8 000 KGS × 1) × 3». Это сделано специально, чтобы любую сумму можно было проверить руками, не выгружая расчёт.

9.2

туроператорадминистраторЯ меняю параметры расчёта

Редактируются три вещи: число мест FOC, доплата за одноместное (ручное значение) и валюта тура. Смена валюты тура немедленно пересчитывает снимок курсов относительно новой базы.

9.3

туроператорадминистраторЯ добавляю дополнительную услугу вне программы

Организационные расходы и прочее, что не привязано к конкретному дню. Указываются ссылка на «Расценки за услуги», количество и, при необходимости, своя цена в валюте тура. Для тарификации «фиксированная в день» количество здесь означает множитель за весь тур.

9.4

туроператорадминистраторЯ смотрю развёрнутый список строк затрат

Экран делится на строки из программы (сгруппированы по блокам, редактируются в программе) и ручные дополнительные услуги. По каждой строке видны: наименование, поставщик, категория, тип тарификации, признак наценки, цена в валюте справочника и в валюте тура, количество, для гостиниц — цены одноместного и двухместного, для транспорта — состав подобранных машин по каждой точке PAX и полный перечень доступных типов направления.

Ошибка, которая останавливает расчёт

Если в программе есть расценка в валюте, для которой в версии нет зафиксированного курса, матрица не построится: «Нет зафиксированного курса для валюты X. Загрузите курсы в справочнике "Валюты", затем создайте новую версию расчёта». Лечится ровно так, как написано — загрузить курс и создать новую версию; в старой курса не появится.

10Коммерческое предложение

Вкладка «КП». Создание и отправка — туроператор и администратор. Список файлов КП может открыть любой, кто видит заявку.

10.1

туроператорадминистраторЯ открываю КП заявки

КП у заявки одно. При первом открытии вкладки оно создаётся автоматически по активной версии расчёта; при повторных — возвращается существующее.

  • Номер КП: номер заявки + -Q + порядковый, сквозной по всем версиям заявки: МК26-0028-Q1, -Q2
  • Язык документа берётся из карточки партнёра (язык общения). Если не задан — русский.
  • «Действует до» подставляется как 31 декабря года тура, если год у заявки указан. Подставляется один раз: очистив поле вручную, вы не получите его обратно при следующем открытии.
10.2

туроператорадминистраторЯ редактирую условия КП

Редактируются: «Включено в стоимость», «Не включено», условия оплаты, срок действия и язык документа. Эти поля хранятся на уровне заявки, а не версии расчёта, — то есть при переключении активной версии условия не сбрасываются.

10.3

туроператорадминистраторЯ смотрю предпросмотр КП

Предпросмотр собирается на лету и всегда отражает активную версию расчёта — даже если КП формально привязано к другой версии. То есть переключили активную версию — предпросмотр и будущий документ поменялись.

В документ попадают: реквизиты заявки, партнёр, страны, даты, длительность, категория отеля, матрица цен, программа по блокам и состав тура. Комиссия и наценка в клиентский документ не выводятся — это внутренние блоки.

10.4

туроператорадминистраторЯ формирую PDF или Word

Генерация ставится в фоновую очередь — интерфейс не блокируется. Запись файла проходит через статусы: «в очереди» → «готов» / «ошибка». Файл рендерится и кладётся в объектное хранилище; скачивается по временной ссылке.

  • Имя файла собирается по маске «дата_номер»: 2026-07-21_МК26-0028-Q1.pdf.
  • Фиксируются автор генерации и номер версии расчёта, по которой сделан документ, — в списке файлов видно, какому сценарию соответствует каждый PDF.
  • Файл живёт 14 дней (настраивается на сервере). После этого ежедневная очистка удаляет и объект в хранилище, и запись. Попытка скачать просроченный файл вернёт «Срок хранения файла истёк — сгенерируйте документ заново».
  • Рендер, не завершившийся за 15 минут, автоматически помечается как неудачный.
  • При сбое делается до двух попыток.
Файлы КП — не архив

Хранилище сгенерированных документов временное. Если PDF нужен как юридически значимый след — скачивайте и храните у себя. Повторная генерация через месяц может дать другие цифры, если справочники или курсы изменились.

10.5

туроператорадминистраторЯ отправляю КП клиенту

Кнопка «Отправить» фиксирует факт отправки: КП помечается как отправленное, записываются время и канал (по умолчанию email).

Главный побочный эффект: если заявка была в статусе «Расчёт», она автоматически переходит в «Отправлена партнёру», и в журнал пишется запись с каналом отправки. Именно этот переход открывает кнопки «Подтвердить» и «Отклонить».

Система не отправляет письмо клиенту

Действие фиксирует факт отправки, а не выполняет её. Документ клиенту вы отправляете сами — почтой, мессенджером, как договорено. Интеграций с WhatsApp и Telegram в текущей версии нет.

11Резервирование (тур)

Раздел /tours. Здесь коммерческая работа заканчивается и начинается операционная. Создавать резервирование могут туроператор, менеджер бронирования и администратор; вести его дальше — менеджер бронирования и администратор.

Жизненный цикл

Ожидает бронированияЗабронирован

Всего два статуса. Переход в «Забронирован» происходит автоматически, когда все обязательные брони подтверждены (см. 11.6), либо вручную — администратором или менеджером бронирования.

11.1

туроператорменеджер бронированияадминистраторЯ создаю резервирование из подтверждённой заявки

Условия: заявка в статусе «Подтверждена» и у неё есть активная версия расчёта. Из одной заявки можно создать несколько резервирований — например, на разные заезды.

Вы указываете дату начала и раскладку номеров: сколько одноместных (SGL), двухместных (DBL), твинов (TWIN) и трёхместных (TRPL). Минимум один номер обязателен.

всего человек = SGL + (DBL + TWIN) × 2 + TRPL × 3 FOC = (всего человек ≥ порог) ? число FOC : 0 PAX = всего человек − FOC длительность = сумма дней блоков программы (иначе — длительность заявки) дата конца = дата начала + длительность − 1

PAX должен быть не меньше единицы — иначе система откажет.

Что создаётся одной транзакцией:

  1. Номер тура вида T2026-0001 — сквозной счётчик по организации и году даты начала тура.
  2. Неизменяемый снимок цены с причиной «создан»: точный расчёт под этот PAX и эту дату, раскладка номеров, стоимость, доплата за одноместные, комиссия и полная разбивка.
  3. Запись в журнал статусов.
  4. Расписание, посеянное из программы тура.
Стоимость резервирования: база = число номеров × цена на человека доплата SGL = число одноместных × доплата за одноместное ИТОГО = база + доплата
11.2

те же ролиЯ предварительно считаю стоимость, ничего не создавая

Отдельная кнопка предпросмотра: указываете дату и раскладку и видите длительность, дату окончания, число номеров, всего человек, FOC, PAX, цену на человека, доплату и итог. Ни резервирование, ни версия расчёта при этом не меняются. То же доступно и для уже созданного тура — «что будет, если сдвинуть дату или переложить номера».

11.3

менеджер бронированияадминистраторЯ меняю дату начала, раскладку или ответственного

Три поля с разными последствиями:

Что меняетеПоследствия
Ответственныйменяется, цена не пересчитывается
Раскладка номеровпересчитывается PAX и цена, создаётся новый снимок с причиной «изменена раскладка»
Дата началавсё расписание сдвигается на ту же дельту, у каждого события заново снимаются цены на новую дату, создаётся снимок с причиной «изменена дата начала»

Две защиты, которые остановят изменение:

  • Нельзя уменьшить раскладку так, чтобы PAX стал меньше числа уже добавленных туристов.
  • Если после сдвига какое-то событие расписания вылезет за пределы новых дат тура — изменение отклоняется с просьбой сначала поправить расписание.
11.4

менеджер бронированияадминистраторЯ принудительно пересчитываю цену

Кнопка ручного пересчёта — когда изменились справочники и нужно зафиксировать актуальную стоимость при тех же дате и раскладке. Обязательно требуется текстовое пояснение, оно навсегда сохраняется в снимке. Создаётся новый снимок с причиной «ручной пересчёт».

11.5

все, кто видит турыЯ смотрю историю стоимости

Снимки цены неизменяемы и накапливаются. По каждому видно: дату, PAX, раскладку, причину изменения, пояснение оператора, валюту, FOC, себестоимость, комиссию, итог, цену на человека, доплату и полную внутреннюю разбивку. Это ваш аудиторский след «почему тур стоит столько».

11.6

менеджер бронированияадминистраторЯ веду брони у поставщиков

Бронь может быть привязана к событию расписания или существовать сама по себе. Поля: обязательность, поставщик (из партнёров), контактное лицо (из контактов), канал связи, дедлайн, номер подтверждения, фактическая стоимость с валютой, условия оплаты, процент предоплаты, комментарий.

Имя, email и телефон контакта подставляются автоматически из справочника и дальше редактируются вручную — то есть в брони остаётся тот контакт, который был на момент бронирования, даже если справочник потом изменили.

Статусы брони — движение только вперёд:

Не забронированоЗапрос отправленПодтверждено
Не забронировано/Запрос отправленОтменено

«Подтверждено» и «Отменено» — тупики: изменить статус после них нельзя. Из «не забронировано» нельзя перепрыгнуть сразу в «подтверждено».

Автопереход тура в «Забронирован»

После каждой правки брони система проверяет: есть ли у тура хотя бы одна активная обязательная бронь и все ли они подтверждены. Если да — тур автоматически переходит в «Забронирован», а в журнал пишется запись с автором «система» и пояснением «Все активные обязательные бронирования подтверждены». Отменённые брони в проверке не участвуют.

Фактическую стоимость и валюту можно указывать только вместе — одно без другого система не примет.

11.7

менеджер бронированияадминистраторЯ веду расписание тура

Расписание создаётся автоматически при создании резервирования: каждое мероприятие программы превращается в событие. Гостиница разворачивается в отдельное событие на каждую ночь, транспорт и услуги — в одно событие на блок.

Тип события определяется автоматически: гостиница → «Проживание», транспорт → «Трансфер», услуга → «Прочее». Дальше события правятся вручную: тип (проживание, трансфер, питание, экскурсия, активность, свободное время, прочее), название, описание, даты, время начала и окончания, место, порядок внутри дня, признак «требует бронирования».

Доступны: добавление события, перестановка внутри дня, атомарный перенос события на другую дату с заданием порядка, удаление.

Снимок услуги в событии

Событие хранит не ссылку на справочник, а снимок: название, поставщик, цены, звёзды, адрес, телефон, категория — всё зафиксированное на дату события. Последующие правки справочника расписание уже созданного тура не меняют. Снимок обновляется только при сдвиге даты тура.

11.8

менеджер бронированияадминистраторЯ веду список туристов

По каждому туристу: ФИО (обязательно), гражданство, дата рождения, номер паспорта, срок действия паспорта, email, телефон, тип размещения (одноместное / двухместное / трёхместное), особые требования, порядок в списке.

Жёсткое ограничение

Число туристов не может превысить PAX резервирования. Проверка стоит и при ручном добавлении, и при импорте, и работает под блокировкой записи — то есть два менеджера одновременно не смогут «просочиться» сверх лимита. Чтобы добавить больше — сначала измените раскладку номеров.

Импорт из Excel: шаблон с колонками ФИО, Гражданство, Дата рождения, Паспорт, Действителен до, Email, Телефон, Размещение, Особые требования. Строки сверх PAX отклоняются с указанием номера строки и причины; корректные — сохраняются.

Печатная форма списка туристов формируется отдельной кнопкой.

11.9

менеджер бронированияадминистраторЯ прикладываю документы

Документ привязывается к туру и, опционально, к событию расписания или к брони. Типы: общий, подтверждение брони, ваучер, билет, страховка, прочее. Разрешены PDF, JPEG, PNG, WEBP. Файл грузится из браузера напрямую в хранилище по временной ссылке; скачивание — тоже по временной ссылке.

11.10

менеджер бронированияадминистраторЯ формирую Booking List

Итоговый операционный документ в PDF или XLSX. Собирает воедино: реквизиты тура и заявки, партнёра, ответственного, всё расписание по датам, все брони с поставщиками, контактами и статусами, полный список туристов.

Каждая генерация сохраняется отдельной версией — видно, кто и когда сформировал. Скачивание по временной ссылке. При сбое версия помечается как неудачная.

Отличие от файлов КП

Booking List генерируется синхронно (вы ждёте результат) и, в отличие от файлов КП, не имеет срока автоудаления.

11.11

все, кто видит турыЯ нахожу нужное резервирование

Поиск идёт одновременно по номеру тура, номеру заявки, коду тура партнёра и названию партнёра. Фильтры: статус, направление, ответственный, диапазон дат начала. Сортировка: номер, дата начала, дата окончания, PAX, статус, дата создания.

В списке у каждого тура виден прогресс бронирования — сколько обязательных броней подтверждено из скольких и процент готовности.

Удаления резервирования нет

В системе отсутствует операция удаления тура. Есть удаление отдельных документов, туристов, событий расписания и броней — но само резервирование удалить нельзя.

12Аналитика

Дашборд на главной странице. Доступен только администратору и руководителю. Считается по заявкам; туры в аналитику не входят.

Как считается когорта

Когорта — заявки, созданные в выбранном периоде. Период по умолчанию — последние три месяца. Достижение этапа определяется по журналу статусов: учитывается первое попадание в статус. Поэтому реактивированная заявка не задваивает показатели.

12.1

администраторруководительЯ смотрю распределение заявок по статусам

Количество заявок в каждом из четырёх статусов за период, общее число и число активных (в «Расчёте» и «Отправлена»).

12.2

администраторруководительЯ смотрю воронку и конверсию

Показатели за период:

  • воронка «открыто → отправлено → подтверждено → отклонено» с процентами от числа открытых;
  • конверсия = подтверждённые / открытые;
  • закрываемость = подтверждённые / отправленные;
  • средний срок от создания до отправки и от отправки до подтверждения, в днях;
  • отказы с разбивкой по этапу, на котором заявка сорвалась;
  • сравнение с предыдущим периодом такой же длины;
  • временной ряд с настраиваемой детализацией.
12.3

администраторруководительЯ сравниваю менеджеров и партнёров

Две таблицы — по ответственным и по партнёрам. В каждой: открыто, отправлено, подтверждено, отклонено, конверсия. Поддерживаются поиск, сортировка по любому столбцу и постраничный вывод. Дополнительно фильтруется по направлению, источнику обращения, категории отеля и типу партнёра (B2B / B2C).

13ИИ-описания программы

Помощник, который пишет текст описания блока программы. Настраивается администратором в «Настройки → ИИ-инструменты», используется туроператором и администратором на вкладке «Программа». По умолчанию функция выключена.

13.1

администраторЯ подключаю ИИ-генерацию

Выбирается одна из преднастроенных моделей, вводится её API-ключ и задаётся системный промпт — инструкция, задающая тон и стиль описаний.

Условия включения проверяются жёстко: системный промпт заполнен, ключ выбранной модели сохранён. Иначе включить не дадут.

Ключ хранится в зашифрованном виде и никогда не возвращается в интерфейс целиком. Есть отдельная операция «показать ключ» и кнопка «Проверить» — она делает тестовый запрос к модели с заглушечным блоком и показывает, отвечает ли провайдер. Очистка поля ключа удаляет сохранённые учётные данные.

13.2

туроператорадминистраторЯ генерирую описание блока программы

Три операции, и система следит, чтобы вы выбрали правильную:

ОперацияКогда доступна
Сгенерироватьтолько если поле описания пустое
Улучшитьтолько если описание уже есть
Создать зановотолько если описание уже есть

Модель получает контекст блока: длительность, точки маршрута, состав мероприятий с названиями из справочников. Язык результата берётся из языка общения партнёра — французскому клиенту описание сгенерируется по-французски.

Можно добавить свободный «контекст для модели» до 5000 символов — уточнение к конкретной генерации.

  • Таймаут запроса — 30 секунд, длина ответа ограничена.
  • Повторная отправка того же запроса не создаёт вторую генерацию: система распознаёт дубль и вернёт первый результат.
  • Каждая генерация пишется в журнал: кто, когда, какая версия и заявка, какая модель, язык, статус, длительность, объём текста на входе и выходе, код ошибки при сбое.
Результат — черновик, а не решение

Сгенерированный текст возвращается как предложение; в программу он попадает только после того, как оператор сохранит блок. Никакой автозаписи в базу генерация не делает.

14Фоновые процессы и внешние зависимости

То, что работает без участия человека. Знать полезно: когда что-то «само поменялось» или «само не сработало» — искать надо здесь.

ПроцессКогдаЧто делаетЕсли сломается
Обновление курсовежедневно 06:00тянет котировки Нацбанка КР, пересчитывает расчётные курсы всем активным организациямкурсы остаются вчерашними; ошибка пишется в журнал, пользователю не показывается
Очистка файлов КПежедневноудаляет из хранилища и базы файлы старше срока храненияфайлы копятся в хранилище
Рендер файлов КПпо кнопке, в очередиформирует PDF/Word, до 2 попытокфайл помечается «ошибка»; зависший дольше 15 минут — тоже
Автопереход турапосле каждой правки бронипереводит тур в «Забронирован», когда все обязательные брони подтверждены
Автопереход заявкипри отправке КП«Расчёт» → «Отправлена партнёру»

От чего система зависит снаружи

Нацбанк КР
Источник курсов валют. Недоступен — курсы не обновятся, но система продолжит работать на последних известных.
Почтовый сервер
Приглашения и сброс пароля. Недоступен — пользователь создаётся, но письма нет; администратор видит признак неудачной отправки и передаёт ссылку вручную.
Объектное хранилище
Все файлы: фото программы, документы туров, PDF КП, Booking List. Недоступно — файлы не грузятся и не скачиваются.
Очередь задач
Фоновая генерация документов КП. Недоступна — файлы навсегда остаются «в очереди» и через 15 минут помечаются неудачными.
Провайдер ИИ
Генерация описаний. Недоступен — генерация не работает, остальная система не затронута.

Изоляция данных между организациями

Каждая запись — заявки, туры, справочники, настройки, курсы, логи ИИ — помечена организацией, и любой запрос читает только записи своей. Даже если подставить чужой идентификатор в адрес, вернётся «не найдено». Общие на всю платформу только два справочника: Страны и Валюты.

15Матрица прав

Сводная таблица: кто что может. Составлена по проверкам в коде сервера, а не по виду меню. «—» означает, что запрос будет отклонён с ошибкой доступа.

Раздел / операцияАдминТуроператорМенеджер брон.РуководительПросмотр справ.Заполн. справ.
Дашборд / аналитикадада
Пользователиполный
Сброс чужой 2FAда
Настройки → Платформада
Настройки → ИИда
Свой профиль, пароль, 2FAдададададада
Справочники — просмотрдадада
Справочники — правка и импортдада
Курсы валют — просмотрдадада
Курсы валют — изменениеда
Заявки — просмотрдададада
Заявки — создание и правкадада
Заявки — удаление, ручной статусда
Расчёт и программадада
КП — создание, правка, отправкадада
КП — список и скачивание файловдададада
ИИ-генерация описанийдада
Туры — просмотрдададада
Создание тура из заявкидадада
Правка тура, статус, пересчёт ценыдада
Расписание, брони, туристы, документыдада
Booking Listдада
Как читать спорные строки

Туроператор может создать резервирование из подтверждённой заявки, но дальше вести его не может — это зона менеджера бронирования. Руководитель видит и заявки, и туры, но не меняет ничего нигде.

16Что важно знать заранее

Список мест, где поведение системы расходится с интуицией. Это не баги — это осознанные решения, но они регулярно вызывают вопросы у новых пользователей.

Снимки: почему «я поменял, а не пересчиталось»

Система намеренно фиксирует значения в момент создания сущности, чтобы отправленное клиенту предложение не менялось задним числом. Фиксируются:

Что фиксируетсяГдеКогда обновится
Курсы всех валютверсия расчётановая версия / смена валюты тура
Три процента комиссииверсия расчётановая версия
Наценка категории партнёраверсия расчётановая версия
Порог FOCверсия расчётановая версия
Тексты КП по умолчаниюзаявкатолько вручную в заявке
Цена, PAX, раскладкаснимок цены турановый снимок (правка или ручной пересчёт)
Данные услуги (название, цены, адрес)событие расписания турасдвиг даты начала тура
Контакт и поставщикброньтолько вручную

Цены справочников, наоборот, не фиксируются в программе: они подтягиваются каждый раз по дате начала тура. Меняете расценку — меняется расчёт всех незамороженных заявок с этой датой.

Тупики и необратимые действия

  • Подтверждённая заявка — расчёт, программа и КП замораживаются навсегда. Вернуть можно только ручной сменой статуса администратором, и это не откатит побочные эффекты.
  • Удаление заявки — уносит все версии расчёта, программу и КП. Только если из неё не создан тур.
  • Резервные коды 2FA — показываются один раз.
  • Бронь в статусе «Подтверждено» или «Отменено» — статус больше не меняется.
  • Номер заявки — присваивается один раз; меняется только при реактивации.
  • Снимок цены тура — неизменяем, только добавляется новый.

Чего в системе нет

  • Самостоятельной регистрации — только приглашение администратора.
  • Удаления пользователей и удаления резервирований.
  • Настраиваемых ролей и прав — набор из шести ролей зашит.
  • Отправки КП клиенту из системы — фиксируется только факт отправки.
  • Интеграций с WhatsApp, Telegram и почтой клиента.
  • Смешанного парка транспорта на один рейс.
  • Учёта фактических платежей и взаиморасчётов.
  • Уведомлений о приближающихся дедлайнах броней.

Порядок первого запуска — как я бы его выстроила

  1. Настройки → Платформа: маска номера, три процента комиссии, порог FOC, стандартные точки PAX, тексты КП.
  2. Курсы валют: загрузить из Нацбанка, задать корректировки, вручную проставить курсы валют, которых нет в фиде.
  3. Справочники по порядку меню: точки маршрутов → категории партнёров → партнёры (и клиенты, и поставщики) → контакты → типы транспорта → категории маршрутов → сезоны → категории расценок → гостиницы → расценки (гостиницы, транспорт, услуги). Крупные объёмы — через импорт с обязательным предпросмотром.
  4. Пользователи: завести сотрудников, обязательно проставив уникальные идентификаторы и, при необходимости, инициалы — они попадут в номера заявок.
  5. Контрольный прогон: создать тестовую заявку, собрать программу, проверить, что матрица считается и цифры в подсказках сходятся вручную, сформировать КП, подтвердить, создать резервирование, провести бронь до «Подтверждено» и убедиться, что тур сам перешёл в «Забронирован». Затем удалить тестовую заявку — но помните: удалить её получится только если тур не создан, поэтому тестовый тур останется в системе навсегда.
  6. ИИ-инструменты — по желанию, в последнюю очередь.
Про контрольный прогон

Тестовое резервирование удалить нельзя, а тестовая заявка после создания тура тоже станет неудаляемой. Если чистота данных важна — прогоняйте сценарий на отдельном (тестовом) стенде, а не на боевом.