feat: поля показателя 8 в GUI (доходы за 5 лет + суммарный ущерб)
- models: income_year_1..5 (доход за 5 лет назад ... за прошлый год),
income_loss (суммарный экономический ущерб от нарушения критических
процессов) — понятные названия без ΔДоходов
- вкладка «Организация» → «Финансовые показатели»: 6 новых полей
- авторасчёт п. 8: берёт доходы за 5 лет и ущерб из полей,
считает №8 = ущерб / средний доход за 5 лет × 100% (проверено
на примере методички: 33% → I категория)
- импорт из опросника: incomeYear1..5 / incomeLoss
- переменные шаблонов: {{company_income_year_1..5}},
{{company_income_loss}}
This commit is contained in:
@@ -129,6 +129,15 @@ class Company:
|
|||||||
profit: str = "" # Сумма прибыли за предыдущий год
|
profit: str = "" # Сумма прибыли за предыдущий год
|
||||||
profit_tax: str = "" # Сумма налога с прибыли за предыдущий год
|
profit_tax: str = "" # Сумма налога с прибыли за предыдущий год
|
||||||
|
|
||||||
|
# Показатель 8 (ущерб субъекту КИИ): доходы за 5 лет и суммарный ущерб
|
||||||
|
income_year_1: str = "" # Доход за 5 лет назад (руб.)
|
||||||
|
income_year_2: str = "" # Доход за 4 года назад (руб.)
|
||||||
|
income_year_3: str = "" # Доход за 3 года назад (руб.)
|
||||||
|
income_year_4: str = "" # Доход за 2 года назад (руб.)
|
||||||
|
income_year_5: str = "" # Доход за прошлый год (руб.)
|
||||||
|
income_loss: str = "" # Суммарный экономический ущерб от нарушения
|
||||||
|
# критических процессов (руб.) — ΔДоходов для п. 8
|
||||||
|
|
||||||
# Списки
|
# Списки
|
||||||
commission: List[CommissionMember] = field(default_factory=list)
|
commission: List[CommissionMember] = field(default_factory=list)
|
||||||
information_systems: List[InformationSystem] = field(default_factory=list)
|
information_systems: List[InformationSystem] = field(default_factory=list)
|
||||||
|
|||||||
+52
-5
@@ -339,6 +339,24 @@ class DokoGenApp:
|
|||||||
entry = ttk.Entry(f_fin, width=50)
|
entry = ttk.Entry(f_fin, width=50)
|
||||||
entry.grid(row=i, column=1, padx=10, sticky=tk.EW, pady=1)
|
entry.grid(row=i, column=1, padx=10, sticky=tk.EW, pady=1)
|
||||||
self._company_entries[key] = entry
|
self._company_entries[key] = entry
|
||||||
|
|
||||||
|
# Показатель 8 (ущерб субъекту КИИ): доходы за 5 лет + суммарный ущерб
|
||||||
|
ttk.Label(f_fin, text="Доходы за 5 лет (показатель 8):",
|
||||||
|
font=('', 9, 'bold')).grid(row=len(fin_fields), column=0, columnspan=2,
|
||||||
|
sticky=tk.W, pady=(8, 2))
|
||||||
|
income_fields = [
|
||||||
|
("Доход за 5 лет назад (руб.):", "income_year_1"),
|
||||||
|
("Доход за 4 года назад (руб.):", "income_year_2"),
|
||||||
|
("Доход за 3 года назад (руб.):", "income_year_3"),
|
||||||
|
("Доход за 2 года назад (руб.):", "income_year_4"),
|
||||||
|
("Доход за прошлый год (руб.):", "income_year_5"),
|
||||||
|
("Суммарный экономический ущерб от нарушения критических процессов (руб.):", "income_loss"),
|
||||||
|
]
|
||||||
|
for j, (label, key) in enumerate(income_fields):
|
||||||
|
ttk.Label(f_fin, text=label).grid(row=len(fin_fields) + 1 + j, column=0, sticky=tk.W, pady=2)
|
||||||
|
entry = ttk.Entry(f_fin, width=50)
|
||||||
|
entry.grid(row=len(fin_fields) + 1 + j, column=1, padx=10, sticky=tk.EW, pady=1)
|
||||||
|
self._company_entries[key] = entry
|
||||||
f_fin.columnconfigure(1, weight=1)
|
f_fin.columnconfigure(1, weight=1)
|
||||||
|
|
||||||
# --- Правая панель: проверка данных ---
|
# --- Правая панель: проверка данных ---
|
||||||
@@ -2497,8 +2515,15 @@ class DokoGenApp:
|
|||||||
return e
|
return e
|
||||||
|
|
||||||
e_profit = e_tax = None
|
e_profit = e_tax = None
|
||||||
e_dincome = _row("Снижение уровня доходов ΔДоходов (руб., наихудший сценарий):", 'dincome', '')
|
# Доходы за 5 лет — из данных организации (поля «Доходы за 5 лет»)
|
||||||
e_budget = _row("Объём доходов субъекта КИИ, усреднённый за 5 лет Дусредн (руб.):", 'budget', '')
|
_incs = [_num2(getattr(self.model, f'income_year_{i}', '') or '') for i in range(1, 6)]
|
||||||
|
_incs = [x for x in _incs if x is not None]
|
||||||
|
_d_avg = (sum(_incs) / len(_incs)) if _incs else None
|
||||||
|
_d_loss = _num2(getattr(self.model, 'income_loss', '') or '')
|
||||||
|
e_dincome = _row("Суммарный экономический ущерб от нарушения критических процессов (руб.):",
|
||||||
|
'dincome', f"{_d_loss:,.0f}" if _d_loss else '')
|
||||||
|
e_budget = _row("Доходы субъекта КИИ, усреднённые за 5 лет (руб.):",
|
||||||
|
'budget', f"{_d_avg:,.0f}" if _d_avg else '')
|
||||||
result = tk.Text(frm, height=10, wrap=tk.WORD, state=tk.NORMAL)
|
result = tk.Text(frm, height=10, wrap=tk.WORD, state=tk.NORMAL)
|
||||||
result.pack(fill=tk.BOTH, expand=True, pady=(8, 0))
|
result.pack(fill=tk.BOTH, expand=True, pady=(8, 0))
|
||||||
|
|
||||||
@@ -2512,9 +2537,9 @@ class DokoGenApp:
|
|||||||
result.insert('1.0', "Заполните оба поля (ΔДоходов и Дусредн).")
|
result.insert('1.0', "Заполните оба поля (ΔДоходов и Дусредн).")
|
||||||
return
|
return
|
||||||
val = d / b * 100
|
val = d / b * 100
|
||||||
lines.append(f"Снижение уровня доходов ΔДоходов: {d:,.0f} руб.")
|
lines.append(f"Суммарный экономический ущерб от нарушения критических процессов: {d:,.0f} руб.")
|
||||||
lines.append(f"Объём доходов, усреднённый за 5 лет (Дусредн): {b:,.0f} руб.")
|
lines.append(f"Доходы субъекта КИИ, усреднённые за 5 лет: {b:,.0f} руб.")
|
||||||
lines.append(f"№8 = ΔДоходов / Дусредн × 100% = {d:,.0f} / {b:,.0f} × 100 = {val:.2f} %")
|
lines.append(f"№8 = ущерб / доходы за 5 лет × 100% = {d:,.0f} / {b:,.0f} × 100 = {val:.2f} %")
|
||||||
if val > 20:
|
if val > 20:
|
||||||
cat = 'I'
|
cat = 'I'
|
||||||
elif val > 10:
|
elif val > 10:
|
||||||
@@ -3564,6 +3589,28 @@ class DokoGenApp:
|
|||||||
entry.delete(0, tk.END)
|
entry.delete(0, tk.END)
|
||||||
entry.insert(0, data[data_keys])
|
entry.insert(0, data[data_keys])
|
||||||
|
|
||||||
|
# Показатель 8: доходы за 5 лет + суммарный ущерб от нарушения критических процессов
|
||||||
|
income_map = [
|
||||||
|
('income_year_1', ('incomeYear1', 'income_year_1')),
|
||||||
|
('income_year_2', ('incomeYear2', 'income_year_2')),
|
||||||
|
('income_year_3', ('incomeYear3', 'income_year_3')),
|
||||||
|
('income_year_4', ('incomeYear4', 'income_year_4')),
|
||||||
|
('income_year_5', ('incomeYear5', 'income_year_5')),
|
||||||
|
('income_loss', ('incomeLoss', 'income_loss')),
|
||||||
|
]
|
||||||
|
for entry_key, data_keys in income_map:
|
||||||
|
entry = self._company_entries.get(entry_key)
|
||||||
|
if not entry:
|
||||||
|
continue
|
||||||
|
val = None
|
||||||
|
for dk in data_keys:
|
||||||
|
if data.get(dk):
|
||||||
|
val = data[dk]
|
||||||
|
break
|
||||||
|
if val:
|
||||||
|
entry.delete(0, tk.END)
|
||||||
|
entry.insert(0, val)
|
||||||
|
|
||||||
# Наименование структурного подразделения по безопасности
|
# Наименование структурного подразделения по безопасности
|
||||||
if data.get('ispdnDepartment'):
|
if data.get('ispdnDepartment'):
|
||||||
self.model.security_department = data['ispdnDepartment']
|
self.model.security_department = data['ispdnDepartment']
|
||||||
|
|||||||
@@ -61,6 +61,12 @@ VARIABLE_DEFS = [
|
|||||||
('{{company_okved_extra}}', 'A', 'Дополнительные ОКВЭД', 'company:okved_extra'),
|
('{{company_okved_extra}}', 'A', 'Дополнительные ОКВЭД', 'company:okved_extra'),
|
||||||
('{{company_profit}}', 'A', 'Сумма прибыли за предыдущий год (руб.)', 'company:profit'),
|
('{{company_profit}}', 'A', 'Сумма прибыли за предыдущий год (руб.)', 'company:profit'),
|
||||||
('{{company_profit_tax}}', 'A', 'Сумма налога с прибыли (руб.)', 'company:profit_tax'),
|
('{{company_profit_tax}}', 'A', 'Сумма налога с прибыли (руб.)', 'company:profit_tax'),
|
||||||
|
('{{company_income_year_1}}', 'A', 'Доход за 5 лет назад (руб.) — показатель 8', 'company:income_year_1'),
|
||||||
|
('{{company_income_year_2}}', 'A', 'Доход за 4 года назад (руб.) — показатель 8', 'company:income_year_2'),
|
||||||
|
('{{company_income_year_3}}', 'A', 'Доход за 3 года назад (руб.) — показатель 8', 'company:income_year_3'),
|
||||||
|
('{{company_income_year_4}}', 'A', 'Доход за 2 года назад (руб.) — показатель 8', 'company:income_year_4'),
|
||||||
|
('{{company_income_year_5}}', 'A', 'Доход за прошлый год (руб.) — показатель 8', 'company:income_year_5'),
|
||||||
|
('{{company_income_loss}}', 'A', 'Суммарный экономический ущерб от нарушения критических процессов (руб.) — показатель 8', 'company:income_loss'),
|
||||||
|
|
||||||
# === Комиссия ===
|
# === Комиссия ===
|
||||||
('{{commission_list}}', 'A', 'Список комиссии', 'commission_list'),
|
('{{commission_list}}', 'A', 'Список комиссии', 'commission_list'),
|
||||||
|
|||||||
Reference in New Issue
Block a user