haikal/inventory/migrations/0001_initial.py

3060 lines
111 KiB
Python

# Generated by Django 5.1.7 on 2025-06-22 10:44
import datetime
import django.core.validators
import django.db.models.deletion
import django.utils.timezone
import inventory.mixins
import inventory.models
import phonenumber_field.modelfields
import uuid
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", "0022_alter_billmodel_bill_items_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)),
(
"slug",
models.SlugField(
blank=True, max_length=255, null=True, unique=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)),
(
"slug",
models.SlugField(
blank=True, max_length=255, null=True, unique=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.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
unique=True,
verbose_name="Primary Key",
),
),
(
"slug",
models.SlugField(
blank=True,
help_text="Slug for the object. If not provided, it will be generated automatically.",
null=True,
unique=True,
verbose_name="Slug",
),
),
(
"created_at",
models.DateTimeField(auto_now_add=True, verbose_name="Created At"),
),
(
"updated_at",
models.DateTimeField(auto_now=True, verbose_name="Updated At"),
),
(
"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"
),
),
(
"item_model",
models.OneToOneField(
blank=True,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
to="django_ledger.itemmodel",
verbose_name="Item Model",
),
),
(
"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",
),
),
("is_sold", models.BooleanField(default=False)),
(
"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),
),
(
"slug",
models.SlugField(
blank=True, max_length=255, null=True, unique=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),
),
(
"slug",
models.SlugField(
blank=True, max_length=255, null=True, unique=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),
),
(
"slug",
models.SlugField(
blank=True, max_length=255, null=True, unique=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)),
(
"slug",
models.SlugField(
blank=True, max_length=255, null=True, unique=True
),
),
(
"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)),
(
"slug",
models.SlugField(
blank=True, max_length=255, null=True, unique=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"),
),
(
"slug",
models.SlugField(
blank=True, max_length=255, null=True, unique=True
),
),
(
"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="Group",
),
),
(
"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"),
),
(
"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(
blank=True, null=True, verbose_name="Date of Birth"
),
),
(
"email",
models.EmailField(
max_length=254, unique=True, verbose_name="Email"
),
),
(
"national_id",
models.CharField(
blank=True,
max_length=10,
null=True,
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"
),
),
("active", models.BooleanField(default=True, verbose_name="Active")),
(
"image",
models.ImageField(
blank=True,
null=True,
upload_to="customers/",
verbose_name="Image",
),
),
(
"created",
models.DateTimeField(auto_now_add=True, verbose_name="Created"),
),
(
"updated",
models.DateTimeField(auto_now=True, verbose_name="Updated"),
),
(
"slug",
models.SlugField(
blank=True,
editable=False,
max_length=255,
null=True,
unique=True,
),
),
(
"customer_model",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="django_ledger.customermodel",
),
),
(
"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"),
("meeting", "Meeting"),
("whatsapp", "WhatsApp"),
("visit", "Visit"),
("negotiation", "Negotiation"),
("follow_up", "Follow Up"),
("won", "Won"),
("lost", "Lost"),
("closed", "Closed"),
("converted", "Converted"),
("transfer", "Transfer"),
("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.UUIDField()),
(
"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"
),
),
(
"address",
models.CharField(
blank=True, max_length=200, null=True, verbose_name="Address"
),
),
(
"lead_type",
models.CharField(
choices=[
("customer", "Customer"),
("organization", "Organization"),
],
default="customer",
max_length=50,
verbose_name="Lead Type",
),
),
(
"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",
),
),
(
"status",
models.CharField(
choices=[
("new", "New"),
("contacted", "Contacted"),
("qualified", "Qualified"),
("unqualified", "Unqualified"),
("converted", "Converted"),
],
db_index=True,
default="new",
max_length=50,
verbose_name="Status",
),
),
(
"next_action",
models.CharField(
blank=True,
max_length=255,
null=True,
verbose_name="Next Action",
),
),
(
"next_action_date",
models.DateTimeField(
blank=True, null=True, verbose_name="Next Action Date"
),
),
("is_converted", models.BooleanField(default=False)),
("converted_at", models.DateTimeField(blank=True, null=True)),
(
"created",
models.DateTimeField(
auto_now_add=True, db_index=True, verbose_name="Created"
),
),
(
"updated",
models.DateTimeField(auto_now=True, verbose_name="Updated"),
),
("slug", models.SlugField(blank=True, null=True, unique=True)),
(
"customer",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="customer_leads",
to="inventory.customer",
),
),
(
"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.UUIDField()),
("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,
),
),
(
"dealer",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="notes",
to="inventory.dealer",
),
),
],
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"
),
),
("email", models.EmailField(max_length=254, verbose_name="Email")),
(
"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"
),
),
("active", models.BooleanField(default=True, verbose_name="Active")),
(
"created",
models.DateTimeField(auto_now_add=True, verbose_name="Created"),
),
(
"updated",
models.DateTimeField(auto_now=True, verbose_name="Updated"),
),
(
"slug",
models.SlugField(
blank=True,
editable=False,
max_length=255,
null=True,
unique=True,
),
),
(
"customer_model",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="django_ledger.customermodel",
),
),
(
"dealer",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="organizations",
to="inventory.dealer",
),
),
(
"user",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
related_name="organization_profile",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"verbose_name": "Organization",
"verbose_name_plural": "Organizations",
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name="Opportunity",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"crn",
models.CharField(
blank=True, max_length=20, null=True, verbose_name="CRN"
),
),
(
"vrn",
models.CharField(
blank=True, max_length=20, null=True, verbose_name="VRN"
),
),
(
"salary",
models.DecimalField(
blank=True,
decimal_places=2,
max_digits=10,
null=True,
verbose_name="Salary",
),
),
(
"priority",
models.CharField(
choices=[
("high", "High"),
("medium", "Medium"),
("low", "Low"),
],
default="medium",
max_length=20,
verbose_name="Priority",
),
),
(
"stage",
models.CharField(
choices=[
("qualification", "Qualification"),
("test_drive", "Test Drive"),
("quotation", "Quotation"),
("negotiation", "Negotiation"),
("financing", "Financing"),
("closed_won", "Closed Won"),
("closed_lost", "Closed Lost"),
("on_hold", "On Hold"),
],
max_length=20,
verbose_name="Stage",
),
),
(
"probability",
models.PositiveIntegerField(
validators=[inventory.models.validate_probability]
),
),
(
"amount",
models.DecimalField(
decimal_places=2, max_digits=10, verbose_name="Amount"
),
),
(
"expected_revenue",
models.DecimalField(
blank=True,
decimal_places=2,
max_digits=10,
null=True,
verbose_name="Expected Revenue",
),
),
(
"vehicle_of_interest_make",
models.CharField(blank=True, max_length=50, null=True),
),
(
"vehicle_of_interest_model",
models.CharField(blank=True, max_length=100, null=True),
),
("expected_close_date", models.DateField(blank=True, null=True)),
(
"created",
models.DateTimeField(auto_now_add=True, verbose_name="Created"),
),
(
"updated",
models.DateTimeField(auto_now=True, verbose_name="Updated"),
),
(
"slug",
models.SlugField(
blank=True,
help_text="Unique slug for the opportunity.",
null=True,
unique=True,
verbose_name="Slug",
),
),
(
"loss_reason",
models.CharField(blank=True, max_length=255, null=True),
),
(
"car",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="inventory.car",
verbose_name="Car",
),
),
(
"customer",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="opportunities",
to="inventory.customer",
),
),
(
"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",
),
),
(
"organization",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="inventory.organization",
verbose_name="Organization",
),
),
],
options={
"verbose_name": "Opportunity",
"verbose_name_plural": "Opportunities",
},
),
migrations.AddField(
model_name="lead",
name="organization",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="organization_leads",
to="inventory.organization",
),
),
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),
),
(
"agreed_price",
models.DecimalField(
decimal_places=2,
help_text="The final agreed-upon selling price of the vehicle.",
max_digits=12,
),
),
(
"down_payment_amount",
models.DecimalField(
decimal_places=2,
default=0.0,
help_text="The initial payment made by the customer.",
max_digits=12,
),
),
(
"trade_in_value",
models.DecimalField(
decimal_places=2,
default=0.0,
help_text="The value of any vehicle traded in by the customer.",
max_digits=12,
),
),
(
"loan_amount",
models.DecimalField(
decimal_places=2,
default=0.0,
help_text="The amount financed by a bank or third-party lender.",
max_digits=12,
),
),
(
"total_paid_amount",
models.DecimalField(
decimal_places=2,
default=0.0,
help_text="Sum of down payment, trade-in value, and loan amount received so far.",
max_digits=12,
),
),
(
"remaining_balance",
models.DecimalField(
decimal_places=2,
default=0.0,
help_text="The remaining amount due from the customer or financing.",
max_digits=12,
),
),
(
"status",
models.CharField(
choices=[
("PENDING_APPROVAL", "Pending Approval"),
("APPROVED", "Approved"),
("IN_FINANCING", "In Financing"),
("PARTIALLY_PAID", "Partially Paid"),
("FULLY_PAID", "Fully Paid"),
("PENDING_DELIVERY", "Pending Delivery"),
("DELIVERED", "Delivered"),
("CANCELLED", "Cancelled"),
],
default="PENDING_APPROVAL",
help_text="Current status of the sales order.",
max_length=20,
),
),
(
"order_date",
models.DateTimeField(
default=django.utils.timezone.now,
help_text="The date and time the sales order was created.",
),
),
(
"expected_delivery_date",
models.DateField(
blank=True,
help_text="The planned date for vehicle delivery.",
null=True,
),
),
(
"actual_delivery_date",
models.DateTimeField(
blank=True,
help_text="The actual date and time the vehicle was delivered.",
null=True,
),
),
(
"cancelled_date",
models.DateTimeField(
blank=True,
help_text="The date and time the order was cancelled, if applicable.",
null=True,
),
),
(
"cancellation_reason",
models.TextField(
blank=True,
help_text="Reason for cancellation, if applicable.",
null=True,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"car",
models.ForeignKey(
blank=True,
help_text="The specific vehicle (VIN) being sold.",
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="sales_orders",
to="inventory.car",
),
),
(
"created_by",
models.ForeignKey(
help_text="The user who created this sales order.",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="created_sales_orders",
to=settings.AUTH_USER_MODEL,
),
),
(
"customer",
models.ForeignKey(
help_text="The customer making the purchase.",
on_delete=django.db.models.deletion.PROTECT,
related_name="sales_orders",
to="inventory.customer",
),
),
(
"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",
),
),
(
"journal_entry",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="django_ledger.journalentrymodel",
),
),
(
"last_modified_by",
models.ForeignKey(
help_text="The user who last modified this sales order.",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="modified_sales_orders",
to=settings.AUTH_USER_MODEL,
),
),
(
"opportunity",
models.OneToOneField(
help_text="The associated sales opportunity for this order.",
on_delete=django.db.models.deletion.CASCADE,
related_name="sales_order",
to="inventory.opportunity",
),
),
(
"trade_in_vehicle",
models.ForeignKey(
blank=True,
help_text="The vehicle traded in by the customer, if any.",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="traded_in_on_orders",
to="inventory.car",
),
),
],
options={
"verbose_name": "Sales Order",
"verbose_name_plural": "Sales Orders",
"ordering": ["-order_date"],
},
),
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",
),
),
("active", models.BooleanField(default=True, verbose_name="Active")),
(
"created",
models.DateTimeField(auto_now_add=True, verbose_name="Created"),
),
(
"updated",
models.DateTimeField(auto_now=True, verbose_name="Updated"),
),
(
"slug",
models.SlugField(
blank=True,
editable=False,
max_length=255,
null=True,
unique=True,
),
),
(
"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.AddField(
model_name="opportunity",
name="staff",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="owner",
to="inventory.staff",
verbose_name="Owner",
),
),
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"),
("contacted", "Contacted"),
("qualified", "Qualified"),
("unqualified", "Unqualified"),
("converted", "Converted"),
],
max_length=50,
verbose_name="Old Status",
),
),
(
"new_status",
models.CharField(
choices=[
("new", "New"),
("contacted", "Contacted"),
("qualified", "Qualified"),
("unqualified", "Unqualified"),
("converted", "Converted"),
],
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="Tasks",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("object_id", models.UUIDField()),
("title", models.CharField(max_length=255, verbose_name="Title")),
(
"description",
models.TextField(blank=True, null=True, verbose_name="Description"),
),
("due_date", models.DateField(verbose_name="Due Date")),
(
"completed",
models.BooleanField(default=False, verbose_name="Completed"),
),
(
"created",
models.DateTimeField(auto_now_add=True, verbose_name="Created"),
),
(
"updated",
models.DateTimeField(auto_now=True, verbose_name="Updated"),
),
(
"assigned_to",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="tasks_assigned",
to=settings.AUTH_USER_MODEL,
),
),
(
"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="tasks_created",
to=settings.AUTH_USER_MODEL,
),
),
(
"dealer",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="tasks",
to="inventory.dealer",
),
),
],
options={
"verbose_name": "Task",
"verbose_name_plural": "Tasks",
},
),
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(max_length=200, verbose_name="Address")),
(
"logo",
models.ImageField(
blank=True,
null=True,
upload_to="logos/vendors",
verbose_name="Logo",
),
),
("active", models.BooleanField(default=True, verbose_name="Active")),
(
"created_at",
models.DateTimeField(auto_now_add=True, verbose_name="Created At"),
),
(
"slug",
models.SlugField(
blank=True,
max_length=255,
null=True,
unique=True,
verbose_name="Slug",
),
),
(
"dealer",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="vendors",
to="inventory.dealer",
),
),
(
"vendor_model",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
to="django_ledger.vendormodel",
verbose_name="Vendor Model",
),
),
],
options={
"verbose_name": "Vendor",
"verbose_name_plural": "Vendors",
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.AddField(
model_name="car",
name="vendor",
field=models.ForeignKey(
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="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")},
},
),
migrations.CreateModel(
name="PaymentHistory",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("user_data", models.JSONField(blank=True, null=True)),
(
"amount",
models.DecimalField(
decimal_places=2,
max_digits=10,
validators=[django.core.validators.MinValueValidator(0.01)],
),
),
("currency", models.CharField(default="SAR", max_length=3)),
(
"payment_date",
models.DateTimeField(default=django.utils.timezone.now),
),
(
"status",
models.CharField(
choices=[
("initiated", "initiated"),
("pending", "Pending"),
("completed", "Completed"),
("paid", "Paid"),
("failed", "Failed"),
("refunded", "Refunded"),
("cancelled", "Cancelled"),
],
default="pending",
max_length=10,
),
),
(
"payment_method",
models.CharField(
choices=[
("credit_card", "Credit Card"),
("debit_card", "Debit Card"),
("paypal", "PayPal"),
("bank_transfer", "Bank Transfer"),
("crypto", "Cryptocurrency"),
("other", "Other"),
],
max_length=20,
),
),
(
"transaction_id",
models.CharField(
blank=True, max_length=100, null=True, unique=True
),
),
(
"invoice_number",
models.CharField(blank=True, max_length=50, null=True),
),
(
"order_reference",
models.CharField(blank=True, max_length=100, null=True),
),
("gateway_response", models.JSONField(blank=True, null=True)),
(
"gateway_name",
models.CharField(blank=True, max_length=50, null=True),
),
("description", models.TextField(blank=True, null=True)),
("is_recurring", models.BooleanField(default=False)),
(
"billing_email",
models.EmailField(blank=True, max_length=254, null=True),
),
("billing_address", models.TextField(blank=True, null=True)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="payments",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"verbose_name": "Payment History",
"verbose_name_plural": "Payment Histories",
"ordering": ["-payment_date"],
"indexes": [
models.Index(
fields=["transaction_id"], name="inventory_p_transac_9469f3_idx"
),
models.Index(
fields=["user"], name="inventory_p_user_id_c31626_idx"
),
models.Index(
fields=["status"], name="inventory_p_status_abcb77_idx"
),
models.Index(
fields=["payment_date"], name="inventory_p_payment_b3068c_idx"
),
],
},
),
]