Авторасчёт остальных показателей ПП-127 (1–7, 11–14): количественные — ввод значения → категория по порогам (человек, тыс. чел., часы, %), качественные — выбор варианта III/II/I из справочника; кнопка «🧮» для всех показателей
This commit is contained in:
+77
-5
@@ -2204,6 +2204,8 @@ class DokoGenApp:
|
||||
критериев экономической значимости» ФСТЭК (2021). Показывает расчёт
|
||||
и предлагает категорию как рекомендацию."""
|
||||
import re as _re2
|
||||
from .variables import (CRITERION_QUANT_THRESHOLDS, CRITERION_CHOICE_INDICATORS,
|
||||
CRITERION_QUANT_UNITS)
|
||||
|
||||
def _num(s):
|
||||
# «121 118 270 руб», «1 000», «906 779 руб», «2 212.5» → число
|
||||
@@ -2245,7 +2247,51 @@ class DokoGenApp:
|
||||
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
|
||||
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
|
||||
|
||||
if num == '10' or str(num).startswith('10.'):
|
||||
if (num in CRITERION_QUANT_THRESHOLDS or num in CRITERION_CHOICE_INDICATORS):
|
||||
# Остальные показатели (1–7, 11–14): количественные — ввод значения,
|
||||
# качественные — выбор варианта (III/II/I) из справочника ПП-127
|
||||
from .variables import (CRITERION_QUANT_THRESHOLDS, CRITERION_CHOICE_INDICATORS,
|
||||
CRITERION_QUANT_UNITS)
|
||||
is_choice = num in CRITERION_CHOICE_INDICATORS
|
||||
ttk.Label(frm, text=f"Показатель {num} — по порогам ПП-127",
|
||||
font=('Arial', 10, 'bold')).pack(anchor=tk.W)
|
||||
if is_choice:
|
||||
ttk.Label(frm, text="Выберите один из вариантов значений (соответствует III/II/I категории):",
|
||||
foreground='gray', wraplength=760, justify=tk.LEFT).pack(anchor=tk.W, pady=(2, 6))
|
||||
else:
|
||||
_unit = CRITERION_QUANT_UNITS.get(num, '')
|
||||
ttk.Label(frm, text=f"Введите значение показателя ({_unit}): категория определяется "
|
||||
"по пороговым значениям ПП-127.",
|
||||
foreground='gray', wraplength=760, justify=tk.LEFT).pack(anchor=tk.W, pady=(2, 6))
|
||||
|
||||
def _row(label, key, default=''):
|
||||
ttk.Label(frm, text=label, wraplength=900, justify=tk.LEFT).pack(anchor=tk.W, pady=(4, 0))
|
||||
e = ttk.Entry(frm, width=80)
|
||||
e.insert(0, str(default or ''))
|
||||
e.pack(fill=tk.X)
|
||||
return e
|
||||
|
||||
if is_choice:
|
||||
# Варианты значений для качественного показателя (из criteria_127.json)
|
||||
_opts = []
|
||||
for _g in (criteria if isinstance(criteria, list) else []):
|
||||
for _ind in _g.get('indicators', []):
|
||||
if str(_ind.get('num', '')) == num:
|
||||
_vals = _ind.get('values', {}) or {}
|
||||
_opts = [str(v) for v in _vals.values() if str(v).strip()]
|
||||
break
|
||||
e_choice = ttk.Combobox(frm, width=90, state='readonly', values=_opts)
|
||||
e_choice.pack(fill=tk.X, pady=4)
|
||||
else:
|
||||
e_value = _row(f"Значение показателя ({_unit}):", 'value', '')
|
||||
result_frame = ttk.Frame(frm)
|
||||
result_frame.pack(fill=tk.BOTH, expand=True, pady=(8, 0))
|
||||
result = tk.Text(result_frame, height=10, wrap=tk.WORD, state=tk.NORMAL)
|
||||
result_scroll = ttk.Scrollbar(result_frame, orient=tk.VERTICAL, command=result.yview)
|
||||
result.configure(yscrollcommand=result_scroll.set)
|
||||
result.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
|
||||
result_scroll.pack(side=tk.RIGHT, fill=tk.Y)
|
||||
elif num == '10' or str(num).startswith('10.'):
|
||||
# Показатель 10 — прекращение финансовых операций (банковская сфера)
|
||||
is_base = str(num) == '10'
|
||||
if is_base:
|
||||
@@ -2412,7 +2458,30 @@ class DokoGenApp:
|
||||
|
||||
def _calc():
|
||||
lines = []
|
||||
if num == '10' or str(num).startswith('10.'):
|
||||
if (num in CRITERION_QUANT_THRESHOLDS or num in CRITERION_CHOICE_INDICATORS):
|
||||
from .variables import (CRITERION_QUANT_THRESHOLDS, CRITERION_CHOICE_INDICATORS,
|
||||
CRITERION_QUANT_UNITS, _calc_criterion_other)
|
||||
is_choice = num in CRITERION_CHOICE_INDICATORS
|
||||
if is_choice:
|
||||
choice = e_choice.get().strip()
|
||||
if not choice:
|
||||
result.delete('1.0', tk.END)
|
||||
result.insert('1.0', "Выберите вариант значения показателя.")
|
||||
return
|
||||
text, cat = _calc_criterion_other(self.model, isys, num, choice=choice)
|
||||
else:
|
||||
val = _num(e_value.get())
|
||||
if val is None:
|
||||
result.delete('1.0', tk.END)
|
||||
result.insert('1.0', "Введите числовое значение показателя.")
|
||||
return
|
||||
text, cat = _calc_criterion_other(self.model, isys, num, value=val)
|
||||
lines.append(text)
|
||||
if cat:
|
||||
lines.append(f"Категория значимости: {cat} (по порогам ПП-127)")
|
||||
else:
|
||||
lines.append("Категория значимости: — (значение ниже порога III)")
|
||||
elif num == '10' or str(num).startswith('10.'):
|
||||
from .variables import _criterion_10_cat
|
||||
if str(num) == '10':
|
||||
ops = _num(e_ops.get())
|
||||
@@ -2591,9 +2660,12 @@ class DokoGenApp:
|
||||
combo.pack(side=tk.RIGHT, padx=6)
|
||||
_combos[num] = combo
|
||||
|
||||
# Кнопка «🧮» — авторасчёт показателя (п. 8 «ущерб субъекту КИИ»,
|
||||
# п. 9 «ущерб бюджетам», п. 10 «прекращение финансовых операций»)
|
||||
if grp_num in ('8', '9', '10'):
|
||||
# Кнопка «🧮» — авторасчёт показателя:
|
||||
# 8/9/10 — экономические формулы; остальные (1–7, 11–14) — по порогам ПП-127
|
||||
from .variables import (CRITERION_QUANT_THRESHOLDS, CRITERION_CHOICE_INDICATORS)
|
||||
if (grp_num in ('8', '9', '10')
|
||||
or num in CRITERION_QUANT_THRESHOLDS
|
||||
or num in CRITERION_CHOICE_INDICATORS):
|
||||
ttk.Button(row, text='🧮', width=3,
|
||||
command=lambda n=num, nm=name, v=var, c=combo:
|
||||
_open_calc_dialog(n, nm, v, c)
|
||||
|
||||
Reference in New Issue
Block a user