valuation va vihicle modellari qoshildi

This commit is contained in:
Husanjonazamov
2026-02-13 15:38:13 +05:00
parent 4bc54f1952
commit acf426ee9b
41 changed files with 775 additions and 1 deletions

View File

@@ -1 +1,3 @@
from .customer import * # noqa
from .valuation import * # noqa
from .vehicle import * # noqa

View 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")

View 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")