diff --git a/yuthon_hr_attendance/models/hr_attendance_month.py b/yuthon_hr_attendance/models/hr_attendance_month.py
index 134ab0a33..f31db48ff 100644
--- a/yuthon_hr_attendance/models/hr_attendance_month.py
+++ b/yuthon_hr_attendance/models/hr_attendance_month.py
@@ -3,6 +3,7 @@ import datetime
import calendar
from odoo import api, fields, models, tools, _
from odoo.tools.float_utils import float_round
+from dateutil.relativedelta import relativedelta
class HrAttendanceYear(models.Model):
@@ -95,7 +96,6 @@ class HrAttendanceMonthDetail(models.Model):
actual_attendance_days = fields.Integer(string="实际出勤天数")
compensatory_leave = fields.Integer(string="调休")
leave_of_absence = fields.Integer(string="事假")
- leave_of_sick = fields.Integer(string="病假")
statutory_leave = fields.Integer(string="法定假")
work_overtime = fields.Integer(string="加班")
entry_date = fields.Date(related='employee_id.open_start_time', string="入职日期")
@@ -106,6 +106,7 @@ class HrAttendanceMonthDetail(models.Model):
marriage_leave = fields.Float(string='婚假')
general_off_leave = fields.Float(string='调休')
maternity_leave = fields.Float(string='产假')
+ paternity_leave = fields.Float(string='陪产假')
family_planning_leave = fields.Float(string='计生假')
bereavement_leave = fields.Float(string='丧假')
home_visit_leave = fields.Float(string='探亲假')
@@ -412,8 +413,99 @@ class HrAttendanceMonthDetail(models.Model):
}
def button_confirm(self):
+ current_employee = self.env['hr.employee'].search([('user_id', '=', self.env.user.id)], limit=1)
for record in self:
- record.state = 'confirmed'
+ current_year = record.current_year
+ current_month = int(record.current_month)
+
+ # 计算该月的天数
+ if current_month in [1, 3, 5, 7, 8, 10, 12]:
+ month_days = 31
+ elif current_month in [4, 6, 9, 11]:
+ month_days = 30
+ elif current_month == 2:
+ if (int(current_year) % 4 == 0 and int(current_year) % 100 != 0) or (int(current_year) % 400 == 0):
+ month_days = 29
+ else:
+ month_days = 28
+ # 日期拼接
+ payslip_start_date = datetime.date(int(current_year), current_month, 1)
+ payslip_end_date = datetime.date(int(current_year), current_month, month_days)
+
+ payslip_record = self.env['hr.payslip'].search([
+ ('employee_id', '=', current_employee.id),
+ ('date_from', '>=', payslip_start_date),
+ ('date_to', '<=', payslip_end_date)
+ ])
+ if payslip_record:
+ # 初始值
+ base_deduction = 0
+ performance_deduction = 0
+ commuting_deduction = 0
+ # 获取当前人员的 对应的月份的基本薪资 绩效奖金 和 通信补贴
+ base_salary = payslip_record.base_salary
+ performance_bonuses = payslip_record.performance_bonuses
+ commuting_allowance = payslip_record.commuting_allowance
+
+ # 普通病假
+ common_sick_leave = record.general_sick_leave
+ base_deduction += common_sick_leave * base_salary * 0.01
+ performance_deduction += (performance_bonuses / 21.75) * common_sick_leave
+
+ # 住院恢复期
+ hospital_recovery_leave = record.recovery_sick_leave
+ base_deduction += hospital_recovery_leave * base_salary * 0.01
+ performance_deduction += (performance_bonuses / 21.75) * hospital_recovery_leave
+
+ # 住院假
+ hospital_leave = record.hospital_sick_leave
+ performance_deduction += (performance_bonuses / 21.75) * hospital_leave
+
+ # 事假
+ personal_leave = record.leave_of_absence
+ base_deduction += personal_leave * base_salary * 0.025
+ performance_deduction += (performance_bonuses / 21.75) * personal_leave
+
+ # 产假
+ maternity_leave = record.maternity_leave
+ commuting_deduction += (commuting_allowance / month_days) * maternity_leave
+ performance_deduction += (performance_bonuses / month_days) * maternity_leave
+
+ # 陪产假
+ paternity_leave = record.paternity_leave
+ commuting_deduction += (commuting_allowance / month_days) * paternity_leave
+ performance_deduction += (performance_bonuses / month_days) * paternity_leave
+
+ # 计生假
+ family_planning_leave = record.family_planning_leave
+ commuting_deduction += (commuting_allowance / month_days) * family_planning_leave
+ performance_deduction += (performance_bonuses / month_days) * family_planning_leave
+
+ # 丧假
+ bereavement_leave = record.bereavement_leave
+ performance_deduction += (performance_bonuses / 21.75) * bereavement_leave
+
+ # 探亲假
+ home_visit_leave = record.home_visit_leave
+ performance_deduction += (performance_bonuses / 21.75) * home_visit_leave
+
+ # 婚假
+ marriage_leave = record.marriage_leave
+ performance_deduction += (performance_bonuses / 21.75) * marriage_leave
+
+ # 考试假
+ exam_leave = record.exam_leave
+ performance_deduction += (performance_bonuses / 21.75) * exam_leave
+
+ # 家长会假
+ parents_meeting_leave = record.parents_meeting_leave
+ performance_deduction += (performance_bonuses / 21.75) * parents_meeting_leave
+
+ current_employee.write({
+ 'last_month_base_salary_deduction': base_deduction,
+ 'last_month_performance_deduction': performance_deduction,
+ 'last_month_commuting_deduction': commuting_deduction
+ })
def _get_attendance_month_obj(self):
"""
diff --git a/yuthon_hr_attendance/models/inherit_hr_employee.py b/yuthon_hr_attendance/models/inherit_hr_employee.py
index 037d12428..14605f358 100644
--- a/yuthon_hr_attendance/models/inherit_hr_employee.py
+++ b/yuthon_hr_attendance/models/inherit_hr_employee.py
@@ -7,7 +7,6 @@ class YuthonHrEmployee(models.Model):
_inherit = "hr.employee"
user_role_ids_changed = fields.Boolean(compute='_compute_user_roles')
- last_attendance = fields.Boolean(string="上月全勤", compute='_compute_last_attendance', store=True)
@api.depends('user_role_ids')
def _compute_user_roles(self):
@@ -33,30 +32,4 @@ class YuthonHrEmployee(models.Model):
# 未知因素屏蔽选择值
group.write({'users': [(4, employee.user_id.id)]})
self.user_role_ids = old_users_ids
- self.user_role_ids_changed = True
-
- @api.depends('name')
- def _compute_last_attendance(self):
- for record in self:
- today = datetime.today()
- first_day_of_last_month = today.replace(day=1) - relativedelta(months=1)
- last_day_of_last_month = first_day_of_last_month.replace(day=28) + relativedelta(days=4)
- last_day_of_last_month = last_day_of_last_month - relativedelta(days=last_day_of_last_month.day)
- attendance_records = self.env['hr.attendance'].search([
- ('employee_id', '=', record.id),
- ('check_in', '>=', first_day_of_last_month),
- ('check_in', '<=', last_day_of_last_month)
- ])
- has_abnormal = True
- if attendance_records:
- for attendance in attendance_records:
- if (
- attendance.is_no_card or
- attendance.is_early_card or
- attendance.is_late_card or
- attendance.is_abnormal or
- attendance.absenteeism_card
- ):
- has_abnormal = False
- break
- record.last_attendance = has_abnormal
\ No newline at end of file
+ self.user_role_ids_changed = True
\ No newline at end of file
diff --git a/yuthon_hr_attendance/views/hr_attendance_month_views.xml b/yuthon_hr_attendance/views/hr_attendance_month_views.xml
index 54202585b..23e08a694 100644
--- a/yuthon_hr_attendance/views/hr_attendance_month_views.xml
+++ b/yuthon_hr_attendance/views/hr_attendance_month_views.xml
@@ -85,6 +85,7 @@
+
@@ -218,7 +219,6 @@
-
diff --git a/yuthon_hr_attendance/views/inherit_hr_employee.xml b/yuthon_hr_attendance/views/inherit_hr_employee.xml
index eb134807d..bc404c863 100644
--- a/yuthon_hr_attendance/views/inherit_hr_employee.xml
+++ b/yuthon_hr_attendance/views/inherit_hr_employee.xml
@@ -1,13 +1,3 @@
-
- hr.employee.form
- hr.employee
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py
index 196207784..172fd48f4 100644
--- a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py
+++ b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py
@@ -167,6 +167,16 @@ class HrAttendanceMonthWizard(models.TransientModel):
'事假': 'unpaid_leave',
'补休': 'cop_leave',
'产假': 'maternity_leave',
+ '病假(普通)': 'general_sick_leave',
+ '病假(住院期)': 'hospital_sick_leave',
+ '病假(出院恢复期)': 'recovery_sick_leave',
+ '陪产假': 'paternity_leave',
+ '计生假': 'family_planning_leave',
+ '丧假': 'bereavement_leave',
+ '探亲假' : 'home_visit_leave',
+ '婚假': 'marriage_leave',
+ '考试假': 'exam_leave',
+ '家长会假': 'parents_meeting_leave',
}
leave_days = {}
year = int(self.current_year)
@@ -204,5 +214,3 @@ class HrAttendanceMonthWizard(models.TransientModel):
for field_name, days in leave_days.items():
setattr(attendance_detail, leave_types[field_name], days)
setattr(attendance_detail, 'work_overtime', all_overtime_hours)
-
- # return result
\ No newline at end of file
diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py
index 6f6d28686..4f104a32e 100644
--- a/yuthon_hr_employee/models/yuthon_hr_employee.py
+++ b/yuthon_hr_employee/models/yuthon_hr_employee.py
@@ -166,64 +166,14 @@ class YuthonHrEmployee(models.Model):
social_base_on = fields.Float(string="1-6月社保薪资基数")
social_base_off = fields.Float(string="7-12月社保薪资基数")
is_salary = fields.Boolean(string="是否薪资计算", default=True)
- last_month_attendance_deduction = fields.Float(string="上月考勤扣款")
last_month_base_salary_deduction = fields.Float(string="上月基本薪资扣款")
- last_month_performance_deduction = fields.Float(string="上月绩效扣款", compute='_compute_last_month_deductions')
- last_month_commuting_deduction = fields.Float(string='上月通信扣款', compute='_compute_last_month_deductions')
- commuting = fields.Float(string='通信补贴', compute='_compute_employee_salary')
- performance = fields.Float(string='绩效奖金', compute='_compute_employee_salary')
+ last_month_performance_deduction = fields.Float(string="上月绩效扣款")
+ last_month_commuting_deduction = fields.Float(string='上月通信扣款')
medical_insurance_base = fields.Float(string='基本医疗费基数', compute='_compute_insurance_bases')
pension_insurance_base = fields.Float(string='基本养老费基数', compute='_compute_insurance_bases')
work_injury_insurance_base = fields.Float(string='工伤保险费基数', compute='_compute_insurance_bases')
housing_fund_base = fields.Float(string='住房公积金基数', compute='_compute_insurance_bases')
-
- def _compute_employee_salary(self):
- for record in self:
- # 获取上个月的时间范围
- now = datetime.now()
- last_month_start = (now.replace(day=1) - relativedelta(months=1))
- last_month_end = last_month_start + relativedelta(day=31)
- payslip_record = self.env['hr.payslip'].search([
- ('employee_id', '=', record.id),
- ('date_from', '>=', last_month_start),
- ('date_to', '<=', last_month_end)
- ])
- if payslip_record:
- record.commuting = payslip_record.commuting_allowance
- record.performance = payslip_record.performance_bonuses
- else:
- record.commuting = 0
- record.performance = 0
-
- @api.depends('commuting', 'performance')
- def _compute_last_month_deductions(self):
- today = datetime.today()
- last_month = today - relativedelta(months=1)
- last_month_year = str(last_month.year)
- last_month_month = str(last_month.month)
- for record in self:
- # 查找上个月的考勤月度明细记录
- attendance_record = self.env['hr.attendance.month.detail'].search([
- ('employee_id', '=', record.id),
- ('current_year', '=', last_month_year),
- ('current_month', '=', last_month_month)
- ])
- if attendance_record:
- # 计算总产假天数
- maternity_leave = attendance_record.maternity_leave
- # 计算月天数
- if last_month.month in [1, 3, 5, 7, 8, 10, 12]:
- end_day = 31
- elif last_month.month in [4, 6, 9, 11]:
- end_day = 30
- elif (last_month.month % 4 == 0 and last_month.year % 100 != 0) or (last_month.year % 400 == 0):
- end_day = 29
- else:
- end_day = 28
-
- # 计算扣款
- record.last_month_commuting_deduction = record.commuting / end_day * maternity_leave
- record.last_month_performance_deduction = record.performance / end_day * maternity_leave
+ last_attendance = fields.Boolean(string="上月全勤", store=True)
@api.depends('social_base_on', 'social_base_off')
def _compute_insurance_bases(self):
@@ -250,6 +200,7 @@ class YuthonHrEmployee(models.Model):
else:
setattr(record, field_name, base)
+
@api.onchange('job_id')
def _onchange_job_id(self):
if self.job_id:
diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
index 17850dfc3..34b2f9360 100644
--- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
+++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
@@ -143,13 +143,11 @@
-
-
-
+