valuation va vihicle modellari qoshildi
This commit is contained in:
@@ -1 +1,3 @@
|
||||
from .customer import * # noqa
|
||||
from .valuation import * # noqa
|
||||
from .vehicle import * # noqa
|
||||
|
||||
127
core/apps/evaluation/models/valuation.py
Normal file
127
core/apps/evaluation/models/valuation.py
Normal file
@@ -0,0 +1,127 @@
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_core.models import AbstractBaseModel
|
||||
from model_bakery import baker
|
||||
|
||||
from core.apps.evaluation.choices.valuation import (
|
||||
EvaluationPurpose,
|
||||
EvaluationType,
|
||||
ValuationStatus,
|
||||
PaymentStatus,
|
||||
)
|
||||
from .customer import CustomerModel, PropertyOwnerModel
|
||||
|
||||
|
||||
class ValuationModel(AbstractBaseModel):
|
||||
# 📋 Asosiy ma'lumotlar
|
||||
conclusion_number = models.CharField(
|
||||
verbose_name=_("conclusion number"),
|
||||
max_length=50,
|
||||
unique=True,
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
evaluation_purpose = models.CharField(
|
||||
verbose_name=_("evaluation purpose"),
|
||||
max_length=50,
|
||||
choices=EvaluationPurpose.choices,
|
||||
default=EvaluationPurpose.SALE,
|
||||
)
|
||||
evaluation_type = models.CharField(
|
||||
verbose_name=_("evaluation type"),
|
||||
max_length=50,
|
||||
choices=EvaluationType.choices,
|
||||
)
|
||||
evaluation_subtype = models.CharField(
|
||||
verbose_name=_("evaluation subtype"),
|
||||
max_length=100,
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
status = models.CharField(
|
||||
verbose_name=_("status"),
|
||||
max_length=20,
|
||||
choices=ValuationStatus.choices,
|
||||
default=ValuationStatus.DRAFT,
|
||||
)
|
||||
|
||||
# 👥 Bog'lanishlar
|
||||
customer = models.ForeignKey(
|
||||
CustomerModel,
|
||||
on_delete=models.PROTECT,
|
||||
related_name="valuations",
|
||||
verbose_name=_("customer"),
|
||||
)
|
||||
property_owner = models.ForeignKey(
|
||||
PropertyOwnerModel,
|
||||
on_delete=models.PROTECT,
|
||||
related_name="valuations",
|
||||
verbose_name=_("property owner"),
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text=_("Keep empty if customer is the owner"),
|
||||
)
|
||||
created_by = models.ForeignKey(
|
||||
"accounts.User",
|
||||
on_delete=models.PROTECT,
|
||||
related_name="created_valuations",
|
||||
verbose_name=_("created by"),
|
||||
)
|
||||
assigned_to = models.ForeignKey(
|
||||
"accounts.User",
|
||||
on_delete=models.SET_NULL,
|
||||
related_name="assigned_valuations",
|
||||
verbose_name=_("assigned to"),
|
||||
null=True,
|
||||
blank=True,
|
||||
)
|
||||
|
||||
# 💰 Narx va To'lov
|
||||
estimated_price = models.DecimalField(
|
||||
verbose_name=_("estimated price"),
|
||||
max_digits=15,
|
||||
decimal_places=2,
|
||||
null=True,
|
||||
blank=True,
|
||||
)
|
||||
final_price = models.DecimalField(
|
||||
verbose_name=_("final price"),
|
||||
max_digits=15,
|
||||
decimal_places=2,
|
||||
null=True,
|
||||
blank=True,
|
||||
)
|
||||
payment_status = models.CharField(
|
||||
verbose_name=_("payment status"),
|
||||
max_length=20,
|
||||
choices=PaymentStatus.choices,
|
||||
default=PaymentStatus.UNPAID,
|
||||
)
|
||||
|
||||
# 🚚 Yetkazib berish
|
||||
is_courier_delivery = models.BooleanField(
|
||||
verbose_name=_("courier delivery"), default=False
|
||||
)
|
||||
courier_extra_amount = models.DecimalField(
|
||||
verbose_name=_("courier extra amount"),
|
||||
max_digits=12,
|
||||
decimal_places=2,
|
||||
default=0,
|
||||
)
|
||||
|
||||
# 📝 Izohlar
|
||||
notes = models.TextField(verbose_name=_("notes"), blank=True, null=True)
|
||||
|
||||
def __str__(self):
|
||||
return f"Valuation {self.conclusion_number} - {self.customer}"
|
||||
|
||||
@classmethod
|
||||
def _baker(cls):
|
||||
return baker.make(cls)
|
||||
|
||||
class Meta:
|
||||
db_table = "Valuation"
|
||||
verbose_name = _("Valuation")
|
||||
verbose_name_plural = _("Valuations")
|
||||
|
||||
|
||||
87
core/apps/evaluation/models/vehicle.py
Normal file
87
core/apps/evaluation/models/vehicle.py
Normal file
@@ -0,0 +1,87 @@
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_core.models import AbstractBaseModel
|
||||
from model_bakery import baker
|
||||
|
||||
|
||||
from core.apps.evaluation.choices.vehicle import FuelType, BodyType, VehicleCondition
|
||||
|
||||
|
||||
class VehicleModel(AbstractBaseModel):
|
||||
# 🌐 Texnik passport ma'lumotlari (API orqali olinadi)
|
||||
tech_passport_series = models.CharField(
|
||||
verbose_name=_("tech passport series"), max_length=10, blank=True, null=True
|
||||
)
|
||||
tech_passport_number = models.CharField(
|
||||
verbose_name=_("tech passport number"), max_length=20, blank=True, null=True
|
||||
)
|
||||
tech_passport_issued_date = models.DateField(
|
||||
verbose_name=_("tech passport issued date"), blank=True, null=True
|
||||
)
|
||||
tech_passport_issued_by = models.CharField(
|
||||
verbose_name=_("tech passport issued by"), max_length=255, blank=True, null=True
|
||||
)
|
||||
|
||||
license_plate = models.CharField(
|
||||
verbose_name=_("license plate"), max_length=20, blank=True, null=True
|
||||
)
|
||||
brand = models.CharField(
|
||||
verbose_name=_("brand"), max_length=100, blank=True, null=True
|
||||
)
|
||||
model = models.CharField(
|
||||
verbose_name=_("model"), max_length=100, blank=True, null=True
|
||||
)
|
||||
manufacture_year = models.IntegerField(
|
||||
verbose_name=_("manufacture year"), blank=True, null=True
|
||||
)
|
||||
vin_number = models.CharField(
|
||||
verbose_name=_("VIN number"), max_length=25, blank=True, null=True
|
||||
)
|
||||
engine_number = models.CharField(
|
||||
verbose_name=_("engine number"), max_length=50, blank=True, null=True
|
||||
)
|
||||
color = models.CharField(
|
||||
verbose_name=_("color"), max_length=50, blank=True, null=True
|
||||
)
|
||||
|
||||
# 🛠 Texnik holati
|
||||
mileage = models.IntegerField(
|
||||
verbose_name=_("mileage"), blank=True, null=True, help_text=_("Distance in km")
|
||||
)
|
||||
fuel_type = models.CharField(
|
||||
verbose_name=_("fuel type"),
|
||||
max_length=20,
|
||||
choices=FuelType.choices,
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
body_type = models.CharField(
|
||||
verbose_name=_("body type"),
|
||||
max_length=20,
|
||||
choices=BodyType.choices,
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
condition = models.CharField(
|
||||
verbose_name=_("condition"),
|
||||
max_length=20,
|
||||
choices=VehicleCondition.choices,
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
position = models.CharField(
|
||||
verbose_name=_("position"), max_length=50, blank=True, null=True
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.brand} {self.model} ({self.license_plate})"
|
||||
|
||||
@classmethod
|
||||
def _baker(cls):
|
||||
return baker.make(cls)
|
||||
|
||||
class Meta:
|
||||
db_table = "Vehicle"
|
||||
verbose_name = _("Vehicle")
|
||||
verbose_name_plural = _("Vehicles")
|
||||
|
||||
Reference in New Issue
Block a user