diff --git a/core/apps/evaluation/choices/request.py b/core/apps/evaluation/choices/request.py index b0efa46..2aee460 100644 --- a/core/apps/evaluation/choices/request.py +++ b/core/apps/evaluation/choices/request.py @@ -19,3 +19,8 @@ class RequestStatus(models.TextChoices): IN_PROGRESS = "in_progress", _("Jarayonda") COMPLETED = "completed", _("Bajarildi") REJECTED = "rejected", _("Rad etildi") + + +class RequestPersonType(models.TextChoices): + INDIVIDUAL_PERSON = "individual_person", "Jismoniy shaxs" + LEGAL_PERSON = "legal_person", 'Yuridik shaxs', diff --git a/core/apps/evaluation/migrations/0037_evaluationrequestmodel_customer_and_owner_same_and_more.py b/core/apps/evaluation/migrations/0037_evaluationrequestmodel_customer_and_owner_same_and_more.py new file mode 100644 index 0000000..eeb21af --- /dev/null +++ b/core/apps/evaluation/migrations/0037_evaluationrequestmodel_customer_and_owner_same_and_more.py @@ -0,0 +1,49 @@ +# Generated by Django 5.2.7 on 2026-04-28 11:41 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('evaluation', '0036_remove_autoevaluationmodel_form_ownership_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='evaluationrequestmodel', + name='customer_and_owner_same', + field=models.BooleanField(default=False), + ), + migrations.CreateModel( + name='EvaluationRequestCustomerModel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('type', models.CharField(choices=[('individual_person', 'Jismoniy shaxs'), ('legal_person', 'Yuridik shaxs')], max_length=100)), + ('jshshir', models.CharField(max_length=100)), + ('evaluation_request', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='customer', to='evaluation.evaluationrequestmodel')), + ], + options={ + 'verbose_name': 'Evaluation Request Customer', + 'verbose_name_plural': 'Evaluation Request Customers', + }, + ), + migrations.CreateModel( + name='EvaluationRequestOwnerModel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('type', models.CharField(choices=[('individual_person', 'Jismoniy shaxs'), ('legal_person', 'Yuridik shaxs')], max_length=100)), + ('jshshir', models.CharField(max_length=100)), + ('evaluation_request', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='owner', to='evaluation.evaluationrequestmodel')), + ], + options={ + 'verbose_name': 'Evaluation Request Owner', + 'verbose_name_plural': 'Evaluation Request Owners', + }, + ), + ] diff --git a/core/apps/evaluation/migrations/0038_evaluationrequestmodel_distance_covered_and_more.py b/core/apps/evaluation/migrations/0038_evaluationrequestmodel_distance_covered_and_more.py new file mode 100644 index 0000000..03a9c5d --- /dev/null +++ b/core/apps/evaluation/migrations/0038_evaluationrequestmodel_distance_covered_and_more.py @@ -0,0 +1,88 @@ +# Generated by Django 5.2.7 on 2026-04-28 11:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('evaluation', '0037_evaluationrequestmodel_customer_and_owner_same_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='evaluationrequestmodel', + name='distance_covered', + field=models.FloatField(blank=True, default=0.0, null=True), + ), + migrations.AddField( + model_name='evaluationrequestmodel', + name='gov_number', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='chassi', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='customer_inn_number', + field=models.CharField(max_length=20), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='is_archive', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='location_lat', + field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='location_lng', + field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='location_name', + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='need_delivering', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='object_type', + field=models.CharField(blank=True, choices=[('lightweight_auto', 'Yengil automobil'), ('truck_car', 'Yuk automobil'), ('special_tech', 'Maxsus texnika')], max_length=50, null=True), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='owner_inn_number', + field=models.CharField(max_length=20), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='rate_type', + field=models.CharField(choices=[('auto', 'Automobil'), ('real_estate', "Ko'chmas mulk"), ('equipment', 'Uskuna')], max_length=50), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='status', + field=models.CharField(choices=[('pending', 'Kutilmoqda'), ('in_progress', 'Jarayonda'), ('completed', 'Bajarildi'), ('rejected', 'Rad etildi')], default='pending', max_length=50), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='tex_passport', + field=models.CharField(blank=True, max_length=20, null=True), + ), + migrations.AlterField( + model_name='evaluationrequestmodel', + name='worked_hours', + field=models.IntegerField(blank=True, null=True), + ), + ] diff --git a/core/apps/evaluation/models/request.py b/core/apps/evaluation/models/request.py index b3637a6..53cf22c 100644 --- a/core/apps/evaluation/models/request.py +++ b/core/apps/evaluation/models/request.py @@ -8,64 +8,41 @@ from core.apps.evaluation.choices.request import ( EvaluationRateType, RequestObjectType, RequestStatus, + RequestPersonType, ) from core.apps.evaluation.models import ReferenceitemModel class EvaluationrequestModel(AbstractBaseModel): - # request sender + rate_type = models.CharField(max_length=50,choices=EvaluationRateType.choices) + object_type = models.CharField(max_length=50,choices=RequestObjectType.choices,blank=True,null=True) + status = models.CharField(max_length=50, choices=RequestStatus.choices, default=RequestStatus.PENDING) + + distance_covered = models.FloatField(default=0.0, null=True, blank=True) + worked_hours = models.IntegerField(blank=True,null=True) + customer_inn_number = models.CharField(max_length=20) + owner_inn_number = models.CharField(max_length=20) + tex_passport = models.CharField(max_length=20,blank=True,null=True) + chassi = models.CharField(max_length=100,blank=True,null=True) + gov_number = models.CharField(max_length=100, null=True, blank=True) + + location_name = models.CharField(max_length=255,blank=True,null=True) + location_lat = models.DecimalField(max_digits=9,decimal_places=6,blank=True, null=True) + location_lng = models.DecimalField(max_digits=9,decimal_places=6,blank=True,null=True) + + need_delivering = models.BooleanField(default=True) + is_archive = models.BooleanField(default=False) + customer_and_owner_same = models.BooleanField(default=False) + + ################### + # Foreign Keys + ################### user = models.ForeignKey( "accounts.User", on_delete=models.CASCADE, related_name="evaluation_requests", verbose_name=_("user"), ) - - # request type -> "Automobil", "Ko'chmas mulk", "Uskuna" - rate_type = models.CharField( - verbose_name=_("rate type"), - max_length=50, - choices=EvaluationRateType.choices, - ) - ################### - # Automobil fields - ################### - object_type = models.CharField( - verbose_name=_("object type"), - max_length=50, - choices=RequestObjectType.choices, - blank=True, - null=True, - ) - customer_inn_number = models.CharField( - verbose_name=_("customer INN number"), - max_length=20, - ) - owner_inn_number = models.CharField( - verbose_name=_("owner INN number"), - max_length=20, - ) - tex_passport = models.CharField( - verbose_name=_("tex passport"), - max_length=20, - blank=True, - null=True, - ) - worked_hours = models.IntegerField( - verbose_name=_("worked hours"), - blank=True, - null=True, - ) - chassi = models.CharField( - verbose_name=_("chassi"), - max_length=100, - blank=True, - null=True, - ) - - ################### - # Value fields - ################### value_determined = models.ForeignKey( "evaluation.ReferenceitemModel", verbose_name=_("value determined"), @@ -99,47 +76,6 @@ class EvaluationrequestModel(AbstractBaseModel): null=True, ) - ################### - # Location fields - ################### - location_name = models.CharField( - verbose_name=_("location name"), - max_length=255, - blank=True, - null=True, - ) - location_lat = models.DecimalField( - verbose_name=_("location latitude"), - max_digits=9, - decimal_places=6, - blank=True, - null=True, - ) - location_lng = models.DecimalField( - verbose_name=_("location longitude"), - max_digits=9, - decimal_places=6, - blank=True, - null=True, - ) - - ################### - # Other fields - ################### - need_delivering = models.BooleanField( - verbose_name=_("need delivering"), - default=True, - ) - status = models.CharField( - verbose_name=_("status"), - max_length=50, - choices=RequestStatus.choices, - default=RequestStatus.PENDING, - ) - is_archive = models.BooleanField( - verbose_name=_("is archive"), - default=False, - ) def __str__(self): return f"Requests #{self.pk} — {self.get_rate_type_display()}" @@ -166,3 +102,29 @@ class EvaluationrequestModel(AbstractBaseModel): db_table = "EvaluationRequest" verbose_name = _("Evaluation Request") verbose_name_plural = _("Evaluation Requests") + + +class EvaluationRequestOwnerModel(AbstractBaseModel): + evaluation_request = models.OneToOneField(EvaluationrequestModel, on_delete=models.CASCADE, related_name='owner') + type = models.CharField(max_length=100, choices=RequestPersonType.choices) + jshshir = models.CharField(max_length=100) + + def __str__(self): + return f"Owner #{self.pk} — {self.type}" + + class Meta: + verbose_name = _("Evaluation Request Owner") + verbose_name_plural = _("Evaluation Request Owners") + + +class EvaluationRequestCustomerModel(AbstractBaseModel): + evaluation_request = models.OneToOneField(EvaluationrequestModel, on_delete=models.CASCADE, related_name='customer') + type = models.CharField(max_length=100, choices=RequestPersonType.choices) + jshshir = models.CharField(max_length=100) + + def __str__(self): + return f"Customer #{self.pk} — {self.type}" + + class Meta: + verbose_name = _("Evaluation Request Customer") + verbose_name_plural = _("Evaluation Request Customers") diff --git a/core/apps/evaluation/serializers/request/EvaluationRequest.py b/core/apps/evaluation/serializers/request/EvaluationRequest.py index 8a2406c..978f173 100644 --- a/core/apps/evaluation/serializers/request/EvaluationRequest.py +++ b/core/apps/evaluation/serializers/request/EvaluationRequest.py @@ -4,8 +4,11 @@ from django.contrib.auth import get_user_model from rest_framework import serializers -from core.apps.evaluation.models import EvaluationrequestModel, ReferenceitemModel +from core.apps.evaluation.models import EvaluationrequestModel, ReferenceitemModel, EvaluationRequestOwnerModel, EvaluationRequestCustomerModel from core.apps.evaluation.serializers.reference import ListReferenceitemSerializer +from core.apps.evaluation.serializers.request.owner import EvaluationRequestOwnerSerializer +from core.apps.evaluation.serializers.request.customer import EvaluationRequestCustomerSerializer + User = get_user_model() @@ -29,6 +32,8 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer): property_rights = ListReferenceitemSerializer(read_only=True) form_ownership = ListReferenceitemSerializer(read_only=True) user = serializers.SerializerMethodField(method_name="get_user") + customer = EvaluationRequestCustomerSerializer(read_only=True) + owner = EvaluationRequestOwnerSerializer(read_only=True) class Meta: model = EvaluationrequestModel @@ -56,6 +61,8 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer): "created_at", "updated_at", "is_archive", + "customer", + "owner", ] def get_location(self, obj): @@ -113,6 +120,8 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer): rate_goal = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all()) property_rights = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all()) form_ownership = serializers.PrimaryKeyRelatedField(required=False, queryset=ReferenceitemModel.objects.all()) + customer = EvaluationRequestCustomerSerializer() + owner = EvaluationRequestOwnerSerializer() class Meta: model = EvaluationrequestModel @@ -131,6 +140,11 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer): "need_delivering", "location", "locationName", + "customer", + "owner", + "customer_and_owner_same", + "distance_covered", + "gov_number" ] def validate_tex_passport(self, value): @@ -179,8 +193,32 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer): if location_name: validated_data["location_name"] = str(location_name) validated_data["user"] = self.context["request"].user - return super().create(validated_data) + + instance = super().create(validated_data) + + customer = validated_data.pop("customer", None) + owner = validated_data.pop("owner", None) + EvaluationRequestCustomerModel.objects.create( + evaluation_request=instance, + type=customer.get("type"), + jshshir=customer.get("jshshir") + ) + if not instance.customer_and_owner_same: + EvaluationRequestOwnerModel.objects.create( + evaluation_request=instance, + type=owner.get("type"), + jshshir=owner.get("jshshir") + ) + else: + EvaluationRequestOwnerModel.objects.create( + evaluation_request=instance, + type=customer.get("type"), + jshshir=customer.get("jshshir") + ) + + return instance + class ArchiveEvaluationrequestSerializer(serializers.Serializer): id = serializers.IntegerField(required=True) - is_archive = serializers.BooleanField(required=True) \ No newline at end of file + is_archive = serializers.BooleanField(required=True) diff --git a/core/apps/evaluation/serializers/request/customer.py b/core/apps/evaluation/serializers/request/customer.py new file mode 100644 index 0000000..765ff4b --- /dev/null +++ b/core/apps/evaluation/serializers/request/customer.py @@ -0,0 +1,9 @@ +from rest_framework import serializers + +from core.apps.evaluation.models.request import EvaluationRequestCustomerModel + + +class EvaluationRequestCustomerSerializer(serializers.ModelSerializer): + class Meta: + model = EvaluationRequestCustomerModel + fields = ["id", "evaluation_request", "type", "jshshir"] diff --git a/core/apps/evaluation/serializers/request/owner.py b/core/apps/evaluation/serializers/request/owner.py new file mode 100644 index 0000000..3436f3e --- /dev/null +++ b/core/apps/evaluation/serializers/request/owner.py @@ -0,0 +1,9 @@ +from rest_framework import serializers + +from core.apps.evaluation.models.request import EvaluationRequestOwnerModel + + +class EvaluationRequestOwnerSerializer(serializers.ModelSerializer): + class Meta: + model = EvaluationRequestOwnerModel + fields = ["id", "evaluation_request", "type", "jshshir"] \ No newline at end of file