diff --git a/bot/handlers.py b/bot/handlers.py index 76d83830..73aa43de 100644 --- a/bot/handlers.py +++ b/bot/handlers.py @@ -1,7 +1,7 @@ from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update from telegram.ext import ContextTypes from users.models import User -from hotels.models import Hotel, UserHotel +from hotels.models import Hotel, UserHotel, Reservation from users.models import NotificationSettings from asgiref.sync import sync_to_async import smtplib @@ -9,7 +9,9 @@ from hotels.models import PMSIntegrationLog import requests from email.mime.text import MIMEText from django.core.mail import send_mail -from datetime import datetime +from datetime import datetime, timedelta +from fpdf import FPDF +import os # --- Вспомогательные функции --- async def get_user_from_chat_id(chat_id): @@ -78,9 +80,15 @@ async def manage_hotels(update: Update, context: ContextTypes.DEFAULT_TYPE): async def handle_button_click(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработчик всех нажатий кнопок""" query = update.callback_query - print(f"Обработчик кнопок: Получен callback_data = {query.data}") + await query.answer() - if query.data == "manage_hotels": + if query.data == "stats": + await statistics(update, context) # Добавляем вызов функции для обработки статистики + elif query.data.startswith("stats_hotel_"): + await stats_select_period(update, context) + elif query.data.startswith("stats_period_"): + await generate_statistics(update, context) + elif query.data == "manage_hotels": await manage_hotels(update, context) elif query.data.startswith("hotel_"): await hotel_actions(update, context) @@ -100,7 +108,6 @@ async def handle_button_click(update: Update, context: ContextTypes.DEFAULT_TYPE await set_notification_time(update, context) elif query.data == "current_settings": await show_current_settings(update, context) - else: print(f"Неизвестный callback_data: {query.data}") await query.edit_message_text("Команда не распознана.") @@ -433,3 +440,136 @@ async def check_pms_integration(update: Update, context: ContextTypes.DEFAULT_TY message=str(e), ) await query.edit_message_text(f"Произошла ошибка: {str(e)}") + +async def get_hotels_for_user(user_id): + """Получение отелей, связанных с пользователем.""" + user = await sync_to_async(User.objects.filter(chat_id=user_id).first)() + if not user: + return [] + return await sync_to_async(list)( + Hotel.objects.filter(userhotel__user=user).distinct() + ) + + +async def get_reservations(hotel_id, start_date=None, end_date=None): + """Получение статистики бронирований по отелю.""" + query = Reservation.objects.filter(hotel_id=hotel_id) + if start_date: + query = query.filter(check_in__gte=start_date) + if end_date: + query = query.filter(check_out__lte=end_date) + return await sync_to_async(list)(query) + + +def generate_pdf_report(hotel_name, reservations, start_date, end_date): + """Генерация PDF отчета.""" + pdf = FPDF() + pdf.add_page() + + # Подключение шрифта, поддерживающего кириллицу + font_path = os.path.join("fonts", "OpenSans-Regular.ttf") + print(f'\n\n\nПуть к шрифту: {font_path}\n\n\n') # Укажите путь к шрифту DejaVuSans.ttf + if not os.path.exists(font_path): + raise FileNotFoundError("Шрифт OpenSans-Regular.ttf не найден. Убедитесь, что он находится в папке 'fonts'.") + pdf.add_font("DejaVu", "", font_path, uni=True) + pdf.set_font("DejaVu", size=12) + + # Заголовки + title = f"Отчет по заселениям: {hotel_name}" + period = ( + f"Период: {start_date.strftime('%d.%m.%Y')} - {end_date.strftime('%d.%m.%Y')}" + if start_date and end_date + else "Период: Все время" + ) + + pdf.cell(200, 10, txt=title, ln=True, align="C") + pdf.cell(200, 10, txt=period, ln=True, align="C") + pdf.ln(10) + + # Заголовки таблицы + pdf.set_font("DejaVu", size=10) + pdf.cell(40, 10, "Дата заезда", border=1) + pdf.cell(40, 10, "Дата выезда", border=1) + pdf.cell(30, 10, "Номер", border=1) + pdf.cell(50, 10, "Тип комнаты", border=1) + pdf.cell(30, 10, "Цена", border=1) + pdf.ln() + + # Добавление данных + for res in reservations: + guests = ", ".join([guest.name for guest in res.guests.all()]) + pdf.cell(40, 10, res.check_in.strftime('%d.%m.%Y'), border=1) + pdf.cell(40, 10, res.check_out.strftime('%d.%m.%Y'), border=1) + pdf.cell(30, 10, res.room_number, border=1) + pdf.cell(50, 10, res.room_type, border=1) + pdf.cell(30, 10, f"{res.price} ₽", border=1) + pdf.ln() + pdf.multi_cell(200, 10, f"Гости: {guests}") + + # Сохранение файла + file_path = os.path.join("reports", f"{hotel_name}_report.pdf") + os.makedirs(os.path.dirname(file_path), exist_ok=True) + pdf.output(file_path) + return file_path + + +# --- Обработчики --- +async def statistics(update: Update, context: ContextTypes.DEFAULT_TYPE): + """Вывод списка отелей для статистики.""" + query = update.callback_query + user_id = query.from_user.id + await query.answer() + + hotels = await get_hotels_for_user(user_id) + if not hotels: + await query.edit_message_text("У вас нет доступных отелей для статистики.") + return + + keyboard = [[InlineKeyboardButton(hotel.name, callback_data=f"stats_hotel_{hotel.id}")] for hotel in hotels] + reply_markup = InlineKeyboardMarkup(keyboard) + await query.edit_message_text("Выберите отель:", reply_markup=reply_markup) + + +async def stats_select_period(update: Update, context: ContextTypes.DEFAULT_TYPE): + """Выбор периода времени для статистики.""" + query = update.callback_query + await query.answer() + + hotel_id = int(query.data.split("_")[2]) + context.user_data["selected_hotel"] = hotel_id + + keyboard = [ + [InlineKeyboardButton("Неделя", callback_data="stats_period_week")], + [InlineKeyboardButton("Месяц", callback_data="stats_period_month")], + [InlineKeyboardButton("Все время", callback_data="stats_period_all")], + ] + 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 + await query.answer() + + hotel_id = context.user_data["selected_hotel"] + period = query.data.split("_")[2] + + now = datetime.now() + if period == "week": + start_date = now - timedelta(days=7) + end_date = now + elif period == "month": + start_date = now - timedelta(days=30) + end_date = now + else: + start_date = None + end_date = None + + reservations = await get_reservations(hotel_id, start_date, end_date) + hotel = await sync_to_async(Hotel.objects.get)(id=hotel_id) + file_path = generate_pdf_report(hotel.name, reservations, start_date, end_date) + + # Отправляем PDF файл пользователю + with open(file_path, "rb") as file: + await query.message.reply_document(document=file, filename=os.path.basename(file_path)) diff --git a/bot/management/commands/fonts/OpenSans-Regular.ttf b/bot/management/commands/fonts/OpenSans-Regular.ttf new file mode 100644 index 00000000..67803bb6 Binary files /dev/null and b/bot/management/commands/fonts/OpenSans-Regular.ttf differ diff --git a/bot/management/commands/run_bot.py b/bot/management/commands/run_bot.py index 3042ddba..cbf5eedc 100644 --- a/bot/management/commands/run_bot.py +++ b/bot/management/commands/run_bot.py @@ -25,6 +25,9 @@ from bot.handlers import ( handle_notification_time, schedule_notifications, show_current_settings, + statistics, + generate_statistics, + stats_select_period, ) # Настройка Django окружения @@ -53,6 +56,9 @@ async def start_bot(application): application.add_handler(CallbackQueryHandler(delete_hotel, pattern="^delete_hotel_")) application.add_handler(CallbackQueryHandler(check_pms, pattern="^check_pms_")) application.add_handler(CallbackQueryHandler(setup_rooms, pattern="^setup_rooms_")) + application.add_handler(CallbackQueryHandler(statistics, pattern="^stats$")) + application.add_handler(CallbackQueryHandler(stats_select_period, pattern="^stats_hotel_")) + application.add_handler(CallbackQueryHandler(generate_statistics, pattern="^stats_period_")) # Регистрация обработчиков текстовых сообщений print("Регистрация обработчиков текстовых сообщений...") diff --git a/hotels/admin.py b/hotels/admin.py index 7609bbc9..190b2d88 100644 --- a/hotels/admin.py +++ b/hotels/admin.py @@ -1,6 +1,17 @@ from django.contrib import admin -from .models import Hotel, UserHotel, APIConfiguration, APIRequestLog, PMSConfiguration, PMSIntegrationLog from django import forms +from .models import ( + Hotel, + UserHotel, + APIConfiguration, + APIRequestLog, + PMSConfiguration, + PMSIntegrationLog, + Reservation, + Guest +) + +# Custom form for Hotel to filter APIConfiguration class HotelForm(forms.ModelForm): class Meta: model = Hotel @@ -8,49 +19,72 @@ class HotelForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - # Исключаем API, которые уже связаны с другими отелями + # Exclude APIs already linked to another hotel used_apis = Hotel.objects.exclude(api__isnull=True).values_list('api', flat=True) self.fields['api'].queryset = APIConfiguration.objects.exclude(id__in=used_apis) + class HotelAdmin(admin.ModelAdmin): form = HotelForm list_display = ('name', 'api', 'created_at', 'pms') search_fields = ('name',) + list_filter = ('pms', 'created_at') + ordering = ('-created_at',) admin.site.register(Hotel, HotelAdmin) + @admin.register(UserHotel) class UserHotelAdmin(admin.ModelAdmin): list_display = ('user', 'hotel') - search_fields = ('user', 'hotel') + search_fields = ('user__username', 'hotel__name') list_filter = ('hotel',) ordering = ('-hotel',) - - + @admin.register(APIConfiguration) class ApiConfigurationAdmin(admin.ModelAdmin): - list_display = ('name', 'url', 'token', 'username', 'password') - search_fields = ('name', 'url', 'token', 'username', 'password') - list_filter = ('name', 'url', 'token', 'username', 'password') - ordering = ('-name',) - + list_display = ('name', 'url', 'token', 'username', 'password', 'last_updated') + search_fields = ('name', 'url', 'token', 'username') + list_filter = ('last_updated',) + ordering = ('-last_updated',) + + @admin.register(APIRequestLog) class ApiRequestLogAdmin(admin.ModelAdmin): list_display = ('api', 'request_time', 'response_status', 'response_data') - search_fields = ('api', 'request_time', 'response_status', 'response_data') - list_filter = ('api', 'request_time', 'response_status', 'response_data') - ordering = ('-api',) - - + search_fields = ('api__name', 'request_time', 'response_status') + list_filter = ('api', 'response_status', 'request_time') + ordering = ('-request_time',) + + @admin.register(PMSConfiguration) class PMSConfigurationAdmin(admin.ModelAdmin): - list_display = ('name', 'parser_settings', 'description') - + list_display = ('name', 'parser_settings', 'description', 'created_at') + search_fields = ('name', 'description') + list_filter = ('created_at',) + ordering = ('-created_at',) + + @admin.register(PMSIntegrationLog) -class PMSIntegreationLogAdmin(admin.ModelAdmin): +class PMSIntegrationLogAdmin(admin.ModelAdmin): list_display = ('hotel', 'checked_at', 'status', 'message') - search_fields = ('hotel', 'checked_at', 'status', 'message') - list_filter = ('hotel', 'checked_at', 'status', 'message') + search_fields = ('hotel__name', 'status', 'message') + list_filter = ('status', 'checked_at') ordering = ('-checked_at',) - \ No newline at end of file + + +@admin.register(Reservation) +class ReservationAdmin(admin.ModelAdmin): + list_display = ('reservation_id', 'hotel', 'room_number', 'room_type', 'check_in', 'check_out', 'status', 'price', 'discount') + search_fields = ('reservation_id', 'hotel__name', 'room_number', 'room_type', 'status') + list_filter = ('status', 'check_in', 'check_out') + ordering = ('-check_in',) + + +@admin.register(Guest) +class GuestAdmin(admin.ModelAdmin): + list_display = ('reservation', 'name', 'birthdate', 'phone', 'email') + search_fields = ('reservation__reservation_id', 'name', 'phone', 'email') + list_filter = ('reservation',) + ordering = ('-reservation',) diff --git a/hotels/booking_analyzer.py b/hotels/booking_analyzer.py new file mode 100644 index 00000000..c7cc64da --- /dev/null +++ b/hotels/booking_analyzer.py @@ -0,0 +1,33 @@ +import json +import pandas as pd + +# Load the JSON file +file_path = '../../modules/analyzed_9.json' +with open(file_path, 'r', encoding='utf-8') as file: + data = json.load(file) + +# Process the data into a structured format +reservations = [] +for booking in data: + for guest in booking.get("guests", []): + reservations.append({ + "Reservation ID": booking.get("id"), + "Hotel Name": booking.get("hotelName"), + "Room Number": booking.get("roomNumber"), + "Room Type": booking.get("roomTypeName"), + "Check-in": booking.get("from"), + "Check-out": booking.get("until"), + "Status": booking.get("checkInStatus"), + "Price": booking.get("reservationPrice"), + "Discount": booking.get("discount"), + "Guest Name": f"{guest.get('lastName', '')} {guest.get('firstName', '')} {guest.get('middleName', '')}".strip(), + "Guest Birthdate": guest.get("birthDate"), + "Guest Phone": guest.get("phone"), + "Guest Email": guest.get("email"), + }) + +# Convert to DataFrame for better visualization +df_reservations = pd.DataFrame(reservations) + +# Display the structured data +import ace_tools as tools; tools.display_dataframe_to_user(name="Structured Reservations Data", dataframe=df_reservations) diff --git a/hotels/migrations/0011_reservation_guest.py b/hotels/migrations/0011_reservation_guest.py new file mode 100644 index 00000000..5fa662bf --- /dev/null +++ b/hotels/migrations/0011_reservation_guest.py @@ -0,0 +1,48 @@ +# Generated by Django 5.1.4 on 2024-12-07 00:35 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('hotels', '0010_apirequestlog_hotels_apir_api_id_686bb0_idx_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='Reservation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('reservation_id', models.BigIntegerField(unique=True, verbose_name='ID бронирования')), + ('room_number', models.CharField(max_length=50, verbose_name='Номер комнаты')), + ('room_type', models.CharField(max_length=255, verbose_name='Тип комнаты')), + ('check_in', models.DateTimeField(verbose_name='Дата заезда')), + ('check_out', models.DateTimeField(verbose_name='Дата выезда')), + ('status', models.CharField(max_length=50, verbose_name='Статус')), + ('price', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Цена')), + ('discount', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Скидка')), + ('hotel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hotels.hotel', verbose_name='Отель')), + ], + options={ + 'verbose_name': 'Бронирование', + 'verbose_name_plural': 'Бронирования', + }, + ), + migrations.CreateModel( + name='Guest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, verbose_name='Имя гостя')), + ('birthdate', models.DateField(blank=True, null=True, verbose_name='Дата рождения')), + ('phone', models.CharField(blank=True, max_length=50, null=True, verbose_name='Телефон')), + ('email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email')), + ('reservation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='guests', to='hotels.reservation', verbose_name='Бронирование')), + ], + options={ + 'verbose_name': 'Гость', + 'verbose_name_plural': 'Гости', + }, + ), + ] diff --git a/hotels/models.py b/hotels/models.py index 95a6201b..eddaf943 100644 --- a/hotels/models.py +++ b/hotels/models.py @@ -30,7 +30,8 @@ class APIConfiguration(models.Model): class Meta: verbose_name = "Конфигурация API" verbose_name_plural = "Конфигурации API" - + + class Hotel(models.Model): name = models.CharField(max_length=255, verbose_name="Название отеля") api = models.OneToOneField( @@ -50,14 +51,17 @@ class Hotel(models.Model): class Meta: verbose_name = "Отель" verbose_name_plural = "Отели" - + + class PMSIntegrationLog(models.Model): hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Отель") checked_at = models.DateTimeField(auto_now_add=True, verbose_name="Время проверки") status = models.CharField(max_length=50, verbose_name="Статус", choices=[('success', 'Успех'), ('error', 'Ошибка')]) message = models.TextField(verbose_name="Сообщение", blank=True, null=True) + def __str__(self): return f"{self.hotel.name} - {self.status} - {self.checked_at}" + class Meta: verbose_name = "Журнал интеграции PMS" verbose_name_plural = "Журналы интеграции PMS" @@ -66,21 +70,18 @@ class PMSIntegrationLog(models.Model): models.Index(fields=['checked_at']), models.Index(fields=['status']), ] - - + + class UserHotel(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Пользователь") hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Отель") def __str__(self): return f"{self.user.username} - {self.hotel.name}" - + class Meta: verbose_name = "Пользователь отеля" verbose_name_plural = "Пользователи отелей" - -from django.db import models - class APIRequestLog(models.Model): @@ -91,6 +92,7 @@ class APIRequestLog(models.Model): def __str__(self): return f"{self.api.name} - {self.request_time}" + class Meta: verbose_name = "Журнал запросов API" verbose_name_plural = "Журналы запросов API" @@ -98,6 +100,37 @@ class APIRequestLog(models.Model): models.Index(fields=['api']), models.Index(fields=['request_time']), ] - -from django.db import models + +class Reservation(models.Model): + hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Отель") + reservation_id = models.BigIntegerField(unique=True, verbose_name="ID бронирования") + room_number = models.CharField(max_length=50, verbose_name="Номер комнаты") + room_type = models.CharField(max_length=255, verbose_name="Тип комнаты") + check_in = models.DateTimeField(verbose_name="Дата заезда") + check_out = models.DateTimeField(verbose_name="Дата выезда") + status = models.CharField(max_length=50, verbose_name="Статус") + price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name="Цена") + discount = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name="Скидка") + + def __str__(self): + return f"Бронирование {self.reservation_id} - {self.hotel.name}" + + class Meta: + verbose_name = "Бронирование" + verbose_name_plural = "Бронирования" + + +class Guest(models.Model): + reservation = models.ForeignKey(Reservation, on_delete=models.CASCADE, related_name="guests", verbose_name="Бронирование") + name = models.CharField(max_length=255, verbose_name="Имя гостя") + birthdate = models.DateField(null=True, blank=True, verbose_name="Дата рождения") + phone = models.CharField(max_length=50, null=True, blank=True, verbose_name="Телефон") + email = models.EmailField(null=True, blank=True, verbose_name="Email") + + def __str__(self): + return self.name + + class Meta: + verbose_name = "Гость" + verbose_name_plural = "Гости" diff --git a/load_hotels_reservations_and_guests.sql b/load_hotels_reservations_and_guests.sql new file mode 100644 index 00000000..3265e4bd --- /dev/null +++ b/load_hotels_reservations_and_guests.sql @@ -0,0 +1,51 @@ +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11005387, 1, '2406', 'junior suite bsv', '2024-12-05T15:00:00', '2024-12-08T12:00:00', 'Ожидание', 34734, -10374); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11121622, 1, '2304', 'junior suite bsv', '2024-12-06T15:00:00', '2024-12-09T12:00:00', 'Ожидание', 29523, -5208); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11121623, 1, '2406', 'junior suite bsv', '2024-12-06T15:00:00', '2024-12-09T12:00:00', 'Ожидание', 29523, -5208); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11121624, 1, '2409', 'junior suite bsv', '2024-12-06T15:00:00', '2024-12-09T12:00:00', 'Ожидание', 29523, -5208); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11121625, 1, '2404', 'junior suite bsv', '2024-12-06T15:00:00', '2024-12-09T12:00:00', 'Ожидание', 3, -34728); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11121626, 1, '2308', 'junior suite bsv', '2024-12-06T15:00:00', '2024-12-09T12:00:00', 'Ожидание', 29523, -5208); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11121627, 1, '2309', 'junior suite bsv', '2024-12-06T15:00:00', '2024-12-09T12:00:00', 'Ожидание', 29523, -5208); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11209172, 1, '2306', 'junior suite bsv', '2024-12-06T14:23:19', '2024-12-07T11:00:00', 'Заселен', 16431, 0); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11340869, 1, '2209', 'junior suite bsv', '2024-12-06T15:00:00', '2024-12-07T12:00:00', 'Ожидание', 10500, 0); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11343896, 1, '2206', 'junior suite bsv', '2024-12-06T15:00:00', '2024-12-08T10:00:00', 'Ожидание', 20690, -5172); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11403309, 1, '2406', 'junior suite bsv', '2024-12-06T13:16:33', '2024-12-07T12:00:00', 'Заселен', 0, 0); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11405187, 1, '2304', 'junior suite bsv', '2024-12-06T15:20:06', '2024-12-08T12:00:00', 'Заселен', 0, -28000); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11405986, 1, '2410', 'junior suite bsv', '2024-12-06T12:34:55', '2024-12-08T12:00:00', 'Заселен', 0, 0); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11408982, 1, '2404', 'junior suite bsv', '2024-12-06T16:05:19', '2024-12-07T12:00:00', 'Заселен', 0, 0); +INSERT INTO hotels_Reservation (reservation_id, hotel_id, room_number, room_type, check_in, check_out, status, price, discount) VALUES (11409769, 1, '2208', 'junior suite bsv', '2024-12-06T17:29:51', '2024-12-08T12:00:00', 'Заселен', 0, -21000); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11005387, 'СЕЛИНА ЕВГЕНИЯ МИХАЙЛОВНА', '1982-06-04T00:00:00', '+7 (928) 2254744', NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11005387, 'ШАБАНОВ ДМИТРИЙ ВИКТОРОВИЧ', '1972-01-24T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121622, 'БЕЛОКОНЬ ГРУППА РЕТРИТ', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121622, 'Гость', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121623, 'БЕЛОКОНЬ ГРУППА РЕТРИТ', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121623, 'МУХТАРОВА АМИНА ЭЛЬМАНОВНА', '2018-02-17T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121624, 'БЕЛОКОНЬ ГРУППА РЕТРИТ', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121624, 'МУХТАРОВА АМИНА ЭЛЬМАНОВНА', '2018-02-17T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121625, 'БЕЛОКОНЬ ЕЛЕНА ГЕОРГИЕВНА', '1974-08-19T00:00:00', '+7 (918) 6233319', NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121625, 'Гость', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121626, 'БЕЛОКОНЬ ГРУППА РЕТРИТ', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121626, 'Гость', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121627, 'БЕЛОКОНЬ ГРУППА РЕТРИТ', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11121627, 'Гость', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11209172, 'ДИХНОВА ВИКТОРИЯ ВИКТОРОВНА', '1978-02-03T00:00:00', '+7 (918) 1110311', 'v.dihnova@yandex.ru'); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11209172, 'Козинец Валерия Витальевна', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11209172, 'КОЗИНЕЦ ОЛЬГА СЕРГЕЕВНА', '1998-06-17T00:00:00', '+7 (918) 2855055', 'o.5285666@mail.ru'); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11209172, 'Дихнов Иван Дмитриевич', '2010-11-13T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11340869, 'Мушкина Дарья Борисовна', NULL, '89181747504', NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11340869, 'Мушкин Максим Артурович', NULL, NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11343896, 'ТАТУЛЬЯН НАТАЛИЯ ЮРЬЕВНА', '1973-06-23T00:00:00', '89184548909', NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11343896, 'ТАТУЛЬЯН ВЛАДИМИР КИРКОРОВИЧ', '1965-12-06T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11403309, 'МИТЮРИНА НЕЛЛИ АЛЕКСЕЕВНА', '1978-03-27T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11403309, 'МИТЮРИН ДМИТРИЙ ИВАНОВИЧ', '1980-09-27T00:00:00', '+7 (918) 0467706', NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11405187, 'Сливинский Александр Федорович', '1988-10-03T00:00:00', '89023742025', NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11405187, 'Сливинский Дмитрий Александрович', '2016-07-14T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11405187, 'СЛИВИНСКАЯ ЕЛЕНА ПЕТРОВНА', '1986-07-26T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11405187, 'Сливинская Анна Александровна', '2021-06-17T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11405986, 'ПОПОВА НАТАЛЬЯ ЛЕОНИДОВНА', '1978-12-08T00:00:00', '89183460333', NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11405986, 'ПОПОВ ЕВГЕНИЙ СЕРГЕЕВИЧ', '1975-01-31T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11408982, 'УВАРОВА АННА СЕРГЕЕВНА', '1988-07-19T00:00:00', '+7 (928) 2959868', NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11408982, 'УВАРОВ ИВАН ДМИТРИЕВИЧ', '2024-07-24T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11408982, 'УВАРОВ ДМИТРИЙ МИХАЙЛОВИЧ', '1975-04-05T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11408982, 'УВАРОВА АЛИСА ДМИТРИЕВНА', '2017-06-13T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11409769, 'ДОНЕЦ ВЛАДИСЛАВ ЮРЬЕВИЧ', '1987-01-11T00:00:00', NULL, NULL); +INSERT INTO hotels_Guest (reservation_id, name, birthdate, phone, email) VALUES (11409769, 'ДОНЕЦ ЕЛЕНА ВИКТОРОВНА', '1987-01-03T00:00:00', NULL, NULL); \ No newline at end of file