Тех. меры: только при присвоенной категории и по факту СЗИ (без СЗИ нет «Регистрации и мониторинга»/«Антивируса»); промт СЗИ: при «без категории» — базовый минимум + провести категорирование, переданы характеристики объекта (интернет/ПО/архитектура); показатель 10 и 10.1–10.7: авторасчёт по методичке ФСТЭК (операции за год / дни) и порогам ПП-127
This commit is contained in:
@@ -518,6 +518,84 @@ def _calc_criterion_8_9(company, isys, num):
|
||||
return text, cat
|
||||
|
||||
|
||||
# Пороги показателя 10 и подпоказателей 10.1–10.7 (ПП-127, «Значение показателя»)
|
||||
CRITERION_10_THRESHOLDS = {
|
||||
# num: (категория → (нижняя граница, верхняя граница)), границы «включительно»
|
||||
# Показатель 10 — среднедневное количество операций (млн ед.):
|
||||
# III — менее или равно 70, II — более 70 но менее или равно 120, I — более 120.
|
||||
'10': {'I': (120, None), 'II': (70, 120), 'III': (None, 70)},
|
||||
'10.1': {'I': (10, None), 'II': (1, 10), 'III': (None, 1)}, # трлн руб.
|
||||
'10.2': {'I': (25, None), 'II': (10, 25), 'III': (None, 10)}, # тыс. шт.
|
||||
'10.3': {'I': (2000, None), 'II': (1000, 2000), 'III': (50, 1000)}, # млрд руб.
|
||||
'10.4': {'I': (5000, None), 'II': (1500, 5000), 'III': (100, 1500)}, # млрд руб.
|
||||
'10.5': {'I': (150, None), 'II': (100, 150), 'III': (25, 100)}, # договоров
|
||||
'10.6': {'I': (5000, None), 'II': (1000, 5000), 'III': (100, 1000)}, # млрд руб.
|
||||
'10.7': {'I': (500, None), 'II': (200, 500), 'III': (30, 200)}, # млн ед.
|
||||
}
|
||||
|
||||
|
||||
def _criterion_10_cat(num, value):
|
||||
"""Категория значимости по показателю 10 / 10.x (ПП-127).
|
||||
|
||||
value — численное значение показателя. Возвращает 'I'/'II'/'III' или None.
|
||||
"""
|
||||
thr = CRITERION_10_THRESHOLDS.get(str(num))
|
||||
if not thr or value is None:
|
||||
return None
|
||||
for cat in ('I', 'II', 'III'):
|
||||
lo, hi = thr[cat]
|
||||
if lo is not None and value < lo:
|
||||
continue
|
||||
if hi is not None and value > hi:
|
||||
continue
|
||||
return cat
|
||||
return None
|
||||
|
||||
|
||||
def _calc_criterion_10(company, isys, num):
|
||||
"""Расчёт показателя 10 (прекращение финансовых операций) и подпоказателей 10.1–10.7.
|
||||
|
||||
Показатель 10: среднедневное количество операций = операции за год (млн ед.) / дни.
|
||||
Подпоказатели 10.x: значение показателя (в своих единицах) сравнивается с порогами.
|
||||
Возвращает (текст_обоснования, категория или None).
|
||||
"""
|
||||
num = str(num)
|
||||
if num not in CRITERION_10_THRESHOLDS:
|
||||
return None, None
|
||||
if num == '10':
|
||||
ops = _num(getattr(company, 'ops_count', '') or '')
|
||||
days = _num(getattr(company, 'calendar_days', '') or '')
|
||||
if days is None or days <= 0:
|
||||
days = 365
|
||||
if ops is None:
|
||||
return ("Показатель применим. Для расчёта заполните данные организации: "
|
||||
"«Количество операций за прошедший год (млн ед.)».", None)
|
||||
val = ops / days
|
||||
cat = _criterion_10_cat('10', val)
|
||||
text = (f"Показатель прекращения финансовых операций оценивается среднедневным количеством "
|
||||
f"операций, проведенных клиентами по банковским счетам и (или) без открытия банковского "
|
||||
f"счета. Количество операций за прошедший год: {ops:,.2f} млн ед. Количество календарных "
|
||||
f"дней в году: {days:.0f}. Среднедневное количество операций: {ops:,.2f} / {days:.0f} "
|
||||
f"= {val:.6f} млн ед./день.")
|
||||
else:
|
||||
value = _num(getattr(company, 'criterion10_value', '') or '')
|
||||
if value is None:
|
||||
return (f"Показатель применим. Для расчёта заполните значение показателя "
|
||||
f"«{num}» в данных организации.", None)
|
||||
val = value
|
||||
cat = _criterion_10_cat(num, val)
|
||||
text = (f"Показатель {num} оценивается значением показателя: {val:,.6f} "
|
||||
f"(в единицах, установленных ПП-127).")
|
||||
if cat:
|
||||
text += (f" Согласно Постановлению № 127 полученное значение соответствует "
|
||||
f"{cat}-й категории значимости, по данному показателю объекту присваивается "
|
||||
f"{cat}-я категория значимости.")
|
||||
else:
|
||||
text += (" Значение не достигает порога III категории — по данному показателю "
|
||||
"категория значимости не присваивается.")
|
||||
return text, cat
|
||||
|
||||
|
||||
def _build_org_measures_text(company, isys=None):
|
||||
"""Формирует текст организационных мер из словаря org_measures.json
|
||||
с учётом ответов раздела «Физическая безопасность» опросника.
|
||||
@@ -617,6 +695,14 @@ def _build_categorization_indicators(company, is_list):
|
||||
category = f"{cat}-я категория"
|
||||
else:
|
||||
category = '—'
|
||||
elif grp_num == '10':
|
||||
text, cat = _calc_criterion_10(company, isys, num)
|
||||
if text:
|
||||
value = text
|
||||
if cat:
|
||||
category = f"{cat}-я категория"
|
||||
else:
|
||||
category = '—'
|
||||
else:
|
||||
# Применимый показатель без авторасчёта — оператор заполняет значение
|
||||
value = '—'
|
||||
|
||||
Reference in New Issue
Block a user