- Исправлен импорт 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
98 lines
3.8 KiB
Python
98 lines
3.8 KiB
Python
"""
|
||
Коды строк финансовой (бухгалтерской) отчетности.
|
||
|
||
Используются для расшифровки данных из /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"
|
||
_builtin_raw_data: ClassVar[list[dict]] = [
|
||
{"code": "1100", "name": "Итого внеоборотных активов"},
|
||
{"code": "2100", "name": "Валовая прибыль (убыток)"},
|
||
{"code": "3100", "name": "Величина капитала"},
|
||
{"code": "4100", "name": "Сальдо денежных потоков от текущих операций"},
|
||
]
|
||
|
||
@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)
|