# Техническая документация: 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` |

---
