diff --git a/yuthon_salary/models/inherit_hr_payslip.py b/yuthon_salary/models/inherit_hr_payslip.py index a96dd85ca..cbaef2175 100644 --- a/yuthon_salary/models/inherit_hr_payslip.py +++ b/yuthon_salary/models/inherit_hr_payslip.py @@ -222,3 +222,20 @@ class InheritHrPayslip(models.Model): "view_mode": "form", "target": "new", } + + def compute_sheet(self, custom_date): + payslips = self.filtered(lambda slip: slip.state in ['draft', 'verify']) + # delete old payslip lines + payslips.line_ids.unlink() + # this guarantees consistent results + self.env.flush_all() + today = custom_date if custom_date else fields.Date.today() + for payslip in payslips: + number = payslip.number or self.env['ir.sequence'].next_by_code('salary.slip') + payslip.write({ + 'number': number, + 'state': 'verify', + 'compute_date': today + }) + self.env['hr.payslip.line'].create(payslips._get_payslip_lines()) + return True \ No newline at end of file diff --git a/yuthon_salary/wizard/salary_compute_wizard.py b/yuthon_salary/wizard/salary_compute_wizard.py index e51052c3c..eb2e915b1 100644 --- a/yuthon_salary/wizard/salary_compute_wizard.py +++ b/yuthon_salary/wizard/salary_compute_wizard.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from odoo import models, fields, api, _, SUPERUSER_ID from odoo.exceptions import ValidationError, UserError +from odoo.exceptions import ValidationError from pypinyin import pinyin, Style import xlrd import base64 @@ -60,18 +61,23 @@ class SalaryComputeWizard(models.Model): 'state': 'draft', 'payslip_count': 0 }) - struct_id = contract_id.structure_type_id.default_struct_id + existing_payslip = self.env['hr.payslip'].search([ + ('employee_id', '=', employee.id), + ('date_from', '<=', end_date), + ('date_to', '>=', start_date) + ]) + if existing_payslip: + raise UserError( f"员工 {employee.name} 在 {start_date} 到 {end_date} 日期范围内已有工资单记录,无法创建新的工资单。") payslip = self.env['hr.payslip'].create({ 'name': employee.name, 'employee_id': employee.id, 'contract_id': contract_id.id, 'date_from': start_date, 'date_to': end_date, - 'struct_id': struct_id.id, 'payslip_run_id': payslip_run_id.id, 'state': 'draft', }) - payslip.compute_sheet() + payslip.compute_sheet(start_date) def _get_chinese_month(self, month): chinese_months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'] diff --git a/yuthon_salary/wizard/salary_payslip_wizard.py b/yuthon_salary/wizard/salary_payslip_wizard.py index 29ac2b63f..33dc91c9b 100644 --- a/yuthon_salary/wizard/salary_payslip_wizard.py +++ b/yuthon_salary/wizard/salary_payslip_wizard.py @@ -37,7 +37,8 @@ class SalaryPayslipWizard(models.Model): 'state': 'draft', 'payslip_count': 0 }) - payslip_id = self.env['hr.payslip'].search([('employee_id', '=', employee_id.id), ('is_push', '=', True), ('is_salary_push', '=', False)]) + payslip_id = self.env['hr.payslip'].search([('employee_id', '=', employee_id.id), ('is_push', '=', True), ('is_salary_push', '=', False), + ('date_from', '>=', row[4].value), ('date_to', '<=', row[5].value)]) payslip_id.write({ 'name': employee_id.name, 'employee_id': employee_id.id,