84 lines
4.8 KiB
Python
84 lines
4.8 KiB
Python
"""
|
||
Отслеживание и логирование платежей
|
||
"""
|
||
import logging
|
||
from typing import Dict
|
||
from aiogram.types import User
|
||
|
||
from .base import OracleDatabase
|
||
|
||
|
||
class PaymentTracker(OracleDatabase):
|
||
"""Класс для отслеживания платежей"""
|
||
|
||
async def save_payment_log(self, user: User, service_type: str, vin: str, payment_data: Dict, service_result: Dict = None) -> bool:
|
||
"""
|
||
Логирует операцию оплаты с полной информацией о пользователе, услуге и результате
|
||
|
||
Args:
|
||
user: Объект пользователя Telegram
|
||
service_type: Тип услуги ('decode_vin', 'check_salvage', 'get_photos')
|
||
vin: VIN номер автомобиля
|
||
payment_data: Данные о платеже (сумма, transaction_id, статус)
|
||
service_result: Результат предоставления услуги (количество данных, статус)
|
||
"""
|
||
def _save_log():
|
||
try:
|
||
with self._get_connection() as conn:
|
||
with conn.cursor() as cur:
|
||
insert_query = """
|
||
INSERT INTO payment_logs (
|
||
log_id, user_id, user_first_name, user_last_name, user_username,
|
||
user_language_code, user_is_premium, service_type, vin_number,
|
||
payment_amount, transaction_id, payment_status, payment_currency,
|
||
service_status, data_found_count, refund_status, refund_reason,
|
||
vehicle_make, vehicle_model, vehicle_year, error_message,
|
||
created_date, ip_address
|
||
) VALUES (
|
||
payment_logs_seq.NEXTVAL, :user_id, :user_first_name, :user_last_name, :user_username,
|
||
:user_language_code, :user_is_premium, :service_type, :vin_number,
|
||
:payment_amount, :transaction_id, :payment_status, :payment_currency,
|
||
:service_status, :data_found_count, :refund_status, :refund_reason,
|
||
:vehicle_make, :vehicle_model, :vehicle_year, :error_message,
|
||
SYSDATE, :ip_address
|
||
)
|
||
"""
|
||
|
||
params = {
|
||
"user_id": user.id,
|
||
"user_first_name": user.first_name,
|
||
"user_last_name": user.last_name,
|
||
"user_username": user.username,
|
||
"user_language_code": user.language_code,
|
||
"user_is_premium": 1 if user.is_premium else 0,
|
||
"service_type": service_type,
|
||
"vin_number": vin,
|
||
"payment_amount": payment_data.get('amount', 0),
|
||
"transaction_id": payment_data.get('transaction_id'),
|
||
"payment_status": payment_data.get('status', 'completed'),
|
||
"payment_currency": payment_data.get('currency', 'XTR'),
|
||
"service_status": service_result.get('status', 'success') if service_result else 'pending',
|
||
"data_found_count": service_result.get('data_count', 0) if service_result else 0,
|
||
"refund_status": payment_data.get('refund_status', 'no_refund'),
|
||
"refund_reason": payment_data.get('refund_reason'),
|
||
"vehicle_make": service_result.get('vehicle_make') if service_result else None,
|
||
"vehicle_model": service_result.get('vehicle_model') if service_result else None,
|
||
"vehicle_year": service_result.get('vehicle_year') if service_result else None,
|
||
"error_message": service_result.get('error') if service_result else None,
|
||
"ip_address": None # Telegram не предоставляет IP адреса
|
||
}
|
||
|
||
cur.execute(insert_query, params)
|
||
conn.commit()
|
||
return True
|
||
except Exception as e:
|
||
logging.error(f"SQL Error in save_payment_log:")
|
||
logging.error(f"User ID: {user.id}, Service: {service_type}, VIN: {vin}")
|
||
logging.error(f"Error: {e}")
|
||
raise
|
||
|
||
try:
|
||
return await self._execute_query(_save_log)
|
||
except Exception as e:
|
||
logging.error(f"Error saving payment log for user {user.id}: {e}")
|
||
return False |