# Техническая документация: mklab_base_indicators_extended **name:** `mklab_base_indicators_extended` **version:** 19.0.2025.11.24 **author:** MK.Lab **depends:** `base`, `mklab_project_task_indicators` --- ## Архитектура Модуль надстраивается поверх `mklab_base_indicators` и `mklab_project_task_indicators`. Вводит две новые модели для хранения шаблонов смет, визард применения шаблона к задаче и расширяет `project.task` двумя методами-действиями. ``` mklab_base_indicators_extended ├── hg.templates — шаблон сметы (заголовок) ├── hg.templates.line — строка шаблона (показатель + дата + сумма) ├── estimate.wizard — визард применения шаблона к задаче └── project.task — расширение: методы «Смета-анализ» и «Править смету» ``` --- ## Модели ### `hg.templates` — Шаблон сметы **Файл:** `models/hg_templates.py` Хранит именованный набор строк показателей — шаблон для быстрого создания сметы задачи. | Поле | Тип | Описание | |---|---|---| | `name` | Char | Название шаблона | | `line_ids` | One2many к `hg.templates.line` | Строки шаблона | --- ### `hg.templates.line` — Строка шаблона **Файл:** `models/hg_templates.py` Одна строка шаблона: конкретный показатель с плановой датой и суммой. | Поле | Тип | Описание | |---|---|---| | `template_id` | Many2one к `hg.templates` (required) | Родительский шаблон | | `index_id` | Many2one к `hg.index` (required) | Показатель из справочника | | `date_due` | Date | Плановая дата | | `value_float_plan` | Float | Плановая сумма | --- ### `estimate.wizard` — Визард создания сметы **Файл:** `wizard/estimate_wizard.py` **Тип:** `models.TransientModel` Диалог выбора шаблона и кода показателей. Открывается из формы задачи когда у неё ещё нет показателей. | Поле | Тип | Описание | |---|---|---| | `template_id` | Many2one к `hg.templates` (required) | Выбранный шаблон сметы | | `code_id` | Many2one к `hg.index.code` (required) | Код, присваиваемый всем создаваемым показателям | #### Метод `confirm_action()` Получает ID задачи из контекста (`active_id`), затем для каждой строки шаблона выполняет три шага: 1. Вызывает `_get_node()` — находит или создаёт `hg.node` для задачи 2. Создаёт `hg.index` с `node_id`, именем из строки шаблона и `internal_code_id` из `code_id` 3. Создаёт `hg.value` с `type='alone'`, `date_due` и `value_float_plan` из строки шаблона После обхода всех строк закрывает диалог через `ir.actions.act_window_close`. #### Метод `_get_node(res_model, res_id, name)` Ищет существующий `hg.node` по паре `(res_model, res_id)`. Если не найден — создаёт новый. Гарантирует что для одной задачи не создаётся дублирующих вершин. --- ### `project.task` — Расширение **Файл:** `models/project_task.py` Добавляет два метода-действия в модель задачи, вызываемых через кнопки на форме. #### `action_estimate_analysis()` Открывает `hg.value` в режиме **pivot** в диалоге. Фильтрует только значения показателей текущей задачи (`index_id in self.index_ids`). Использует кастомный pivot-вид `view_estimate_pivot`. #### `action_edit_estimate()` Условная логика в зависимости от наличия показателей у задачи: | Условие | Результат | |---|---| | `self.index_ids` не пустой | Открывает `hg.value` в list-режиме (`view_edit_estimate_list`) в диалоге | | `self.index_ids` пустой | Открывает визард `estimate.wizard` с `active_id` задачи в контексте | --- ## Представления | Файл | Содержание | |---|---| | `views/hg_templates.xml` | Форма и список шаблонов смет (`hg.templates`) | | `views/hg_value.xml` | Кастомные виды `hg.value`: pivot (`view_estimate_pivot`) и list (`view_edit_estimate_list`) | | `views/project_task.xml` | Кнопки «Смета-анализ» и «Править смету» на форме задачи | | `wizard/estimate_wizard.xml` | Форма визарда выбора шаблона | --- ## Данные при установке **Файл:** `data/data.xml` Создаёт один классификатор и 6 предустановленных показателей `hg.index`: | XML ID | Название | Внешний код | |---|---|---| | `work_design` | Работы по проектированию | EXT-DESIGN | | `work_excavation` | Подготовка котлована | EXT-EXCAV | | `work_foundation` | Фундамент | EXT-FOUND | | `work_monolithic` | Монолитные работы | EXT-MONO | | `work_finishing` | Отделочные работы | EXT-FINISH | | `work_engineering` | Инженерные работы | EXT-ENG | --- ## Демо-данные **Файл:** `demo/demo.xml` Создаёт шаблон «Смета проекта (базовая)» с тремя строками: | Показатель | Плановая сумма | Дата | |---|---|---| | Выручка (`demo_index_revenue`) | 2 000 000 | 2026-12-31 | | Себестоимость (`demo_index_cost`) | 1 200 000 | 2026-12-31 | | Прибыль (`demo_index_profit`) | 800 000 | 2026-12-31 | Использует показатели из демо-данных модуля `mklab_base_indicators`. --- ## Права доступа **Файл:** `security/ir.model.access.csv` | Модель | Группа | Права | |---|---|---| | `hg.templates` | `group_indicators_admin` | CRUD | | `hg.templates.line` | `group_indicators_admin` | CRUD | | `estimate.wizard` | `group_indicators_admin` | CRUD | --- ## Тесты **Файл:** `tests/` | Файл | Что покрывает | |---|---| | `test_hg_templates.py` | Создание шаблонов, добавление строк, корректность полей | | `test_estimate_wizard.py` | Применение шаблона к задаче, создание `hg.node` / `hg.index` / `hg.value`, идемпотентность `_get_node` | ---