feat: ОПК показатели 8/9/13 + блокировка неприменимых с разблокировкой
- criteria_applicability.json: ОПК — применимы 8 (ущерб субъекту КИИ),
9 (ущерб бюджету), 13 (гособоронзаказ) — обязательные для ОПК
- окно ПП 127: неприменимые для сферы показатели автоматически
выбирают «не применим» и блокируются (серым), НО у каждого есть
кнопка «🔓» — разблокировать конкретный показатель, если оператор
считает его применимым (вернётся выбор категории)
- «не применим» сохраняется в список показателей и обоснование,
не влияет на категорию
This commit is contained in:
@@ -94,6 +94,8 @@
|
|||||||
"14"
|
"14"
|
||||||
],
|
],
|
||||||
"Оборонная промышленность": [
|
"Оборонная промышленность": [
|
||||||
|
"8",
|
||||||
|
"9",
|
||||||
"13"
|
"13"
|
||||||
],
|
],
|
||||||
"Ракетно-космическая промышленность": [
|
"Ракетно-космическая промышленность": [
|
||||||
|
|||||||
+30
-8
@@ -1868,6 +1868,18 @@ class DokoGenApp:
|
|||||||
return _just[m.group(1)]
|
return _just[m.group(1)]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def _unlock(combo, var, lbl_num, lbl_name, name, btn=None):
|
||||||
|
"""Разблокировать конкретный показатель: вернуть выбор категории."""
|
||||||
|
try:
|
||||||
|
combo.config(state='readonly')
|
||||||
|
var.set('')
|
||||||
|
lbl_num.config(foreground='black')
|
||||||
|
lbl_name.config(foreground='black', text=name)
|
||||||
|
if btn is not None:
|
||||||
|
btn.destroy()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
dialog = tk.Toplevel(self.root)
|
dialog = tk.Toplevel(self.root)
|
||||||
dialog.title("Показатели критериев значимости (ПП РФ № 127)")
|
dialog.title("Показатели критериев значимости (ПП РФ № 127)")
|
||||||
dialog.geometry("980x700")
|
dialog.geometry("980x700")
|
||||||
@@ -1896,7 +1908,9 @@ class DokoGenApp:
|
|||||||
if applicable is not None:
|
if applicable is not None:
|
||||||
_sphere_txt = self.is_sphere_combo.get() if hasattr(self, 'is_sphere_combo') else ''
|
_sphere_txt = self.is_sphere_combo.get() if hasattr(self, 'is_sphere_combo') else ''
|
||||||
ttk.Label(body, text=f"Сфера объекта: «{_sphere_txt}». Показатели, не применимые для этой сферы "
|
ttk.Label(body, text=f"Сфера объекта: «{_sphere_txt}». Показатели, не применимые для этой сферы "
|
||||||
f"(по Распоряжению ПРФ № 360-р), отмечены серым и исключены из расчёта.",
|
f"(по Распоряжению ПРФ № 360-р), автоматически помечены «не применим» и "
|
||||||
|
f"заблокированы. Кнопка «🔓» разблокирует конкретный показатель, если оператор "
|
||||||
|
f"считает его применимым.",
|
||||||
foreground='#1a6e1a', wraplength=920, justify=tk.LEFT).pack(anchor=tk.W, pady=(0, 8))
|
foreground='#1a6e1a', wraplength=920, justify=tk.LEFT).pack(anchor=tk.W, pady=(0, 8))
|
||||||
|
|
||||||
rows = [] # (num, name, values{III:..,II:..,I:..}, var, applicable)
|
rows = [] # (num, name, values{III:..,II:..,I:..}, var, applicable)
|
||||||
@@ -1948,13 +1962,23 @@ class DokoGenApp:
|
|||||||
combo.bind('<<ComboboxSelected>>', _on_pick)
|
combo.bind('<<ComboboxSelected>>', _on_pick)
|
||||||
|
|
||||||
if not applicable_here:
|
if not applicable_here:
|
||||||
# Показатель не применим для сферы объекта — блокируем
|
# Показатель не применим для сферы объекта:
|
||||||
|
# автоматически выбираем «не применим» и блокируем,
|
||||||
|
# но даём кнопку «🔓» для разблокировки конкретного показателя
|
||||||
|
var.set('не применим')
|
||||||
combo.config(state='disabled')
|
combo.config(state='disabled')
|
||||||
lbl_num.config(foreground='gray')
|
lbl_num.config(foreground='gray')
|
||||||
lbl_name.config(foreground='gray')
|
lbl_name.config(foreground='gray')
|
||||||
if hasattr(lbl_name, 'config'):
|
|
||||||
pass
|
|
||||||
lbl_name.config(text=name + ' (не применим для сферы)')
|
lbl_name.config(text=name + ' (не применим для сферы)')
|
||||||
|
btn_unlock = ttk.Button(row, text='🔓', width=3,
|
||||||
|
command=lambda c=combo, v=var,
|
||||||
|
ln=lbl_num, lname=lbl_name,
|
||||||
|
b=None, nm=name: _unlock(c, v, ln, lname, nm))
|
||||||
|
btn_unlock.pack(side=tk.RIGHT, padx=(2, 0))
|
||||||
|
# ссылка на кнопку для возможного удаления — храним в замыкании
|
||||||
|
btn_unlock.config(command=lambda c=combo, v=var, ln=lbl_num,
|
||||||
|
lname=lbl_name, b=btn_unlock, nm=name:
|
||||||
|
_unlock(c, v, ln, lname, nm, b))
|
||||||
rows.append((num, name, values, var, applicable_here))
|
rows.append((num, name, values, var, applicable_here))
|
||||||
|
|
||||||
# Обоснование
|
# Обоснование
|
||||||
@@ -1971,15 +1995,13 @@ class DokoGenApp:
|
|||||||
result_lbl.pack(anchor=tk.W, pady=(6, 0))
|
result_lbl.pack(anchor=tk.W, pady=(6, 0))
|
||||||
|
|
||||||
def _selected():
|
def _selected():
|
||||||
"""Список выбранных: [(num, name, категория, значение)] — только применимые показатели.
|
"""Список выбранных: [(num, name, категория, значение)].
|
||||||
|
|
||||||
«не применим» возвращается как ('—', 'не применим') и не влияет на категорию,
|
«не применим» возвращается как ('—', 'не применим') и не влияет на категорию,
|
||||||
но сохраняется в список показателей.
|
но сохраняется в список показателей и в обоснование.
|
||||||
"""
|
"""
|
||||||
out = []
|
out = []
|
||||||
for num, name, values, var, applicable_here in rows:
|
for num, name, values, var, applicable_here in rows:
|
||||||
if not applicable_here:
|
|
||||||
continue
|
|
||||||
s = var.get().strip()
|
s = var.get().strip()
|
||||||
if not s:
|
if not s:
|
||||||
continue
|
continue
|
||||||
|
|||||||
Reference in New Issue
Block a user