XH_Digital_Management/application/hrm_mgnt/models.py

239 lines
10 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.

import datetime
from django.db import models
# 岗位表
class Position(models.Model):
position_id = models.AutoField(primary_key=True, verbose_name='岗位ID')
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):
GENDER_CHOICES = [
('', ''),
('', ''),
('其他', '其他')
]
BLOOD_TYPE_CHOICES = [
('A', 'A'),
('B', 'B'),
('AB', 'AB'),
('O', 'O'),
('其他', '其他')
]
MARITAL_STATUS_CHOICES = [
('未婚', '未婚'),
('已婚未育', '已婚未育'),
('已婚已育', '已婚已育'),
('离婚', '离婚'),
('其他', '其他')
]
POLITICAL_AFFILIATION_CHOICES = [
('共产党员', '共产党员'),
('共青团员', '共青团员'),
('群众', '群众'),
('民主党派', '民主党派'),
('其他', '其他')
]
EMPLOYMENT_TYPE_CHOICES = [
('全职', '全职'),
('兼职', '兼职'),
('实习', '实习')
]
STATUS_CHOICES = [
('在职', '在职'),
('离职', '离职')
]
EDUCATION_CHOICES = [
('高中', '高中'),
('大专', '大专'),
('本科', '本科'),
('硕士研究生', '硕士研究生'),
('博士研究生', '博士研究生'),
('其他', '其他')
]
RESIGNATION_TYPE_CHOICES = [
('合同期满', '合同期满'),
('主动辞职', '主动辞职'),
('无条件辞职', '无条件辞职'),
('试用未通过', '试用未通过'),
('辞退', '辞退'),
('其他', '其他')
]
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=GENDER_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=BLOOD_TYPE_CHOICES, 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=MARITAL_STATUS_CHOICES, verbose_name='婚姻状态')
political_affiliation = models.CharField(max_length=50, choices=POLITICAL_AFFILIATION_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=EMPLOYMENT_TYPE_CHOICES, verbose_name='用工性质')
status = models.CharField(max_length=50, choices=STATUS_CHOICES, verbose_name='状态')
primary_department = models.ForeignKey('org_mgnt.PrimaryDepartment', on_delete=models.SET_NULL, null=True, verbose_name='一级部门')
secondary_department = models.ForeignKey('org_mgnt.SecondaryDepartment', on_delete=models.SET_NULL, null=True, verbose_name='二级部门', blank=True)
position = models.ForeignKey('Position', on_delete=models.SET_NULL, null=True, verbose_name='岗位')
rank = models.ForeignKey('Rank', on_delete=models.SET_NULL, null=True, 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=EDUCATION_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=RESIGNATION_TYPE_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('hrm_mgnt.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):
LEAVE_TYPE_CHOICES = [
('事假', '事假'),
('年假', '年假'),
('病假', '病假'),
('婚假', '婚假'),
('丧假', '丧假'),
]
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=LEAVE_TYPE_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}"