cleanings
This commit is contained in:
@@ -121,6 +121,52 @@ async def delete_hotel(update: Update, context):
|
||||
# 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
|
||||
|
||||
@@ -144,28 +190,28 @@ async def check_pms(update, context):
|
||||
# Проверяем, какой способ интеграции использовать
|
||||
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()
|
||||
report = await pms_manager.plugin._fetch_data()
|
||||
else:
|
||||
# Если подходящий способ не найден
|
||||
await query.edit_message_text("Подходящий способ интеграции с PMS не найден.")
|
||||
return
|
||||
|
||||
# Сохраняем данные в базу
|
||||
from bot.utils.database import save_reservations
|
||||
await sync_to_async(save_reservations)(data)
|
||||
# Формируем сообщение о результатах
|
||||
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(f"Интеграция PMS {pms_config.name} завершена успешно.")
|
||||
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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
|
||||
from telegram.ext import ContextTypes
|
||||
from asgiref.sync import sync_to_async
|
||||
@@ -7,7 +7,7 @@ from users.models import User
|
||||
|
||||
from bot.utils.pdf_report import generate_pdf_report
|
||||
from bot.utils.database import get_hotels_for_user, get_hotel_by_name
|
||||
|
||||
from django.utils.timezone import make_aware
|
||||
|
||||
async def statistics(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
"""Вывод списка отелей для статистики."""
|
||||
@@ -55,6 +55,7 @@ async def stats_select_period(update: Update, context: ContextTypes.DEFAULT_TYPE
|
||||
reply_markup = InlineKeyboardMarkup(keyboard)
|
||||
await query.edit_message_text("Выберите период времени:", reply_markup=reply_markup)
|
||||
|
||||
|
||||
async def generate_statistics(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
"""Генерация и отправка статистики."""
|
||||
query = update.callback_query
|
||||
@@ -66,47 +67,70 @@ async def generate_statistics(update: Update, context: ContextTypes.DEFAULT_TYPE
|
||||
return
|
||||
|
||||
period = query.data.split("_")[2]
|
||||
print(f'Period raw: {query.data}')
|
||||
print(f'Selected period: {period}')
|
||||
|
||||
now = datetime.utcnow().replace(tzinfo=timezone.utc) # Используем timezone.utc
|
||||
|
||||
now = datetime.now()
|
||||
if period == "day":
|
||||
start_date = (now - timedelta(days=1)).date() # Вчерашняя дата
|
||||
end_date = now.date() # Сегодняшняя дата
|
||||
start_date = (now - timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
end_date = now.replace(hour=23, minute=59, second=59, microsecond=999999)
|
||||
elif period == "week":
|
||||
start_date = (now - timedelta(days=7)).date()
|
||||
end_date = now.date()
|
||||
start_date = (now - timedelta(days=7)).replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
end_date = now.replace(hour=23, minute=59, second=59, microsecond=999999)
|
||||
elif period == "month":
|
||||
start_date = (now - timedelta(days=30)).date()
|
||||
end_date = now.date()
|
||||
else:
|
||||
start_date = (now - timedelta(days=30)).replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
end_date = now.replace(hour=23, minute=59, second=59, microsecond=999999)
|
||||
else: # "all"
|
||||
start_date = None
|
||||
end_date = None
|
||||
|
||||
print(f'Raw start_date: {start_date}, Raw end_date: {end_date}')
|
||||
|
||||
# Убедитесь, что даты имеют временную зону UTC
|
||||
if start_date:
|
||||
start_date = make_aware(start_date) if start_date.tzinfo is None else start_date
|
||||
if end_date:
|
||||
end_date = make_aware(end_date) if end_date.tzinfo is None else end_date
|
||||
|
||||
print(f'Filtered start_date: {start_date}, Filtered end_date: {end_date}')
|
||||
|
||||
# Фильтрация по "дата заезда"
|
||||
if start_date and end_date:
|
||||
reservations = await sync_to_async(list)(
|
||||
Reservation.objects.filter(
|
||||
hotel_id=hotel_id,
|
||||
check_in__date__gte=start_date,
|
||||
check_in__date__lte=end_date
|
||||
).prefetch_related('guests')
|
||||
check_in__gte=start_date,
|
||||
check_in__lte=end_date
|
||||
).select_related('hotel')
|
||||
)
|
||||
else:
|
||||
else: # Без фильтра по дате
|
||||
reservations = await sync_to_async(list)(
|
||||
Reservation.objects.filter(hotel_id=hotel_id).prefetch_related('guests')
|
||||
Reservation.objects.filter(
|
||||
hotel_id=hotel_id
|
||||
).select_related('hotel')
|
||||
)
|
||||
|
||||
print(f'Filtered reservations count: {len(reservations)}')
|
||||
|
||||
if not reservations:
|
||||
await query.edit_message_text("Нет данных для статистики за выбранный период.")
|
||||
return
|
||||
|
||||
hotel = await sync_to_async(Hotel.objects.get)(id=hotel_id)
|
||||
print(f'Hotel: {hotel.name}')
|
||||
|
||||
for reservation in reservations:
|
||||
print(f"Reservation ID: {reservation.reservation_id}, Hotel: {reservation.hotel.name}, "
|
||||
f"Room number: {reservation.room_number}, Check-in: {reservation.check_in}, Check-out: {reservation.check_out}")
|
||||
|
||||
# Генерация PDF отчета (пример)
|
||||
file_path = generate_pdf_report(hotel.name, reservations, start_date, end_date)
|
||||
print(f'Generated file path: {file_path}')
|
||||
|
||||
with open(file_path, "rb") as file:
|
||||
await query.message.reply_document(document=file, filename=f"{hotel.name}_report.pdf")
|
||||
|
||||
|
||||
|
||||
async def stats_back(update: Update, context):
|
||||
"""Возврат к выбору отеля."""
|
||||
query = update.callback_query
|
||||
|
||||
Reference in New Issue
Block a user