feat: максимальная автоматизация ПП 127

- после автозаполнения категория пересчитывается сразу (по наивысшей
  из выбранных)
- подсказка для ΔДоходов: балансовая стоимость объекта как ориентир
- итоговое сообщение показывает, какие показатели остались незаполненными
  (нет данных для расчёта) — оператор видит, что именно добить вручную
This commit is contained in:
2026-08-04 22:57:26 +04:00
parent 0f9b3a1f11
commit 5aed863b83
+16 -3
View File
@@ -2368,10 +2368,16 @@ class DokoGenApp:
profit = _num2(getattr(self.model, 'profit', '') or '') profit = _num2(getattr(self.model, 'profit', '') or '')
tax = _num2(getattr(self.model, 'profit_tax', '') or '') tax = _num2(getattr(self.model, 'profit_tax', '') or '')
if profit and tax: if profit and tax:
# Подсказка: балансовая стоимость объекта как ориентир для ΔДоходов
_hint = ''
_bv = getattr(isys, 'balance_value', '') or ''
_bvn = _num2(_bv)
if _bvn:
_hint = f"\n(балансовая стоимость объекта: {_bvn:,.0f} руб. — можно использовать как ориентир)"
dincome = simpledialog.askfloat( dincome = simpledialog.askfloat(
"Показатель 9 — ущерб бюджетам", "Показатель 9 — ущерб бюджетам",
"Снижение уровня доходов субъекта КИИ ΔДоходов (руб.):\n" "Снижение уровня доходов субъекта КИИ ΔДоходов (руб.):\n"
"(наихудший сценарий компьютерной атаки на объект)", "(наихудший сценарий компьютерной атаки на объект)" + _hint,
parent=dialog, minvalue=0) parent=dialog, minvalue=0)
if dincome is None: if dincome is None:
continue continue
@@ -2411,12 +2417,19 @@ class DokoGenApp:
else: else:
justify_txt.insert('1.0', full) justify_txt.insert('1.0', full)
filled.append(f"п. {num}: №9 = {val:.6f}% → {cat or ''}") filled.append(f"п. {num}: №9 = {val:.6f}% → {cat or ''}")
# Что осталось незаполненным (применимые, без значения)
left = []
for num, name, values, var, applicable_here in rows:
if applicable_here and not var.get().strip():
left.append(num)
_calc() # пересчитать категорию сразу
messagebox.showinfo( messagebox.showinfo(
"⚡ Автозаполнение ПП 127", "⚡ Автозаполнение ПП 127",
"Заполнено автоматически (рекомендации):\n" + "Заполнено автоматически (рекомендации):\n" +
("\n".join(filled) if filled else "— нет") + ("\n".join(filled) if filled else "— нет") +
"\n\nОстальные применимые показатели заполните вручную.\n" (f"\n\nОсталось заполнить вручную (нет данных для расчёта): {', '.join(left)}"
"Категория объекта будет рассчитана по наивысшей из выбранных.") if left else "\n\nВсе применимые показатели заполнены!") +
"\n\nКатегория объекта пересчитана по наивысшей из выбранных.")
def _open_calc_dialog(num, name, var, combo): def _open_calc_dialog(num, name, var, combo):
"""Авторасчёт показателя 8 или 9 по «Рекомендациям по оценке показателей """Авторасчёт показателя 8 или 9 по «Рекомендациям по оценке показателей