arm-core/api/src/domain/aliases.py
Andrey Epifancev 7007c51f63 feat(directories): алиасы ЮЛ с нормализацией §3
normalize_alias (lower, ё→е, без пунктуации и ОПФ), POST/DELETE
/directories/legal-entities/{id}/aliases, конфликты ALIAS_EXISTS /
ALIAS_TAKEN (с legal_entity_id владельца), EMPTY_ALIAS, аудит
LEGAL_ENTITY_CHANGE по legal_entity_alias.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-04 21:52:47 +04:00

42 lines
1.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Нормализация алиаса ЮЛ (§3 п. 4, ANL-028): ключ сопоставления контрагента из ОСВ с ЮЛ по тексту названия.
Чистая функция без обращения к БД; одно и то же название в разных написаниях (`ООО «Пекарня»`, `Пекарня, ООО`)
даёт один и тот же `normalized_alias`.
"""
import re
# Одиночные токены ОПФ (§3 п. 4: «ООО, АО, ПАО, ИП…»); убираются только целиком — «ооо» внутри слова не трогается.
LEGAL_FORMS: frozenset[str] = frozenset(
{
"ооо",
"ао",
"пао",
"зао",
"оао",
"нао",
"ип",
"гуп",
"муп",
"фгуп",
"ано",
"тсж",
"кфх",
"пк",
"спк",
"сх",
"сха",
}
)
_PUNCT_RE = re.compile(r"[^\w\s]", re.UNICODE) # кавычки «»"'„“ и прочая пунктуация → пробел
def normalize_alias(raw: str) -> str:
"""§3: lower → ё→е → пунктуация и кавычки → пробел → убрать токены ОПФ → схлопнуть пробелы → strip.
Строка из одних ОПФ и пунктуации нормализуется в `""` — вызывающий отвергает такой алиас.
"""
text = _PUNCT_RE.sub(" ", raw.lower().replace("ё", "е"))
return " ".join(token for token in text.split() if token not in LEGAL_FORMS)