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