755 lines
51 KiB
Python
755 lines
51 KiB
Python
# Generated by Django 5.1.7 on 2025-03-27 20:55
|
|
|
|
import datetime
|
|
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 = [
|
|
('appointment', '0001_initial'),
|
|
('auth', '0012_alter_user_first_name_max_length'),
|
|
('contenttypes', '0002_remove_content_type_name'),
|
|
('django_ledger', '0021_alter_bankaccountmodel_account_model_and_more'),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
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(blank=True, choices=[(1, 'Car'), (2, 'Light Commercial'), (3, 'Heavy-Duty Tractors'), (4, 'Trailers'), (5, 'Medium Trucks'), (6, 'Buses'), (20, 'Motorcycles'), (21, 'Buggy'), (22, 'Moto ATV'), (23, 'Scooters'), (24, 'Karting'), (25, 'ATV'), (26, 'Snowmobiles')], null=True)),
|
|
],
|
|
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='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='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')),
|
|
('item', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='django_ledger.itemmodel', verbose_name='Item')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Additional Services',
|
|
'verbose_name_plural': 'Additional Services',
|
|
},
|
|
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
|
|
),
|
|
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'), ('transfer', 'Transfer')], 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')),
|
|
('hash', models.CharField(blank=True, max_length=64, null=True, verbose_name='Hash')),
|
|
('vendor', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='django_ledger.vendormodel', verbose_name='Vendor')),
|
|
('id_car_make', 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')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Car',
|
|
'verbose_name_plural': 'Cars',
|
|
},
|
|
),
|
|
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='inventory.additionalservices')),
|
|
('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.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(blank=True, max_length=1, null=True, verbose_name='Text 2')),
|
|
('text3', models.CharField(blank=True, max_length=1, null=True, verbose_name='Text 3')),
|
|
('registration_date', models.DateTimeField(verbose_name='Registration Date')),
|
|
('car', models.OneToOneField(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='CustomGroup',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('name', models.CharField(max_length=100)),
|
|
('group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='auth.group', verbose_name='')),
|
|
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='groups', to='inventory.dealer')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Customer',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('title', models.CharField(choices=[('mr', 'Mr'), ('mrs', 'Mrs'), ('ms', 'Ms'), ('miss', 'Miss'), ('dr', 'Dr'), ('prof', 'Prof'), ('prince', 'Prince'), ('princess', 'Princess'), ('company', 'Company'), ('na', 'N/A')], default='na', max_length=10, verbose_name='Title')),
|
|
('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')),
|
|
('gender', models.CharField(choices=[('m', 'Male'), ('f', 'Female')], max_length=1, verbose_name='Gender')),
|
|
('dob', models.DateField(verbose_name='Date of Birth')),
|
|
('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')),
|
|
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
|
|
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='customer_profile', to=settings.AUTH_USER_MODEL)),
|
|
('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='CarTransfer',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('transfer_date', models.DateTimeField(auto_now_add=True, verbose_name='Transfer Date')),
|
|
('quantity', models.IntegerField(default=1, verbose_name='Quantity')),
|
|
('remarks', models.TextField(blank=True, null=True, verbose_name='Remarks')),
|
|
('status', models.CharField(default='draft', max_length=10, verbose_name=[('draft', 'Draft'), ('approved', 'Approved'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('success', 'Success'), ('reject', 'Reject'), ('cancelled', 'Cancelled')])),
|
|
('is_approved', models.BooleanField(default=False)),
|
|
('active', models.BooleanField(default=True)),
|
|
('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(on_delete=django.db.models.deletion.CASCADE, related_name='transfer_logs', to='inventory.car', verbose_name='Car')),
|
|
('from_dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_out', to='inventory.dealer', verbose_name='From Dealer')),
|
|
('to_dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_in', to='inventory.dealer', verbose_name='To Dealer')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Car Transfer Log',
|
|
'verbose_name_plural': 'Car Transfer Logs',
|
|
},
|
|
),
|
|
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.AddField(
|
|
model_name='additionalservices',
|
|
name='dealer',
|
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.dealer', verbose_name='Dealer'),
|
|
),
|
|
migrations.CreateModel(
|
|
name='Activity',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('object_id', models.PositiveIntegerField()),
|
|
('activity_type', models.CharField(choices=[('call', 'Call'), ('sms', 'SMS'), ('email', 'Email'), ('whatsapp', 'WhatsApp'), ('visit', 'Visit'), ('add_car', 'Add Car'), ('sale_car', 'Sale Car'), ('reserve_car', 'Reserve Car'), ('transfer_car', 'Transfer Car'), ('remove_car', 'Remove Car'), ('create_quotation', 'Create Quotation'), ('cancel_quotation', 'Cancel Quotation'), ('create_order', 'Create Order'), ('cancel_order', 'Cancel Order'), ('create_invoice', 'Create Invoice'), ('cancel_invoice', 'Cancel Invoice')], max_length=50, verbose_name='Activity Type')),
|
|
('notes', models.TextField(blank=True, null=True, verbose_name='Notes')),
|
|
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
|
|
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
|
|
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='contenttypes.contenttype')),
|
|
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='activities_created_by', to=settings.AUTH_USER_MODEL)),
|
|
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='inventory.dealer')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Activity',
|
|
'verbose_name_plural': 'Activities',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='DealerSettings',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('additional_info', models.JSONField(blank=True, default=dict, null=True)),
|
|
('bill_cash_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bill_cash', to='django_ledger.accountmodel')),
|
|
('bill_prepaid_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bill_prepaid', to='django_ledger.accountmodel')),
|
|
('bill_unearned_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bill_unearned', to='django_ledger.accountmodel')),
|
|
('dealer', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='settings', to='inventory.dealer')),
|
|
('invoice_cash_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='invoice_cash', to='django_ledger.accountmodel')),
|
|
('invoice_prepaid_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='invoice_prepaid', to='django_ledger.accountmodel')),
|
|
('invoice_unearned_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='invoice_unearned', to='django_ledger.accountmodel')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Email',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('object_id', models.PositiveIntegerField()),
|
|
('from_email', models.TextField(blank=True, null=True, verbose_name='From Email')),
|
|
('to_email', models.TextField(blank=True, null=True, verbose_name='To Email')),
|
|
('subject', models.TextField(blank=True, null=True, verbose_name='Subject')),
|
|
('message', models.TextField(blank=True, null=True, verbose_name='Message')),
|
|
('status', models.CharField(choices=[('SENT', 'Sent'), ('FAILED', 'Failed'), ('DELIVERED', 'Delivered'), ('OPEN', 'Open'), ('DRAFT', 'Draft')], default='OPEN', max_length=20, verbose_name='Status')),
|
|
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
|
|
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
|
|
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')),
|
|
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='emails_created', to=settings.AUTH_USER_MODEL)),
|
|
],
|
|
options={
|
|
'verbose_name': 'Email',
|
|
'verbose_name_plural': 'Emails',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Lead',
|
|
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')),
|
|
('last_name', models.CharField(max_length=50, verbose_name='Last Name')),
|
|
('email', models.EmailField(max_length=254, verbose_name='Email')),
|
|
('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')),
|
|
('lead_type', models.CharField(choices=[('customer', 'Customer'), ('organization', 'Organization')], default='customer', max_length=50, verbose_name='Lead Type')),
|
|
('year', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Year')),
|
|
('source', models.CharField(choices=[('referrals', 'Referrals'), ('whatsapp', 'WhatsApp'), ('showroom', 'Showroom'), ('tiktok', 'TikTok'), ('instagram', 'Instagram'), ('x', 'X'), ('facebook', 'Facebook'), ('motory', 'Motory'), ('influencers', 'Influencers'), ('youtube', 'Youtube'), ('campaign', 'Campaign')], max_length=50, verbose_name='Source')),
|
|
('channel', models.CharField(choices=[('walk_in', 'Walk In'), ('toll_free', 'Toll Free'), ('website', 'Website'), ('email', 'Email'), ('form', 'Form')], max_length=50, verbose_name='Channel')),
|
|
('crn', models.CharField(blank=True, max_length=10, null=True, unique=True, verbose_name='Commercial Registration Number')),
|
|
('vrn', models.CharField(blank=True, max_length=15, null=True, unique=True, verbose_name='VAT Registration Number')),
|
|
('address', models.CharField(max_length=50, verbose_name='address')),
|
|
('priority', models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')], default='medium', max_length=10, verbose_name='Priority')),
|
|
('status', models.CharField(choices=[('new', 'New'), ('pending', 'Pending'), ('in_progress', 'In Progress'), ('qualified', 'Qualified'), ('contacted', 'Contacted'), ('converted', 'Converted'), ('canceled', 'Canceled')], db_index=True, default='new', max_length=50, verbose_name='Status')),
|
|
('created', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Created')),
|
|
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
|
|
('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='leads', to='django_ledger.customermodel')),
|
|
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='leads', to='inventory.dealer')),
|
|
('id_car_make', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake', verbose_name='Make')),
|
|
('id_car_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel', verbose_name='Model')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Lead',
|
|
'verbose_name_plural': 'Leads',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Notes',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('object_id', models.PositiveIntegerField()),
|
|
('note', models.TextField(verbose_name='Note')),
|
|
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
|
|
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
|
|
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')),
|
|
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='notes_created', to=settings.AUTH_USER_MODEL)),
|
|
],
|
|
options={
|
|
'verbose_name': 'Note',
|
|
'verbose_name_plural': 'Notes',
|
|
},
|
|
),
|
|
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', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
|
|
('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'],
|
|
},
|
|
),
|
|
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', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
|
|
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
|
|
('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, unique=True, 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='SaleOrder',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('payment_method', models.CharField(choices=[('cash', 'Cash'), ('finance', 'Finance'), ('lease', 'Lease'), ('credit_card', 'Credit Card'), ('bank_transfer', 'Bank Transfer'), ('SADAD', 'SADAD')], max_length=20)),
|
|
('comments', models.TextField(blank=True, null=True)),
|
|
('formatted_order_id', models.CharField(editable=False, max_length=10, unique=True)),
|
|
('created', models.DateTimeField(auto_now_add=True)),
|
|
('estimate', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='django_ledger.estimatemodel', verbose_name='Estimate')),
|
|
('invoice', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='django_ledger.invoicemodel', verbose_name='Invoice')),
|
|
],
|
|
options={
|
|
'ordering': ['-created'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Schedule',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('purpose', models.CharField(choices=[('Product Demo', 'Product Demo'), ('Follow-Up Call', 'Follow-Up Call'), ('Contract Discussion', 'Contract Discussion'), ('Sales Meeting', 'Sales Meeting'), ('Support Call', 'Support Call'), ('Other', 'Other')], max_length=200)),
|
|
('scheduled_at', models.DateTimeField()),
|
|
('scheduled_type', models.CharField(choices=[('Call', 'Call'), ('Meeting', 'Meeting'), ('Email', 'Email')], default='Call', max_length=200)),
|
|
('duration', models.DurationField(default=datetime.timedelta(seconds=300))),
|
|
('notes', models.TextField(blank=True, null=True)),
|
|
('status', models.CharField(choices=[('Scheduled', 'Scheduled'), ('Completed', 'Completed'), ('Canceled', 'Canceled')], default='Scheduled', max_length=200)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='schedules', to='django_ledger.customermodel')),
|
|
('lead', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='schedules', to='inventory.lead')),
|
|
('scheduled_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
|
],
|
|
options={
|
|
'ordering': ['-scheduled_at'],
|
|
},
|
|
),
|
|
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=[('inventory', 'Inventory'), ('accountant', 'Accountant'), ('sales', 'Sales')], max_length=255, verbose_name='Staff Type')),
|
|
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
|
|
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
|
|
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='staff', to='inventory.dealer')),
|
|
('staff_member', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='staff', to='appointment.staffmember')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Staff',
|
|
'verbose_name_plural': 'Staff',
|
|
'permissions': [],
|
|
},
|
|
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
|
|
managers=[
|
|
('objects', inventory.models.StaffUserManager()),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Opportunity',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('stage', models.CharField(choices=[('prospect', 'Prospect'), ('proposal', 'Proposal'), ('negotiation', 'Negotiation'), ('closed_won', 'Closed Won'), ('closed_lost', 'Closed Lost')], max_length=20, verbose_name='Stage')),
|
|
('status', models.CharField(choices=[('new', 'New'), ('pending', 'Pending'), ('in_progress', 'In Progress'), ('qualified', 'Qualified'), ('contacted', 'Contacted'), ('converted', 'Converted'), ('canceled', 'Canceled')], default='new', max_length=20, verbose_name='Status')),
|
|
('probability', models.PositiveIntegerField(validators=[inventory.models.validate_probability])),
|
|
('closing_date', models.DateField(blank=True, null=True, verbose_name='Closing Date')),
|
|
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
|
|
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
|
|
('closed', models.BooleanField(default=False, verbose_name='Closed')),
|
|
('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='django_ledger.customermodel')),
|
|
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='inventory.dealer')),
|
|
('estimate', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='opportunity', to='django_ledger.estimatemodel')),
|
|
('lead', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='opportunity', to='inventory.lead')),
|
|
('staff', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owner', to='inventory.staff', verbose_name='Owner')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Opportunity',
|
|
'verbose_name_plural': 'Opportunities',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='LeadStatusHistory',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('old_status', models.CharField(choices=[('new', 'New'), ('pending', 'Pending'), ('in_progress', 'In Progress'), ('qualified', 'Qualified'), ('contacted', 'Contacted'), ('converted', 'Converted'), ('canceled', 'Canceled')], max_length=50, verbose_name='Old Status')),
|
|
('new_status', models.CharField(choices=[('new', 'New'), ('pending', 'Pending'), ('in_progress', 'In Progress'), ('qualified', 'Qualified'), ('contacted', 'Contacted'), ('converted', 'Converted'), ('canceled', 'Canceled')], max_length=50, verbose_name='New Status')),
|
|
('changed_at', models.DateTimeField(auto_now_add=True, verbose_name='Changed At')),
|
|
('lead', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='status_history', to='inventory.lead')),
|
|
('changed_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='status_changes', to='inventory.staff')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Lead Status History',
|
|
'verbose_name_plural': 'Lead Status Histories',
|
|
},
|
|
),
|
|
migrations.AddField(
|
|
model_name='lead',
|
|
name='staff',
|
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned', to='inventory.staff', verbose_name='Assigned'),
|
|
),
|
|
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.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='DealersMake',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('added_at', models.DateTimeField(auto_now_add=True)),
|
|
('car_make', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='car_dealers', to='inventory.carmake')),
|
|
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dealer_makes', to='inventory.dealer')),
|
|
],
|
|
options={
|
|
'unique_together': {('dealer', 'car_make')},
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='CarColors',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('car', models.OneToOneField(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')},
|
|
},
|
|
),
|
|
]
|