Перейти к содержимому

Расходы

Модуль расходов позволяет учитывать всё, что вы тратите на работу отеля — от электричества и тапочек до зарплат, аренды и ремонта кровли — и автоматически считать валовую операционную прибыль (GOP), эффективность на номер (GOPPAR), EBITDA и прибыль до налогов.

До появления этого модуля система знала только доходную часть: бронирования, платежи, продажи услуг. Без расходов вы видели «сделали 12 млн ₸» и не могли ответить на главный вопрос — заработали или ушли в минус. Теперь финансовая картина полная.

Система использует международную стандартную классификацию расходов гостиничного бизнеса USALI (Uniform System of Accounts for the Lodging Industry). При создании нового объекта автоматически создаются 41 системная категория в 12 группах. Группа определяет, в какую строку P&L попадёт расход:

ГруппаПримеры категорийГде в P&L
Расходы номеров (Rooms)Расходники для номеров, аменитис, прачечная, униформа, зарплата администраторов и горничныхРасходы направления «Размещение»
Питание (F&B)Продукты для завтраков, напитки и бар, посуда, зарплата кухниРасходы направления «Питание»
Коммуналка (Utilities)Электричество, вода, газ, отоплениеНакладные
Обслуживание (Maintenance)Текущий ремонт, сантехника, электрика, мебель, уборка территории, капитальные затратыНакладные (капитальные — под чертой)
Административные (A&G)Канцелярия, банковские комиссии, бухгалтерия, юристы, прочие расходыНакладные
Системы и связь (I&TS)Интернет и связь, программное обеспечение и подписки, компьютеры и оборудованиеНакладные
МаркетингРеклама онлайн, фото/видео, печатьНакладные
Зарплаты без направленияНалоги на ФОТ, зарплата персонала без направленияРазносится по направлениям или строка «ФОТ, направление не указано»
Управляющая компанияПлата управляющей компанииМежду GOP и EBITDA
АрендаПомещения, оборудованиеВнеоперационные
Налоги и страховкаНалог на имущество, страхованиеВнеоперационные
ФинансыПроценты по кредитамНиже EBITDA

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

У категории можно указать направление — размещение, питание или одно из прочих направлений. С направлением расход ложится в расходы этого направления, без направления — в накладные своей группы. У зарплатных категорий направление особенно важно: по USALI зарплата стоит внутри направления, где работает человек. Зарплатная категория без направления в отчёте становится строкой «ФОТ, направление не указано», а в справочнике у неё появляется подсказка «Указать направление» и полоса-сводка над списком. Если при вводе расхода выбрана такая категория, форма попросит направление и запишет его на категорию — следующие расходы по ней пойдут туда сами.

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

Ремонт и покупки, которые служат дольше года — замена кровли, новая котельная, мебель на весь корпус. По USALI такие расходы в операционную прибыль не входят: в P&L они стоят строкой «Капитальные затраты» под «Прибылью до налогов», с «Итогом после капитальных» ниже, и не попадают в график расходов. Касса и движение денег их видят как обычные оплаты.

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

Имена категорий мультиязычные: каждое название хранится сразу на нескольких языках (ru / en / kz / de), а интерфейс показывает его на языке пользователя. Поэтому в любой локали категория выглядит одинаково осмысленно.

Отдельная страница Финансы → Расходы → Категории — это «атлас» всех статей. Слева список 12 USALI-групп со счётчиками, справа — категории выбранной группы.

Что здесь видно и можно делать:

  • Сводка по группе — сколько всего категорий, сколько ваших, сколько системных, сколько зарплатных
  • Поиск — по любому из языков названия сразу по всем группам
  • Переключатель «Только зарплатные» — собирает зарплатные категории сквозь все группы
  • Цвет и иконка — у каждой категории свой значок; для своих категорий можно выбрать цвет из готовых или задать свой; по умолчанию стоит «Авто» — цвет группы
  • Бейджи — «Зарплата» у зарплатных категорий, «Капитальные» у капитальных, подпись «разносится пропорционально зарплатам» у налогов с зарплат
  • Создание / редактирование своих категорий, переименование системных
  • Удаление — только для своих категорий; системные защищены замком

Модуль использует гранулярные права, а не только роли:

