""" Отслеживание и логирование платежей """ 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