fix: аудит dokogen187 — критические и высокие замечания

- api_settings: убраны реальные API-ключи из кода (env/файл) — 1.1
- verify: промт ИИ для проверки реквизитов больше не ссылается на 187-ФЗ
  как на закон о ПДн («юрист по ПДн (187-ФЗ)» → специалист по реквизитам)
- ui: дата ПП РФ №127 исправлена 08.02.2019 → 08.02.2018 (3 места)
- help_docs: группа B переименована «187-ФЗ (персональные данные)» →
  «187-ФЗ (критическая информационная инфраструктура)»
- generator: убран дубль хвоста параграфа в _highlight_unmatched
- importer: «магия дат» (числа 10001-79999 → дата Excel) теперь только
  для полей-дат (as_date), финансовые поля не ломаются
- ui (_collect_is): убраны дубли пар маппинга attacker_level/attacker_types
- ui (импорт): убрано наследие 152-ФЗ ispdnPosition/ispdnFio из маппинга
- test_generator: переписан под модель 187-ФЗ (category/sphere/object_type
  вместо pd_count/threat_type/defence_level)
- criteria_justifications: п.9 для здравоохранения согласован с кодом
  (убран «критерий неприменим» — противоречие с «применим ко всем»)
- criteria_applicability: Транспорт (добавлены п.1, п.2; убран п.10),
  Банковская сфера (добавлены п.8, п.9) — требуется экспертная сверка
- ui: Бусредн вынесен в константу DEFAULT_BUDGET_AVG (данные Минфина,
  обновлять ежегодно); автозаполнение п.9 унифицировано с авторасчётом
  (ΔБ = ΔНП+ΔНДПИ+ΔДИВ+ΔВСО+ΔНС)
- ui: п.8 — предупреждение при неполных данных (менее 5 лет доходов)
- models: поля ndpi/div/vso/ns для п.9; комментарий income_loss уточнён
- .gitignore: api_settings.json/.env не попадают в git
This commit is contained in:
LocoAgent
2026-08-05 09:16:16 +04:00
parent 868e0065f3
commit 5af23ae525
11 changed files with 107 additions and 68 deletions
+12 -5
View File
@@ -97,13 +97,18 @@ def normalize_address(text: str) -> str:
return ''.join(out)
def clean_value(val):
"""Очистка и нормализация значения ячейки Excel."""
def clean_value(val, as_date=False):
"""Очистка и нормализация значения ячейки Excel.
as_date=True — конвертировать серийный номер Excel в дату (только для
полей-дат, напр. ogrnDate). Для финансовых полей НЕ вызывается,
иначе число 50 000 руб. превратится в «дату» (см. аудит importer.py:105-109).
"""
if val is None:
return ''
if isinstance(val, (int, float)):
# Попытка распознать дату (серийный номер Excel)
if 10000 < val < 80000:
# Попытка распознать дату (серийный номер Excel) — только для полей-дат
if as_date and 10000 < val < 80000:
serial = int(val)
if serial > 60:
serial -= 1
@@ -253,7 +258,7 @@ def _import_187_common(wb, data, settings, log_fn):
if sn.lower() == sheet_part.lower():
target_ws = wb[sn]
break
val = clean_value(cell_value(target_ws, coord))
val = clean_value(cell_value(target_ws, coord), as_date=('дата' in name.lower() or 'date' in key.lower()))
if val:
if key in ('chiefFio', 'responsibleFio', 'ispdnFio', 'adminFio'):
val = _extract_single_fio(val)
@@ -273,6 +278,8 @@ def _import_187_common(wb, data, settings, log_fn):
if val:
if key in ('chiefFio', 'responsibleFio', 'ispdnFio', 'adminFio'):
val = _extract_single_fio(val)
elif 'дата' in name.lower() or 'date' in key.lower():
val = clean_value(val, as_date=True)
data[key] = val
log_fn(f" {name} [по ключу]: {val}")
break