ПравоЧто даёт
expenses.viewВидеть список расходов и агрегаты (без зарплат)
expenses.manageСоздавать/редактировать/отменять любые расходы (кроме зарплатных) и управлять категориями
expenses.manage_ownВидеть все non-payroll расходы проекта; редактировать и отменять — только свои, младше 24 часов
expenses.payroll.viewВидеть зарплатные категории и суммы
expenses.payroll.manageСоздавать и редактировать зарплатные расходы
financial_kpi.viewВидеть GOP, GOPPAR, EBITDA, прибыль до налогов, ADR, RevPAR

Готовые пресеты в диалоге изменения прав участника проекта:

  • Владелец / Управляющий / Бухгалтер — полный доступ к финансам, включая зарплаты
  • Ресепшн — только expenses.manage_own (свои операционные расходы за смену)
  • Только чтение — просмотр без редактирования

На странице Финансы → Расходы → Все расходы — таблица со всеми расходами проекта.

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

Что здесь можно делать:

  • Строка над таблицей — поиск по названию поставщика, период (с готовыми пресетами: сегодня, вчера, 7 дней, месяц, прошлый месяц, с начала года) и кнопка «Фильтр»; справа — число расходов, настройка колонок и плотность таблицы
  • Окно «Фильтр» — USALI-группа, статус (Оплачен / Запланирован) и вид (капитальные / операционные). Число на кнопке показывает, сколько условий выбрано, «Сбросить всё» внизу окна снимает их разом
  • Переходы из P&L по статье, направлению и капитальным открывают список уже отфильтрованным
  • Активные фильтры показываются «пилюлями» — каждую можно снять одним кликом
  • Клик по строке — открывает детальную страницу расхода
  • Новый расход — кнопка в шапке открывает форму создания
  • Колонка «Кто создал» — видно, кто внёс расход (важно для контроля в сменах ресепшена)
  • НДС — если у расхода указан НДС, он показывается под суммой отдельной подписью
  • Пагинация — выбор размера страницы и переключение по номерам

При проваливании из портфельного P&L (?projectId=…) страница автоматически переключается на нужный отель — карточки и таблица показывают данные именно того объекта, в который вы перешли.

  1. Откройте Финансы → Расходы → Все расходы
  2. Нажмите «Новый расход» — справа откроется форма
  3. Заполните форму:
    • Сумма — обязательное поле, в тенге (в кадре выше — 45 000 ₸ за замену смесителя)
    • Статус — Оплачен или Запланирован
    • Категория — выбирается из дерева USALI с поиском по всем языкам (в кадре — «Сантехника» из группы «Обслуживание»; зарплатные видят только владельцы). Если выбрана зарплатная категория без направления, ниже появится обязательный выбор направления — оно запишется на категорию. У категорий питания и розницы форма напоминает: «Товар для продажи проводите приходом на склад»
    • Дата расхода — когда возникло обязательство (для P&L)
    • Дата оплаты — когда деньги реально ушли (для cash flow). Поле появляется только для статуса «Оплачен» и может отличаться от даты расхода
    • Способ оплаты — Наличные / Банк / Карта / Kaspi / Другое
    • Поставщик, номер счёта, описание — опционально
    • Капитальные затраты — отметка внизу формы; по умолчанию как у категории, для этой записи можно снять или поставить
  4. Нажмите «Сохранить» — расход встанет первой строкой списка, а карточки-итоги пересчитаются

Расход сохраняется в статусе Оплачен (если поставили дату оплаты) или Запланирован.

Клик по строке в списке открывает детальную страницу — аналог страницы платежа.

На странице отображаются:

  • Сводка — крупная сумма, отдельной строкой НДС (если задан), категория, способ оплаты, поставщик, номер счёта, описание
  • Две даты с пояснением — дата расхода (попадает в P&L за этот месяц) и дата оплаты (попадает в движение денежных средств за этот день). Раскрывающаяся подпись объясняет, зачем нужны обе. Под датой расхода видно, был ли он проставлен задним числом; под датой оплаты — разрыв между начислением и оплатой (отсрочка поставщика или предоплата)
  • Категория — отдельным блоком, с группой USALI, направлением и бейджами «Зарплата» и «Капитальные»
  • Признак ночного аудита — попадает ли расход в сменный отчёт
  • Источник — если расход создан автоматически из повторяющегося правила, есть ссылка на него
  • Карточка автора — кто создал расход и когда
  • Хронология — таймлайн событий: создан → понесён → оплачен → отменён
  • История изменений (аудит) — сворачиваемый блок; раскрыт по умолчанию для аномалий (отменённые или внесённые задним числом расходы)

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

