00Как устроена система
Платформа ведёт коммерческий цикл туроператора: обращение клиента → расчёт себестоимости и цены → коммерческое предложение → подтверждение → операционная подготовка тура. Всё это опирается на справочники, которые вы наполняете заранее.
Три слоя, из которых складывается всё остальное
- Справочники — страны, валюты, точки маршрутов, партнёры, контакты, гостиницы, типы транспорта, сезоны, категории и сами расценки. Это «прайс-лист» компании. Без них расчёт физически не может посчитать ни одной суммы.
- Заявка — коммерческая сущность. Внутри неё живут версии расчёта, программа тура по дням и коммерческое предложение (КП).
- Резервирование (тур) — операционная сущность. Создаётся вручную из подтверждённой заявки, дальше живёт своей жизнью: расписание, брони у поставщиков, туристы, документы.
Ключевые термины, без которых текст ниже не читается
- 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Вход, двухфакторная аутентификация, пароль
все ролиЯ вхожу в систему по email и паролю
Экран /sign-in. Система ищет пользователя по email и сверяет пароль.
- Пароль неверный или email неизвестен → «Неверный email или пароль». Формулировка одна на оба случая — чтобы нельзя было перебором выяснить, какие адреса заведены. Более того, при неизвестном email система намеренно тратит столько же времени на проверку, сколько и на настоящую, — чтобы нельзя было вычислить существование аккаунта по скорости ответа.
- Аккаунт деактивирован → отдельное сообщение «Ваш аккаунт деактивирован. Свяжитесь с поддержкой…». Здесь система сознательно раскрывает причину, чтобы человек не бился о «неверный пароль».
- 2FA выключена → вы сразу в системе.
- 2FA включена → выдаётся временный промежуточный токен на 5 минут и вас перебрасывает на экран ввода кода. Этим токеном нельзя открыть ничего, кроме проверки кода.
После успешного входа выдаются два токена: рабочий на 24 часа и токен продления на 7 дней. Пока вы пользуетесь системой, сессия продлевается незаметно. Если не заходить неделю — придётся логиниться заново.
все ролиЯ подтверждаю вход кодом из приложения-аутентификатора
Экран /two-factor. Принимается либо шестизначный TOTP-код, либо один из резервных кодов.
- Допуск по времени — одно окно в 30 секунд в обе стороны, то есть код, который только что сменился, ещё сработает.
- Резервный код сгорает при использовании — второй раз тот же код не примут.
- Если за 5 минут код не введён — промежуточный токен истёк, надо начинать вход заново.
- Если пока вы искали телефон, администратор деактивировал ваш аккаунт — вход не завершится.
все ролиЯ включаю себе 2FA
Настройки → вкладка безопасности. Порядок жёсткий и его нельзя пропустить:
- Система генерирует секрет и QR-код (подпись в приложении будет «Asia Expeditions (ваш email)») и сразу сохраняет секрет в вашем профиле — но 2FA пока выключена.
- Вы сканируете QR и вводите текущий код. Код неверный — включения не происходит.
- 2FA включается, и система единожды показывает 10 резервных кодов. Повторно их посмотреть невозможно.
Резервные коды показываются один раз. Не сохранив их, при потере телефона пользователь сможет вернуться только через администратора (сценарий 3.7).
все ролиЯ перевыпускаю резервные коды или выключаю 2FA
Обе операции требуют ввести действующий TOTP-код. Перевыпуск аннулирует все старые 10 кодов и выдаёт новые 10. Выключение 2FA стирает и секрет, и все резервные коды.
все ролиЯ меняю свой пароль
Настройки → аккаунт. Нужен текущий пароль. Если у вас включена 2FA — дополнительно требуется TOTP-код. Новый пароль обязан отличаться от текущего и пройти проверку сложности:
- от 8 до 128 символов;
- минимум одна заглавная, одна строчная, одна цифра и один спецсимвол;
- не больше двух одинаковых символов подряд («aaa» — запрещено);
- не должен содержать имя из вашего email (для
ivanov@…пароль с «ivanov» не примут).
все ролиЯ забыл пароль и восстанавливаю доступ
Экран /forgot-password. Система всегда отвечает одинаково, независимо от того, есть такой email или нет. Письмо со ссылкой уходит только если аккаунт реально существует и уже активирован.
- Ссылка живёт 15 минут.
- Каждый новый запрос аннулирует предыдущую ссылку.
- Приглашённому пользователю, который ещё не принял приглашение, ссылка сброса не отправляется — такому человеку нужна ссылка-приглашение, а не сброс. Если он всё-таки где-то раздобудет токен сброса, система откажет: «Аккаунт ещё не активирован — воспользуйтесь ссылкой из приглашения».
- Новый пароль проходит ту же проверку сложности.
Сбой отправки почты не считается ошибкой пользователя: система молча пишет проблему в свой журнал и отвечает «успешно». Человек будет ждать письма, которого нет. Это единственный способ поймать проблему — попросить администратора проверить логи почты.
03Пользователи
Раздел /users виден только администратору. Самостоятельной регистрации в системе нет — попасть внутрь можно исключительно по приглашению.
администраторЯ создаю нового пользователя и отправляю ему приглашение
Заполняются пять полей:
| Поле | Правила | Зачем ещё нужно |
|---|---|---|
| Имя | 2–100 символов, только буквы (рус./лат.), дефис, пробел | ФИО в журналах статусов, подписи документов |
| Фамилия | 2–100 символов, те же символы | сортировка в списках |
| корректный адрес, уникален | логин и адрес приглашения | |
| Идентификатор | до 8 символов, только латиница и цифры, уникален в организации | подставляется в номер заявки как {USERID} |
| Роль | одна из шести | определяет весь доступ |
Что происходит дальше, по шагам:
- Создаётся аккаунт со статусом «Ожидает приглашение» (pending) и случайным временным паролем, который никому не показывается и которым нельзя войти.
- Генерируется одноразовый токен со сроком жизни 7 дней.
- На почту уходит письмо со ссылкой вида
/accept-invitation?token=…&email=…. - Администратору возвращается сама ссылка и флаг «письмо ушло / не ушло».
Пользователь всё равно создан — ошибка почты не откатывает создание. Администратор видит признак неудачной отправки и может либо переслать приглашение (3.4), либо передать ссылку человеку напрямую любым каналом.
приглашённыйЯ принимаю приглашение и задаю себе пароль
По ссылке из письма человек вводит пароль (та же проверка сложности, что в 2.5). Проверяется, что токен жив, что email в ссылке совпадает с email аккаунта и что приглашение ещё не принято. После успеха статус меняется на «Активен», а токен удаляется — ссылка одноразовая.
администраторЯ редактирую пользователя
Меняются имя, фамилия, email, роль, идентификатор и инициалы. Инициалы — отдельное поле (до 16 символов): именно они подставляются в номер заявки как {INITIALS}. Если поле пустое, система соберёт инициалы из имени и фамилии автоматически.
Смена роли действует немедленно и меняет весь набор доступных разделов. Email и идентификатор проверяются на уникальность.
Номера уже созданных заявок останутся со старым идентификатором — номер присваивается один раз и после этого неизменен.
администраторЯ повторно отправляю приглашение
Доступно только для пользователей в статусе «Ожидает приглашение». Старый токен удаляется, выпускается новый на 7 дней. Для уже активного пользователя кнопка вернёт отказ.
администраторЯ деактивирую пользователя
Статус становится «Неактивен», предыдущий статус запоминается. Эффект мгновенный и жёсткий: даже если у человека на руках действующий токен сессии, каждый его запрос будет отклонён с сообщением «Ваш аккаунт деактивирован. У вас больше нет доступа к платформе». Разлогинивать принудительно не требуется.
администраторЯ возвращаю доступ деактивированному сотруднику
Кнопка активации возвращает тот статус, который был до деактивации, а не просто «Активен»:
- был активен → снова активен, работает сразу;
- был «ожидает приглашение» → снова «ожидает приглашение», и система прямо об этом предупреждает: доступа не будет, пока не отправите приглашение повторно;
- уже активен → отказ «Пользователь уже активен»;
- «ожидает приглашение» напрямую активировать нельзя — человек обязан пройти по ссылке-приглашению.
администраторЯ сбрасываю чужую 2FA
Сценарий «сотрудник потерял телефон и резервные коды». Администратор отключает пользователю 2FA без ввода кода. Секрет и резервные коды стираются, человек входит по одному паролю и может настроить 2FA заново.
Это единственная операция в системе, которая снимает второй фактор без подтверждения владельцем. Кто угодно с ролью «Администратор» может обнулить 2FA любого сотрудника, включая другого администратора. Регламент выдачи роли администратора — это, по сути, ваш периметр безопасности.
администраторЯ ищу и фильтрую пользователей
Список поддерживает поиск, сортировку и фильтры по роли, статусу и признаку «2FA включена / выключена». Последний фильтр — практичный способ проверить, кто из сотрудников ещё не защитил аккаунт.
Отдельно есть «пользователи для выбора» — облегчённый список активных сотрудников с поиском, который подставляется в поля «Ответственный» в заявках и турах. Он доступен всем ролям, кроме справочных.
В системе нет операции удаления аккаунта — только деактивация. Это осознанно: пользователь связан с заявками, журналами статусов и снимками цен, удаление порвало бы историю.
04Настройки организации
Раздел «Настройки» → вкладка «Платформа». Доступен только администратору. Это самые влиятельные поля во всей системе: они задают, как считаются деньги и как называются заявки.
администраторЯ настраиваю маску номера заявки
По умолчанию {INITIALS}{YY}-{NNNN}. Доступные подстановки:
| Переменная | Во что превращается | Пример |
|---|---|---|
| {YYYY} | год из четырёх цифр | 2026 |
| {YY} | год из двух цифр | 26 |
| {MM} | месяц с ведущим нулём | 09 |
| {NNNN} | порядковый номер; сколько букв N — столько разрядов | 0028 |
| {INITIALS} | инициалы автора заявки | МК |
| {USERID} | идентификатор автора заявки | KERIMOV |
Маска обязана содержать порядковый номер — сохранить её без {N…} система не даст. Длина — до 64 символов.
Как работает счётчик: он свой у каждой организации и у каждого календарного года. С наступлением нового года нумерация начинается заново с единицы. Инкремент атомарный — два оператора, создающие заявку в одну секунду, гарантированно получат разные номера.
Номер выдаётся до сохранения заявки. Если заявку потом удалили, номер в счётчик не возвращается, и в нумерации будет дырка. Это не ошибка.
администраторЯ задаю комиссию компании
Комиссия разбита на три независимых поля, каждое от 0 до 100 % с двумя знаками после запятой:
- Налог, %
- Комиссия продавца, %
- Административные расходы, %
В расчёте применяется их сумма. Разбивка нужна, чтобы понимать, из чего сложился процент; ни одно из полей не работает отдельно.
Три процента фиксируются в момент создания версии расчёта — как фотография. Поменяли комиссию сегодня — все ранее созданные версии считаются по старым цифрам. Чтобы применить новые проценты к конкретной заявке, нужно создать в ней новую версию расчёта.
администраторЯ задаю порог FOC и стандартные точки PAX
- Порог FOC — с какого числа человек начисляется бесплатное место. По умолчанию 10. Значение 0 означает «FOC начисляется всегда». Как и комиссия, фиксируется в версии расчёта при её создании.
- Стандартные точки PAX — например [2, 4, 6, 8, 10]. Не больше 20 значений, каждое — целое ≥ 1. Система сама убирает дубли и сортирует по возрастанию. Эти точки подставляются в первую версию расчёта новой заявки и в каждую новую пустую версию.
администраторЯ задаю тексты КП по умолчанию
Два свободных текстовых поля — «Включено в стоимость» и «Не включено». Они копируются в заявку в момент её создания и дальше редактируются в каждой заявке независимо. Изменение шаблона не подтягивается в уже созданные заявки.
администраторЯ задаю корректировку курса по валютам
По каждой валюте отдельно задаётся поправка к курсу Нацбанка — в процентах либо фиксированной суммой в сомах. Подробнее в разделе 06.
Вкладки «Общее» и «Аккаунт» открыты всем ролям, включая справочные, — там профиль, смена пароля и 2FA. Вкладки «Платформа» и «ИИ-инструменты» открыты только администратору: попытка зайти по прямой ссылке перебросит на «Общее».
05Справочники и импорт
Раздел /references. Доступ: администратор (полный), «Заполнение справочников» (полный по справочникам), «Просмотр справочников» (только чтение). Туроператор, менеджер бронирования и руководитель справочники не видят вообще — они работают на готовых данных.
Что за чем заполнять
Порядок в меню не случаен — он повторяет порядок заполнения. Каждый следующий блок опирается на предыдущий.
| Группа | Справочник | От чего зависит | Где используется |
|---|---|---|---|
| База и география | Страны | — | карточка партнёра, точки маршрутов, заявка (мультивыбор стран) |
| Валюты | — | цены во всех расценках, валюта тура, курсы | |
| Точки маршрутов | страна | отправление/прибытие транспорта, город гостиницы и услуги | |
| Партнёры и люди | Партнёры | страна, категория партнёра | клиент в заявке, поставщик услуг и гостиниц, поставщик в бронях |
| Категории партнёров | — | задают наценку %, которая прибавляется к комиссии | |
| Контакты | — | гиды, водители, менеджеры, экстренная связь — в бронях тура | |
| Параметры туров | Типы транспорта | — | вместимость и участие в подборе транспорта |
| Категории маршрутов | типы транспорта | ограничивают подбор транспорта в заявке | |
| Сезоны | — | вместе с годом заменяют даты тура в заявке | |
| Категории расценок | — | питание, билеты, гиды и т. п.; флаг «начислять наценку» | |
| Объекты и расценки | Гостиницы | партнёр, точка маршрута | карточка объекта: звёзды, адрес, номерной фонд |
| Расценки на гостиницы | гостиница, валюта | цены за номер с историей по датам | |
| Расценки на транспорт | точки маршрутов, типы транспорта, валюта | цена за рейс по направлению, по каждому типу ТС | |
| Расценки за услуги | категория расценки, партнёр-поставщик, валюта | питание, входные билеты, гиды, орграсходы |
Эти два справочника едины для всей платформы и не привязаны к организации. Всё остальное изолировано: данные одной организации не видны другой.
Как устроены расценки: история цен вместо одного числа
У каждой расценки — не одна цена, а список цен с датами начала действия. При расчёте система берёт ту цену, у которой дата начала максимальная из тех, что не превышают дату начала тура.
При сохранении система проверяет: хотя бы одна цена обязательна, дублирующихся дат начала быть не должно, список автоматически сортируется. Валюта задаётся у каждой цены отдельно — одна и та же услуга может иметь долларовую цену на один период и сомовую на другой.
Особенности отдельных расценок
- Гостиницы: в каждой цене два поля — «двухместное за ночь» (обязательно, цена за номер) и «одноместное за ночь» (может быть пустым). Одна гостиница = одна запись расценки.
- Транспорт: одна запись — это именованный вариант направления («Бишкек → Каракол, горная»). Внутри — набор типов транспорта, и у каждого типа своя история цен. Цена — за рейс за одну машину. Для одного направления можно завести несколько записей с разными названиями.
- Услуги: запись однозначно определяется тройкой «категория + поставщик + наименование» — повторить её нельзя. У каждой услуги свой тип тарификации и способ оплаты (наличные / безнал). Плюс справочные поля: город, адрес, телефон, ссылка на документы, комментарий — они выводятся оператору в расчёте и программе.
Три типа тарификации услуги — и что они делают с числом
| Тип | Код | Формула суммы на тур | Что означает «количество» |
|---|---|---|---|
| На человека | per_person | цена × кол-во × (PAX + FOC) | сколько раз на одного человека |
| Фиксированная в день | fixed_per_day | цена × кол-во | множитель за блок программы или за тур |
| Произвольная | custom | цена | фиксированная сумма за услугу |
Несмотря на название «фиксированная ставка в день», длительность блока или тура в стоимость услуги не входит. Дни надо явным образом проставить в количестве. Это ровно то место, где чаще всего ошибаются при заполнении программы.
Ещё две настройки, которые незаметно управляют расчётом
- Категория расценки → «Начислять наценку». Если флаг снят, услуги этой категории попадают в себестоимость, но комиссия компании на них не начисляется. Так оформляются сквозные расходы, которые перевыставляются клиенту без маржи.
- Тип транспорта → «Участвует в расчёте». Снятый флаг исключает тип из автоподбора машин, при этом сам тип остаётся в справочнике.
администраторзаполнение справочниковЯ импортирую справочник из Excel
У каждого справочника один и тот же трёхшаговый маршрут:
- Скачать шаблон. Система формирует .xlsx с готовыми заголовками, листом «Инструкция», примерами значений и выпадающими списками там, где значение должно быть из фиксированного набора. Заголовки в шаблоне совпадают с тем, что ждёт парсер, — переименовывать колонки нельзя.
- Проверить файл. Кнопка предпросмотра прогоняет файл без сохранения и показывает, сколько строк пройдёт и какие сломаются, с номером строки и причиной.
- Импортировать. Корректные строки сохраняются, ошибочные пропускаются. В ответе — сколько создано, сколько не прошло и список ошибок.
Отдельной кнопкой скачивается файл с ошибочными строками: исправляете в нём и загружаете повторно, не разбирая исходный файл целиком.
Берётся только первый лист книги. Первая строка — заголовки. Полностью пустые строки пропускаются. Связи подставляются по человекочитаемым значениям: партнёр — по наименованию, страна — по ISO-коду («KZ»), валюта — по коду («USD»).
администраторзаполнение справочниковЯ удаляю запись справочника
Удаление возможно, но связанные записи защищены ссылками в базе: гостиницу, на которую заведена расценка, или партнёра, привязанного к заявке, удалить не получится — операция вернёт ошибку. Порядок всегда обратный порядку создания: сначала расценка, потом объект.
06Курсы валют
Экран «Курсы валют» внутри справочников. Просмотр доступен также роли «Просмотр справочников»; менять курсы может только администратор.
Два курса, а не один
- Курс ЦБ
- То, что отдал Нацбанк КР: сколько сомов за 1 единицу валюты. Если Нацбанк даёт котировку за 100 единиц, система делит на номинал сама.
- Расчётный курс
- Курс ЦБ + ваша корректировка. Именно он используется во всех расчётах.
системаКурсы обновляются автоматически каждый день
Ежедневно в 06:00 система обращается к официальному файлу Нацбанка КР (nbkr.kg/XML/daily.xml), забирает котировки и пересчитывает расчётные курсы по вашим корректировкам. Таймаут запроса — 15 секунд. Валюта, которой в фиде нет, просто пропускается с пометкой в журнале.
администраторЯ обновляю курсы вручную прямо сейчас
Кнопка «Загрузить курсы». Делает то же самое, что ночной процесс, но по вашей команде. Если Нацбанк недоступен, вернётся понятная ошибка.
администраторЯ задаю курс валюты вручную
Для валюты, которой нет в фиде Нацбанка. Указываете курс ЦБ (обязательно положительный), расчётный система выведет сама по корректировке. Источник записи помечается как «ручной».
Система берёт по каждой валюте её собственный последний известный курс, а не общую свежую дату. Поэтому ручной курс продолжает действовать сколько угодно долго — пока вы его не измените, — даже когда у остальных валют курсы обновляются ежедневно.
администраторЯ задаю корректировку курса
Выбираете режим (процент или фиксированная сумма) и значение — допускается отрицательное. Сохранение немедленно пересчитывает расчётные курсы по всем последним котировкам.
Изменение курса или корректировки не пересчитывает уже созданные версии расчёта. Каждая версия хранит собственный снимок курсов на момент создания. Так предложение, отправленное клиенту, не «поедет» на следующий день. Чтобы применить свежие курсы — создайте новую версию расчёта.
07Заявки
Раздел /applications. Видят администратор, туроператор, менеджер бронирования и руководитель. Создавать и менять — только администратор и туроператор.
Жизненный цикл заявки
| Из статуса | Куда можно | Кто/что запускает переход |
|---|---|---|
| Расчёт | Отправлена партнёру | автоматически при отправке КП |
| Отправлена партнёру | Подтверждена | оператор/администратор — кнопка «Подтвердить» |
| Отправлена партнёру | Отклонена | оператор/администратор — кнопка «Отклонить» |
| Подтверждена | никуда | тупик по матрице переходов |
| Отклонена | Расчёт | реактивация (отдельная операция) |
туроператорадминистраторЯ создаю заявку
Обязательные поля: партнёр-клиент, одна или несколько стран маршрута, категория отеля (3★/4★/5★), источник обращения (WhatsApp, Telegram, email, личный кабинет, звонок, прямое обращение). Опционально: категория маршрута, ответственный, код тура партнёра, комментарий.
Даты задаются одним из двух способов, третьего нет:
- Год + сезон. Система выводит даты из сезона: начало = день/месяц начала сезона в указанном году. Если сезон переходит через Новый год (напр. 15.11 → 20.02), конец берётся в следующем году.
- Прямые даты начала и окончания.
Указать только год или только сезон нельзя — система потребует и то и другое либо обе даты.
Что происходит в момент создания — цепочка из шести шагов:
- Проверяется, что партнёр — клиент (роль «client» или «both»). Поставщика в заявку выбрать нельзя.
- Из профиля партнёра копируется его тип (B2B / B2C).
- Считается длительность в днях (включая обе даты).
- Генерируется номер по маске организации, с инициалами и идентификатором автора заявки.
- Из настроек организации копируются тексты КП «включено» и «не включено».
- Автоматически создаётся первая версия расчёта со стандартными точками PAX, снимком комиссии, снимком наценки категории партнёра и снимком всех курсов валют. Она сразу становится активной.
В журнал статусов пишется запись «создана → Расчёт» с автором и временем.
туроператорадминистраторЯ редактирую заявку
Правило простое, но с исключением:
- Ответственного можно менять в любом статусе, включая подтверждённую заявку.
- Всё остальное — партнёр, страны, даты, год/сезон, категория отеля, категория маршрута, источник, комментарий — только в статусах «Расчёт» и «Отправлена». После подтверждения коммерческая информация замораживается.
Смена года или сезона заново выводит даты и пересчитывает длительность. Смена стран корректно обновляет список: основной страной остаётся первая в списке.
туроператорадминистраторЯ подтверждаю или отклоняю заявку
Обе кнопки работают только из статуса «Отправлена партнёру». Из «Расчёта» подтвердить нельзя — сначала нужно отправить КП. Каждый переход пишется в журнал с автором и временем.
туроператорадминистраторЯ реактивирую отклонённую заявку
Клиент передумал. Кнопка реактивации делает три вещи разом:
- Присваивает заявке новый номер (счётчик двигается вперёд).
- Возвращает статус «Расчёт».
- Клонирует активную версию расчёта в новую: копируются точки PAX, параметры, строки затрат и блоки программы, но курсы валют фиксируются заново, на текущий момент. Старая версия остаётся в истории.
Реактивация доступна только из статуса «Отклонена».
администраторЯ вручную ставлю заявке произвольный статус
Администратор может выставить любой статус в обход матрицы переходов — например, вернуть подтверждённую заявку в «Расчёт». В журнале такая запись помечается каналом «manual».
Обычный переход тянет за собой действия: отправка КП двигает статус, реактивация клонирует версию. Ручная смена статуса ничего этого не делает — она просто переставляет метку. Ставя вручную «Расчёт» вместо «Отклонена», вы не получите новую версию расчёта и новый номер.
администраторЯ удаляю заявку
Удаление необратимо и уносит с собой всё: журнал статусов, все версии расчёта со строками, точками PAX и курсами, программу тура и коммерческие предложения.
Единственная защита: заявку, из которой создан хотя бы один тур, удалить нельзя — система вернёт отказ.
Право на удаление и ручную смену статуса есть у роли «Администратор». Роль «Туроператор» такие операции выполнить не может.
все, кто видит заявкиЯ ищу заявку и смотрю журнал её статусов
Поиск идёт по номеру заявки, коду тура партнёра и названию партнёра одновременно. Фильтры: статус, партнёр, направление, ответственный, месяц начала тура, диапазон дат начала тура, диапазон дат создания заявки. Сортировка: по номеру, дате начала, дате создания, статусу.
Журнал статусов показывает каждый переход: откуда, куда, кто инициировал (ФИО или «система»), канал отправки и точное время в вашем часовом поясе.
туроператорадминистраторЯ импортирую заявки из Excel
Тот же трёхшаговый маршрут, что у справочников. Колонки: Партнёр, Код страны, Дата начала, Дата окончания, Категория отеля (3/4/5), Источник, Код тура партнёра, Комментарий. Даты принимаются в двух форматах: ГГГГ-ММ-ДД и ДД.ММ.ГГГГ. Источник понимает и английские коды, и русские слова («почта», «звонок», «прямой»).
Каждая импортированная строка проходит полный сценарий создания — с номером, копированием текстов КП и созданием первой версии расчёта.
Через Excel заявка создаётся только с прямыми датами и одной страной. Сезон, категорию маршрута и мультистрановость нужно проставлять руками после импорта.
Карточка заявки: три вкладки
Внутри заявки — «Программа», «Расчёт» и «КП». Порядок в интерфейсе именно такой, потому что программа является источником затрат для расчёта, а расчёт — источником цифр для КП.
08Программа тура
Вкладка «Программа» в карточке заявки. Доступна туроператору и администратору. Программа хранится внутри версии расчёта: у каждой версии своя программа.
Из чего состоит программа
Программа — это последовательность блоков. Блок это не обязательно один день:
- Номер блока
- Порядок в программе, 1…N.
- Длительность
- Сколько дней занимает блок. Сумма длительностей всех блоков = длительность тура.
- Точка выезда / прибытия
- Из справочника точек маршрутов. Опционально.
- Описание
- Текст на языке партнёра — то, что увидит клиент в КП. Может быть сгенерирован ИИ (раздел 13).
- Фотографии
- Загружаются прямо в объектное хранилище. JPEG, PNG, WEBP, GIF.
- Мероприятия
- Ссылки на конкретные строки справочников расценок + количество.
Мероприятие — это ссылка, а не цена
Ключевая механика: мероприятие хранит только тип, идентификатор расценки и количество. Цена в программе не хранится — она подтягивается из справочника по дате начала тура каждый раз при расчёте.
| Тип мероприятия | Ссылается на | Что означает количество |
|---|---|---|
| Гостиница | расценку на гостиницу | число ночей |
| Транспорт | расценку на транспорт (направление) | число рейсов |
| Услуга | расценку за услугу | зависит от тарификации (см. 05) |
туроператорадминистраторЯ собираю программу по дням
Программа сохраняется целиком, одним действием: старые блоки удаляются, новые записываются. Порядок мероприятий внутри блока сохраняется как есть.
Побочный эффект сохранения: длительность заявки пересчитывается как сумма длительностей всех блоков — но только если редактируемая версия является активной у заявки.
Оператору при просмотре программы показываются подтянутые из справочников названия, актуальные цены на дату начала тура, звёзды и номерной фонд гостиницы, поставщик, категория услуги, город, адрес, телефон, ссылка на документы и комментарии. Всё это — справочная обвязка, помогающая собрать программу, не выходя из вкладки.
туроператорадминистраторЯ задаю свою цену вместо справочной
Для услуг с тарификацией «произвольная» можно указать собственную цену вместо справочной. В программе она задаётся в валюте расценки и конвертируется в валюту тура по курсу, зафиксированному в версии.
В ручных дополнительных услугах на вкладке «Расчёт» своя цена задаётся сразу в валюте тура и не конвертируется. Одно и то же поле, две разные логики — зависит от того, где вы его заполняете.
09Расчёт стоимости
Вкладка «Расчёт». Сердце системы. Доступна туроператору и администратору.
Версии расчёта
У заявки может быть много версий; активная — ровно одна. Активная версия используется для КП и для создания резервирования.
| Операция | Что делает | Ограничение |
|---|---|---|
| Новая версия | Создаёт пустую версию: без строк и программы, но со стандартными точками PAX из настроек. Свежие курсы, свежая комиссия. Становится активной. | заявка должна быть в «Расчёт» или «Отправлена» |
| Дублировать | Копирует выбранную версию целиком: параметры, точки PAX, строки затрат, блоки программы. Курсы фиксируются заново. Копия становится активной. | то же |
| Сделать активной | Переключает активную версию заявки. | то же |
| Подпись версии | Заметка до 120 символов, чтобы различать сценарии («вариант с джипами»). | то же |
| Удалить версию | Удаляет версию со всем содержимым. | нельзя активную и нельзя последнюю |
Любая правка расчёта — версии, точки PAX, строки, параметры, программа, доп. услуги — блокируется, как только заявка перешла в «Подтверждена» или «Отклонена». Сообщение: «Расчёт нельзя изменять после подтверждения заявки. Создайте тур из подтверждённой заявки».
Что версия фиксирует в момент создания
- Курсы всех валют относительно валюты тура.
- Три процента комиссии и их сумма.
- Наценку категории партнёра.
- Порог FOC из настроек организации.
Валюта тура по умолчанию — KGS; её можно сменить, и тогда курсы пересчитываются заново от новой базы.
Как считается матрица — шаг за шагом
Для каждой точки PAX система проходит один и тот же путь.
Шаг 1. Сколько человек реально едет
FOC — фиксированное число мест, а не процент: при пороге 10 и одном FOC группа из 10 и группа из 40 человек получат по одному бесплатному месту.
Шаг 2. Гостиницы
Цены гостиниц — за номер. Туристы размещаются по двухместному, FOC — по одноместному:
Даже при нечётном числе туристов делитель остаётся два — доплата за одноместное показывается отдельно.
Шаг 3. Доплата за одноместное размещение
Доплата не зависит от числа туристов и показывается отдельным блоком под матрицей, с расшифровкой по каждой гостинице.
Шаг 4. Транспорт — автоподбор машин
Для каждого направления и каждой точки PAX система подбирает парк под (PAX + FOC) человек:
- Берутся все типы транспорта этого направления, у которых есть действующая цена на дату начала тура, стоит флаг «участвует в расчёте» и которые разрешены категорией маршрута заявки.
- Для каждого типа считается
число машин = ceil(люди / вместимость). - На весь рейс выбирается один тип. Побеждает тот, у кого меньше машин; при равенстве — тот, у кого дешевле общая сумма за рейс (уже в валюте тура, поэтому типы в разных валютах сравниваются корректно).
- Сумма на тур = число машин × цена за рейс × количество рейсов.
Система не составит «автобус + минивэн» на один рейс. Всегда один тип, размноженный до нужного количества машин. Если ни у одного типа направления нет действующей цены на дату — направление молча выпадает из расчёта.
Шаг 5. Услуги
Каждая услуга считается по своему типу тарификации (таблица в разделе 05) и раскладывается в две корзины:
- с наценкой — категория расценки имеет флаг «начислять наценку»;
- без наценки — флаг снят; сумма входит в себестоимость, но комиссия на неё не начисляется.
Услуги, у которых на дату тура нет действующей цены и не задана своя, показываются в списке строк затрат, но в матрицу не попадают.
Шаг 6. Итог
Все суммы округляются до двух знаков.
туроператорадминистраторЯ задаю точки PAX и вижу матрицу цен
Список точек задаётся вручную; дубли убираются, порядок — по возрастанию. Матрица показывает по каждой точке: PAX, FOC, себестоимость транспорта, гостиниц, услуг, базу под комиссию, себестоимость без наценки, общую себестоимость, комиссию, итого по туру, цену на человека и доплату за одноместное.
По каждой цифре доступна расшифровка-подсказка с формулой: например, «Ала-Арча: 8 000 KGS / 2 × 6 + 8 000 KGS × 1) × 3». Это сделано специально, чтобы любую сумму можно было проверить руками, не выгружая расчёт.
туроператорадминистраторЯ меняю параметры расчёта
Редактируются три вещи: число мест FOC, доплата за одноместное (ручное значение) и валюта тура. Смена валюты тура немедленно пересчитывает снимок курсов относительно новой базы.
туроператорадминистраторЯ добавляю дополнительную услугу вне программы
Организационные расходы и прочее, что не привязано к конкретному дню. Указываются ссылка на «Расценки за услуги», количество и, при необходимости, своя цена в валюте тура. Для тарификации «фиксированная в день» количество здесь означает множитель за весь тур.
туроператорадминистраторЯ смотрю развёрнутый список строк затрат
Экран делится на строки из программы (сгруппированы по блокам, редактируются в программе) и ручные дополнительные услуги. По каждой строке видны: наименование, поставщик, категория, тип тарификации, признак наценки, цена в валюте справочника и в валюте тура, количество, для гостиниц — цены одноместного и двухместного, для транспорта — состав подобранных машин по каждой точке PAX и полный перечень доступных типов направления.
Если в программе есть расценка в валюте, для которой в версии нет зафиксированного курса, матрица не построится: «Нет зафиксированного курса для валюты X. Загрузите курсы в справочнике "Валюты", затем создайте новую версию расчёта». Лечится ровно так, как написано — загрузить курс и создать новую версию; в старой курса не появится.
10Коммерческое предложение
Вкладка «КП». Создание и отправка — туроператор и администратор. Список файлов КП может открыть любой, кто видит заявку.
туроператорадминистраторЯ открываю КП заявки
КП у заявки одно. При первом открытии вкладки оно создаётся автоматически по активной версии расчёта; при повторных — возвращается существующее.
- Номер КП: номер заявки +
-Q+ порядковый, сквозной по всем версиям заявки:МК26-0028-Q1,-Q2… - Язык документа берётся из карточки партнёра (язык общения). Если не задан — русский.
- «Действует до» подставляется как 31 декабря года тура, если год у заявки указан. Подставляется один раз: очистив поле вручную, вы не получите его обратно при следующем открытии.
туроператорадминистраторЯ редактирую условия КП
Редактируются: «Включено в стоимость», «Не включено», условия оплаты, срок действия и язык документа. Эти поля хранятся на уровне заявки, а не версии расчёта, — то есть при переключении активной версии условия не сбрасываются.
туроператорадминистраторЯ смотрю предпросмотр КП
Предпросмотр собирается на лету и всегда отражает активную версию расчёта — даже если КП формально привязано к другой версии. То есть переключили активную версию — предпросмотр и будущий документ поменялись.
В документ попадают: реквизиты заявки, партнёр, страны, даты, длительность, категория отеля, матрица цен, программа по блокам и состав тура. Комиссия и наценка в клиентский документ не выводятся — это внутренние блоки.
туроператорадминистраторЯ формирую PDF или Word
Генерация ставится в фоновую очередь — интерфейс не блокируется. Запись файла проходит через статусы: «в очереди» → «готов» / «ошибка». Файл рендерится и кладётся в объектное хранилище; скачивается по временной ссылке.
- Имя файла собирается по маске «дата_номер»:
2026-07-21_МК26-0028-Q1.pdf. - Фиксируются автор генерации и номер версии расчёта, по которой сделан документ, — в списке файлов видно, какому сценарию соответствует каждый PDF.
- Файл живёт 14 дней (настраивается на сервере). После этого ежедневная очистка удаляет и объект в хранилище, и запись. Попытка скачать просроченный файл вернёт «Срок хранения файла истёк — сгенерируйте документ заново».
- Рендер, не завершившийся за 15 минут, автоматически помечается как неудачный.
- При сбое делается до двух попыток.
Хранилище сгенерированных документов временное. Если PDF нужен как юридически значимый след — скачивайте и храните у себя. Повторная генерация через месяц может дать другие цифры, если справочники или курсы изменились.
туроператорадминистраторЯ отправляю КП клиенту
Кнопка «Отправить» фиксирует факт отправки: КП помечается как отправленное, записываются время и канал (по умолчанию email).
Главный побочный эффект: если заявка была в статусе «Расчёт», она автоматически переходит в «Отправлена партнёру», и в журнал пишется запись с каналом отправки. Именно этот переход открывает кнопки «Подтвердить» и «Отклонить».
Действие фиксирует факт отправки, а не выполняет её. Документ клиенту вы отправляете сами — почтой, мессенджером, как договорено. Интеграций с WhatsApp и Telegram в текущей версии нет.
11Резервирование (тур)
Раздел /tours. Здесь коммерческая работа заканчивается и начинается операционная. Создавать резервирование могут туроператор, менеджер бронирования и администратор; вести его дальше — менеджер бронирования и администратор.
Жизненный цикл
Всего два статуса. Переход в «Забронирован» происходит автоматически, когда все обязательные брони подтверждены (см. 11.6), либо вручную — администратором или менеджером бронирования.
туроператорменеджер бронированияадминистраторЯ создаю резервирование из подтверждённой заявки
Условия: заявка в статусе «Подтверждена» и у неё есть активная версия расчёта. Из одной заявки можно создать несколько резервирований — например, на разные заезды.
Вы указываете дату начала и раскладку номеров: сколько одноместных (SGL), двухместных (DBL), твинов (TWIN) и трёхместных (TRPL). Минимум один номер обязателен.
PAX должен быть не меньше единицы — иначе система откажет.
Что создаётся одной транзакцией:
- Номер тура вида
T2026-0001— сквозной счётчик по организации и году даты начала тура. - Неизменяемый снимок цены с причиной «создан»: точный расчёт под этот PAX и эту дату, раскладка номеров, стоимость, доплата за одноместные, комиссия и полная разбивка.
- Запись в журнал статусов.
- Расписание, посеянное из программы тура.
те же ролиЯ предварительно считаю стоимость, ничего не создавая
Отдельная кнопка предпросмотра: указываете дату и раскладку и видите длительность, дату окончания, число номеров, всего человек, FOC, PAX, цену на человека, доплату и итог. Ни резервирование, ни версия расчёта при этом не меняются. То же доступно и для уже созданного тура — «что будет, если сдвинуть дату или переложить номера».
менеджер бронированияадминистраторЯ меняю дату начала, раскладку или ответственного
Три поля с разными последствиями:
| Что меняете | Последствия |
|---|---|
| Ответственный | меняется, цена не пересчитывается |
| Раскладка номеров | пересчитывается PAX и цена, создаётся новый снимок с причиной «изменена раскладка» |
| Дата начала | всё расписание сдвигается на ту же дельту, у каждого события заново снимаются цены на новую дату, создаётся снимок с причиной «изменена дата начала» |
Две защиты, которые остановят изменение:
- Нельзя уменьшить раскладку так, чтобы PAX стал меньше числа уже добавленных туристов.
- Если после сдвига какое-то событие расписания вылезет за пределы новых дат тура — изменение отклоняется с просьбой сначала поправить расписание.
менеджер бронированияадминистраторЯ принудительно пересчитываю цену
Кнопка ручного пересчёта — когда изменились справочники и нужно зафиксировать актуальную стоимость при тех же дате и раскладке. Обязательно требуется текстовое пояснение, оно навсегда сохраняется в снимке. Создаётся новый снимок с причиной «ручной пересчёт».
все, кто видит турыЯ смотрю историю стоимости
Снимки цены неизменяемы и накапливаются. По каждому видно: дату, PAX, раскладку, причину изменения, пояснение оператора, валюту, FOC, себестоимость, комиссию, итог, цену на человека, доплату и полную внутреннюю разбивку. Это ваш аудиторский след «почему тур стоит столько».
менеджер бронированияадминистраторЯ веду брони у поставщиков
Бронь может быть привязана к событию расписания или существовать сама по себе. Поля: обязательность, поставщик (из партнёров), контактное лицо (из контактов), канал связи, дедлайн, номер подтверждения, фактическая стоимость с валютой, условия оплаты, процент предоплаты, комментарий.
Имя, email и телефон контакта подставляются автоматически из справочника и дальше редактируются вручную — то есть в брони остаётся тот контакт, который был на момент бронирования, даже если справочник потом изменили.
Статусы брони — движение только вперёд:
«Подтверждено» и «Отменено» — тупики: изменить статус после них нельзя. Из «не забронировано» нельзя перепрыгнуть сразу в «подтверждено».
После каждой правки брони система проверяет: есть ли у тура хотя бы одна активная обязательная бронь и все ли они подтверждены. Если да — тур автоматически переходит в «Забронирован», а в журнал пишется запись с автором «система» и пояснением «Все активные обязательные бронирования подтверждены». Отменённые брони в проверке не участвуют.
Фактическую стоимость и валюту можно указывать только вместе — одно без другого система не примет.
менеджер бронированияадминистраторЯ веду расписание тура
Расписание создаётся автоматически при создании резервирования: каждое мероприятие программы превращается в событие. Гостиница разворачивается в отдельное событие на каждую ночь, транспорт и услуги — в одно событие на блок.
Тип события определяется автоматически: гостиница → «Проживание», транспорт → «Трансфер», услуга → «Прочее». Дальше события правятся вручную: тип (проживание, трансфер, питание, экскурсия, активность, свободное время, прочее), название, описание, даты, время начала и окончания, место, порядок внутри дня, признак «требует бронирования».
Доступны: добавление события, перестановка внутри дня, атомарный перенос события на другую дату с заданием порядка, удаление.
Событие хранит не ссылку на справочник, а снимок: название, поставщик, цены, звёзды, адрес, телефон, категория — всё зафиксированное на дату события. Последующие правки справочника расписание уже созданного тура не меняют. Снимок обновляется только при сдвиге даты тура.
менеджер бронированияадминистраторЯ веду список туристов
По каждому туристу: ФИО (обязательно), гражданство, дата рождения, номер паспорта, срок действия паспорта, email, телефон, тип размещения (одноместное / двухместное / трёхместное), особые требования, порядок в списке.
Число туристов не может превысить PAX резервирования. Проверка стоит и при ручном добавлении, и при импорте, и работает под блокировкой записи — то есть два менеджера одновременно не смогут «просочиться» сверх лимита. Чтобы добавить больше — сначала измените раскладку номеров.
Импорт из Excel: шаблон с колонками ФИО, Гражданство, Дата рождения, Паспорт, Действителен до, Email, Телефон, Размещение, Особые требования. Строки сверх PAX отклоняются с указанием номера строки и причины; корректные — сохраняются.
Печатная форма списка туристов формируется отдельной кнопкой.
менеджер бронированияадминистраторЯ прикладываю документы
Документ привязывается к туру и, опционально, к событию расписания или к брони. Типы: общий, подтверждение брони, ваучер, билет, страховка, прочее. Разрешены PDF, JPEG, PNG, WEBP. Файл грузится из браузера напрямую в хранилище по временной ссылке; скачивание — тоже по временной ссылке.
менеджер бронированияадминистраторЯ формирую Booking List
Итоговый операционный документ в PDF или XLSX. Собирает воедино: реквизиты тура и заявки, партнёра, ответственного, всё расписание по датам, все брони с поставщиками, контактами и статусами, полный список туристов.
Каждая генерация сохраняется отдельной версией — видно, кто и когда сформировал. Скачивание по временной ссылке. При сбое версия помечается как неудачная.
Booking List генерируется синхронно (вы ждёте результат) и, в отличие от файлов КП, не имеет срока автоудаления.
все, кто видит турыЯ нахожу нужное резервирование
Поиск идёт одновременно по номеру тура, номеру заявки, коду тура партнёра и названию партнёра. Фильтры: статус, направление, ответственный, диапазон дат начала. Сортировка: номер, дата начала, дата окончания, PAX, статус, дата создания.
В списке у каждого тура виден прогресс бронирования — сколько обязательных броней подтверждено из скольких и процент готовности.
В системе отсутствует операция удаления тура. Есть удаление отдельных документов, туристов, событий расписания и броней — но само резервирование удалить нельзя.
12Аналитика
Дашборд на главной странице. Доступен только администратору и руководителю. Считается по заявкам; туры в аналитику не входят.
Как считается когорта
Когорта — заявки, созданные в выбранном периоде. Период по умолчанию — последние три месяца. Достижение этапа определяется по журналу статусов: учитывается первое попадание в статус. Поэтому реактивированная заявка не задваивает показатели.
администраторруководительЯ смотрю распределение заявок по статусам
Количество заявок в каждом из четырёх статусов за период, общее число и число активных (в «Расчёте» и «Отправлена»).
администраторруководительЯ смотрю воронку и конверсию
Показатели за период:
- воронка «открыто → отправлено → подтверждено → отклонено» с процентами от числа открытых;
- конверсия = подтверждённые / открытые;
- закрываемость = подтверждённые / отправленные;
- средний срок от создания до отправки и от отправки до подтверждения, в днях;
- отказы с разбивкой по этапу, на котором заявка сорвалась;
- сравнение с предыдущим периодом такой же длины;
- временной ряд с настраиваемой детализацией.
администраторруководительЯ сравниваю менеджеров и партнёров
Две таблицы — по ответственным и по партнёрам. В каждой: открыто, отправлено, подтверждено, отклонено, конверсия. Поддерживаются поиск, сортировка по любому столбцу и постраничный вывод. Дополнительно фильтруется по направлению, источнику обращения, категории отеля и типу партнёра (B2B / B2C).
13ИИ-описания программы
Помощник, который пишет текст описания блока программы. Настраивается администратором в «Настройки → ИИ-инструменты», используется туроператором и администратором на вкладке «Программа». По умолчанию функция выключена.
администраторЯ подключаю ИИ-генерацию
Выбирается одна из преднастроенных моделей, вводится её API-ключ и задаётся системный промпт — инструкция, задающая тон и стиль описаний.
Условия включения проверяются жёстко: системный промпт заполнен, ключ выбранной модели сохранён. Иначе включить не дадут.
Ключ хранится в зашифрованном виде и никогда не возвращается в интерфейс целиком. Есть отдельная операция «показать ключ» и кнопка «Проверить» — она делает тестовый запрос к модели с заглушечным блоком и показывает, отвечает ли провайдер. Очистка поля ключа удаляет сохранённые учётные данные.
туроператорадминистраторЯ генерирую описание блока программы
Три операции, и система следит, чтобы вы выбрали правильную:
| Операция | Когда доступна |
|---|---|
| Сгенерировать | только если поле описания пустое |
| Улучшить | только если описание уже есть |
| Создать заново | только если описание уже есть |
Модель получает контекст блока: длительность, точки маршрута, состав мероприятий с названиями из справочников. Язык результата берётся из языка общения партнёра — французскому клиенту описание сгенерируется по-французски.
Можно добавить свободный «контекст для модели» до 5000 символов — уточнение к конкретной генерации.
- Таймаут запроса — 30 секунд, длина ответа ограничена.
- Повторная отправка того же запроса не создаёт вторую генерацию: система распознаёт дубль и вернёт первый результат.
- Каждая генерация пишется в журнал: кто, когда, какая версия и заявка, какая модель, язык, статус, длительность, объём текста на входе и выходе, код ошибки при сбое.
Сгенерированный текст возвращается как предложение; в программу он попадает только после того, как оператор сохранит блок. Никакой автозаписи в базу генерация не делает.
14Фоновые процессы и внешние зависимости
То, что работает без участия человека. Знать полезно: когда что-то «само поменялось» или «само не сработало» — искать надо здесь.
| Процесс | Когда | Что делает | Если сломается |
|---|---|---|---|
| Обновление курсов | ежедневно 06:00 | тянет котировки Нацбанка КР, пересчитывает расчётные курсы всем активным организациям | курсы остаются вчерашними; ошибка пишется в журнал, пользователю не показывается |
| Очистка файлов КП | ежедневно | удаляет из хранилища и базы файлы старше срока хранения | файлы копятся в хранилище |
| Рендер файлов КП | по кнопке, в очереди | формирует PDF/Word, до 2 попыток | файл помечается «ошибка»; зависший дольше 15 минут — тоже |
| Автопереход тура | после каждой правки брони | переводит тур в «Забронирован», когда все обязательные брони подтверждены | — |
| Автопереход заявки | при отправке КП | «Расчёт» → «Отправлена партнёру» | — |
От чего система зависит снаружи
- Нацбанк КР
- Источник курсов валют. Недоступен — курсы не обновятся, но система продолжит работать на последних известных.
- Почтовый сервер
- Приглашения и сброс пароля. Недоступен — пользователь создаётся, но письма нет; администратор видит признак неудачной отправки и передаёт ссылку вручную.
- Объектное хранилище
- Все файлы: фото программы, документы туров, PDF КП, Booking List. Недоступно — файлы не грузятся и не скачиваются.
- Очередь задач
- Фоновая генерация документов КП. Недоступна — файлы навсегда остаются «в очереди» и через 15 минут помечаются неудачными.
- Провайдер ИИ
- Генерация описаний. Недоступен — генерация не работает, остальная система не затронута.
Изоляция данных между организациями
Каждая запись — заявки, туры, справочники, настройки, курсы, логи ИИ — помечена организацией, и любой запрос читает только записи своей. Даже если подставить чужой идентификатор в адрес, вернётся «не найдено». Общие на всю платформу только два справочника: Страны и Валюты.
15Матрица прав
Сводная таблица: кто что может. Составлена по проверкам в коде сервера, а не по виду меню. «—» означает, что запрос будет отклонён с ошибкой доступа.
| Раздел / операция | Админ | Туроператор | Менеджер брон. | Руководитель | Просмотр справ. | Заполн. справ. |
|---|---|---|---|---|---|---|
| Дашборд / аналитика | да | — | — | да | — | — |
| Пользователи | полный | — | — | — | — | — |
| Сброс чужой 2FA | да | — | — | — | — | — |
| Настройки → Платформа | да | — | — | — | — | — |
| Настройки → ИИ | да | — | — | — | — | — |
| Свой профиль, пароль, 2FA | да | да | да | да | да | да |
| Справочники — просмотр | да | — | — | — | да | да |
| Справочники — правка и импорт | да | — | — | — | — | да |
| Курсы валют — просмотр | да | — | — | — | да | да |
| Курсы валют — изменение | да | — | — | — | — | — |
| Заявки — просмотр | да | да | да | да | — | — |
| Заявки — создание и правка | да | да | — | — | — | — |
| Заявки — удаление, ручной статус | да | — | — | — | — | — |
| Расчёт и программа | да | да | — | — | — | — |
| КП — создание, правка, отправка | да | да | — | — | — | — |
| КП — список и скачивание файлов | да | да | да | да | — | — |
| ИИ-генерация описаний | да | да | — | — | — | — |
| Туры — просмотр | да | да | да | да | — | — |
| Создание тура из заявки | да | да | да | — | — | — |
| Правка тура, статус, пересчёт цены | да | — | да | — | — | — |
| Расписание, брони, туристы, документы | да | — | да | — | — | — |
| Booking List | да | — | да | — | — | — |
Туроператор может создать резервирование из подтверждённой заявки, но дальше вести его не может — это зона менеджера бронирования. Руководитель видит и заявки, и туры, но не меняет ничего нигде.
16Что важно знать заранее
Список мест, где поведение системы расходится с интуицией. Это не баги — это осознанные решения, но они регулярно вызывают вопросы у новых пользователей.
Снимки: почему «я поменял, а не пересчиталось»
Система намеренно фиксирует значения в момент создания сущности, чтобы отправленное клиенту предложение не менялось задним числом. Фиксируются:
| Что фиксируется | Где | Когда обновится |
|---|---|---|
| Курсы всех валют | версия расчёта | новая версия / смена валюты тура |
| Три процента комиссии | версия расчёта | новая версия |
| Наценка категории партнёра | версия расчёта | новая версия |
| Порог FOC | версия расчёта | новая версия |
| Тексты КП по умолчанию | заявка | только вручную в заявке |
| Цена, PAX, раскладка | снимок цены тура | новый снимок (правка или ручной пересчёт) |
| Данные услуги (название, цены, адрес) | событие расписания тура | сдвиг даты начала тура |
| Контакт и поставщик | бронь | только вручную |
Цены справочников, наоборот, не фиксируются в программе: они подтягиваются каждый раз по дате начала тура. Меняете расценку — меняется расчёт всех незамороженных заявок с этой датой.
Тупики и необратимые действия
- Подтверждённая заявка — расчёт, программа и КП замораживаются навсегда. Вернуть можно только ручной сменой статуса администратором, и это не откатит побочные эффекты.
- Удаление заявки — уносит все версии расчёта, программу и КП. Только если из неё не создан тур.
- Резервные коды 2FA — показываются один раз.
- Бронь в статусе «Подтверждено» или «Отменено» — статус больше не меняется.
- Номер заявки — присваивается один раз; меняется только при реактивации.
- Снимок цены тура — неизменяем, только добавляется новый.
Чего в системе нет
- Самостоятельной регистрации — только приглашение администратора.
- Удаления пользователей и удаления резервирований.
- Настраиваемых ролей и прав — набор из шести ролей зашит.
- Отправки КП клиенту из системы — фиксируется только факт отправки.
- Интеграций с WhatsApp, Telegram и почтой клиента.
- Смешанного парка транспорта на один рейс.
- Учёта фактических платежей и взаиморасчётов.
- Уведомлений о приближающихся дедлайнах броней.
Порядок первого запуска — как я бы его выстроила
- Настройки → Платформа: маска номера, три процента комиссии, порог FOC, стандартные точки PAX, тексты КП.
- Курсы валют: загрузить из Нацбанка, задать корректировки, вручную проставить курсы валют, которых нет в фиде.
- Справочники по порядку меню: точки маршрутов → категории партнёров → партнёры (и клиенты, и поставщики) → контакты → типы транспорта → категории маршрутов → сезоны → категории расценок → гостиницы → расценки (гостиницы, транспорт, услуги). Крупные объёмы — через импорт с обязательным предпросмотром.
- Пользователи: завести сотрудников, обязательно проставив уникальные идентификаторы и, при необходимости, инициалы — они попадут в номера заявок.
- Контрольный прогон: создать тестовую заявку, собрать программу, проверить, что матрица считается и цифры в подсказках сходятся вручную, сформировать КП, подтвердить, создать резервирование, провести бронь до «Подтверждено» и убедиться, что тур сам перешёл в «Забронирован». Затем удалить тестовую заявку — но помните: удалить её получится только если тур не создан, поэтому тестовый тур останется в системе навсегда.
- ИИ-инструменты — по желанию, в последнюю очередь.
Тестовое резервирование удалить нельзя, а тестовая заявка после создания тура тоже станет неудаляемой. Если чистота данных важна — прогоняйте сценарий на отдельном (тестовом) стенде, а не на боевом.