# -*- 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'})