Files
Touchh/bot/operations/hotels.py
2024-12-09 17:42:23 +09:00

175 lines
7.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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("Отель не найден.")
from pms_integration.manager import PMSIntegrationManager
from asgiref.sync import sync_to_async
from hotels.models import Hotel
# async def check_pms(update, context):
# query = update.callback_query
# try:
# # Логирование 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"Loaded hotel: {pms_manager.hotel}")
# await pms_manager.load_hotel() # Асинхронная загрузка отеля
# pms_manager.load_plugin() # Загрузка плагина
# # Получение данных
# data = pms_manager.fetch_data()
# print(f'PMS_managerПолучено записей: {len(data)}\n\n\n___')
# 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)} записей.")
# except Exception as 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:
# Получение 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 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