Сметы
Обновлено 2026-10-27
На этой странице
- Иерархия
- Сущности, поля и связи
- Смета
- Раздел
- Работа в смете
- Что и где редактируется
- В таблице сметы (прямо в ячейках)
- В окне редактирования работы
- Что считается, а что хранится в базе
- Объёмы: план и факт
- Цены
- Суммы: план и факт
- Связь сметы с отчётами
- Откуда берутся значения при создании работы
- Цена исполнителя и ставка
- Ручной факт
- Импорт сметы
- Шаги импорта
- Импорт материалов
- Единицы измерения материала в смете
Сметы
Иерархия
Смета состоит из разделов. В каждом разделе — список работ и при необходимости привязанные материалы.
Структура: Смета → Разделы → Работы (и материалы в разделе).
При создании новой сметы автоматически создаётся первый раздел. Разделы можно добавлять, переименовывать и менять порядок.
Каждая работа в смете привязана к типу работ из справочника (от типа зависят единицы измерения, калькулятор объёма, способ расчёта ставки). Отчёты о выполнении привязываются к конкретной работе в смете.
Для разработчиков
Plan → PlanSection → PlanWork. Таблицы: vseprosto_estimate_plans, vseprosto_estimate_plan_sections, vseprosto_estimate_plan_works.
В разделах pivot с материалами (vseprosto_estimate_plan_materials). Работа связана с WorkType; ReportItem ссылается на plan_work_id.
Сущности, поля и связи
Смета
У сметы хранятся: название, объект (место), статус (активна / закрыта / в архиве), настройки доступа по ссылке и код ссылки, количество дней (план/факт), настройки НДС. Смета всегда привязана к одному объекту.
Раздел
У раздела хранятся: название и порядок сортировки. В разделе — список работ и привязка материалов (объём, факт, цена по каждому материалу).
Работа в смете
У работы хранятся: название, тип работ (из справочника), план объёма, цена (для заказчика), ставка (для расчёта выплат исполнителю), единица измерения. Дополнительно сохраняются параметры и коэффициенты, заданные для этой работы (они используются при расчёте цены и объёма).
Работа связана с типом работ: от типа берутся единицы измерения, формула расчёта объёма (если включён калькулятор), а также правило — ставка в процентах от цены или фиксированная сумма.
Цена и ставка при создании работы могут подставляться из справочников цен и тарифов — по типу работ, объекту и дате. Если поля остались пустыми, при открытии сметы система подставляет значения из справочников только для отображения; в базу они не перезаписываются при каждом открытии.
Итого по работе:
- Хранится в базе: название, тип работ, план объёма, цена (для заказчика), ставка, единица измерения, параметры и коэффициенты.
- Всегда считается при показе (в базе нет): цена исполнителя, суммы (для заказчика, для исполнителя, по факту), фактический объём по работе (собирается из отчётов).
Для разработчиков
Plan: name, place_id, status, link_code, link_access_allowed, man_days, amount_days, vat и др.
PlanSection: name, plan_id, sort_order; hasMany PlanWork; belongsToMany Material (pivot: amount, amount_fact, price).
PlanWork: name, work_type_id, plan_section_id, amount, price, rate, measure, data (JSON). Цена/ставка подставляются из Price и Rate по типу работ, объекту, дате.
Что и где редактируется
В таблице сметы (прямо в ячейках)
По двойному клику по ячейке можно изменить:
- название работы или раздела;
- план (объём);
- факт (объём по отчётам — см. ручной факт);
- цену (для заказчика);
- цену исполнителя (в интерфейсе так называется; в базе при этом сохраняется ставка — см. раздел про ставки).
Редактировать можно только существующие строки (не новые) и только при наличии прав. После ввода значения изменение сохраняется при снятии фокуса с ячейки или по Enter.
В окне редактирования работы
В модальном окне работы доступно полное редактирование: название, тип работ, параметры и коэффициенты типа работ, пересчёт объёма по калькулятору, ручной ввод плана объёма, цены и ставки.
Для разработчиков
Inline: колонки с editable, dblClickCell → setValue → onSaveRecords (updPlanWork). Сохраняются: name, amount, price, price_performer (конвертируется в rate).
Модалка: форма работы, onAddPlanWork / onUpdPlanWork.
Что считается, а что хранится в базе
Что по работе хранится в базе и что считается при показе — перечислено в разделе «Сущности, поля и связи» (блок «Итого по работе»).
Объёмы: план и факт
| Показатель | Источник | Описание |
|---|---|---|
| План объёма | Вводится вручную или по калькулятору типа работ | Хранится в работе сметы. |
| Фактический объём | Отчёты или ручной ввод | Если задан вручную руководителем — используется он. Иначе — сумма объёмов всех отчётов, привязанных к этой работе (с пересчётом единиц, если у типа работ настроена конвертация). Подробнее — «Ручной факт». |
Цены
| Показатель | Источник | Описание |
|---|---|---|
| Цена для заказчика | Хранится в работе сметы | Подставляется из прайса при создании работы (тип работ, объект, дата, коэффициенты). Используется и для плана, и для факта. |
| Цена исполнителя | Считается по ставке | См. «Цена исполнителя и ставка». |
Суммы: план и факт
| Показатель | Формула |
|---|---|
| Сумма для заказчика (план) | цена × план объёма |
| Сумма для заказчика (факт) | цена × фактический объём |
| Сумма для исполнителей (план) | цена исполнителя × план объёма |
| Сумма для исполнителей (факт) | Сумма полей «сумма» всех исполнителей и бригадиров по всем отчётам этой работы |
Остаток по работе: план − факт (и по объёму, и по суммам).
Связь сметы с отчётами
Фактические данные в смете берутся из отчётов, привязанных к работе:
- Объём по факту — сумма объёмов отчётов (с конвертацией единиц при необходимости).
- Сумма по факту для исполнителей — сумма сумм исполнителей (включая бригадиров) по всем отчётам этой работы.
Подробнее о том, как формируются суммы в отчётах и как они попадают в смету — в разделе «Отчёты: Связь отчётов со сметой».
Для разработчиков
amount_fact: из ReportItem (amount) с MeasureHelp::getConvertAmount; либо plan_work.amount_fact_manual.
sum_fact: plan_work.price × amount_fact.
sum_fact_performers: sum(performer->pivot->sum) + sum(report_item->foreman_sum) по report_items работы.
Откуда берутся значения при создании работы
Если при добавлении работы не заполнены цена или ставка, система подставляет их из справочников: цена — из прайса (тип работ, объект, дата, с учётом коэффициентов работы); ставка — из тарифов (тип работ, объект или общий тариф, дата, роль «партнёр»). План объёма может быть рассчитан по формуле типа работ (калькулятор), если заданы параметры.
При сохранении изменений из таблицы сметы в базу записывается только введённое пользователем; из справочников заново ничего не подставляется.
Для разработчиков
Хранится: plan_work.amount, price, rate, measure, data.
Считается при отдаче: price×amount, price×amount_fact; price_performer (rate_is_percent ? price×rate/100 : rate), sum_performer. amount_fact из ReportItem с конвертацией.
Подстановка при пустых: PriceHelp::findPriceForWork; WorkTypeHelp::searchRates (partner); calcAmount для amount.
Цена исполнителя и ставка
В базе по работе хранится ставка (в процентах или фиксированная — задаётся в типе работ). Поля «цена исполнителя» в базе нет: она всегда считается при показе.
- Ставка в процентах — цена исполнителя = цена заказчика × ставка / 100.
- Ставка фиксированная (₽) — цена исполнителя равна ставке. Сумма для исполнителя = ставка × план объёма.
В таблице сметы показывается и редактируется колонка «Цена исполнителя»: при сохранении из неё пересчитывается ставка и в базу пишется уже ставка. В окне редактирования работы есть поле «Ставка» — там ставку можно ввести или изменить напрямую.
Для разработчиков
plan_work.rate. price_performer не хранится, считается в PlanHelp.
При сохранении из таблицы (price_performer): rate_is_percent → rate = value*100/price, иначе rate = value. searchRates(work_type, place_id, date, 'partner').
Ручной факт
По каждой работе в смете отображается факт — фактический объём выполнения.
- Если факт задан вручную (руководитель дважды кликнул по ячейке «Факт» и ввёл значение) — используется это значение. В колонке «Факт» у такой работы отображается иконка ручки (видна только руководителю).
- Если факт не задан вручную — он считается автоматически из прикреплённых к работе отчётов: объёмы из отчётов суммируются с учётом единиц измерения (при необходимости пересчёт по коэффициентам типа работ).
Чтобы снова считать факт из отчётов, достаточно очистить ячейку «Факт» (удалить значение и сохранить). Редактировать факт в таблице сметы может только руководитель.
Импорт сметы
Импорт доступен по вкладке «Импорт» на странице сметы (только для руководителя). Данные можно загрузить из файла (Excel .xls, .xlsx) или вставить из буфера обмена (например, скопировав таблицу из Excel).
Шаги импорта
- Загрузка или вставка. Нажать «Загрузить» и выбрать файл либо «Вставить из буфера» и при необходимости нажать Ctrl+V (Cmd+V) в указанном поле.
- Выбор области. На экране отображается таблица. Нужно указать область импорта: клик по заголовку колонки или по строке в первой колонке выделяет/снимает колонку или строку; можно выделить прямоугольную область мышью. Кнопка «Выделить все» отмечает все строки и колонки. Кнопка «Продолжить» переходит к настройкам.
- Автоопределение. Система пытается найти строку заголовков (по совпадению с названиями колонок: название, цена, кол-во, ед. изм., тип работ). Строки выше заголовка и сама строка заголовка помечаются как «Пропустить». Для остальных строк автоматически подбираются типы колонок и типы строк (раздел, материал, тип работ — по колонке «тип работ» и по признакам раздела/материала). При необходимости можно вручную задать тип колонки или тип строки (клик по заголовку или по ячейке типа/ед. изм.). Доступна кнопка «Определить тип по ИИ» для классификации типов строк.
- Настройки импорта (кнопка с иконкой шестерёнки). Можно включить «Очистить смету перед импортом» — тогда перед импортом удаляются все разделы сметы. Для совпадений по разделу и названию работы можно выбрать: Обновить (перезаписать объём и цену), Просуммировать (прибавить объём к существующей записи) или Добавить новую запись. Если включена очистка сметы, эти варианты не используются.
- Импортировать. Нажать «Импортировать». Данные загружаются на сервер; при совпадении имён разделов создаётся один раздел, а не дубликаты. Работы и материалы создаются или обновляются согласно выбранным настройкам.
Колонки, которые можно сопоставить: название, цена, количество, ед. изм., тип работ. Типы строк: пропустить, раздел, материал или конкретный тип работ из справочника. Для материалов при импорте может использоваться справочник материалов (если тип строки «Материал» и название совпадает с материалом из справочника).
Импорт материалов
Строка таблицы импорта может быть помечена как «Материал». В этом случае система обрабатывает её так:
- Поиск в справочнике. По названию из колонки «Название» ищется существующий материал. Если материал найден — он будет привязан к разделу сметы с указанными в строке количеством и ценой.
- Если материал не найден — в справочнике материалов создаётся новая позиция: берутся название из колонки «Название», цена из колонки «Цена», а единица измерения — из колонки «Ед. изм.» (если она указана в настройках импорта и в ячейке строки есть значение). После этого новый материал так же привязывается к разделу сметы.
- Раздел сметы. Материал (новый или найденный) добавляется в раздел: либо в тот, который задан предыдущей строкой-разделом в файле, либо в раздел «Материалы» (он создаётся автоматически, если его ещё нет).
- Повторная привязка. Если такой материал уже есть в этом разделе сметы, по умолчанию его количество суммируется с объёмом из импортируемой строки (поведение можно изменить в настройках импорта).
Итого: при импорте материалов важно задать колонку «Ед. изм.» и при необходимости заполнить ячейки в файле — тогда у вновь создаваемых материалов в справочнике сразу будет правильная единица измерения.
Для разработчиков
Обработка строк с
rowSettings[$keyRow] == 'material': проверкаkey_exists($keyRow, $rowMaterials)— совпадение по справочнику (передаётся с фронта вimportSettings['materials']). При отсутствии —Material::create(['name', 'link_purchase_page' => '', 'cost', 'measure']); единица берётся из$rowMeasures[$keyRow](значение из колонки «Ед. изм.» после сопоставления со справочником мер на фронте) или из$row[$columnsType['measure']]. Привязка к разделу —$currentSection->materials()->attach($materialBase->id, ['amount', 'price'])или обновление pivotamount. Таблица материалов:vseprosto_estimate_materials(id, name, link_purchase_page, cost, measure). Pivot:vseprosto_estimate_plan_materials(plan_section_id, material_id, price, amount, amount_fact).
Единицы измерения материала в смете
В смете у каждой строки-материала отображается единица измерения (шт., м², м и т.п.). Она не хранится в самой смете: при открытии сметы система каждый раз подставляет текущее значение из справочника материалов.
Что это значит на практике:
- Если вы измените единицу измерения у материала в справочнике (страница «Материалы»), при следующем открытии или обновлении всех смет, где этот материал используется, будет показана уже новая единица. Отдельно ничего обновлять в сметах не нужно.
- Перед сменой единицы измерения в справочнике система предупреждает: материал используется в N сметах и смена единицы отразится во всех этих сметах. Подтверждение нужно только при реальном изменении значения.
В смете в ячейках раздела хранятся только: какой материал привязан, его количество (план и факт) и цена. Единица измерения всегда берётся из карточки материала в справочнике.
Для разработчиков
В pivot
vseprosto_estimate_plan_materialsнет поляmeasure. При формировании записей сметы (например, вApiPlans.php) для каждой позиции-материала загружается модельMaterialпоmaterial_id; в ответ уходитmeasureиmeasure_nameиз$planMaterial->measureиMeasureHelp::getMeasure($planMaterial->measure). Справочник материалов при сохранении проверяетused_in_plans_count(число смет, в которых материал встречается) и при смене поляmeasureпоказывает confirm с предупреждением.