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