独角鲸同步合作方公司数据项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

259 lines
7.8 KiB

from rest_framework import serializers
from staff.models import *
from staff.utils import vaild_attendance
from utils.custom import MyCustomError
class DeptSerializer(serializers.ModelSerializer):
"""
部门序列化
"""
class Meta:
model = Dept
fields = "__all__"
def validate_name(self, value):
# 当修改与创建时,检查idCode是否已存在
if self.instance: # Update case
existing_dept = Dept.objects.exclude(id=self.instance.id).filter(name=value, companyMid=self.initial_data.get('companyMid'))
else: # Create case
existing_dept = Dept.objects.filter(name=value, companyMid=self.initial_data.get('companyMid'))
if existing_dept.exists():
raise MyCustomError("部门已存在")
return value
class DeptModifySerializer(serializers.ModelSerializer):
"""
部门修改序列化
"""
class Meta:
model = Dept
fields = "__all__"
def validate_name(self, value):
# 当修改与创建时,检查idCode是否已存在
if self.instance: # Update case
existing_dept = Dept.objects.exclude(id=self.instance.id).filter(name=value, companyMid=self.initial_data.get('companyMid'))
else: # Create case
existing_dept = Dept.objects.filter(name=value, companyMid=self.initial_data.get('companyMid'))
if existing_dept.exists():
raise MyCustomError("部门已存在")
return value
def validate(self, data):
pid = data.get('pid')
id = self.instance if self.instance else None
if pid == id:
raise serializers.ValidationError("pid字段不能等于id字段")
return data
class AttendanceSerializer(serializers.ModelSerializer):
"""
考勤序列化
"""
class Meta:
model = Attendance
fields = "__all__"
def validate(self, data):
attendance = self.Meta.model(**data) or self.instance
staffTime = Staff.objects.filter(id=attendance.staffId if attendance.staffId else self.instance.staffId).values(
'id', 'entryTime', 'leaveTime').first()
if not staffTime:
raise MyCustomError("员工不存在")
try:
vaild_attendance(attendance, entryTime=staffTime['entryTime'], leaveTime=staffTime['leaveTime'])
data['restDay'] = attendance.restDay
except Exception as e:
raise e
return data
class WagesSerializer(serializers.ModelSerializer):
"""
工资记录序列化
"""
class Meta:
model = Wages
fields = "__all__"
class SocialInsuranceSerializer(serializers.ModelSerializer):
"""
社保记录序列化
"""
class Meta:
model = SocialInsurance
fields = "__all__"
class AccumulationSerializer(serializers.ModelSerializer):
"""
公积金记录序列化
"""
class Meta:
model = Accumulation
fields = "__all__"
class BonusSerializer(serializers.ModelSerializer):
"""
奖金记录序列化
"""
class Meta:
model = Accumulation
fields = "__all__"
class WelfareSerializer(serializers.ModelSerializer):
"""
福利记录序列化
"""
class Meta:
model = Welfare
fields = "__all__"
# 预提管理序列化
class AccruedWagesSerializer(serializers.ModelSerializer):
"""
预提工资记录序列化
"""
class Meta:
model = AccruedWages
fields = "__all__"
class AccruedSocialInsuranceSerializer(serializers.ModelSerializer):
"""
预提社保记录序列化
"""
class Meta:
model = AccruedSocialInsurance
fields = "__all__"
class AccruedAccumulationSerializer(serializers.ModelSerializer):
"""
预提公积金序列化
"""
class Meta:
model = AccruedAccumulation
fields = "__all__"
class AccruedBonusSerializer(serializers.ModelSerializer):
"""
预提奖金序列化
"""
class Meta:
model = AccruedBonus
fields = "__all__"
class AccruedWelfareSerializer(serializers.ModelSerializer):
"""
预提福利序列化
"""
class Meta:
model = AccruedWelfare
fields = "__all__"
class SalarySerializer(serializers.ModelSerializer):
"""
薪资记录序列化
"""
class Meta:
model = Salary
fields = "__all__"
def validate_salaryDate(self, value):
# 从context中获取companyMid
# companyMid = self.context.get('companyMid')
# 当修改与创建时,检查idCode是否已存在
Year, Month = value.year, value.month
if self.instance: # Update case
# existing_staff = Salary.objects.exclude(id=self.instance.id).filter(salaryDate__year=Year, salaryDate__month=Month, type=self.instance.type, staffId=self.initial_data.get('staffId'), companyMid=self.initial_data.get('companyMid'))
existing_staff = Salary.objects.exclude(id=self.instance.id).filter(salaryDate__year=Year, salaryDate__month=Month, staffId=self.initial_data.get('staffId'), companyMid=self.initial_data.get('companyMid'))
else: # Create case
# existing_staff = Salary.objects.filter(salaryDate__year=Year, salaryDate__month=Month, type=self.initial_data.get('type'), staffId=self.initial_data.get('staffId'), companyMid=self.initial_data.get('companyMid'))
existing_staff = Salary.objects.filter(salaryDate__year=Year, salaryDate__month=Month, staffId=self.initial_data.get('staffId'), companyMid=self.initial_data.get('companyMid'))
if existing_staff.exists():
raise MyCustomError("该员工该月已存在薪资记录")
return value
class AccruedSerializer(serializers.ModelSerializer):
"""
预提记录序列化
"""
class Meta:
model = Accrued
fields = "__all__"
def validate_accruedDate(self, value):
# 从context中获取companyMid
# companyMid = self.context.get('companyMid')
# 当修改与创建时,检查idCode是否已存在
Year, Month = value.year, value.month
existing_accrued = None
if self.instance: # Update case
if 1 == self.initial_data.get('accruedType'): # 仅类型-工资社保公积金需要限制每月一条记录
existing_accrued = Accrued.objects.exclude(id=self.instance.id).filter(accruedDate__year=Year,
accruedDate__month=Month,
accruedType=self.initial_data.get('accruedType'),
staffId=self.initial_data.get(
'staffId'),
companyMid=self.initial_data.get(
'companyMid'))
else: # Create case
if 1 == self.initial_data.get('accruedType'):
existing_accrued = Accrued.objects.filter(accruedDate__year=Year, accruedDate__month=Month,
accruedType=self.initial_data.get('accruedType'),
staffId=self.initial_data.get('staffId'),
companyMid=self.initial_data.get('companyMid'))
if existing_accrued and existing_accrued.exists():
raise MyCustomError("该员工该月已存在预提薪资记录")
return value
class RewardSerializer(serializers.ModelSerializer):
"""
奖金福利序列化
"""
class Meta:
model = Reward
fields = "__all__"