128 lines
3.4 KiB
Python
128 lines
3.4 KiB
Python
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")
|
|
|
|
|