diff --git a/core/apps/evaluation/migrations/0041_rename_bonustype_bonuscategory.py b/core/apps/evaluation/migrations/0041_rename_bonustype_bonuscategory.py new file mode 100644 index 0000000..2d56cf0 --- /dev/null +++ b/core/apps/evaluation/migrations/0041_rename_bonustype_bonuscategory.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.7 on 2026-05-01 12:06 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('evaluation', '0040_basevaluebonus_bonustype_employeebonus_delete_bonus'), + ] + + operations = [ + migrations.RenameModel( + old_name='BonusType', + new_name='BonusCategory', + ), + ] diff --git a/core/apps/evaluation/models/bonus.py b/core/apps/evaluation/models/bonus.py index 9c18840..784c2da 100644 --- a/core/apps/evaluation/models/bonus.py +++ b/core/apps/evaluation/models/bonus.py @@ -11,13 +11,8 @@ class BaseValueBonus(AbstractBaseModel): def __str__(self): return f"Base: {self.base_price}" - def save(self, *args, **kwargs): - if not self.pk and BaseValueBonus.objects.exists(): - raise ValueError("Value Bonus already exists") - return super().save(*args, **kwargs) - -class BonusType(AbstractBaseModel): +class BonusCategory(AbstractBaseModel): name = models.CharField(max_length=255) category = models.CharField( max_length=50, @@ -31,7 +26,7 @@ class BonusType(AbstractBaseModel): class EmployeeBonus(AbstractBaseModel): user = models.ForeignKey("accounts.User", on_delete=models.CASCADE, related_name="bonuses", ) - bonus_type = models.ForeignKey(BonusType, on_delete=models.CASCADE) + bonus_type = models.ForeignKey(BonusCategory, on_delete=models.CASCADE) percentage = models.PositiveIntegerField() class Meta: diff --git a/core/apps/evaluation/serializers/bonus/Bonus.py b/core/apps/evaluation/serializers/bonus/Bonus.py index 51482cd..501c09a 100644 --- a/core/apps/evaluation/serializers/bonus/Bonus.py +++ b/core/apps/evaluation/serializers/bonus/Bonus.py @@ -1,20 +1,32 @@ from rest_framework import serializers -from core.apps.evaluation.models.bonus import BonusType, EmployeeBonus, BaseValueBonus +from core.apps.evaluation.models.bonus import BonusCategory, EmployeeBonus, BaseValueBonus -class BonusTypeCreateSerializer(serializers.ModelSerializer): +class BaseBonusSerializer(serializers.ModelSerializer): class Meta: - model = BonusType + model = BaseValueBonus + fields = 'id', 'base_price' + + def create(self, validated_data): + if BaseValueBonus.objects.exists(): + raise serializers.ValidationError("Base bonus already exists") + + return super().create(validated_data) + + +class BonusCategorySerializer(serializers.ModelSerializer): + class Meta: + model = BonusCategory fields = 'name', 'category', 'percentage' -class BonusTypeListSerializer(serializers.ModelSerializer): - price = serializers.SerializerMethodField() +class BonusCategoryListSerializer(serializers.ModelSerializer): + price = serializers.DecimalField(max_digits=12, decimal_places=2) class Meta: - model = BonusType - fields = 'name', 'category', 'percentage' + model = BonusCategory + fields = 'id', 'name', 'category', 'percentage' , 'price' def get_price(self, obj): base_obj = BaseValueBonus.objects.first() @@ -27,15 +39,15 @@ class BonusTypeListSerializer(serializers.ModelSerializer): class BonusEmployeeBonusSerializer(serializers.ModelSerializer): class Meta: model = EmployeeBonus - fields = 'user' , 'bonus_type' , 'percentage' + fields = 'user', 'bonus_type', 'percentage' -class EmployeeBonusSerializer(serializers.ModelSerializer): - price = serializers.SerializerMethodField() +class EmployeeBonusListSerializer(serializers.ModelSerializer): + price = serializers.DecimalField(max_digits=12, decimal_places=2) class Meta: model = EmployeeBonus - fields = 'user', 'bonus_type', 'percentage' + fields = 'id', 'user', 'bonus_type', 'percentage' , 'price' def get_price(self, obj): base_obj = BaseValueBonus.objects.first() diff --git a/core/apps/evaluation/urls.py b/core/apps/evaluation/urls.py index dea563e..a9d7247 100644 --- a/core/apps/evaluation/urls.py +++ b/core/apps/evaluation/urls.py @@ -29,6 +29,7 @@ router.register("customer", views.CustomerView, basename="customer") router.register("certificate", views.CertificateView, basename="certificate") router.register("bonus-type", views.BonusTypeView, basename="bonus-type") router.register("bonus-employee", views.BonusEmployeeViewSet, basename="bonus-employee") +router.register("bonus-base", views.BaseBonusViewSet, basename="bonus-base") urlpatterns = [ path("", include(router.urls)), diff --git a/core/apps/evaluation/views/bonus.py b/core/apps/evaluation/views/bonus.py index 4c3d312..3e294a8 100644 --- a/core/apps/evaluation/views/bonus.py +++ b/core/apps/evaluation/views/bonus.py @@ -1,26 +1,33 @@ from django_core.mixins import BaseViewSetMixin from drf_spectacular.utils import extend_schema -from rest_framework.permissions import AllowAny, IsAdminUser +from rest_framework import viewsets +from rest_framework.permissions import IsAdminUser from rest_framework.viewsets import ModelViewSet # core -from core.apps.evaluation.models.bonus import BonusType, EmployeeBonus -from core.apps.evaluation.serializers.bonus.Bonus import BonusTypeCreateSerializer, \ - BonusTypeListSerializer, EmployeeBonusSerializer, BonusEmployeeBonusSerializer +from core.apps.evaluation.models.bonus import BonusCategory, EmployeeBonus, BaseValueBonus +from core.apps.evaluation.serializers.bonus.Bonus import BonusCategorySerializer, \ + BonusCategoryListSerializer, EmployeeBonusListSerializer, BonusEmployeeBonusSerializer, BaseBonusSerializer -@extend_schema(tags=["Bonus"]) +@extend_schema(tags=["BaseBonus"]) +class BaseBonusViewSet(BaseViewSetMixin, viewsets.ModelViewSet): + queryset = BaseValueBonus.objects.all() + serializer_class = BaseBonusSerializer + + +@extend_schema(tags=["Bonus-Category"]) class BonusTypeView(BaseViewSetMixin, ModelViewSet): - queryset = BonusType.objects.all() + queryset = BonusCategory.objects.all() - serializer_class = BonusTypeCreateSerializer + serializer_class = BonusCategorySerializer action_serializer_class = { - 'create': BonusTypeCreateSerializer, - 'update': BonusTypeCreateSerializer, - 'partial_update': BonusTypeCreateSerializer, - 'list': BonusTypeListSerializer, - 'retrieve': BonusTypeListSerializer, + 'create': BonusCategorySerializer, + 'update': BonusCategorySerializer, + 'partial_update': BonusCategorySerializer, + 'list': BonusCategoryListSerializer, + 'retrieve': BonusCategoryListSerializer, } action_permission_classes = { @@ -34,16 +41,14 @@ class BonusTypeView(BaseViewSetMixin, ModelViewSet): class BonusEmployeeViewSet(BaseViewSetMixin, ModelViewSet): queryset = EmployeeBonus.objects.all() - serializer_class = EmployeeBonusSerializer - - + serializer_class = BonusEmployeeBonusSerializer action_serializer_class = { 'create': BonusEmployeeBonusSerializer, 'update': BonusEmployeeBonusSerializer, 'partial_update': BonusEmployeeBonusSerializer, - 'list': EmployeeBonusSerializer, - 'retrieve': EmployeeBonusSerializer, + 'list': EmployeeBonusListSerializer, + 'retrieve': EmployeeBonusListSerializer, } action_permission_classes = { @@ -52,4 +57,4 @@ class BonusEmployeeViewSet(BaseViewSetMixin, ModelViewSet): 'partial_update': [IsAdminUser], 'destroy': [IsAdminUser], 'list': [IsAdminUser], - } \ No newline at end of file + }