diff --git a/antifroud/management/commands/fraud_check.py b/antifroud/management/commands/fraud_check.py new file mode 100644 index 00000000..58e82d2a --- /dev/null +++ b/antifroud/management/commands/fraud_check.py @@ -0,0 +1,8 @@ +from django.core.management.base import BaseCommand +from antifroud.check_fraud import run_reservation_check + +class Command(BaseCommand): + help = "Запуск проверки на несоответствия" + + def handle(self, *args, **options): + run_reservation_check() diff --git a/antifroud/migrations/0003_alter_roomdiscrepancy_booking_id_and_more.py b/antifroud/migrations/0003_alter_roomdiscrepancy_booking_id_and_more.py new file mode 100644 index 00000000..f3b61fed --- /dev/null +++ b/antifroud/migrations/0003_alter_roomdiscrepancy_booking_id_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 5.1.4 on 2025-02-01 06:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('antifroud', '0002_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='roomdiscrepancy', + name='booking_id', + field=models.CharField(max_length=255, null=True, verbose_name='ID бронирования'), + ), + migrations.AlterField( + model_name='roomdiscrepancy', + name='check_in_date_actual', + field=models.DateField(null=True, verbose_name='Фактическая дата заселения'), + ), + migrations.AlterField( + model_name='roomdiscrepancy', + name='check_in_date_expected', + field=models.DateField(null=True, verbose_name='Ожидаемая дата заселения'), + ), + ] diff --git a/antifroud/migrations/0004_alter_roomdiscrepancy_discrepancy_type.py b/antifroud/migrations/0004_alter_roomdiscrepancy_discrepancy_type.py new file mode 100644 index 00000000..8f3c2879 --- /dev/null +++ b/antifroud/migrations/0004_alter_roomdiscrepancy_discrepancy_type.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.4 on 2025-02-01 06:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('antifroud', '0003_alter_roomdiscrepancy_booking_id_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='roomdiscrepancy', + name='discrepancy_type', + field=models.CharField(choices=[('early', 'Раннее заселение'), ('late', 'Позднее заселение'), ('missed', 'Неявка'), ('no_booking', 'Без брони')], max_length=50, verbose_name='Тип несоответствия'), + ), + ] diff --git a/antifroud/models.py b/antifroud/models.py index d113a827..d0f996a0 100644 --- a/antifroud/models.py +++ b/antifroud/models.py @@ -42,7 +42,7 @@ class UserActivityLog(models.Model): return "Нет данных" # Изменение имени столбца - + class Meta: indexes = [ models.Index(fields=["external_id"], name="idx_external_id"), @@ -55,7 +55,7 @@ class UserActivityLog(models.Model): verbose_name_plural = "Логи активности пользователей" def __str__(self): return f"UserActivityLog {self.id}: {self.page_title}" - + class Meta: verbose_name = "Регистрация посетителей" verbose_name_plural = "Регистрации посетителей" @@ -63,7 +63,7 @@ class UserActivityLog(models.Model): def get_location(self): if not self.ip: return "IP-адрес отсутствует" - + try: db_path = f"{settings.GEOIP_PATH}/GeoLite2-City.mmdb" geoip_reader = Reader(db_path) @@ -107,12 +107,12 @@ class ExternalDBSettings(models.Model): class RoomDiscrepancy(models.Model): hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Отель") room_number = models.CharField(max_length=50, verbose_name="Номер комнаты") - booking_id = models.CharField(max_length=255, verbose_name="ID бронирования") - check_in_date_expected = models.DateField(verbose_name="Ожидаемая дата заселения") - check_in_date_actual = models.DateField(verbose_name="Фактическая дата заселения") + booking_id = models.CharField(max_length=255, null=True, verbose_name="ID бронирования") + check_in_date_expected = models.DateField(null=True, verbose_name="Ожидаемая дата заселения") + check_in_date_actual = models.DateField(null=True, verbose_name="Фактическая дата заселения") discrepancy_type = models.CharField( max_length=50, - choices=[("early", "Раннее заселение"), ("late", "Позднее заселение"), ("missed", "Неявка")], + choices=[("early", "Раннее заселение"), ("late", "Позднее заселение"), ("missed", "Неявка"), ("no_booking", "Без брони")], verbose_name="Тип несоответствия" ) created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания") @@ -216,8 +216,8 @@ class SyncLog(models.Model): def __str__(self): return f"Отель: {self.hotel.name} | Получено: {self.recieved_records} | Обработано: {self.processed_records}" - - + + class ViolationLog(models.Model): hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Отель") room_number = models.CharField(max_length=50, verbose_name="Номер комнаты", null=True, blank=True)