import datetime from django.core.exceptions import ValidationError from django.db import models # 职务表 class Position(models.Model): position_id = models.AutoField(primary_key=True) position_name = models.CharField(max_length=255, verbose_name='岗位名称') position_description = models.TextField(verbose_name='岗位描述') class Meta: verbose_name = '岗位表' verbose_name_plural = '岗位表' def __str__(self): return self.position_name # 职级表 class Rank(models.Model): rank_id = models.AutoField(primary_key=True, verbose_name='职级ID') rank_name = models.CharField(max_length=255, verbose_name='职级名称') rank_description = models.TextField(verbose_name='职级描述') class Meta: verbose_name = '职级表' verbose_name_plural = '职级表' def __str__(self): return self.rank_name # 人员基本信息表 class EmployeeInformation(models.Model): employee_id = models.AutoField(primary_key=True) name = models.CharField(max_length=255, verbose_name='姓名') id_number = models.CharField(max_length=255, verbose_name='身份证号', unique=True) gender = models.CharField(max_length=10, choices=[ ('男', '男'), ('女', '女'), ('其他', '其他') ], verbose_name='性别') birthday = models.DateField(verbose_name='生日') age = models.IntegerField(verbose_name='年龄') height = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='身高(cm)') weight = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='体重(kg)') blood_type = models.CharField(max_length=3, choices=[ ('A', 'A'), ('B', 'B'), ('AB', 'AB'), ('O', 'O'), ('其他', '其他') ], verbose_name='血型') ethnicity = models.CharField(max_length=255, verbose_name='民族', blank=True) domicile = models.CharField(max_length=255, verbose_name='户籍地', blank=True) marital_status = models.CharField(max_length=50, choices=[ ('未婚', '未婚'), ('已婚未育', '已婚未育'), ('已婚已育', '已婚已育'), ('离婚', '离婚'), ('其他', '其他') ], verbose_name='婚姻状态') political_affiliation = models.CharField(max_length=50, choices=[ ('共产党员', '共产党员'), ('共青团员', '共青团员'), ('群众', '群众'), ('民主党派', '民主党派'), ('其他', '其他') ], verbose_name='政治面貌') entry_date = models.DateField(verbose_name='入职日期') regularization_date = models.DateField(null=True, blank=True, verbose_name='转正日期') employment_type = models.CharField(max_length=50, choices=[ ('全职', '全职'), ('兼职', '兼职'), ('实习', '实习') ], verbose_name='用工性质') status = models.CharField(max_length=50, choices=[ ('在职', '在职'), ('离职', '离职') ], verbose_name='状态') primary_department = models.CharField(max_length=255, verbose_name='一级部门') secondary_department = models.CharField(max_length=255, verbose_name='二级部门', blank=True) position = models.CharField(max_length=255, verbose_name='岗位') grade = models.CharField(max_length=255, verbose_name='职级', blank=True) contract_end_date = models.DateField(null=True, blank=True, verbose_name='当前合同到期日期') mobile_number = models.CharField(max_length=255, verbose_name='手机号') email = models.EmailField(verbose_name='邮箱') mailing_address = models.CharField(max_length=255, verbose_name='通信地址', blank=True) emergency_contact = models.CharField(max_length=255, verbose_name='紧急联系人', blank=True) relation_with_contact = models.CharField(max_length=255, verbose_name='与本人关系', blank=True) emergency_contact_phone = models.CharField(max_length=255, verbose_name='紧急联系人电话', blank=True) education = models.CharField(max_length=50, choices=[ ('高中', '高中'), ('大专', '大专'), ('本科', '本科'), ('硕士研究生', '硕士研究生'), ('博士研究生', '博士研究生'), ('其他', '其他') ], verbose_name='学历') undergraduate_school = models.CharField(max_length=255, verbose_name='本科毕业院校', blank=True) graduate_school = models.CharField(max_length=255, verbose_name='研究生毕业院校', blank=True) major = models.CharField(max_length=255, verbose_name='专业', blank=True) technical_title = models.CharField(max_length=255, verbose_name='技术职称', blank=True) base_salary = models.TextField(verbose_name='基础工资', blank=True) salary_account_number = models.CharField(max_length=255, verbose_name='工资卡号', blank=True) bank_of_salary_account = models.CharField(max_length=255, verbose_name='工资卡开户行', blank=True) resignation_type = models.CharField(max_length=50, choices=[ ('合同期满', '合同期满'), ('主动辞职', '主动辞职'), ('无条件辞职', '无条件辞职'), ('试用未通过', '试用未通过'), ('辞退', '辞退'), ('其他', '其他') ], verbose_name='离职类型', blank=True) resignation_reason = models.TextField(verbose_name='离职原因', blank=True) resignation_date = models.DateField(null=True, blank=True, verbose_name='离职日期') excluded_fields = ['resignation_type', 'resignation_reason', 'resignation_date'] class Meta: verbose_name = '人员基本信息表' verbose_name_plural = '人员基本信息表' def __str__(self): return self.name # 工资变更记录表 class SalaryChangeRecord(models.Model): employee = models.ForeignKey(EmployeeInformation, on_delete=models.CASCADE, related_name='salary_change_records') change_date = models.DateField(verbose_name='变更日期') previous_value = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='前值') new_value = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='最新值') approved_by = models.CharField(max_length=255, verbose_name='核准人') class Meta: verbose_name = '工资变更记录表' verbose_name_plural = '工资变更记录表' def __str__(self): return f"{self.employee.name} - {self.change_date}" # 员工考勤记录表 class EmployeeAttendanceRecord(models.Model): record_id = models.AutoField(primary_key=True) employee = models.ForeignKey('EmployeeInformation', on_delete=models.CASCADE, verbose_name='姓名') year_month = models.DateField(verbose_name='年月') late = models.IntegerField(default=0, verbose_name='迟到') early_leave = models.IntegerField(default=0, verbose_name='早退') absenteeism = models.IntegerField(default=0, verbose_name='旷工') annual_leave = models.IntegerField(default=0, verbose_name='年假') personal_leave = models.IntegerField(default=0, verbose_name='事假') sick_leave = models.IntegerField(default=0, verbose_name='病假') class Meta: verbose_name = '员工考勤记录表' verbose_name_plural = '员工考勤记录表' def __str__(self): return f"{self.employee.name} - {self.year_month.strftime('%Y-%m')}" # 其他假期详细记录表 class OtherLeaveDetails(models.Model): record_id = models.AutoField(primary_key=True) attendance_record = models.ForeignKey(EmployeeAttendanceRecord, on_delete=models.CASCADE, related_name='other_leaves', verbose_name='考勤记录') leave_type = models.CharField(max_length=255, choices=[ ('事假', '事假'), ('年假', '年假'), ('病假', '病假'), ('婚假', '婚假'), ('丧假', '丧假'), ], verbose_name='假期类型') days = models.IntegerField(verbose_name='天数') description = models.TextField(verbose_name='说明') class Meta: verbose_name = '其他假期详细记录' verbose_name_plural = '其他假期详细记录' def __str__(self): return f"{self.leave_type} - {self.days} days" # 年假使用记录 class AnnualLeaveRecord(models.Model): record_id = models.AutoField(primary_key=True, verbose_name='记录编号') year = models.IntegerField(verbose_name='年份') employee_name = models.CharField(max_length=255, verbose_name='姓名') primary_department = models.CharField(max_length=255, verbose_name='一级部门') total_annual_leave = models.IntegerField(verbose_name='年假天数') used_annual_leave = models.IntegerField(verbose_name='已请年假数') remaining_annual_leave = models.IntegerField(verbose_name='剩余年假数') class Meta: verbose_name = '年假使用记录' verbose_name_plural = '年假使用记录表' def __str__(self): return f"{self.employee_name} - {self.year}" # 员工绩效 class PerformanceEvaluation(models.Model): YEAR_CHOICES = [(r, r) for r in range(1980, datetime.date.today().year + 1)] performance_id = models.AutoField(primary_key=True) employee = models.ForeignKey(EmployeeInformation, on_delete=models.CASCADE, verbose_name='员工') year = models.IntegerField(choices=YEAR_CHOICES, verbose_name='年度') performance_score = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='年度绩效') class Meta: verbose_name = '员工绩效' verbose_name_plural = '员工绩效表' unique_together = ('employee', 'year') def __str__(self): return f"{self.employee.name} - {self.year} - {self.performance_score}"