diff --git a/yuthon_salary/wizard/salary_compute_wizard.py b/yuthon_salary/wizard/salary_compute_wizard.py index 6ce731fc8..c089d4a01 100644 --- a/yuthon_salary/wizard/salary_compute_wizard.py +++ b/yuthon_salary/wizard/salary_compute_wizard.py @@ -115,7 +115,7 @@ class SalaryComputeWizard(models.Model): ], limit=1) if not existing_payslip: - payslip_id = self.env['hr.payslip'].create({ + self.env['hr.payslip'].create({ 'is_bold': is_bold, 'name': employee.name, 'employee_id': employee.id, @@ -125,9 +125,7 @@ class SalaryComputeWizard(models.Model): 'salary_group_id': contract_id.salary_group_id.id if contract_id else employee.contract_id.salary_group_id.id, 'payslip_run_id': payslip_run_id.id, 'state': 'draft', - }) - payslip_id.compute_sheet() - payslip_id.compute_sheet() + }).compute_sheet() internship_ids = self.env['hr.payslip'].search([ ('is_push', '=', False), @@ -138,30 +136,20 @@ class SalaryComputeWizard(models.Model): for internship_id in internship_ids: employee = internship_id.employee_id contract = employee.contract_id + year = int(self.select_year) + month = int(self.select_time) # 更改扣发绩效奖金 performance_deduction = self.salary_performance_deduction(employee, self.select_year, self.select_time, internship_id.performance_bonuses) internship_id.write({ 'performance_deduction': performance_deduction, }) # 获取离职日期 - turnover_date = employee.contract_id.date_end + turnover_date = contract.date_end start_date = fields.Date.from_string(start_date) end_date = fields.Date.from_string(end_date) - # 判断员工是否在所选月份已离职 - is_turnover = False - if turnover_date: - turnover_year = turnover_date.year - turnover_month = turnover_date.month - # 如果离职年月早于或等于所选年月,则视为已离职 - is_turnover = (turnover_year < year) or (turnover_year == year and turnover_month <= month) - - # 判断员工是否在试用期 - is_probation = False - if contract.start_date and contract.end_date: - # 检查所选月份是否在试用期内 - selected_date = fields.Date.to_date(f"{year}-{month:02d}-01") - is_probation = contract.start_date <= selected_date <= contract.end_date + is_turnover = self._is_employee_turnover(employee, year, month) + is_probation = self._is_employee_in_probation(employee, year, month) original_start_date = internship_id.date_from original_end_date = internship_id.date_to @@ -288,10 +276,13 @@ class SalaryComputeWizard(models.Model): for rec in self.env['hr.payslip'].search([('is_push', '=', False), ('salary_group_id.name', '=', '天河物管领导')]): rec.compute_sheet() - for rec2 in self.env['hr.payslip'].search([('employee_id.name', '=', '王军'), ('is_push', '=', False)]): - rec2.compute_sheet() - for rec2 in self.env['hr.payslip'].search([('employee_id.name', '=', '蔡思琪'), ('is_push', '=', False)]): - rec2.compute_sheet() + + year = int(self.select_year) + month = int(self.select_time) + for rec2 in self.env['hr.payslip'].search(('is_push', '=', False)): + if not self._is_employee_turnover(rec2.employee_id, year, month) and not self._is_employee_in_probation( + rec2.employee_id, year, month): + rec2.compute_sheet() def _get_chinese_month(self, month): chinese_months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'] @@ -376,6 +367,24 @@ class SalaryComputeWizard(models.Model): # 满足任一条件即返回 True return entry_matches or confirmation_matches or retire_matches + def _is_employee_turnover(self, employee, year, month): + """判断员工是否在指定年月已离职""" + turnover_date = employee.contract_id.date_end + if not turnover_date: + return False + turnover_year = turnover_date.year + turnover_month = turnover_date.month + return (turnover_year < year) or (turnover_year == year and turnover_month <= month) + + def _is_employee_in_probation(self, employee, year, month): + """判断员工在指定年月是否处于试用期""" + contract = employee.contract_id + if not (contract and contract.start_date and contract.end_date): + return False + # 检查所选月份是否在试用期内 + selected_date = fields.Date.to_date(f"{year}-{month:02d}-01") + return contract.start_date <= selected_date <= contract.end_date + def salary_performance_deduction(self, employee, selected_year, selected_month, performance_bonuses): attendance_month_obj = self.env["hr.attendance.month.detail"].search([ ('employee_id', '=', employee.id),