feat(parsers): добавлен API клиент для checko.ru

- Реализован CheckoClient с поддержкой всех 10 эндпоинтов API v2
- Frozen dataclass модели для запросов и ответов
- Справочники ОКВЭД2, ОКФС, ОКОПФ, ОКПД, статусы компаний
- Маппинг русских полей API на английские имена
- Unit тесты с моками
- E2E тесты с реальными запросами
- Настройка CHECKO_API_KEY в settings.py
This commit is contained in:
2026-02-03 17:00:19 +01:00
parent 5c88c6466d
commit c36c7b9ba9
22 changed files with 5943 additions and 4 deletions

View File

@@ -0,0 +1,91 @@
"""
Коды строк финансовой (бухгалтерской) отчетности.
Используются для расшифровки данных из /finances эндпоинта.
Использование:
from apps.parsers.clients.checko.datasets import AccountCodes
# Получить название строки по коду
name = AccountCodes.get_name("1100") # -> "Итого внеоборотных активов"
# Получить полный объект
item = AccountCodes.get("2110")
# Поиск по названию
items = AccountCodes.search("прибыль")
"""
from dataclasses import dataclass
from typing import ClassVar
from apps.parsers.clients.checko.datasets.base import BaseDataset
@dataclass(frozen=True)
class AccountCodeItem:
"""Элемент справочника кодов строк отчетности."""
code: str
"""Код строки (например: '1100', '2110')."""
name: str
"""Наименование строки."""
class AccountCodes(BaseDataset[AccountCodeItem]):
"""
Справочник кодов строк финансовой отчетности.
Коды соответствуют:
- Форма №1 (Бухгалтерский баланс): 1100-1700
- Форма №2 (Отчет о финансовых результатах): 2100-2500
- Форма №3 (Отчет об изменениях капитала): 3100-3600
- Форма №4 (Отчет о движении денежных средств): 4100-4500
- Форма №6 (Отчет о целевом использовании средств): 6100-6400
"""
_data: ClassVar[dict[str, AccountCodeItem] | None] = None
_json_filename: ClassVar[str] = "account_codes.json"
@classmethod
def _parse_item(cls, raw: dict) -> AccountCodeItem:
return AccountCodeItem(
code=raw.get("code", ""),
name=raw.get("name", ""),
)
@classmethod
def get_form_codes(cls, form_number: int) -> list[AccountCodeItem]:
"""
Получить все коды указанной формы отчетности.
Args:
form_number: Номер формы (1, 2, 3, 4 или 6).
Returns:
Список кодов указанной формы.
"""
cls._ensure_loaded()
prefix = str(form_number)
return [i for i in cls._data.values() if i.code.startswith(prefix)]
@classmethod
def get_balance_codes(cls) -> list[AccountCodeItem]:
"""Получить коды Формы №1 (Бухгалтерский баланс)."""
return cls.get_form_codes(1)
@classmethod
def get_profit_loss_codes(cls) -> list[AccountCodeItem]:
"""Получить коды Формы №2 (Отчет о финансовых результатах)."""
return cls.get_form_codes(2)
@classmethod
def get_capital_codes(cls) -> list[AccountCodeItem]:
"""Получить коды Формы №3 (Отчет об изменениях капитала)."""
return cls.get_form_codes(3)
@classmethod
def get_cash_flow_codes(cls) -> list[AccountCodeItem]:
"""Получить коды Формы №4 (Отчет о движении денежных средств)."""
return cls.get_form_codes(4)