Files
mostovik-backend/src/apps/parsers/clients/checko/datasets/okved.py
Aleksandr Meshchriakov ea473f0f2d
Some checks failed
CI/CD Pipeline / Build & Push Images (push) Has been cancelled
CI/CD Pipeline / Code Quality Checks (push) Has been cancelled
CI/CD Pipeline / Run Tests (push) Has been cancelled
Исправлены падения тестов и Telegram-уведомления CI
- Исправлен импорт core.celery в тестах health-check вместо устаревшего config.celery

- Добавлен fallback для Checko datasets при отсутствии JSON-файлов в CI

- Обновлен BaseDataset: загрузка встроенных данных при missing JSON

- Прокинуты TG_BOT_KEY/TG_CHANNEL из secrets в jobs lint/test/build_push
2026-02-18 13:36:47 +01:00

153 lines
4.5 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.
"""
ОКВЭД-2 (ОК 029-2014) - Общероссийский классификатор видов экономической деятельности.
Использование:
from apps.parsers.clients.checko.datasets import OKVED2
# Получить название по коду
name = OKVED2.get_name("62.01")
# Получить полный объект
item = OKVED2.get("62.01")
# Поиск по названию
items = OKVED2.search("программное")
# Получить все коды раздела
section_j = OKVED2.get_section("J")
# Получить дочерние коды
children = OKVED2.get_children("62")
"""
from dataclasses import dataclass
from typing import ClassVar
from apps.parsers.clients.checko.datasets.base import BaseDataset
@dataclass(frozen=True)
class OkvedItem:
"""Элемент справочника ОКВЭД-2."""
code: str
"""Код ОКВЭД (например: '62.01')."""
name: str
"""Наименование вида деятельности."""
section: str | None = None
"""Раздел классификатора (A-U)."""
parent_code: str | None = None
"""Код родительского элемента."""
comment: str | None = None
"""Пояснения к коду."""
class OKVED2(BaseDataset[OkvedItem]):
"""
Справочник ОКВЭД-2 (виды экономической деятельности).
Данные: ОК 029-2014 (КДЕС Ред. 2).
"""
_data: ClassVar[dict[str, OkvedItem] | None] = None
_json_filename: ClassVar[str] = "okved_2.json"
_builtin_raw_data: ClassVar[list[dict]] = [
{
"code": "J",
"name": "Деятельность в области информации и связи",
"section": "J",
"parent_code": None,
},
{
"code": "62",
"name": "Разработка компьютерного программного обеспечения",
"section": "J",
"parent_code": "J",
},
{
"code": "62.01",
"name": "Разработка компьютерного программного обеспечения",
"section": "J",
"parent_code": "62",
},
]
@classmethod
def _parse_item(cls, raw: dict) -> OkvedItem:
return OkvedItem(
code=raw.get("code", ""),
name=raw.get("name", ""),
section=raw.get("section"),
parent_code=raw.get("parent_code"),
comment=raw.get("comment"),
)
@classmethod
def get_section(cls, section: str) -> list[OkvedItem]:
"""
Получить все коды раздела.
Args:
section: Код раздела (A-U).
Returns:
Список элементов раздела.
"""
cls._ensure_loaded()
return [i for i in cls._data.values() if i.section == section.upper()]
@classmethod
def get_children(cls, code: str) -> list[OkvedItem]:
"""
Получить дочерние коды.
Args:
code: Родительский код ОКВЭД.
Returns:
Список дочерних элементов.
"""
cls._ensure_loaded()
return [i for i in cls._data.values() if i.parent_code == code]
@classmethod
def get_parent(cls, code: str) -> OkvedItem | None:
"""
Получить родительский элемент.
Args:
code: Код ОКВЭД.
Returns:
Родительский элемент или None.
"""
item = cls.get(code)
if item and item.parent_code:
return cls.get(item.parent_code)
return None
@classmethod
def get_hierarchy(cls, code: str) -> list[OkvedItem]:
"""
Получить иерархию от корня до указанного кода.
Args:
code: Код ОКВЭД.
Returns:
Список от корневого раздела до указанного кода.
"""
result = []
current = cls.get(code)
while current:
result.insert(0, current)
if current.parent_code:
current = cls.get(current.parent_code)
else:
break
return result