# Generated by Django 5.1.4 on 2025-01-07 22:27 import django.db.models.deletion import inventory.mixins import inventory.models import phonenumber_field.modelfields from decimal import Decimal from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('django_ledger', '0017_alter_accountmodel_unique_together_and_more'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Car', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('vin', models.CharField(max_length=17, unique=True, verbose_name='VIN')), ('year', models.IntegerField(verbose_name='Year')), ('status', models.CharField(choices=[('available', 'Available'), ('sold', 'Sold'), ('hold', 'Hold'), ('damaged', 'Damaged'), ('reserved', 'Reserved')], default='available', max_length=10, verbose_name='Status')), ('stock_type', models.CharField(choices=[('new', 'New'), ('used', 'Used')], default='new', max_length=10, verbose_name='Stock Type')), ('remarks', models.TextField(blank=True, null=True, verbose_name='Remarks')), ('mileage', models.IntegerField(blank=True, null=True, verbose_name='Mileage')), ('receiving_date', models.DateTimeField(verbose_name='Receiving Date')), ], options={ 'verbose_name': 'Car', 'verbose_name_plural': 'Cars', }, ), migrations.CreateModel( name='CarEquipment', fields=[ ('id_car_equipment', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(blank=True, max_length=255, null=True)), ('arabic_name', models.CharField(blank=True, max_length=255, null=True)), ('year_begin', models.IntegerField(blank=True, null=True)), ], options={ 'verbose_name': 'Equipment', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='CarMake', fields=[ ('id_car_make', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(blank=True, max_length=255, null=True)), ('arabic_name', models.CharField(blank=True, max_length=255, null=True)), ('logo', models.ImageField(blank=True, null=True, upload_to='car_make', verbose_name='logo')), ('is_sa_import', models.BooleanField(default=False)), ('car_type', models.SmallIntegerField(choices=[(1, 'Car'), (2, 'light commercial'), (3, 'truck trailer'), (4, 'trailer'), (5, 'truck'), (6, 'bus')])), ], options={ 'verbose_name': 'Make', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='ExteriorColors', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='Name')), ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')), ], options={ 'verbose_name': 'Exterior Colors', 'verbose_name_plural': 'Exterior Colors', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='InteriorColors', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='Name')), ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')), ], options={ 'verbose_name': 'Interior Colors', 'verbose_name_plural': 'Interior Colors', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='Payment', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')), ('payment_method', models.CharField(choices=[('cash', 'cash'), ('credit', 'credit'), ('transfer', 'transfer'), ('debit', 'debit'), ('SADAD', 'SADAD')], max_length=50, verbose_name='method')), ('reference_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='reference number')), ('payment_date', models.DateField(auto_now_add=True, verbose_name='date')), ], options={ 'verbose_name': 'payment', 'verbose_name_plural': 'payments', }, ), migrations.CreateModel( name='SubscriptionPlan', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='Name of the subscription plan', max_length=100, unique=True)), ('description', models.TextField()), ('price', models.DecimalField(decimal_places=2, max_digits=10)), ('max_users', models.PositiveIntegerField(default=1, help_text='Maximum number of users allowed')), ('max_inventory_size', models.PositiveIntegerField(default=50, help_text='Maximum number of cars in inventory')), ('support_level', models.CharField(choices=[('basic', 'Basic Support'), ('priority', 'Priority Support'), ('dedicated', 'Dedicated Support')], default='basic', help_text='Level of support provided', max_length=50)), ('custom_features', models.JSONField(blank=True, help_text='Additional features specific to this plan', null=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ], options={ 'verbose_name': 'Subscription Plan', 'verbose_name_plural': 'Subscription Plans', }, ), migrations.CreateModel( name='VatRate', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('rate', models.DecimalField(decimal_places=2, default=Decimal('0.15'), max_digits=5)), ('is_active', models.BooleanField(default=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ], ), migrations.CreateModel( name='CarFinance', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('cost_price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Cost Price')), ('selling_price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Selling Price')), ('discount_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Discount Amount')), ('additional_services', models.ManyToManyField(blank=True, related_name='additional_finances', to='django_ledger.itemmodel')), ('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='finances', to='inventory.car')), ], options={ 'verbose_name': 'Car Financial Details', 'verbose_name_plural': 'Car Financial Details', }, ), migrations.AddField( model_name='car', name='id_car_make', field=models.ForeignKey(blank=True, db_column='id_car_make', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake', verbose_name='Make'), ), migrations.CreateModel( name='CarModel', fields=[ ('id_car_model', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(blank=True, max_length=255, null=True)), ('arabic_name', models.CharField(blank=True, max_length=255, null=True)), ('id_car_make', models.ForeignKey(db_column='id_car_make', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake')), ], options={ 'verbose_name': 'Model', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.AddField( model_name='car', name='id_car_model', field=models.ForeignKey(blank=True, db_column='id_car_model', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel', verbose_name='Model'), ), migrations.CreateModel( name='CarOption', fields=[ ('id_car_option', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(blank=True, max_length=255, null=True)), ('arabic_name', models.CharField(blank=True, max_length=255, null=True)), ('id_parent', models.ForeignKey(blank=True, db_column='id_parent', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.caroption')), ], options={ 'verbose_name': 'Option', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='CarOptionValue', fields=[ ('id_car_option_value', models.AutoField(primary_key=True, serialize=False)), ('value', models.CharField(max_length=500)), ('unit', models.CharField(blank=True, max_length=255, null=True)), ('is_base', models.IntegerField()), ('id_car_equipment', models.ForeignKey(db_column='id_car_equipment', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carequipment')), ('id_car_option', models.ForeignKey(db_column='id_car_option', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.caroption')), ], options={ 'verbose_name': 'Option Value', }, ), migrations.CreateModel( name='CarRegistration', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('plate_number', models.IntegerField(verbose_name='Plate Number')), ('text1', models.CharField(max_length=1, verbose_name='Text 1')), ('text2', models.CharField(max_length=1, verbose_name='Text 2')), ('text3', models.CharField(max_length=1, verbose_name='Text 3')), ('registration_date', models.DateTimeField(verbose_name='Registration Date')), ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='registrations', to='inventory.car', verbose_name='Car')), ], options={ 'verbose_name': 'Registration', 'verbose_name_plural': 'Registrations', }, ), migrations.CreateModel( name='CarSerie', fields=[ ('id_car_serie', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(blank=True, max_length=255, null=True)), ('arabic_name', models.CharField(blank=True, max_length=255, null=True)), ('year_begin', models.IntegerField(blank=True, null=True)), ('year_end', models.IntegerField(blank=True, null=True)), ('generation_name', models.CharField(blank=True, max_length=255, null=True)), ('id_car_model', models.ForeignKey(db_column='id_car_model', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel')), ], options={ 'verbose_name': 'Series', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.AddField( model_name='car', name='id_car_serie', field=models.ForeignKey(blank=True, db_column='id_car_serie', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carserie', verbose_name='Series'), ), migrations.CreateModel( name='CarSpecification', fields=[ ('id_car_specification', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(max_length=255)), ('arabic_name', models.CharField(max_length=255)), ('id_parent', models.ForeignKey(blank=True, db_column='id_parent', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carspecification')), ], options={ 'verbose_name': 'Specification', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='CarTrim', fields=[ ('id_car_trim', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(blank=True, max_length=255, null=True)), ('arabic_name', models.CharField(blank=True, max_length=255, null=True)), ('start_production_year', models.IntegerField(blank=True, null=True)), ('end_production_year', models.IntegerField(blank=True, null=True)), ('id_car_serie', models.ForeignKey(db_column='id_car_serie', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carserie')), ], options={ 'verbose_name': 'Trim', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='CarSpecificationValue', fields=[ ('id_car_specification_value', models.AutoField(primary_key=True, serialize=False)), ('value', models.CharField(max_length=500)), ('unit', models.CharField(blank=True, max_length=255, null=True)), ('id_car_specification', models.ForeignKey(db_column='id_car_specification', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carspecification')), ('id_car_trim', models.ForeignKey(db_column='id_car_trim', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.cartrim')), ], options={ 'verbose_name': 'Specification Value', }, ), migrations.AddField( model_name='carequipment', name='id_car_trim', field=models.ForeignKey(db_column='id_car_trim', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.cartrim'), ), migrations.AddField( model_name='car', name='id_car_trim', field=models.ForeignKey(blank=True, db_column='id_car_trim', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.cartrim', verbose_name='Trim'), ), migrations.CreateModel( name='CustomCard', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('custom_number', models.CharField(max_length=255, verbose_name='Custom Number')), ('custom_date', models.DateField(verbose_name='Custom Date')), ('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='custom_cards', to='inventory.car', verbose_name='Car')), ], options={ 'verbose_name': 'Custom Card', 'verbose_name_plural': 'Custom Cards', }, ), migrations.CreateModel( name='Dealer', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('crn', models.CharField(blank=True, max_length=10, null=True, verbose_name='Commercial Registration Number')), ('vrn', models.CharField(blank=True, max_length=15, null=True, verbose_name='VAT Registration Number')), ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('name', models.CharField(max_length=255, verbose_name='English Name')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), ('logo', models.ImageField(blank=True, null=True, upload_to='logos/users', verbose_name='Logo')), ('joined_at', models.DateTimeField(auto_now_add=True, verbose_name='Joined At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('entity', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.entitymodel')), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='dealer', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Dealer', 'verbose_name_plural': 'Dealers', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), managers=[ ('objects', inventory.models.DealerUserManager()), ], ), migrations.CreateModel( name='Customer', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('first_name', models.CharField(max_length=50, verbose_name='First Name')), ('middle_name', models.CharField(blank=True, max_length=50, null=True, verbose_name='Middle Name')), ('last_name', models.CharField(max_length=50, verbose_name='Last Name')), ('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')), ('national_id', models.CharField(max_length=10, unique=True, verbose_name='National ID')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', unique=True, verbose_name='Phone Number')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), ('is_lead', models.BooleanField(default=False, verbose_name='Is Lead')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customers', to='inventory.dealer')), ], options={ 'verbose_name': 'Customer', 'verbose_name_plural': 'Customers', }, ), migrations.CreateModel( name='CarLocation', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('description', models.TextField(blank=True, help_text='Optional description about the showroom placement.', null=True, verbose_name='Description')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Last Updated')), ('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='location', to='inventory.car', verbose_name='Car')), ('owner', models.ForeignKey(help_text='Dealer who owns the car.', on_delete=django.db.models.deletion.CASCADE, related_name='owned_cars', to='inventory.dealer', verbose_name='Owner')), ('showroom', models.ForeignKey(help_text='Dealer where the car is displayed (can be the owner).', on_delete=django.db.models.deletion.CASCADE, related_name='showroom_cars', to='inventory.dealer', verbose_name='Showroom')), ], options={ 'verbose_name': 'Car Location', 'verbose_name_plural': 'Car Locations', }, ), migrations.AddField( model_name='car', name='dealer', field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.dealer', verbose_name='Dealer'), ), migrations.CreateModel( name='AdditionalServices', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='Name')), ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('description', models.TextField(verbose_name='Description')), ('price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Price')), ('taxable', models.BooleanField(default=False, verbose_name='taxable')), ('uom', models.CharField(choices=[('EA', 'Each'), ('PR', 'Pair'), ('SET', 'Set'), ('GAL', 'Gallon'), ('L', 'Liter'), ('M', 'Meter'), ('KG', 'Kilogram'), ('HR', 'Hour'), ('BX', 'Box'), ('RL', 'Roll'), ('PKG', 'Package'), ('DZ', 'Dozen'), ('SQ_M', 'Square Meter'), ('PC', 'Piece'), ('BDL', 'Bundle')], max_length=10, verbose_name='Unit of Measurement')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.dealer', verbose_name='Dealer')), ], options={ 'verbose_name': 'Additional Services', 'verbose_name_plural': 'Additional Services', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='Notification', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('message', models.CharField(max_length=255, verbose_name='Message')), ('is_read', models.BooleanField(default=False, verbose_name='Is Read')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Notification', 'verbose_name_plural': 'Notifications', 'ordering': ['-created_at'], }, ), migrations.CreateModel( name='Opportunity', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('deal_name', models.CharField(max_length=255, verbose_name='Deal Name')), ('deal_value', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Deal Value')), ('deal_status', models.CharField(choices=[('new', 'New'), ('pending', 'Pending'), ('canceled', 'Canceled'), ('completed', 'Completed')], default='new', max_length=20, verbose_name='Deal Status')), ('priority', models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')], default='low', max_length=10, verbose_name='Priority')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('car', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='inventory.car', verbose_name='Car')), ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='inventory.customer')), ], options={ 'verbose_name': 'Opportunity', 'verbose_name_plural': 'Opportunities', }, ), migrations.CreateModel( name='Notes', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('note', models.TextField(verbose_name='Note')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='notes_created', to=settings.AUTH_USER_MODEL)), ('opportunity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='inventory.opportunity')), ], options={ 'verbose_name': 'Notes', 'verbose_name_plural': 'Notes', }, ), migrations.CreateModel( name='Organization', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='Name')), ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('crn', models.CharField(max_length=15, verbose_name='Commercial Registration Number')), ('vrn', models.CharField(max_length=15, verbose_name='VAT Registration Number')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), ('logo', models.ImageField(blank=True, null=True, upload_to='logos', verbose_name='Logo')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='organizations', to='inventory.dealer')), ], options={ 'verbose_name': 'Organization', 'verbose_name_plural': 'Organizations', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='Refund', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')), ('reason', models.TextField(blank=True, verbose_name='reason')), ('refund_date', models.DateField(auto_now_add=True, verbose_name='refund date')), ('payment', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='refund', to='inventory.payment')), ], options={ 'verbose_name': 'refund', 'verbose_name_plural': 'refunds', }, ), migrations.CreateModel( name='Representative', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='Name')), ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('id_number', models.CharField(max_length=10, verbose_name='ID Number')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('email', models.EmailField(max_length=255, verbose_name='Email Address')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='representatives', to='inventory.dealer')), ('organization', models.ManyToManyField(related_name='representatives', to='inventory.organization')), ], options={ 'verbose_name': 'Representative', 'verbose_name_plural': 'Representatives', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='SaleQuotation', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('quotation_number', models.CharField(max_length=10, unique=True)), ('amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=10, verbose_name='Amount')), ('remarks', models.TextField(blank=True, null=True, verbose_name='Remarks')), ('is_approved', models.BooleanField(default=False)), ('status', models.CharField(choices=[('Draft', 'Draft'), ('Approved', 'Approved'), ('In Review', 'In Review'), ('Paid', 'Paid')], default='Draft', max_length=10, verbose_name='Status')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('posted', models.BooleanField(default=False)), ('payment_id', models.CharField(blank=True, max_length=255, null=True, verbose_name='Payment ID')), ('is_paid', models.BooleanField(default=False)), ('date_draft', models.DateTimeField(blank=True, null=True, verbose_name='Draft Date')), ('date_in_review', models.DateTimeField(blank=True, null=True, verbose_name='In Review Date')), ('date_approved', models.DateTimeField(blank=True, null=True, verbose_name='Approved Date')), ('date_paid', models.DateTimeField(blank=True, null=True, verbose_name='Paid Date')), ('date_void', models.DateTimeField(blank=True, null=True, verbose_name='Void Date')), ('date_canceled', models.DateTimeField(blank=True, null=True, verbose_name='Canceled Date')), ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quotations', to='inventory.customer', verbose_name='Customer')), ('dealer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sales', to='inventory.dealer')), ], ), migrations.AddField( model_name='payment', name='quotation', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to='inventory.salequotation'), ), migrations.CreateModel( name='SaleQuotationCar', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('quantity', models.PositiveIntegerField(default=1, verbose_name='Quantity')), ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.car', verbose_name='Car')), ('quotation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quotation_cars', to='inventory.salequotation', verbose_name='Quotation')), ], ), migrations.CreateModel( name='SalesOrder', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('total_amount', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Total Amount')), ('quotation', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='sales_order', to='inventory.salequotation', verbose_name='Quotation')), ], ), migrations.CreateModel( name='Staff', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='Name')), ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('staff_type', models.CharField(choices=[('manager', 'Manager'), ('inventory', 'Inventory'), ('accountant', 'Accountant'), ('sales', 'Sales'), ('coordinator', 'Coordinator'), ('receptionist', 'Receptionist'), ('agent', 'Agent')], max_length=255, verbose_name='Staff Type')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='staff', to='inventory.dealer')), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='staff', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Staff', 'verbose_name_plural': 'Staff', 'permissions': [], }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='OpportunityLog', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('action', models.CharField(choices=[('create', 'Create'), ('update', 'Update'), ('delete', 'Delete'), ('status_change', 'Status Change')], max_length=50, verbose_name='Action')), ('old_status', models.CharField(blank=True, choices=[('new', 'New'), ('pending', 'Pending'), ('canceled', 'Canceled'), ('completed', 'Completed')], max_length=50, null=True, verbose_name='Old Status')), ('new_status', models.CharField(blank=True, choices=[('new', 'New'), ('pending', 'Pending'), ('canceled', 'Canceled'), ('completed', 'Completed')], max_length=50, null=True, verbose_name='New Status')), ('details', models.TextField(blank=True, null=True, verbose_name='Details')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('opportunity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='inventory.opportunity')), ('staff', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='inventory.staff', verbose_name='Staff')), ], options={ 'verbose_name': 'Log', 'verbose_name_plural': 'Logs', 'ordering': ['-created_at'], }, ), migrations.AddField( model_name='opportunity', name='created_by', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='deals_created', to='inventory.staff'), ), migrations.CreateModel( name='Subscription', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('start_date', models.DateField(help_text='Date when the subscription starts')), ('end_date', models.DateField(help_text='Date when the subscription ends')), ('is_active', models.BooleanField(default=True)), ('billing_cycle', models.CharField(choices=[('monthly', 'Monthly'), ('annual', 'Annual')], default='monthly', help_text='Billing cycle for the subscription', max_length=10)), ('last_payment_date', models.DateField(blank=True, help_text='Date of the last payment made', null=True)), ('next_payment_date', models.DateField(blank=True, help_text='Date of the next payment due', null=True)), ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subscriptions', to='inventory.subscriptionplan')), ], options={ 'verbose_name': 'Subscription', 'verbose_name_plural': 'Subscriptions', }, ), migrations.CreateModel( name='SubscriptionUser', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('subscription', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.subscription')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Subscription User', 'verbose_name_plural': 'Subscription Users', }, ), migrations.AddField( model_name='subscription', name='users', field=models.ManyToManyField(through='inventory.SubscriptionUser', to=settings.AUTH_USER_MODEL), ), migrations.CreateModel( name='UserActivityLog', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('action', models.TextField()), ('timestamp', models.DateTimeField(auto_now_add=True)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'User Activity Log', 'verbose_name_plural': 'User Activity Logs', 'ordering': ['-timestamp'], }, ), migrations.CreateModel( name='Vendor', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('crn', models.CharField(max_length=10, unique=True, verbose_name='Commercial Registration Number')), ('vrn', models.CharField(max_length=15, unique=True, verbose_name='VAT Registration Number')), ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('name', models.CharField(max_length=255, verbose_name='English Name')), ('contact_person', models.CharField(max_length=100, verbose_name='Contact Person')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('email', models.EmailField(max_length=255, verbose_name='Email Address')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), ('logo', models.ImageField(blank=True, null=True, upload_to='logos/vendors', verbose_name='Logo')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='vendors', to='inventory.dealer')), ], options={ 'verbose_name': 'Vendor', 'verbose_name_plural': 'Vendors', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.AddField( model_name='car', name='vendor', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.vendor', verbose_name='Vendor'), ), migrations.CreateModel( name='CarReservation', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('reserved_at', models.DateTimeField(auto_now_add=True, verbose_name='Reserved At')), ('reserved_until', models.DateTimeField(verbose_name='Reserved Until')), ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='inventory.car', verbose_name='Car')), ('reserved_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to=settings.AUTH_USER_MODEL, verbose_name='Reserved By')), ], options={ 'verbose_name': 'Car Reservation', 'verbose_name_plural': 'Car Reservations', 'ordering': ['-reserved_at'], 'unique_together': {('car', 'reserved_until')}, }, ), migrations.CreateModel( name='CarColors', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.car')), ('exterior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.exteriorcolors')), ('interior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.interiorcolors')), ], options={ 'verbose_name': 'Color', 'verbose_name_plural': 'Colors', 'unique_together': {('car', 'exterior', 'interior')}, }, ), ]