XH_Digital_Management/application/hrm_mgnt/models.py

197 lines
8.8 KiB
Python
Raw Normal View History

from django.core.exceptions import ValidationError
2024-05-15 10:02:51 +08:00
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='转正日期')
departure_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.DecimalField(max_digits=15, decimal_places=2, verbose_name='基础工资', null=True, 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)
class Meta:
verbose_name = '人员基本信息表'
verbose_name_plural = '人员基本信息表'
def __str__(self):
return self.name
# 员工考勤记录表
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='病假')
other_leave_details_id = models.IntegerField(null=True, blank=True, verbose_name='其他假期详细记录ID')
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}"
def clean(self):
# Ensure that remaining annual leave is not negative
if self.remaining_annual_leave < 0:
raise ValidationError('剩余年假数不能为负数')
def save(self, *args, **kwargs):
# Ensure that remaining annual leave is calculated correctly
self.remaining_annual_leave = self.total_annual_leave - self.used_annual_leave
if self.remaining_annual_leave < 0:
self.remaining_annual_leave = 0
super(AnnualLeaveRecord, self).save(*args, **kwargs)