yun_product/yuthon_salary/models/employee_salary.py
2026-07-30 19:56:43 +08:00

118 lines
5.1 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, fields, api
class EmployeeSalary(models.Model):
"""教职工薪资档案 - 记录每位教职工的薪资配置"""
_name = 'yuthon.employee.salary'
_description = '教职工薪资档案'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'employee_id'
name = fields.Char(string='档案编号', required=True, copy=False, readonly=True, default='新建')
employee_id = fields.Many2one('hr.employee', string='教职工', required=True)
department_id = fields.Many2one('hr.department', string='所属部门', related='employee_id.department_id', store=True)
job_id = fields.Many2one('hr.job', string='岗位', related='employee_id.job_id', store=True)
# 基本信息
employee_type = fields.Selection([
('full_time', '正式编制'),
('contract', '合同制'),
('temporary', '临聘'),
('intern', '实习'),
('part_time', '兼职'),
], string='用工类型', required=True, default='full_time')
teacher_title = fields.Selection([
('none', '无职称'),
('third', '三级教师'),
('second', '二级教师'),
('first', '一级教师'),
('senior', '高级教师'),
('special', '特级教师'),
('lecturer', '讲师'),
('associate_prof', '副教授'),
('professor', '教授'),
], string='教师职称', default='none')
education_level = fields.Selection([
('college', '大专'),
('bachelor', '本科'),
('master', '硕士'),
('doctor', '博士'),
], string='学历层次', default='bachelor')
# 薪资结构
structure_id = fields.Many2one('yuthon.salary.structure', string='适用薪资结构')
# 基本工资
basic_salary = fields.Float(string='基本工资', required=True, default=0.0, tracking=True)
position_salary = fields.Float(string='岗位工资', default=0.0, tracking=True)
performance_salary = fields.Float(string='绩效工资基数', default=0.0, tracking=True)
# 课时费标准(按职称/科目差异化)
class_hour_rate_normal = fields.Float(string='常规课时费标准(元/课时)', default=0.0)
class_hour_rate_overtime = fields.Float(string='超课时费标准(元/课时)', default=0.0)
class_hour_rate_weekend = fields.Float(string='周末课时费标准(元/课时)', default=0.0)
class_hour_rate_holiday = fields.Float(string='节假日课时费标准(元/课时)', default=0.0)
# 班主任津贴
is_class_teacher = fields.Boolean(string='是否班主任', default=False)
class_teacher_allowance = fields.Float(string='班主任津贴', default=0.0)
class_level = fields.Selection([
('junior', '低年级'),
('middle', '中年级'),
('senior', '高年级'),
('junior_high', '初中'),
('senior_high', '高中'),
], string='任教年级段')
# 其他固定津贴
seniority_allowance = fields.Float(string='工龄津贴', default=0.0)
education_allowance = fields.Float(string='学历津贴', default=0.0)
title_allowance = fields.Float(string='职称津贴', default=0.0)
other_allowance = fields.Float(string='其他津贴', default=0.0)
# 社保公积金
social_insurance_base = fields.Float(string='社保基数', default=0.0)
provident_fund_base = fields.Float(string='公积金基数', default=0.0)
pension_rate_personal = fields.Float(string='养老保险个人比例(%)', default=8.0)
medical_rate_personal = fields.Float(string='医疗保险个人比例(%)', default=2.0)
unemployment_rate_personal = fields.Float(string='失业保险个人比例(%)', default=0.5)
provident_fund_rate_personal = fields.Float(string='公积金个人比例(%)', default=12.0)
# 个税
tax_deduction_point = fields.Float(string='个税起征点', default=5000.0)
special_deduction = fields.Float(string='专项附加扣除', default=0.0)
# 银行卡信息
bank_name = fields.Char(string='开户银行')
bank_account = fields.Char(string='银行卡号')
bank_branch = fields.Char(string='开户支行')
# 状态
state = fields.Selection([
('draft', '草稿'),
('active', '生效'),
('suspended', '停薪'),
('resigned', '离职'),
], string='状态', default='draft', tracking=True)
effective_date = fields.Date(string='生效日期', default=fields.Date.today)
note = fields.Text(string='备注')
company_id = fields.Many2one('res.company', string='学校', default=lambda self: self.env.company)
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if vals.get('name', '新建') == '新建':
vals['name'] = self.env['ir.sequence'].next_by_code('yuthon.employee.salary') or '新建'
return super(EmployeeSalary, self).create(vals_list)
def action_activate(self):
self.write({'state': 'active'})
def action_suspend(self):
self.write({'state': 'suspended'})
def action_resign(self):
self.write({'state': 'resigned'})