diff --git a/dokogen/models.py b/dokogen/models.py index 7a76111..9c94f17 100644 --- a/dokogen/models.py +++ b/dokogen/models.py @@ -129,6 +129,15 @@ class Company: profit: 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) information_systems: List[InformationSystem] = field(default_factory=list) diff --git a/dokogen/ui.py b/dokogen/ui.py index ab2e98a..2095872 100644 --- a/dokogen/ui.py +++ b/dokogen/ui.py @@ -339,6 +339,24 @@ class DokoGenApp: entry = ttk.Entry(f_fin, width=50) entry.grid(row=i, column=1, padx=10, sticky=tk.EW, pady=1) 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) # --- Правая панель: проверка данных --- @@ -2497,8 +2515,15 @@ class DokoGenApp: return e e_profit = e_tax = None - e_dincome = _row("Снижение уровня доходов ΔДоходов (руб., наихудший сценарий):", 'dincome', '') - e_budget = _row("Объём доходов субъекта КИИ, усреднённый за 5 лет Дусредн (руб.):", 'budget', '') + # Доходы за 5 лет — из данных организации (поля «Доходы за 5 лет») + _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.pack(fill=tk.BOTH, expand=True, pady=(8, 0)) @@ -2512,9 +2537,9 @@ class DokoGenApp: result.insert('1.0', "Заполните оба поля (ΔДоходов и Дусредн).") return val = d / b * 100 - lines.append(f"Снижение уровня доходов ΔДоходов: {d:,.0f} руб.") - lines.append(f"Объём доходов, усреднённый за 5 лет (Дусредн): {b:,.0f} руб.") - lines.append(f"№8 = ΔДоходов / Дусредн × 100% = {d:,.0f} / {b:,.0f} × 100 = {val:.2f} %") + lines.append(f"Суммарный экономический ущерб от нарушения критических процессов: {d:,.0f} руб.") + lines.append(f"Доходы субъекта КИИ, усреднённые за 5 лет: {b:,.0f} руб.") + lines.append(f"№8 = ущерб / доходы за 5 лет × 100% = {d:,.0f} / {b:,.0f} × 100 = {val:.2f} %") if val > 20: cat = 'I' elif val > 10: @@ -3564,6 +3589,28 @@ class DokoGenApp: entry.delete(0, tk.END) 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'): self.model.security_department = data['ispdnDepartment'] diff --git a/dokogen/variables.py b/dokogen/variables.py index 7322e9c..4dd640f 100644 --- a/dokogen/variables.py +++ b/dokogen/variables.py @@ -61,6 +61,12 @@ VARIABLE_DEFS = [ ('{{company_okved_extra}}', 'A', 'Дополнительные ОКВЭД', 'company:okved_extra'), ('{{company_profit}}', 'A', 'Сумма прибыли за предыдущий год (руб.)', 'company:profit'), ('{{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'),