mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
Подготовка к релизу
This commit is contained in:
@@ -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 = []
|
||||
Reference in New Issue
Block a user