Исходный код tbank.business_cards.models

from __future__ import annotations

from decimal import Decimal
from typing import Annotated, List, Optional

from pydantic import BaseModel, ConfigDict, Field, PlainSerializer
from pydantic.alias_generators import to_camel

from tbank.business_cards.enums import (
    CardBlockReason,
    CardIssueApplicationStatus,
    CardNetwork,
    CardStatus,
    InputLimitPeriod,
    OutputLimitPeriod,
    ReissueStatus,
)
from tbank.core.models import Rubles

# Суммы на запись: Decimal у пользователя, но в JSON уходит числом (T-API ждёт number).
WriteRubles = Annotated[
    Decimal, PlainSerializer(lambda v: float(v), return_type=float, when_used="json")
]


[документация] class BusinessCardModel(BaseModel): """Базовая модель домена: snake_case в Python, camelCase на проводе.""" model_config = ConfigDict( alias_generator=to_camel, populate_by_name=True, extra="ignore", )
# --- Карты ---
[документация] class CardInfo(BusinessCardModel): ucid: int account_number: str card_bin: str card_last_four_digits: str is_active: bool status: CardStatus embossed_name: str
[документация] class CardInfoSeq(BusinessCardModel): """Страница карт (метод `/api/v1/card`).""" offset: int limit: int total_number: int cards: Optional[List[CardInfo]] = None
[документация] class ExpiryDate(BusinessCardModel): year: int month: int
[документация] class VirtualCardRequisites(BusinessCardModel): """Реквизиты виртуальной карты (полный номер, CVC, срок).""" number: str embossed_name: str cvc: str expiry_date: ExpiryDate
[документация] class CompanyCard(BusinessCardModel): ucid: int account_number: str card_bin: str card_last_four_digits: str embossed_name: str is_active: bool is_virtual: bool status: CardStatus
[документация] class CompanyCardsResponse(BusinessCardModel): """Список карт компании (метод `/api/v3/company/card`).""" cards: List[CompanyCard] = Field(default_factory=list) offset: int limit: int total: Optional[int] = None
# --- Заявки на выпуск виртуальной карты ---
[документация] class CreateApplicationRequest(BusinessCardModel): employee_identification_application_id: str account_number: str card_network: CardNetwork
[документация] class CreateApplicationResult(BusinessCardModel): card_issue_application_id: str
[документация] class CardIssueApplicationStatusResult(BusinessCardModel): card_issue_application_id: str status: CardIssueApplicationStatus failed_reason: Optional[str] = None ucid: Optional[int] = None
[документация] class VirtualCardApplication(BusinessCardModel): """Заявка на виртуальную карту (метод `/api/v3/card/virtual/issue/application`).""" card_issue_application_id: str status: CardIssueApplicationStatus ucid: Optional[str] = None
# --- Перевыпуск виртуальной карты ---
[документация] class ReissueRequest(BusinessCardModel): ucid: int
[документация] class ReissueApplication(BusinessCardModel): correlation_id: str
[документация] class ReissuedVirtualCardInfo(BusinessCardModel): old_ucid: int new_ucid: int card_bin: str card_last_four_digits: str
[документация] class ReissueVirtualCardResult(BusinessCardModel): """Результат перевыпуска: `info` заполнен только при `status == READY`.""" status: ReissueStatus info: Optional[ReissuedVirtualCardInfo] = None
# --- Блокировка ---
[документация] class BlockCardRequest(BusinessCardModel): reason: CardBlockReason comment: Optional[str] = None
# --- Лимиты ---
[документация] class SetLimitRequest(BusinessCardModel): """Установка лимита (общий расходный или на наличные).""" limit_value: WriteRubles limit_period: InputLimitPeriod
[документация] class SpendLimit(BusinessCardModel): limit_value: Rubles limit_remain: Rubles limit_period: OutputLimitPeriod
[документация] class CashLimit(BusinessCardModel): limit_value: Rubles limit_remain: Rubles limit_period: OutputLimitPeriod
[документация] class CardLimits(BusinessCardModel): ucid: int spend_limit: SpendLimit cash_limit: CashLimit
# --- Пакетная установка лимитов (v3) ---
[документация] class BatchLimitValue(BusinessCardModel): limit_period: InputLimitPeriod limit_value: int
[документация] class BatchLimitItem(BusinessCardModel): ucid: int spend_limit: Optional[BatchLimitValue] = None cash_limit: Optional[BatchLimitValue] = None
[документация] class SetBatchLimitsRequest(BusinessCardModel): limits: List[BatchLimitItem]
[документация] class BatchLimitResult(BusinessCardModel): is_success: bool error_message: Optional[str] = None
[документация] class BatchLimitResultItem(BusinessCardModel): ucid: int spend_limit: Optional[BatchLimitResult] = None cash_limit: Optional[BatchLimitResult] = None
[документация] class SetBatchLimitsResult(BusinessCardModel): limits: List[BatchLimitResultItem] = Field(default_factory=list)