ECVI fully functional
This commit is contained in:
@@ -1,68 +1,3 @@
|
||||
# import os
|
||||
# import django
|
||||
# import asyncio
|
||||
# from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||
# from django.core.management.base import BaseCommand
|
||||
# from telegram.ext import Application
|
||||
# from bot.utils.bot_setup import setup_bot
|
||||
# from scheduler.tasks import load_tasks_to_scheduler
|
||||
# from app_settings.models import TelegramSettings
|
||||
# from touchh.utils.log import CustomLogger
|
||||
|
||||
# class Command(BaseCommand):
|
||||
# help = "Запуск Telegram бота и планировщика"
|
||||
|
||||
# def handle(self, *args, **options):
|
||||
# # Установка Django окружения
|
||||
# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "touchh.settings")
|
||||
# django.setup()
|
||||
|
||||
# # Создаем новый цикл событий
|
||||
# loop = asyncio.new_event_loop()
|
||||
# asyncio.set_event_loop(loop)
|
||||
|
||||
# # Настройка планировщика
|
||||
# scheduler = AsyncIOScheduler(event_loop=loop)
|
||||
# scheduler.start()
|
||||
|
||||
# # Загрузка задач в планировщик
|
||||
# try:
|
||||
# load_tasks_to_scheduler(scheduler)
|
||||
# except Exception as e:
|
||||
# self.stderr.write(f"Ошибка при загрузке задач в планировщик: {e}")
|
||||
# return
|
||||
|
||||
# # Настройка Telegram бота
|
||||
# # bot_token = os.getenv("TELEGRAM_BOT_TOKEN")
|
||||
# bot_token = TelegramSettings.objects.first().bot_token
|
||||
|
||||
# if not bot_token:
|
||||
# raise ValueError("Токен бота не найден в переменных окружения.")
|
||||
# application = Application.builder().token(bot_token).build()
|
||||
# setup_bot(application)
|
||||
# # Основная асинхронная функция
|
||||
# async def main():
|
||||
# await application.initialize()
|
||||
# await application.start()
|
||||
# await application.updater.start_polling()
|
||||
# self.stdout.write(self.style.SUCCESS("Telegram бот и планировщик успешно запущены."))
|
||||
# try:
|
||||
# while True:
|
||||
# await asyncio.sleep(3600)
|
||||
# except asyncio.CancelledError:
|
||||
# await application.stop()
|
||||
# scheduler.shutdown()
|
||||
|
||||
# # Запуск асинхронной программы
|
||||
# try:
|
||||
# loop.run_until_complete(main())
|
||||
# except KeyboardInterrupt:
|
||||
# self.stdout.write(self.style.ERROR("Завершение работы Telegram бота и планировщика"))
|
||||
# finally:
|
||||
# loop.close()
|
||||
|
||||
|
||||
|
||||
import os
|
||||
import django
|
||||
import asyncio
|
||||
@@ -88,7 +23,7 @@ class Command(BaseCommand):
|
||||
bot_token = TelegramSettings.objects.first().bot_token
|
||||
|
||||
if not bot_token:
|
||||
raise ValueError("Токен бота не найден в переменных окружения.")
|
||||
raise ValueError("Токен бота не найден в базе данных.")
|
||||
|
||||
application = Application.builder().token(bot_token).build()
|
||||
setup_bot(application)
|
||||
|
||||
@@ -124,7 +124,6 @@ async def delete_hotel(update: Update, context):
|
||||
# # Обрабатываем и логируем ошибки
|
||||
# await query.edit_message_text(f"❌ Ошибка: {str(e)}")
|
||||
|
||||
|
||||
async def check_pms(update, context):
|
||||
query = update.callback_query
|
||||
|
||||
@@ -132,37 +131,38 @@ async def check_pms(update, context):
|
||||
# Получение ID отеля из callback_data
|
||||
hotel_id = query.data.split("_")[2]
|
||||
logger.debug(f"Hotel ID: {hotel_id}")
|
||||
logger.debug(f"Hotel ID type : {type(hotel_id)}")
|
||||
|
||||
# Получение конфигурации отеля и PMS
|
||||
hotel = await sync_to_async(Hotel.objects.select_related('pms').get)(id=hotel_id)
|
||||
pms_config = hotel.pms
|
||||
logger.debug(f"Hotel ID type: {type(hotel_id)}")
|
||||
|
||||
if not pms_config:
|
||||
# Получение объекта отеля с PMS конфигурацией
|
||||
hotel = await sync_to_async(Hotel.objects.select_related('pms').get)(id=hotel_id)
|
||||
if not hotel.pms:
|
||||
logger.error(f"Отель {hotel.name} не имеет связанной PMS конфигурации.")
|
||||
await query.edit_message_text("PMS конфигурация не найдена.")
|
||||
return
|
||||
|
||||
# Создаем экземпляр PMSIntegrationManager
|
||||
pms_manager = PMSIntegrationManager(hotel_id=hotel_id)
|
||||
await pms_manager.load_hotel()
|
||||
logger.debug(f"Hotel PMS: {hotel.pms.name}")
|
||||
|
||||
# Инициализация PMSIntegrationManager с отелем
|
||||
pms_manager = PMSIntegrationManager(hotel=hotel)
|
||||
await sync_to_async(pms_manager.load_hotel)()
|
||||
await sync_to_async(pms_manager.load_plugin)()
|
||||
|
||||
# Проверяем, какой способ интеграции использовать
|
||||
# Проверка наличия fetch_data и вызов плагина
|
||||
if hasattr(pms_manager.plugin, 'fetch_data') and callable(pms_manager.plugin.fetch_data):
|
||||
# Плагин поддерживает метод fetch_data
|
||||
report = await pms_manager.plugin._fetch_data()
|
||||
logger.debug(f"TYPE: {type(report)}")
|
||||
report = await pms_manager.plugin.fetch_data()
|
||||
logger.debug(f"Отчет типа: {type(report)}")
|
||||
else:
|
||||
logger.error("Плагин не поддерживает fetch_data.")
|
||||
await query.edit_message_text("Подходящий способ интеграции с PMS не найден.")
|
||||
return
|
||||
|
||||
# Проверяем результат выполнения fetch_data
|
||||
# Проверка корректности отчета
|
||||
if not report or not isinstance(report, dict):
|
||||
logger.error(f"Некорректный отчет от fetch_data: {report}")
|
||||
await query.edit_message_text("Ошибка: Отчет fetch_data отсутствует или имеет некорректный формат.")
|
||||
return
|
||||
|
||||
# Формируем сообщение о результатах
|
||||
# Формирование сообщения о результатах
|
||||
result_message = (
|
||||
f"Интеграция PMS завершена успешно.\n"
|
||||
f"Обработано интервалов: {report.get('processed_intervals', 0)}\n"
|
||||
@@ -174,14 +174,15 @@ async def check_pms(update, context):
|
||||
|
||||
logger.info(f"Result_Message: {result_message}")
|
||||
await query.edit_message_text(result_message)
|
||||
except Hotel.DoesNotExist:
|
||||
logger.error(f"Отель с ID {hotel_id} не найден.")
|
||||
await query.edit_message_text("Ошибка: Отель не найден.")
|
||||
except Exception as e:
|
||||
# Обрабатываем и логируем ошибки
|
||||
logger.error(f"Ошибка в методе check_pms: {str(e)}", exc_info=True)
|
||||
await query.edit_message_text(f"❌ Ошибка: {str(e)}")
|
||||
|
||||
|
||||
|
||||
|
||||
async def setup_rooms(update: Update, context):
|
||||
"""Настроить номера отеля."""
|
||||
query = update.callback_query
|
||||
|
||||
@@ -55,10 +55,13 @@ async def stats_select_period(update: Update, context: ContextTypes.DEFAULT_TYPE
|
||||
context.user_data["selected_hotel"] = hotel_id
|
||||
|
||||
keyboard = [
|
||||
[InlineKeyboardButton("День", callback_data="stats_period_day")],
|
||||
[InlineKeyboardButton("Сегодня", callback_data="stats_period_today")],
|
||||
[InlineKeyboardButton("Вчера", callback_data="stats_period_yesterday")],
|
||||
[InlineKeyboardButton("Неделя", callback_data="stats_period_week")],
|
||||
[InlineKeyboardButton("Месяц", callback_data="stats_period_month")],
|
||||
[InlineKeyboardButton("Год", callback_data="stats_period_year")],
|
||||
[InlineKeyboardButton("Этот месяц", callback_data="stats_period_thismonth")],
|
||||
[InlineKeyboardButton("Прошлый месяц", callback_data="stats_period_lastmonth")],
|
||||
[InlineKeyboardButton("Этот год", callback_data="stats_period_thisyear")],
|
||||
[InlineKeyboardButton("Прошлый год", callback_data="stats_period_lastyear")],
|
||||
[InlineKeyboardButton("🏠 Главная", callback_data="main_menu")],
|
||||
[InlineKeyboardButton("🔙 Назад", callback_data="statistics")],
|
||||
]
|
||||
@@ -140,7 +143,7 @@ def get_period_dates(period, now=None):
|
||||
start_date = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
|
||||
end_date = now.replace(hour=23, minute=59, second=59, microsecond=999999)
|
||||
|
||||
elif period == "last_month":
|
||||
elif period == "lastmonth":
|
||||
# Последний месяц: с первого дня прошлого месяца до последнего дня прошлого месяца
|
||||
first_day_of_current_month = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
|
||||
last_day_of_previous_month = first_day_of_current_month - timedelta(days=1)
|
||||
@@ -152,7 +155,7 @@ def get_period_dates(period, now=None):
|
||||
start_date = now.replace(month=1, day=1, hour=0, minute=0, second=0, microsecond=0)
|
||||
end_date = now.replace(hour=23, minute=59, second=59, microsecond=999999)
|
||||
|
||||
elif period == "last_year":
|
||||
elif period == "lastyear":
|
||||
# Последний год: с 1 января предыдущего года до 31 декабря предыдущего года
|
||||
start_date = now.replace(year=now.year - 1, month=1, day=1, hour=0, minute=0, second=0, microsecond=0)
|
||||
end_date = now.replace(year=now.year - 1, month=12, day=31, hour=23, minute=59, second=59, microsecond=999999)
|
||||
|
||||
Reference in New Issue
Block a user