from django.db import models from django.core.validators import MinValueValidator, MaxValueValidator class APIConfiguration(models.Model): name = models.CharField(max_length=255, verbose_name="Название API") url = models.URLField(verbose_name="URL API") token = models.CharField(max_length=255, blank=True, null=True, verbose_name="Токен") username = models.CharField(max_length=255, blank=True, null=True, verbose_name="Логин") password = models.CharField(max_length=255, blank=True, null=True, verbose_name="Пароль") last_updated = models.DateTimeField(auto_now=True, verbose_name="Дата последнего обновления") def __str__(self): return self.name class Meta: verbose_name = "Конфигурация API" verbose_name_plural = "Конфигурации API" class Hotel(models.Model): name = models.CharField(max_length=255, verbose_name="Название отеля") api = models.OneToOneField( APIConfiguration, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="API", help_text="API, связанный с этим отелем." ) created_at = models.DateTimeField(auto_now_add=True, verbose_name="Создан") pms = models.ForeignKey( 'pms_integration.PMSConfiguration', on_delete=models.SET_NULL, null=True, blank=True, verbose_name="PMS система" ) def __str__(self): return self.name class Meta: verbose_name = "Отель" verbose_name_plural = "Отели" class UserHotel(models.Model): user = models.ForeignKey( 'users.User', # Используем строковую ссылку on_delete=models.CASCADE, related_name="user_hotels", verbose_name="Пользователь" ) hotel = models.ForeignKey( 'hotels.Hotel', on_delete=models.CASCADE, related_name="hotel_users", verbose_name="Отель" ) def __str__(self): return f"{self.user.username} - {self.hotel.name}" class Meta: verbose_name = "Пользователь отеля" verbose_name_plural = "Пользователи отелей" class APIRequestLog(models.Model): api = models.ForeignKey(APIConfiguration, on_delete=models.CASCADE, verbose_name="API") request_time = models.DateTimeField(auto_now_add=True, verbose_name="Время запроса") response_status = models.IntegerField(verbose_name="HTTP статус ответа", validators=[MinValueValidator(100), MaxValueValidator(599)]) response_data = models.JSONField(verbose_name="Данные ответа", blank=True, null=True) def __str__(self): return f"{self.api.name} - {self.request_time}" class Meta: verbose_name = "Журнал запросов API" verbose_name_plural = "Журналы запросов API" indexes = [ models.Index(fields=['api']), models.Index(fields=['request_time']), ] 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 = "Гости"