Кнопка «Изменить» открывает форму со всеми полями расхода. Часть полей — дата расхода, дата оплаты, способ оплаты — можно менять прямо на странице, не открывая форму. Категорию изменить нельзя — это ограничение сделано специально, чтобы не ломать исторические агрегаты по группам USALI. Если категория выбрана неверно, отмените расход и создайте новый.

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

Ресепшн может отменять только свои расходы, созданные меньше 24 часов назад. Владелец, управляющий и бухгалтер могут отменить любой non-payroll расход (зарплатные — при наличии expenses.payroll.manage).

Для регулярных платежей — аренда, коммуналка, подписки — создайте правило в Финансы → Расходы → Повторяющиеся. Система сама сгенерирует запись в статусе «Запланирован» по расписанию. Правила показаны таблицей: категория с группой и описанием, частота, сумма, поставщик и дата следующего расхода; кнопка «Остановить» в строке отключает правило.

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

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

Оператор с правом expenses.manage_own:

  • Видит все non-payroll расходы проекта (чтобы понимать общую картину по смене и не создавать дубли)
  • Создаёт расходы от своего имени
  • Не видит зарплатные категории вообще
  • Может редактировать и отменять только свои расходы, и только если они созданы меньше 24 часов назад
  • Не может спрятать свой расход от ночного аудита — его записи всегда попадают в сменный отчёт
  • Не видит GOP, ADR, RevPAR, GOPPAR, прибыль до налогов — только кассу

Это сделано специально, чтобы:

  1. Ресепшн отвечал за свои операционные закупки (тапочки за смену, батарейки в замки) — и они попадали в ночной аудит
  2. Финансовые KPI видели только те, кому они нужны для управления — владелец и управляющий

На странице Отчёты → Ночной аудит есть секция «Расходы за смену» — показываются non-payroll расходы, отмеченные для ночного аудита и возникшие в день аудита. Секция не видна пользователям без expenses.view.

На основе расходов автоматически считаются ключевые гостиничные KPI:

МетрикаФормулаЧто показывает
Прибыль направленийВыручка − расходы направлений (с зарплатами)Эффективность самой гостиничной деятельности
GOPПрибыль направлений − накладныеВаловая операционная прибыль
GOP MarginGOP / Выручка × 100%Маржа
GOPPARGOP / доступные ночи по USALIГлавная метрика эффективности собственника
EBITDAGOP − плата управляющей компании − внеоперационные статьиПрибыль до процентов, налогов и амортизации
Прибыль до налоговEBITDA − проценты по кредитамПоследняя ступень операционного отчёта
Итог после капитальныхПрибыль до налогов − капитальные затратыЧто осталось с учётом ремонта и покупок надолго

Эти метрики требуют права financial_kpi.view. Если у пользователя нет expenses.payroll.view, зарплата не учитывается в расчёте, ступени помечаются «без зарплат» — цифра завышена на сумму скрытого фонда оплаты труда.

GOP, прибыль до налогов и итог после капитальных отображаются на дашборде и в P&L отчёте. Подробнее о том, как считается выручка для этих метрик — см. Признание выручки.

  • Модели: ExpenseCategory, Expense, RecurringExpense (см. apps/api/prisma/schema.prisma)
  • Имена категорий — мультиязычный JSON { ru, en, kz, de, … }; группа (group), направление (department), признаки isPayroll, isCapital, allocateByLabor — отдельные поля; у записи свой isCapital
  • У расхода есть опциональная привязка к зоне/корпусу и юниту (zoneId, unitId), поле НДС (vatAmount), валюта и вложения-чеки (attachments)
  • Сид системных категорий: apps/api/src/modules/expense-category/expenseCategorySeeds.ts
  • Ежедневный cron: RecurringExpenseCronService (03:00 серверного времени)
  • Мягкое удаление через isActive=false + status=CANCELLED
  • Все операции пишутся в AuditLog
  • Только KZT. Валюта хранится в каждой записи, но полноценная мультивалютность в TODO как критичная отложенная задача
  • PDF-экспорт ночного аудита не рендерит секцию расходов (только UI отображает)
  • Доступ к бронированиям по-прежнему определяется проектной ролью, не permissions. Поэтому пресет «Бухгалтер» даёт финансовые права, но бронирования и данные гостей всё ещё видны через роль OPERATOR/VIEWER. Изоляция бухгалтера от гостевых данных — в TODO как «RBAC Phase 2»