Files
ibapp-backend/core/apps/finance/serializers/cash_transaction.py

110 lines
4.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.db import transaction
from rest_framework import serializers
from core.apps.finance.models import CashTransaction, CashTransactionFolder
from core.apps.accounts.models import User
from core.apps.finance.models import PaymentType
from core.apps.finance.serializers.payment_type import PaymentTypeSerializer
from core.apps.projects.models import Project
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = [
'id', 'name', 'start_date', 'end_date', 'status'
]
class CashTransactionEmployeeListSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'id', 'profile_image', 'first_name', 'last_name', 'username'
]
class CashTransactionListSerializer(serializers.ModelSerializer):
payment_type = PaymentTypeSerializer(many=True)
employees = CashTransactionEmployeeListSerializer(many=True)
projects = ProjectSerializer(many=True)
class Meta:
model = CashTransaction
fields = [
'id', 'name', 'payment_type', 'employees', 'status', 'total_balance_usd',
'income_balance_usd', 'expence_balance_usd', 'total_balance_uzs',
'income_balance_uzs', 'expence_balance_uzs', 'projects'
]
class CashTransactionUpdateSerializer(serializers.ModelSerializer):
project_ids = serializers.ListField(child=serializers.UUIDField(required=False), required=False)
class Meta:
model = CashTransaction
fields = [
'name', 'payment_type', 'employees', 'status', 'folder', 'project_ids'
]
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.payment_type = validated_data.get('payment_type', instance.payment_type)
instance.status = validated_data.get('status', instance.status)
instance.folder = validated_data.get('folder', instance.folder) # `folter` orniga `folder`
employees = validated_data.get('employees', None)
if employees is not None:
instance.employees.set(employees)
project_ids = validated_data.pop('project_ids', [])
if project_ids:
projects = Project.objects.filter(id__in=project_ids)
instance.projects.set(projects)
instance.save()
return instance
class CashTransactionCreateSerializer(serializers.Serializer):
payment_type_ids = serializers.ListSerializer(child=serializers.UUIDField(), write_only=True)
employee_ids = serializers.ListSerializer(child=serializers.UUIDField(), write_only=True)
name = serializers.CharField()
status = serializers.BooleanField()
folder_id = serializers.UUIDField(required=False)
project_ids = serializers.ListField(child=serializers.UUIDField(required=False), required=False)
def validate_name(self, value):
if CashTransaction.objects.filter(name=value).exists():
raise serializers.ValidationError('cash transaction with this name already exists')
return value
def validate(self, data):
if data.get('folder_id'):
folder = CashTransactionFolder.objects.filter(id=data.get('folder_id')).first()
if not folder:
raise serializers.ValidationError("Cash Transaction Folder not found")
data['folder'] = folder
return data
def create(self, validated_data):
with transaction.atomic():
employee_ids = validated_data.pop('employee_ids', [])
payment_type_ids = validated_data.pop('payment_type_ids', [])
cash_transaction = CashTransaction.objects.create(
name=validated_data.get('name'),
status=validated_data.get('status'),
folder=validated_data.get('folder')
)
if validated_data.get('project_ids'):
projects = Project.objects.filter(id__in=validated_data.get('project_ids'))
for project in projects:
project.cash_transaction.add(cash_transaction)
project.save()
cash_transaction.employees.set(employee_ids)
cash_transaction.payment_type.set(payment_type_ids)
cash_transaction.save()
return cash_transaction