Софт для управления отелем и арендой обычно рвётся по линии «посуточно/помесячно»: с одной стороны отельная PMS, с другой журнал аренды, а владелец, ведущий и то и другое, вручную держит две системы в согласии. Модуль жилья в Korat от этого разрыва отказывается. Отель, курорт, апартаменты, кондоминиум, дом в посёлке и гостевой дом — один тип бизнеса с одним каталогом типов номеров под ним. Объект может принять бронь на две ночи и договор на год из одной и той же сетки номеров, а отчёты за месяц покрывают и то и другое.
Единица — тип номера, а не отдельный номер
Объект описывается набором типов номеров — у каждого фотографии, цена за ночь, количество, описание и удобства — а не списком отдельно настроенных комнат. Такова и настоящая форма цен и доступности: восемь одинаковых улучшенных двухместных — это один продукт с количеством восемь, а обращение с ними как с восемью продуктами означает восемь мест, где меняется цена, и восемь шансов одно пропустить. В обзоре сетка или список показывают цену «от», рейтинг и значок типа, чтобы гостевой дом и кондоминиум различались до нажатия.
Рейтинг складывается из отзывов гостей с подтверждённым проживанием
Рейтинг на карточке — не число, которое поставил владелец. Как и любой рейтинг в Korat, он пересчитывается триггером базы из строк отзывов, а написать отзыв может только гость, про которого платформа может доказать проживание: проживание — один из подходящих видов в представлении права на отзыв.
Сезонные и акционные цены, посчитанные один раз и использованные дважды
Цены меняются: Сонгкран (тайский Новый год в середине апреля, пик поездок), длинные выходные, низкий сезон, промоакция владельца на две недели. Поэтому у типа номера есть правила цен, каждое — диапазон дат плюс поправка в процентах или фиксированной суммой в валюте самого объекта размещения (обычно бат, но не всегда — каждое заведение задаёт свою). Важно не то, что правила есть — они есть в любой системе бронирования, — а то, что число в списке и число, по которому считается бронь, выходят из одного и того же расчёта. Отдельного вычисления цены для показа, которое могло бы отстать от настоящего, здесь нет.
Классический сбой в этой функции — результат поиска, посчитанный одним путём кода, и оформление, посчитанное другим: гостю показывают цену, на которую объект не соглашался, и берут другую. Общий расчёт делает такое расхождение структурно невозможным, а не тем, что надо тестировать. Когда действует акция, карточка показывает зачёркнутую базовую цену со значком, чтобы гость видел размер поправки, а не только число поменьше.
Бронь — это запрос, который подтверждает объект
Онлайн-бронирование собирает даты заезда и выезда, гостя и телефон и попадает во входящие броней объекта. Владелец подтверждает. Счётчик ожидающих стоит на панели консоли живым значком, обновляющимся каждые несколько секунд, рядом с прочими вещами, на которые бизнес обязан ответить, — так что это не очередь, которую надо не забыть открыть.
Запросы обслуживания в номере приходят в ту же консоль
Во время проживания гость может отправить запрос обслуживания в номер из приложения; он приходит в ту же консоль. Маленькая функция с непропорционально большим влиянием на работу небольшого объекта, потому что альтернатива — телефон в номере, на который никто не отвечает, или прогулка до стойки.
Бронь — это резервирование, а не предоплата. Форма собирает даты, гостя и телефон, а объект подтверждает. Korat не принимает карту при бронировании, не держит депозит и не проводит оплату проживания — расчёт происходит с объектом.
То же и с месячным счётом: он формируется, показывается арендатору и несёт признак оплаты, который ставит владелец. Признак фиксирует, что деньги пришли; он их не перемещает.
Сетка номеров и консоль владельца
Консоль даёт объекту четыре плитки: сетку номеров с заездом и выездом, менеджер типов номеров вместе с сезонными правилами, входящие броней и помесячную аренду. Сетка — экран, в котором живёт администратор: занятость с одного взгляда и два действия, которые её меняют, — тогда как менеджер типов номеров — то место, где цены, количества, удобства и правила правятся один раз.
Отчёты, клиентская база и кадры — плитки для любого бизнеса
Вокруг них стоят плитки, которые получает любой тип бизнеса. Отчёты: выручка, число заказов, средний чек, разбивка на наличные, PromptPay и прочее, пятёрка лидеров продаж, график выручки за семь дней и периоды «сегодня», «7 дней», «30 дней», «всё время», с перепечаткой чека и текстом чека для отправки. Налоговую накладную выставить нельзя: это доступно только плательщикам НДС, а регистрация ни одного заведения в системе пока не записана. База клиентов строится из журнала продаж с заметками, метками, историей и баллами, которые копятся по ставке, заданной самим заведением в своей валюте — для объекта, принимающего возвращающихся командированных, именно эта история и полезна. Кадры: приход и уход по GPS с комментарием, заявки на отпуск, смены и зарплата с отработанными минутами и переработкой после восьми часов в день, объявления и задачи.
Помесячная аренда: показания превращаются в счёт
Помесячная сторона — то место, где модуль перестаёт напоминать отельную систему. У типа номера своя настройка аренды и коммунальных; у номера — арендатор и депозит; и каждый месяц владелец вносит показания счётчиков воды и электричества. Счёт формируется из показаний: показание — вход, счёт — выход, и арифметику не делают на бумаге, чтобы потом вписать итог, который потом никто не проверит. У каждого счёта есть признак оплаты, поэтому список неоплаченных — это запрос, а не чья-то память.
Это та часть управления небольшим домом, которая порождает больше всего споров, — именно потому, что обычно ведётся в тетради. Хранение показаний рядом с договором позволяет проследить счёт до двух чисел, из которых он вышел: ответ на вопрос «почему в этом месяце больше» лучше, чем пересчёт с нуля. Наём комнаты и выдача вещи под залог живут в одном модуле: см. прокат и аренду.
Два модуля особенно часто оказываются рядом с объектом размещения: запись, если при нём есть спа или процедурный кабинет, и парковка, которая выдаёт постоянным жильцам месячные абонементы по номеру машины.
Права персонала и то, чего гость не видит
Доступ к консоли работает на матрице прав: тринадцать базовых возможностей плюс всё, что добавят установленные модули, ролевые пресеты — владелец, управляющий, официант, кухня, сотрудник — и точечные исключения по людям. Плитки скрываются, когда у человека нет соответствующего права, а сотрудник без прав видит явное состояние «прав пока нет», а не пустой экран, читающийся как поломка.
В приложении для Android эти проверки выполняются на клиенте. Та же матрица есть в базе как has_capability(business_id, capability), её используют политики защиты на уровне строк, и пресеты раскрываются на сервере, так что сервер не верит клиенту в вопросе роли, — но сказать, что вся консоль сегодня защищена на сервере, было бы преувеличением, поэтому мы этого не говорим.