# Generated by Django 5.2.8 on 2025-12-04 19:27 import django.db.models.deletion from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('schedule', '0027_add_deposit_percent_back'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Holiday', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(help_text="Unique identifier (e.g., 'thanksgiving_us', 'christmas')", max_length=50, unique=True)), ('name', models.CharField(max_length=100)), ('country', models.CharField(db_index=True, default='US', help_text='ISO 3166-1 alpha-2 country code', max_length=2)), ('holiday_type', models.CharField(choices=[('FIXED', 'Fixed date'), ('FLOATING', 'Floating (Nth weekday of month)'), ('CALCULATED', 'Calculated (algorithm-based)')], default='FIXED', max_length=20)), ('month', models.PositiveSmallIntegerField(blank=True, help_text='Month (1-12)', null=True)), ('day', models.PositiveSmallIntegerField(blank=True, help_text='Day of month (1-31)', null=True)), ('week_of_month', models.PositiveSmallIntegerField(blank=True, help_text="Week of month (1-4, or 5 for 'last')", null=True)), ('day_of_week', models.PositiveSmallIntegerField(blank=True, help_text='Day of week (0=Monday, 6=Sunday)', null=True)), ('calculation_rule', models.CharField(blank=True, help_text="Calculation rule (e.g., 'easter', 'easter-2' for Good Friday)", max_length=50)), ('is_active', models.BooleanField(default=True)), ], options={ 'ordering': ['country', 'name'], 'indexes': [models.Index(fields=['country', 'is_active'], name='schedule_ho_country_b41340_idx')], }, ), migrations.CreateModel( name='TimeBlock', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(help_text="Display title (e.g., 'Christmas Day', 'Lunch Break')", max_length=200)), ('description', models.TextField(blank=True, help_text='Optional description or reason for block')), ('block_type', models.CharField(choices=[('HARD', 'Hard Block (prevents booking)'), ('SOFT', 'Soft Block (warning only, override allowed)')], default='HARD', help_text='HARD prevents booking; SOFT shows warning but allows override', max_length=10)), ('recurrence_type', models.CharField(choices=[('NONE', 'No recurrence (specific date/range)'), ('WEEKLY', 'Weekly (specific days of week)'), ('MONTHLY', 'Monthly (specific days of month)'), ('YEARLY', 'Yearly (specific days of year)'), ('HOLIDAY', 'Holiday (floating dates)')], db_index=True, default='NONE', max_length=20)), ('start_date', models.DateField(blank=True, help_text='Start date for one-time blocks', null=True)), ('end_date', models.DateField(blank=True, help_text='End date for one-time blocks (same as start for single day)', null=True)), ('all_day', models.BooleanField(default=True, help_text='If true, blocks entire day; if false, uses start/end time')), ('start_time', models.TimeField(blank=True, help_text='Start time (if not all-day)', null=True)), ('end_time', models.TimeField(blank=True, help_text='End time (if not all-day)', null=True)), ('recurrence_pattern', models.JSONField(blank=True, default=dict, help_text='\n Recurrence configuration:\n - WEEKLY: {"days_of_week": [0,1,2]} (0=Mon, 6=Sun)\n - MONTHLY: {"days_of_month": [1, 15]}\n - YEARLY: {"month": 7, "day": 4} or {"month": 12, "day": 25}\n - HOLIDAY: {"holiday_code": "thanksgiving_us"}\n ')), ('recurrence_start', models.DateField(blank=True, help_text='When this recurring block becomes active', null=True)), ('recurrence_end', models.DateField(blank=True, help_text='When this recurring block ends (null = forever)', null=True)), ('is_active', models.BooleanField(db_index=True, default=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_time_blocks', to=settings.AUTH_USER_MODEL)), ('resource', models.ForeignKey(blank=True, help_text='Specific resource (null = business-level block)', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='time_blocks', to='schedule.resource')), ], options={ 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['resource', 'is_active'], name='schedule_ti_resourc_1e9a5d_idx'), models.Index(fields=['recurrence_type', 'is_active'], name='schedule_ti_recurre_b7b096_idx'), models.Index(fields=['start_date', 'end_date'], name='schedule_ti_start_d_bba9d9_idx')], }, ), ]