from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update from asgiref.sync import sync_to_async from hotels.models import Hotel, UserHotel from users.models import User from pms_integration.manager import PMSIntegrationManager from bot.utils.froud_check import detect_fraud async def manage_hotels(update: Update, context): """Отображение списка отелей, связанных с пользователем.""" query = update.callback_query await query.answer() user_id = query.from_user.id user = await sync_to_async(User.objects.filter(chat_id=user_id).first)() if not user: await query.edit_message_text("Вы не зарегистрированы в системе.") return user_hotels = await sync_to_async(list)( UserHotel.objects.filter(user=user).select_related("hotel") ) if not user_hotels: await query.edit_message_text("У вас нет связанных отелей.") return keyboard = [ [InlineKeyboardButton(f"🏨 {hotel.hotel.name}", callback_data=f"hotel_{hotel.hotel.id}")] for hotel in user_hotels ] reply_markup = InlineKeyboardMarkup(keyboard) await query.edit_message_text("Выберите отель:", reply_markup=reply_markup) async def hotel_actions(update: Update, context): """Обработчик действий для выбранного отеля.""" query = update.callback_query await query.answer() hotel_id = int(query.data.split("_")[1]) print(f"Selected hotel id: {hotel_id}") hotel = await sync_to_async(Hotel.objects.filter(id=hotel_id).first)() if not hotel: await query.edit_message_text("Отель не найден.") return keyboard = [ [InlineKeyboardButton("🗑️ Удалить отель", callback_data=f"delete_hotel_{hotel_id}")], [InlineKeyboardButton("Проверить на FRAUD", callback_data=f"check_fraud_{hotel_id}")], [InlineKeyboardButton("🔗 Проверить интеграцию с PMS", callback_data=f"check_pms_{hotel_id}")], [InlineKeyboardButton("🛏️ Настроить номера", callback_data=f"setup_rooms_{hotel_id}")], [InlineKeyboardButton("🏠 Главная", callback_data="main_menu")], [InlineKeyboardButton("🔙 Назад", callback_data="back")], ] reply_markup = InlineKeyboardMarkup(keyboard) await query.edit_message_text(f"Управление отелем: {hotel.name}", reply_markup=reply_markup) async def handle_fraud_check(update, context): query = update.callback_query hotel_id = int(query.data.split("_")[2]) await detect_fraud(hotel_id) await query.edit_message_text("Проверка на FRAUD завершена. Администратор уведомлен.") async def delete_hotel(update: Update, context): """Удаление отеля.""" query = update.callback_query await query.answer() hotel_id = int(query.data.split("_")[2]) hotel = await sync_to_async(Hotel.objects.filter(id=hotel_id).first)() if hotel: hotel_name = hotel.name await sync_to_async(hotel.delete)() await query.edit_message_text(f"Отель {hotel_name} успешно удалён.") else: await query.edit_message_text("Отель не найден.") # async def check_pms(update, context): # query = update.callback_query # try: # # Получение hotel_id из callback_data # hotel_id = query.data.split("_")[2] # print(f"Selected hotel id: {hotel_id}") # context.user_data["selected_hotel"] = hotel_id # # Инициализация менеджера PMS # pms_manager = PMSIntegrationManager(hotel_id=hotel_id) # print(f"Инициализация PMS менеджера для отеля ID: {hotel_id}") # # Загрузка данных отеля # await pms_manager.load_hotel() # print(f"Данные отеля загружены: {pms_manager.hotel}") # # Загрузка плагина # pms_manager.load_plugin() # print(f"Плагин загружен: {pms_manager.plugin}") # # Получение данных из PMS # data = pms_manager.fetch_data() # print(f"Данные получены из PMS: {len(data)} записей") # # print(f"Полные данные: {data}\n\n\n") # # Сохранение лога успешной интеграции # await pms_manager.save_log("success", f"Успешная интеграция с PMS {pms_manager.pms_config.name}.") # # Ответ пользователю # await query.edit_message_text(f"Интеграция успешна! Получено {len(data)} записей.") # # Обработка данных и запись в БД # await pms_manager.plugin._save_to_db(data, hotel_id=int(hotel_id)) # print(f"Данные успешно сохранены в базу данных.") # except Exception as e: # # Логирование ошибки # print(f"Ошибка при выполнении check_pms: {e}") # if 'pms_manager' in locals() and pms_manager.hotel: # await pms_manager.save_log("error", str(e)) # await query.edit_message_text(f"❌ Ошибка: {e}") # async def check_pms(update, context): # query = update.callback_query # try: # # Получение ID отеля из callback_data # hotel_id = query.data.split("_")[2] # # Получение конфигурации отеля и PMS # hotel = await sync_to_async(Hotel.objects.select_related('pms').get)(id=hotel_id) # pms_config = hotel.pms # if not pms_config: # await query.edit_message_text("PMS конфигурация не найдена.") # return # # Создаем экземпляр PMSIntegrationManager # pms_manager = PMSIntegrationManager(hotel_id=hotel_id) # await pms_manager.load_hotel() # await sync_to_async(pms_manager.load_plugin)() # # Проверяем, какой способ интеграции использовать # if hasattr(pms_manager.plugin, 'fetch_data') and callable(pms_manager.plugin.fetch_data): # # Плагин поддерживает метод fetch_data # data = await pms_manager.plugin.fetch_data() # elif pms_config.api_url and pms_config.token: # # Используем прямой запрос к API # from pms_integration.api_client import APIClient # api_client = APIClient(base_url=pms_config.api_url, access_token=pms_config.token) # data = api_client.fetch_reservations() # else: # # Если подходящий способ не найден # await query.edit_message_text("Подходящий способ интеграции с PMS не найден.") # return # # Сохраняем данные в базу # from bot.utils.database import save_reservations # await sync_to_async(save_reservations)(data) # # Уведомляем об успешной интеграции # await query.edit_message_text(f"Интеграция PMS {pms_config.name} завершена успешно.") # except Exception as e: # # Обрабатываем и логируем ошибки # await query.edit_message_text(f"❌ Ошибка: {str(e)}") async def check_pms(update, context): query = update.callback_query try: # Получение ID отеля из callback_data hotel_id = query.data.split("_")[2] # Получение конфигурации отеля и PMS hotel = await sync_to_async(Hotel.objects.select_related('pms').get)(id=hotel_id) pms_config = hotel.pms if not pms_config: await query.edit_message_text("PMS конфигурация не найдена.") return # Создаем экземпляр PMSIntegrationManager pms_manager = PMSIntegrationManager(hotel_id=hotel_id) await pms_manager.load_hotel() await sync_to_async(pms_manager.load_plugin)() # Проверяем, какой способ интеграции использовать if hasattr(pms_manager.plugin, 'fetch_data') and callable(pms_manager.plugin.fetch_data): # Плагин поддерживает метод fetch_data report = await pms_manager.plugin._fetch_data() else: await query.edit_message_text("Подходящий способ интеграции с PMS не найден.") return # Формируем сообщение о результатах result_message = ( f"Интеграция PMS завершена успешно.\n" f"Обработано интервалов: {report['processed_intervals']}\n" f"Обработано записей: {report['processed_items']}\n" f"Ошибки: {len(report['errors'])}" ) if report["errors"]: result_message += "\n\nСписок ошибок:\n" + "\n".join(report["errors"]) await query.edit_message_text(result_message) except Exception as e: # Обрабатываем и логируем ошибки await query.edit_message_text(f"❌ Ошибка: {str(e)}") async def setup_rooms(update: Update, context): """Настроить номера отеля.""" query = update.callback_query await query.answer() hotel_id = int(query.data.split("_")[2]) hotel = await sync_to_async(Hotel.objects.filter(id=hotel_id).first)() if not hotel: await query.edit_message_text("Отель не найден.") return await query.edit_message_text(f"Настройка номеров для отеля: {hotel.name}") async def get_users_for_hotel(hotel_id): """Получение пользователей, зарегистрированных в отеле с правами управления через бота.""" users = await sync_to_async(list)( User.objects.filter(user_hotels__hotel_id=hotel_id, user_hotels__role__in=["admin", "manager"]).distinct() ) return users