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__"