添加功能
This commit is contained in:
@@ -11,25 +11,49 @@ class YuthonMedicalManage(models.Model):
|
||||
employee_id = fields.Many2one('hr.employee', string="员工姓名")
|
||||
year = fields.Char(string="年份")
|
||||
current_year_remaining = fields.Float(string="本年剩余", compute="_compute_current_year_remaining")
|
||||
last_year_quota = fields.Float(string="上年额度")
|
||||
last_year_balance = fields.Float(string="上年结余")
|
||||
last_year_used = fields.Float(string="上年使用")
|
||||
last_year_remaining = fields.Float(string="上年剩余")
|
||||
prev_last_year_quota = fields.Float(string="前年额度")
|
||||
prev_last_year_balance = fields.Float(string="前年结余")
|
||||
prev_last_year_used = fields.Float(string="前年使用")
|
||||
last_year_quota = fields.Float(string="去年额度")
|
||||
last_year_used = fields.Float(string="去年使用", compute="_compute_last_year_used")
|
||||
last_year_remaining = fields.Float(string="去年剩余")
|
||||
prev_last_year_remaining = fields.Float(string="前年剩余")
|
||||
this_year_usage = fields.Float(string='本年使用')
|
||||
this_year_usage = fields.Float(string='本年使用', compute="_compute_this_year_usage")
|
||||
this_year_quota = fields.Float(string='本年额度')
|
||||
medical_line_ids = fields.One2many('yuthon.medical.line', 'medical_manage_id', string="体检费明细")
|
||||
company_id = fields.Many2one(related="employee_id.company_id", string="公司", default=lambda self: self.env.company)
|
||||
|
||||
@api.depends('this_year_quota', 'this_year_usage', 'last_year_balance')
|
||||
@api.depends('this_year_quota', 'this_year_usage', 'last_year_remaining')
|
||||
def _compute_current_year_remaining(self):
|
||||
for record in self:
|
||||
record.current_year_remaining = record.this_year_quota + record.last_year_balance - record.this_year_usage
|
||||
record.current_year_remaining = record.this_year_quota + record.last_year_remaining - record.this_year_usage
|
||||
|
||||
def _calculate_medical_quota(self, employee, current_date):
|
||||
@api.depends('employee_id', 'year')
|
||||
def _compute_last_year_used(self):
|
||||
if not self:
|
||||
return
|
||||
for record in self:
|
||||
line_domain = ([
|
||||
('employee_id', '=', record.employee_id.id),
|
||||
('enable', '=', True),
|
||||
('medical_date', '>=', f"{str(int(record.year)-1)}-01-01"),
|
||||
('medical_date', '<=', f"{str(int(record.year)-1)}-12-31")
|
||||
])
|
||||
all_lines = self.env['yuthon.medical.line'].search(line_domain)
|
||||
record.last_year_used = sum(all_lines.mapped('medical_fee'))
|
||||
|
||||
@api.depends('employee_id', 'year')
|
||||
def _compute_this_year_usage(self):
|
||||
if not self:
|
||||
return
|
||||
for record in self:
|
||||
line_domain = ([
|
||||
('employee_id', '=', record.employee_id.id),
|
||||
('enable', '=', True),
|
||||
('medical_date', '>=', f"{record.year}-01-01"),
|
||||
('medical_date', '<=', f"{record.year}-12-31")
|
||||
])
|
||||
all_lines = self.env['yuthon.medical.line'].search(line_domain)
|
||||
record.this_year_usage = sum(all_lines.mapped('medical_fee'))
|
||||
|
||||
def _calculate_medical_quota(self, employee, year):
|
||||
current_date = fields.Date.today()
|
||||
valid_rules = self.env['yuthon.medical.rule'].search([
|
||||
('start_date', '<=', current_date),
|
||||
'|', ('end_date', '>=', current_date), ('end_date', '=', False)
|
||||
@@ -43,42 +67,39 @@ class YuthonMedicalManage(models.Model):
|
||||
increment_times = exceed_age_years // rule.increase_interval_years
|
||||
base_quota += rule.increment_amount * increment_times
|
||||
|
||||
if rule.cap > 0:
|
||||
base_quota = min(base_quota, rule.cap)
|
||||
|
||||
# 女性婚姻状态补助
|
||||
final_quota = base_quota
|
||||
if employee.gender == 'female':
|
||||
if employee.user_sex == 'girl':
|
||||
if employee.marital == 'single':
|
||||
final_quota += rule.allowance_unmarried_women
|
||||
elif employee.marital == 'married':
|
||||
final_quota += rule.allowance_married_women
|
||||
|
||||
entry_date = fields.Date.from_string(employee.entry_date)
|
||||
current_year = current_date.year
|
||||
entry_year = entry_date.year
|
||||
|
||||
# 判断是否为当年入职
|
||||
if entry_year == current_year:
|
||||
if entry_year == year:
|
||||
entry_month = entry_date.month
|
||||
ratio = (12 - entry_month + 1) / 12
|
||||
final_quota = final_quota * ratio
|
||||
final_quota = max(final_quota, 0.0)
|
||||
|
||||
if rule.cap > 0:
|
||||
final_quota = min(base_quota, rule.cap)
|
||||
|
||||
return final_quota
|
||||
|
||||
def medical_manage(self):
|
||||
current_date = fields.Date.today()
|
||||
current_year = str(current_date.year)
|
||||
last_year = str(int(current_year) - 1)
|
||||
prev_last_year = str(int(current_year) - 2)
|
||||
open_contracts = self.env['hr.contract'].search([
|
||||
('state', '=', 'open'),
|
||||
last_year_medical_recs = self.env['yuthon.medical.manage'].search([
|
||||
('year', '=', last_year),
|
||||
('company_id.name', '=', '集团本部')
|
||||
])
|
||||
open_employees = open_contracts.mapped('employee_id')
|
||||
|
||||
open_employees = last_year_medical_recs.mapped('employee_id')
|
||||
for employee in open_employees:
|
||||
# 查找/创建该员工的本年体检费记录
|
||||
medical_manage_rec = self.env['yuthon.medical.manage'].search([
|
||||
('employee_id', '=', employee.id),
|
||||
('year', '=', current_year)
|
||||
@@ -93,8 +114,9 @@ class YuthonMedicalManage(models.Model):
|
||||
else:
|
||||
continue
|
||||
|
||||
this_year_quota = self._calculate_medical_quota(employee, current_date)
|
||||
medical_manage_rec.write({'this_year_quota': this_year_quota})
|
||||
this_year_quota = self._calculate_medical_quota(employee, current_year)
|
||||
medical_manage_rec.write({'this_year_quota': this_year_quota,
|
||||
})
|
||||
|
||||
# 回填上年数据
|
||||
last_year_rec = self.env['yuthon.medical.manage'].search([
|
||||
@@ -104,33 +126,23 @@ class YuthonMedicalManage(models.Model):
|
||||
if last_year_rec:
|
||||
medical_manage_rec.write({
|
||||
'last_year_quota': last_year_rec.this_year_quota,
|
||||
'last_year_used': last_year_rec.this_year_usage,
|
||||
'last_year_remaining': last_year_rec.current_year_remaining,
|
||||
'last_year_balance': last_year_rec.current_year_remaining,
|
||||
})
|
||||
|
||||
# 回填前年数据
|
||||
prev_last_year_rec = self.env['yuthon.medical.manage'].search([
|
||||
('employee_id', '=', employee.id),
|
||||
('year', '=', prev_last_year)
|
||||
], limit=1)
|
||||
if prev_last_year_rec:
|
||||
medical_manage_rec.write({
|
||||
'prev_last_year_quota': prev_last_year_rec.this_year_quota,
|
||||
'prev_last_year_used': prev_last_year_rec.this_year_usage,
|
||||
'prev_last_year_remaining': prev_last_year_rec.current_year_remaining,
|
||||
'prev_last_year_balance': prev_last_year_rec.current_year_remaining,
|
||||
})
|
||||
|
||||
# 回填前年数据
|
||||
prev_last_year_vals = {
|
||||
'prev_last_year_remaining': last_year_rec.last_year_remaining,
|
||||
}
|
||||
medical_manage_rec.write(prev_last_year_vals)
|
||||
|
||||
def button_details(self):
|
||||
form_id = self.env.ref('yuthon_hr_employee.view_yuthon_medical_manage_form').id
|
||||
tree_id = self.env.ref('yuthon_hr_employee.yuthon_medical_line_tree').id
|
||||
return {
|
||||
"type": "ir.actions.act_window",
|
||||
"name": "修正申请",
|
||||
"res_model": "yuthon.medical.manage",
|
||||
"views": [[form_id, "form"]],
|
||||
"res_id": self.id,
|
||||
"name": "查看详情",
|
||||
"res_model": "yuthon.medical.line",
|
||||
"views": [[tree_id, "tree"]],
|
||||
"domain": [('employee_id', '=', self.employee_id.id)],
|
||||
}
|
||||
|
||||
def property_reimbursement_form(self):
|
||||
@@ -151,16 +163,30 @@ class YuthonMedicalManage(models.Model):
|
||||
'target': 'new',
|
||||
}
|
||||
|
||||
def update_year(self):
|
||||
def update_initial_value(self):
|
||||
medical_ids = self.env["yuthon.medical.manage"].browse(
|
||||
self._context.get('active_ids', self._context.get('active_id')))
|
||||
for rec in medical_ids:
|
||||
rec.year = 2025
|
||||
current_year = str(rec.year)
|
||||
last_year = str(int(current_year) - 1)
|
||||
prev_last_year = str(int(current_year) - 2)
|
||||
last_year_quota = self._calculate_medical_quota(rec.employee_id, last_year)
|
||||
prev_last_year_quota = self._calculate_medical_quota(rec.employee_id, prev_last_year)
|
||||
this_year_quota = self._calculate_medical_quota(rec.employee_id, current_year)
|
||||
rec.write({
|
||||
'this_year_quota': this_year_quota,
|
||||
'last_year_quota': last_year_quota,
|
||||
'prev_last_year_quota': prev_last_year_quota,
|
||||
})
|
||||
|
||||
|
||||
|
||||
class YuthonMedicalLine(models.Model):
|
||||
_name = 'yuthon.medical.line'
|
||||
_description = '体检费明细'
|
||||
|
||||
medical_manage_id = fields.Many2one('yuthon.medical.manage', string="关联体检费管理")
|
||||
medical_date = fields.Date(string="体检日期")
|
||||
medical_fee = fields.Float(string="费用")
|
||||
employee_id = fields.Many2one('hr.employee', string="姓名")
|
||||
medical_date = fields.Date(string="报销日期")
|
||||
medical_fee = fields.Float(string="金额")
|
||||
enable = fields.Boolean(string="启用", default=True)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user