Что такое продукт
Продукт — это учётная карточка взаимозаменяемого инвентаря. В отличие от отдельной единицы оборудования, у которой есть собственная жизнь (состояние, пробег, страховка, история выдач), продукт описывает позицию целиком и ведёт учёт по количеству, а не по каждому экземпляру отдельно. Во внутренней базе данных этот раздел называется «Продукты». Продукт используется в двух режимах:- Как контейнер отдельных единиц. К продукту привязаны реальные единицы инвентаря (например, десять одинаковых велосипедов). Доступность и свободный остаток при этом рассчитываются на лету по расписанию занятости конкретных единиц.
- Как счётчик по количеству. Для расходуемого или сыпучего инвентаря (топливо, крепёж, наполнитель) продукт хранит единицу измерения, цену за единицу и учитываемый остаток, а сумма по остатку вычисляется автоматически.
Свободный остаток и доступность не хранятся в карточке продукта — они вычисляются в момент запроса на основании выбранного интервала времени и расписания занятости единиц. Поэтому один и тот же продукт может показывать разное «свободно» в зависимости от запрошенных дат.
Модель данных
Основные поля
Классификация и витрина
Учёт по количеству
Сумма по единицам — расчётное поле. Даже если во входящих данных передать своё значение, при сохранении оно всегда перезаписывается произведением цены за единицу на количество единиц. Задавать её вручную бессмысленно.
Служебные поля
Логика и побочные эффекты
Что происходит при сохранении
При каждом сохранении карточки продукта автоматически выполняется несколько действий:- Миниатюра изображения. Если фото изменилось и оно задано, для него генерируется миниатюра.
- Слаг (URL). Если изменилось название или слаг ещё не заполнен, он формируется из названия. Слаг обязан быть уникальным в пределах компании.
- Пересчёт суммы. Сумма по единицам пересчитывается как цена за единицу × количество единиц.
- Защита от конфликта слага. Если при записи возникает конфликт уникальности (компания + слаг), слаг сбрасывается и запись сохраняется повторно уже без него.
Слаг уникален именно в паре «компания + слаг», а не глобально. Разные компании могут иметь продукты с одинаковым слагом, внутри одной компании — нет.
Синхронизация с единицами и витриной
Сохранение и удаление продукта запускают фоновые эффекты:- Обновление категории у единиц. Если у существующего продукта действительно сменили категорию, новая категория проставляется всем его единицам. Так категория продукта наследуется входящими в него единицами. Прочие правки продукта (переименование, смена фото, цены и т. п.) категории единиц не трогают, поэтому вручную выставленная у отдельной единицы категория сохраняется.
- Обновление витрины. При сохранении и при удалении продукта запускается фоновая задача обновления публичного каталога продуктов, чтобы витрина отражала актуальное состояние.
Массовое создание единиц из продукта
При создании или обновлении продукта можно сразу сгенерировать привязанные к нему отдельные единицы инвентаря через форму создания единиц. Логика такая:- Указывается количество (до 1000 за раз), а также необязательные точка проката, цена и дата покупки, субарендодатель и его процент, доп. поля.
- Артикулы создаваемых единиц нумеруются автоматически по сквозному счётчику компании, привязанному к конкретному продукту. Формат артикула — «артикул продукта (или его идентификатор) + порядковый номер из трёх цифр». Счётчик берётся с блокировкой и увеличивается на запрошенное количество, поэтому номера не пересекаются даже при параллельных запросах.
- В каждую единицу копируются название, комментарий и изображение продукта; категория берётся у продукта либо, если она не задана, из первой доступной категории каталога.
Проверка уникальности артикула
Артикул проверяется на уникальность только когда соответствующая настройка компании включена. Проверка учитывает лишь действующие (не выведенные из оборота) продукты и при редактировании исключает саму текущую запись. При совпадении сохранение отклоняется с сообщением, что продукт с таким идентификатором уже существует.Удаление — это вывод из оборота
Удаление продукта не стирает запись физически. Вместо этого создаётся запись о выводе из оборота со способом «удаление» и указанием, кто его выполнил. Благодаря этому в списках продукт помечается как удалённый, но его история и связанные данные сохраняются.Расчёт остатков и доступности
Список продуктов возвращается вместе с вычисляемыми на лету показателями. Для каждого показателя учитываются только «живые» единицы: не проданные, не находящиеся на складе как отдельная сущность и не выведенные из оборота.Интервал доступности
Свободный остаток считается для интервала «начало–конец», который берётся из запроса. Если даты не переданы, обе границы приравниваются к текущему моменту. Дополнительно можно передать список идентификаторов единиц, которые нужно исключить из подсчёта свободных (например, уже отложенные в текущий черновик заказа) — список либо передаётся напрямую, либо подтягивается из заранее сохранённого во временном хранилище набора по ключу.Список свободных единиц исключает переданные идентификаторы, а список «всего» — нет. Это позволяет показывать, сколько единиц физически в продукте, и отдельно — сколько из них реально можно взять на запрошенные даты.
Ограничение по точке проката и правам
Видимость продуктов и подсчёт остатков зависят от роли пользователя:- Администратор компании без выбранной точки видит все продукты; с выбранной точкой — только продукты этой точки.
- Остальные сотрудники видят только продукты тех точек проката, к которым они привязаны.
При включённой настройке «доступность продукта» список скрывает продукты, в которых нет ни одной действующей единицы. Это удобно для витрины, но означает, что пустой продукт просто не покажется в списке, пока в него не добавят единицы.
Тарифы продукта
Ценообразование продукта задаётся его тарифами. Тариф — это правило: цена за определённый период времени с возможным ограничением по дням недели и времени суток.
Одна и та же модель тарифа обслуживает тарифы продукта, отдельной единицы и комплекта — для тарифа продукта заполняется связь именно с продуктом.
Управление тарифами
Тарифы можно вести двумя способами:- Вместе с карточкой продукта. При создании или обновлении продукта можно передать форму тарифов. Новые тарифы (без идентификатора) создаются пакетно; существующие (с идентификатором) пакетно обновляются по полям дней недели, времени начала и конца, названия, цены и порядка. Если порядок не указан, новым тарифам он присваивается по позиции в списке.
- Отдельными операциями. Есть отдельный список тарифов конкретного продукта (создание и просмотр) и отдельная работа с одним тарифом (просмотр, изменение, удаление).
Состояния и статусы единиц продукта
Для продукта доступны две сводки по его единицам, обе без постраничной разбивки:- Разбивка по состояниям. Показывает, сколько действующих единиц продукта находится в каждом состоянии инвентаря. Учитываются только не выведенные из оборота единицы, с фильтрацией по доступным пользователю точкам проката.
- Разбивка по вычисляемым статусам. Показывает количество единиц по их вычисляемому статусу (свободна, в аренде и т. п.), также с учётом прав на точки и без выведенных из оборота единиц.
Как это используется
- В каталоге и списках CRM продукт — это карточка, которую менеджер видит в каталоге: название, категория, фото, остатки и тарифы. Отсюда же запускается массовое создание единиц.
- При оформлении заказа по продукту считается свободный остаток на нужные даты, а исключаемые идентификаторы позволяют не учитывать уже отложенные единицы.
- На витрине/сайте продукт синхронизируется фоновой задачей при каждом изменении, чтобы публичный каталог оставался актуальным.
- Для расходуемого инвентаря продукт работает как простой количественный учёт: цена за единицу, остаток и автоматически считаемая сумма.
Особенности поведения
- Сумма по единицам всегда пересчитывается при сохранении как цена за единицу, умноженная на количество единиц, поэтому переданное вручную значение этого поля игнорируется.
- Слаг уникален только в паре «компания + слаг»; при конфликте уникальности слаг сбрасывается в пустое значение и запись сохраняется повторно.
- Свободный остаток и «всего единиц» не хранятся, а вычисляются на лету по интервалу времени из запроса; при отсутствии дат обе границы равны текущему моменту.
- Список свободных единиц исключает переданные идентификаторы исключаемых единиц, тогда как счётчик «всего единиц» их не исключает.
- Проверка уникальности артикула выполняется только при включённой настройке компании и учитывает лишь не выведенные из оборота продукты, исключая текущую запись при редактировании.
- Обновление тарифов через форму карточки продукта не удаляет тарифы, отсутствующие в переданном списке; удаление возможно только отдельной операцией.
- Артикулы массово создаваемых единиц нумеруются через сквозной счётчик компании, привязанный к продукту и взятый с блокировкой; формат — артикул или идентификатор продукта плюс трёхзначный порядковый номер.
- При включённой настройке «доступность продукта» список продуктов скрывает те из них, где нет ни одной действующей единицы (когда «всего единиц» равно нулю).
- Обновление категории у единиц продукта происходит только при обновлении уже существующего продукта и только когда его категория действительно изменилась; при создании продукта и при любых других правках категории единиц не переписываются.
- В общий список продуктов подгружаются только тарифы с ценой больше нуля, поэтому тарифы с нулевой ценой в этой сводке не видны.
- В модели остаются устаревшие поля (флаг публикации, отдельная цена, бонус, количество), помеченные как подлежащие удалению; актуальная логика на них не опирается.
Связанные страницы
Глоссарий: Продукт
Полный перечень полей и терминов модели продукта.
Инвентарь и услуги (CRM)
Обзорная страница модуля учёта инвентаря и услуг.
Инвентарь (единицы)
Отдельные единицы оборудования: статусы и состояние, пробег, страховка, авто-поля, импорт, массовое обновление, перемещение и продажа.
Комплекты (наборы)
Наборы инвентаря, сдаваемые как единое целое: состав, позиции и цены комплекта.
Тарифы и цены
Тарифы аренды по временным периодам для единиц, продуктов и комплектов инвентаря.
Доступность и расписание
Расписание занятости инвентаря и расчёт доступности с учётом заказов, склада и задач мастерской.
Субаренда
Периоды субаренды единиц инвентаря с процентом владельца — источник истории для распределения выручки.
Услуги (сервисы)
Дополнительные платные услуги и их тарифы, публикуемые в каталоге и добавляемые к заказам.
Обслуживание и ремонт
Плановое и разовое техобслуживание инвентаря по интервалу или пробегу, с ресурсами и уведомлениями.
Инвентаризация
Проверки состояния инвентаря при выдаче и приёмке заказов, автоматически обновляющие статус единицы.