feat: финансовые показатели организации + балансовая стоимость объекта
- модели: Company.profit (сумма прибыли), Company.profit_tax (налог с прибыли),
InformationSystem.balance_value (балансовая стоимость объекта КИИ)
- импорт из опросника: «Сумма прибыли за предыдущий год» и «Сумма налога с прибыли»
(Общие сведения) → profit/profitTax; «Балансовая стоимость объекта КИИ в рублях»
(каждый ОБЪЕКТ-лист) → balanceValue, больше не падает в описание
- UI: блок «Финансовые показатели» во вкладке «Организация»; поле
«Балансовая стоимость (руб.)» в объекте КИИ; маппинги collect/select/copy/import
- генератор: {{company_profit}}, {{company_profit_tax}}, {{item.balance_value}}
This commit is contained in:
+5
-1
@@ -554,7 +554,11 @@ def _import_187_is_list(wb, data, settings, log_fn):
|
|||||||
if matched:
|
if matched:
|
||||||
continue
|
continue
|
||||||
if val_b and 'выбрать' not in field_lower and field_lower not in ('значение', 'примечание'):
|
if val_b and 'выбрать' not in field_lower and field_lower not in ('значение', 'примечание'):
|
||||||
# Остальные заполненные поля — в описание (адрес, балансовая стоимость и т.д.)
|
# Балансовая стоимость объекта КИИ — в отдельное поле
|
||||||
|
if 'балансовая стоимость' in field_lower or 'стоимость объекта' in field_lower:
|
||||||
|
is_obj['balanceValue'] = val_b
|
||||||
|
continue
|
||||||
|
# Остальные заполненные поля — в описание (адрес и т.д.)
|
||||||
if not is_obj['description']:
|
if not is_obj['description']:
|
||||||
is_obj['description'] = f"{field}: {val_b}"
|
is_obj['description'] = f"{field}: {val_b}"
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -66,6 +66,9 @@ class InformationSystem:
|
|||||||
os_sw: str = "" # Общесистемное ПО (ОС, средства виртуализации)
|
os_sw: str = "" # Общесистемное ПО (ОС, средства виртуализации)
|
||||||
app_sw: str = "" # Прикладные программы
|
app_sw: str = "" # Прикладные программы
|
||||||
|
|
||||||
|
# Балансовая стоимость объекта КИИ (опросник)
|
||||||
|
balance_value: str = "" # Балансовая стоимость объекта КИИ в рублях
|
||||||
|
|
||||||
# Безопасность (236 приказ)
|
# Безопасность (236 приказ)
|
||||||
attacker_category: str = "" # Категория нарушителя (внешний/внутренний)
|
attacker_category: str = "" # Категория нарушителя (внешний/внутренний)
|
||||||
threats: str = "" # Основные угрозы безопасности информации (\n — разделитель)
|
threats: str = "" # Основные угрозы безопасности информации (\n — разделитель)
|
||||||
@@ -120,6 +123,10 @@ class Company:
|
|||||||
contract_number: str = ""
|
contract_number: str = ""
|
||||||
contract_date: str = ""
|
contract_date: str = ""
|
||||||
|
|
||||||
|
# Финансовые показатели организации (опросник)
|
||||||
|
profit: str = "" # Сумма прибыли за предыдущий год
|
||||||
|
profit_tax: str = "" # Сумма налога с прибыли за предыдущий год
|
||||||
|
|
||||||
# Списки
|
# Списки
|
||||||
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)
|
||||||
|
|||||||
@@ -326,6 +326,20 @@ class DokoGenApp:
|
|||||||
ttk.Entry(f4, textvariable=self.doc_date_var, width=25).grid(
|
ttk.Entry(f4, textvariable=self.doc_date_var, width=25).grid(
|
||||||
row=1, column=1, padx=10, sticky=tk.W)
|
row=1, column=1, padx=10, sticky=tk.W)
|
||||||
|
|
||||||
|
# --- Финансовые показатели (опросник) ---
|
||||||
|
f_fin = ttk.LabelFrame(left, text="Финансовые показатели", padding=10)
|
||||||
|
f_fin.pack(fill=tk.X, pady=5)
|
||||||
|
fin_fields = [
|
||||||
|
("Сумма прибыли за предыдущий год (руб.):", "profit"),
|
||||||
|
("Сумма налога с прибыли (руб.):", "profit_tax"),
|
||||||
|
]
|
||||||
|
for i, (label, key) in enumerate(fin_fields):
|
||||||
|
ttk.Label(f_fin, text=label).grid(row=i, column=0, sticky=tk.W, pady=2)
|
||||||
|
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
|
||||||
|
f_fin.columnconfigure(1, weight=1)
|
||||||
|
|
||||||
# --- Правая панель: проверка данных ---
|
# --- Правая панель: проверка данных ---
|
||||||
right = ttk.LabelFrame(main, text="Проверка данных", padding=10)
|
right = ttk.LabelFrame(main, text="Проверка данных", padding=10)
|
||||||
right.pack(side=tk.RIGHT, fill=tk.Y, padx=(10, 0))
|
right.pack(side=tk.RIGHT, fill=tk.Y, padx=(10, 0))
|
||||||
@@ -776,6 +790,11 @@ class DokoGenApp:
|
|||||||
ttk.Radiobutton(cat_frame, text=val, variable=self.is_category_var,
|
ttk.Radiobutton(cat_frame, text=val, variable=self.is_category_var,
|
||||||
value=val).pack(side=tk.LEFT, padx=3)
|
value=val).pack(side=tk.LEFT, padx=3)
|
||||||
|
|
||||||
|
ttk.Label(fields_frame, text="Балансовая стоимость (руб.):").grid(
|
||||||
|
row=3, column=0, sticky=tk.W, pady=2)
|
||||||
|
self.is_balance_entry = ttk.Entry(fields_frame, width=60)
|
||||||
|
self.is_balance_entry.grid(row=3, column=1, padx=10, sticky=tk.EW, pady=2)
|
||||||
|
|
||||||
fields_frame.columnconfigure(1, weight=1)
|
fields_frame.columnconfigure(1, weight=1)
|
||||||
|
|
||||||
# ---- Вложенные вкладки ----
|
# ---- Вложенные вкладки ----
|
||||||
@@ -1282,6 +1301,8 @@ class DokoGenApp:
|
|||||||
if hasattr(self, 'is_software_entry'):
|
if hasattr(self, 'is_software_entry'):
|
||||||
isys.software = self.is_software_entry.get().strip()
|
isys.software = self.is_software_entry.get().strip()
|
||||||
isys.category = self.is_category_var.get()
|
isys.category = self.is_category_var.get()
|
||||||
|
if hasattr(self, 'is_balance_entry'):
|
||||||
|
isys.balance_value = self.is_balance_entry.get().strip()
|
||||||
# Поля 236 приказа
|
# Поля 236 приказа
|
||||||
for attr, model_field in [
|
for attr, model_field in [
|
||||||
('is_purpose_entry', 'purpose'),
|
('is_purpose_entry', 'purpose'),
|
||||||
@@ -1515,6 +1536,9 @@ class DokoGenApp:
|
|||||||
self.is_software_entry.delete(0, tk.END)
|
self.is_software_entry.delete(0, tk.END)
|
||||||
self.is_software_entry.insert(0, isys.software or "")
|
self.is_software_entry.insert(0, isys.software or "")
|
||||||
self.is_category_var.set(isys.category or "без категории")
|
self.is_category_var.set(isys.category or "без категории")
|
||||||
|
if hasattr(self, 'is_balance_entry'):
|
||||||
|
self.is_balance_entry.delete(0, tk.END)
|
||||||
|
self.is_balance_entry.insert(0, isys.balance_value or "")
|
||||||
|
|
||||||
# Поля 236 приказа
|
# Поля 236 приказа
|
||||||
for attr, model_field in [
|
for attr, model_field in [
|
||||||
@@ -1610,6 +1634,7 @@ class DokoGenApp:
|
|||||||
hw_sw=src.hw_sw,
|
hw_sw=src.hw_sw,
|
||||||
os_sw=src.os_sw,
|
os_sw=src.os_sw,
|
||||||
app_sw=src.app_sw,
|
app_sw=src.app_sw,
|
||||||
|
balance_value=src.balance_value,
|
||||||
attacker_category=src.attacker_category,
|
attacker_category=src.attacker_category,
|
||||||
threats=src.threats,
|
threats=src.threats,
|
||||||
incidents=src.incidents,
|
incidents=src.incidents,
|
||||||
@@ -2694,6 +2719,13 @@ class DokoGenApp:
|
|||||||
if data.get('contractDate'):
|
if data.get('contractDate'):
|
||||||
self.doc_date_var.set(data['contractDate'])
|
self.doc_date_var.set(data['contractDate'])
|
||||||
|
|
||||||
|
# Финансовые показатели (прибыль, налог)
|
||||||
|
for entry_key, data_keys in [('profit', 'profit'), ('profit_tax', 'profitTax')]:
|
||||||
|
entry = self._company_entries.get(entry_key)
|
||||||
|
if entry and data.get(data_keys):
|
||||||
|
entry.delete(0, tk.END)
|
||||||
|
entry.insert(0, data[data_keys])
|
||||||
|
|
||||||
# Наименование структурного подразделения по безопасности
|
# Наименование структурного подразделения по безопасности
|
||||||
if data.get('ispdnDepartment'):
|
if data.get('ispdnDepartment'):
|
||||||
self.model.security_department = data['ispdnDepartment']
|
self.model.security_department = data['ispdnDepartment']
|
||||||
@@ -2767,6 +2799,7 @@ class DokoGenApp:
|
|||||||
hw_sw=is_data.get('hw_sw', ''),
|
hw_sw=is_data.get('hw_sw', ''),
|
||||||
os_sw=is_data.get('os_sw', ''),
|
os_sw=is_data.get('os_sw', ''),
|
||||||
app_sw=is_data.get('app_sw', ''),
|
app_sw=is_data.get('app_sw', ''),
|
||||||
|
balance_value=is_data.get('balanceValue', is_data.get('balance_value', '')),
|
||||||
attacker_category=is_data.get('attacker_category', ''),
|
attacker_category=is_data.get('attacker_category', ''),
|
||||||
threats=is_data.get('threats', ''),
|
threats=is_data.get('threats', ''),
|
||||||
incidents=is_data.get('incidents', ''),
|
incidents=is_data.get('incidents', ''),
|
||||||
|
|||||||
@@ -59,6 +59,8 @@ VARIABLE_DEFS = [
|
|||||||
('{{security_department}}', 'A', 'Наименование структурного подразделения по безопасности', 'company:security_department'),
|
('{{security_department}}', 'A', 'Наименование структурного подразделения по безопасности', 'company:security_department'),
|
||||||
('{{company_okved}}', 'A', 'Основной ОКВЭД', 'company:okved'),
|
('{{company_okved}}', 'A', 'Основной ОКВЭД', 'company:okved'),
|
||||||
('{{company_okved_extra}}', 'A', 'Дополнительные ОКВЭД', 'company:okved_extra'),
|
('{{company_okved_extra}}', 'A', 'Дополнительные ОКВЭД', 'company:okved_extra'),
|
||||||
|
('{{company_profit}}', 'A', 'Сумма прибыли за предыдущий год (руб.)', 'company:profit'),
|
||||||
|
('{{company_profit_tax}}', 'A', 'Сумма налога с прибыли (руб.)', 'company:profit_tax'),
|
||||||
|
|
||||||
# === Комиссия ===
|
# === Комиссия ===
|
||||||
('{{commission_list}}', 'A', 'Список комиссии', 'commission_list'),
|
('{{commission_list}}', 'A', 'Список комиссии', 'commission_list'),
|
||||||
@@ -323,6 +325,7 @@ def _build_loop_data(company: Company, is_list: List) -> Dict[str, List[Dict]]:
|
|||||||
'hw_sw': getattr(isys, 'hw_sw', '') or '—',
|
'hw_sw': getattr(isys, 'hw_sw', '') or '—',
|
||||||
'os_sw': getattr(isys, 'os_sw', '') or '—',
|
'os_sw': getattr(isys, 'os_sw', '') or '—',
|
||||||
'app_sw': getattr(isys, 'app_sw', '') or '—',
|
'app_sw': getattr(isys, 'app_sw', '') or '—',
|
||||||
|
'balance_value': getattr(isys, 'balance_value', '') or '—',
|
||||||
'attacker_category': getattr(isys, 'attacker_category', '') or '—',
|
'attacker_category': getattr(isys, 'attacker_category', '') or '—',
|
||||||
'threats': getattr(isys, 'threats', '') or '—',
|
'threats': getattr(isys, 'threats', '') or '—',
|
||||||
'incidents': getattr(isys, 'incidents', '') or '—',
|
'incidents': getattr(isys, 'incidents', '') or '—',
|
||||||
|
|||||||
Reference in New Issue
Block a user