Files
public/mklab_base_indicators_extended/TECHNICAL.md

169 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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