# Generated by Django 5.0.10 on 2026-01-14 07:04 import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('accounts', '0001_initial'), ('customers', '0002_initial'), ('orders', '0002_initial'), ('products', '0001_initial'), ] operations = [ migrations.CreateModel( name='Discount', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=200, verbose_name='Название скидки')), ('description', models.TextField(blank=True, verbose_name='Описание')), ('discount_type', models.CharField(choices=[('percentage', 'Процент'), ('fixed_amount', 'Фиксированная сумма')], max_length=20, verbose_name='Тип скидки')), ('value', models.DecimalField(decimal_places=2, help_text='Процент (0-100) или сумма в рублях', max_digits=10, verbose_name='Значение')), ('scope', models.CharField(choices=[('order', 'На весь заказ'), ('product', 'На товар'), ('category', 'На категорию товаров')], default='order', max_length=20, verbose_name='Уровень применения')), ('is_active', models.BooleanField(db_index=True, default=True, verbose_name='Активна')), ('start_date', models.DateTimeField(blank=True, null=True, verbose_name='Дата начала действия')), ('end_date', models.DateTimeField(blank=True, null=True, verbose_name='Дата окончания действия')), ('max_usage_count', models.PositiveIntegerField(blank=True, help_text='Оставьте пустым для безлимитного использования', null=True, verbose_name='Макс. количество использований')), ('current_usage_count', models.PositiveIntegerField(default=0, verbose_name='Текущее количество использований')), ('priority', models.PositiveIntegerField(default=0, help_text='Более высокий приоритет применяется первым', verbose_name='Приоритет')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')), ('min_order_amount', models.DecimalField(blank=True, decimal_places=2, help_text='Скидка применяется только если сумма заказа >= этого значения', max_digits=10, null=True, verbose_name='Мин. сумма заказа')), ('is_auto', models.BooleanField(default=False, help_text='Применяется автоматически при выполнении условий', verbose_name='Автоматическая')), ('combine_mode', models.CharField(choices=[('stack', 'Складывать (суммировать)'), ('max_only', 'Только максимум'), ('exclusive', 'Исключающая (отменяет остальные)')], default='max_only', help_text='stack = суммировать с другими, max_only = применить максимальную, exclusive = отменить остальные', max_length=20, verbose_name='Режим объединения')), ('categories', models.ManyToManyField(blank=True, related_name='discounts', to='products.productcategory', verbose_name='Категории')), ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_discounts', to='accounts.customuser', verbose_name='Создал')), ('excluded_products', models.ManyToManyField(blank=True, related_name='excluded_from_discounts', to='products.product', verbose_name='Исключенные товары')), ('products', models.ManyToManyField(blank=True, related_name='discounts', to='products.product', verbose_name='Товары')), ], options={ 'verbose_name': 'Скидка', 'verbose_name_plural': 'Скидки', }, ), migrations.CreateModel( name='PromoCode', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(help_text='Уникальный код (например: SALE2025, WINTER10)', max_length=50, unique=True, verbose_name='Код промокода')), ('max_uses_per_user', models.PositiveIntegerField(blank=True, help_text='Оставьте пустым для безлимитного использования', null=True, verbose_name='Макс. использований на клиента')), ('max_total_uses', models.PositiveIntegerField(blank=True, null=True, verbose_name='Макс. общее количество использований')), ('current_uses', models.PositiveIntegerField(default=0, verbose_name='Текущее количество использований')), ('is_active', models.BooleanField(default=True, verbose_name='Активен')), ('start_date', models.DateTimeField(blank=True, null=True, verbose_name='Дата начала действия')), ('end_date', models.DateTimeField(blank=True, null=True, verbose_name='Дата окончания действия')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')), ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_promo_codes', to='accounts.customuser', verbose_name='Создал')), ('discount', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='promo_codes', to='discounts.discount', verbose_name='Скидка')), ], options={ 'verbose_name': 'Промокод', 'verbose_name_plural': 'Промокоды', }, ), migrations.CreateModel( name='DiscountApplication', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('target', models.CharField(choices=[('order', 'Заказ'), ('order_item', 'Позиция заказа')], max_length=20, verbose_name='Объект применения')), ('base_amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Базовая сумма')), ('discount_amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Сумма скидки')), ('final_amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Итоговая сумма')), ('applied_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата применения')), ('applied_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='applied_discounts', to='accounts.customuser', verbose_name='Применен пользователем')), ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='discount_applications', to='customers.customer', verbose_name='Клиент')), ('discount', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='applications', to='discounts.discount', verbose_name='Скидка')), ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='discount_applications', to='orders.order', verbose_name='Заказ')), ('order_item', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='discount_applications', to='orders.orderitem', verbose_name='Позиция заказа')), ('promo_code', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='applications', to='discounts.promocode', verbose_name='Промокод')), ], options={ 'verbose_name': 'Применение скидки', 'verbose_name_plural': 'Применения скидок', }, ), migrations.AddIndex( model_name='discount', index=models.Index(fields=['is_active'], name='discounts_d_is_acti_ae32b7_idx'), ), migrations.AddIndex( model_name='discount', index=models.Index(fields=['scope'], name='discounts_d_scope_2c30a7_idx'), ), migrations.AddIndex( model_name='discount', index=models.Index(fields=['discount_type'], name='discounts_d_discoun_f47d7f_idx'), ), migrations.AddIndex( model_name='discount', index=models.Index(fields=['is_auto'], name='discounts_d_is_auto_a4fe48_idx'), ), migrations.AddIndex( model_name='promocode', index=models.Index(fields=['code'], name='discounts_p_code_f0e5a6_idx'), ), migrations.AddIndex( model_name='promocode', index=models.Index(fields=['is_active'], name='discounts_p_is_acti_25d05d_idx'), ), migrations.AddIndex( model_name='discountapplication', index=models.Index(fields=['order'], name='discounts_d_order_i_2b0f24_idx'), ), migrations.AddIndex( model_name='discountapplication', index=models.Index(fields=['discount'], name='discounts_d_discoun_c0cd4d_idx'), ), migrations.AddIndex( model_name='discountapplication', index=models.Index(fields=['promo_code'], name='discounts_d_promo_c_9ce5dd_idx'), ), migrations.AddIndex( model_name='discountapplication', index=models.Index(fields=['customer'], name='discounts_d_custome_d57e7c_idx'), ), migrations.AddIndex( model_name='discountapplication', index=models.Index(fields=['applied_at'], name='discounts_d_applied_96adbb_idx'), ), ]