Подготовка к релизу

This commit is contained in:
2025-10-30 18:28:26 +03:00
parent 69c0162c6b
commit 4981db90a0
191 changed files with 45557 additions and 3651 deletions
+126
View File
@@ -0,0 +1,126 @@
"""
Модели данных для платежной системы.
"""
from dataclasses import dataclass
from datetime import datetime
from typing import Optional, Dict, Any
from enum import Enum
class PaymentStatus(Enum):
"""Статусы платежа"""
PENDING = "pending"
PROCESSING = "processing"
SUCCEEDED = "succeeded"
FAILED = "failed"
CANCELLED = "cancelled"
REFUNDED = "refunded"
class PaymentProvider(Enum):
"""Платежные провайдеры"""
STRIPE = "stripe"
YOOKASSA = "yookassa"
class TransactionType(Enum):
"""Типы транзакций"""
PAYMENT = "payment"
REFUND = "refund"
CHARGEBACK = "chargeback"
@dataclass
class PaymentIntent:
"""Интент платежа от провайдера"""
id: str
url: str
client_secret: Optional[str] = None
status: str = "pending"
@dataclass
class PaymentEvent:
"""Событие платежа"""
type: str # 'payment.succeeded', 'payment.failed', etc.
payment_id: str
amount: float
currency: str = "RUB"
user_id: Optional[int] = None
metadata: Optional[Dict[str, Any]] = None
timestamp: Optional[datetime] = None
def __post_init__(self):
if self.timestamp is None:
self.timestamp = datetime.now()
@dataclass
class Payment:
"""Модель платежа"""
id: int
user_id: int
amount: float
currency: str
provider: str # PaymentProvider.value
external_id: str # ID платежа у провайдера
status: str # PaymentStatus.value
created_at: datetime
updated_at: datetime
processed_at: Optional[datetime] = None
metadata: Optional[Dict[str, Any]] = None
error_message: Optional[str] = None
def __post_init__(self):
if self.metadata is None:
self.metadata = {}
if isinstance(self.created_at, str):
self.created_at = datetime.fromisoformat(self.created_at.replace('Z', '+00:00'))
if isinstance(self.updated_at, str):
self.updated_at = datetime.fromisoformat(self.updated_at.replace('Z', '+00:00'))
if self.processed_at and isinstance(self.processed_at, str):
self.processed_at = datetime.fromisoformat(self.processed_at.replace('Z', '+00:00'))
@dataclass
class Transaction:
"""Модель транзакции"""
id: int
payment_id: int
type: str # TransactionType.value
amount: float
status: str
created_at: datetime
external_transaction_id: Optional[str] = None
details: Optional[Dict[str, Any]] = None
def __post_init__(self):
if self.details is None:
self.details = {}
if isinstance(self.created_at, str):
self.created_at = datetime.fromisoformat(self.created_at.replace('Z', '+00:00'))
@dataclass
class DonationResponse:
"""Ответ на создание доната"""
payment_url: str
payment_id: int
provider: str
amount: float
currency: str
@dataclass
class PaymentValidationResult:
"""Результат валидации платежа"""
is_valid: bool
errors: list[str]
warnings: list[str]
def __post_init__(self):
if not self.errors:
self.errors = []
if not self.warnings:
self.warnings = []