oca-payroll/odoo-bringout-oca-payroll-hr_payroll_period/hr_payroll_period/models/hr_payslip.py
2025-08-29 15:43:05 +02:00

81 lines
3.1 KiB
Python

# Copyright 2015 Savoir-faire Linux. All Rights Reserved.
# Copyright 2017 Serpent Consulting Services Pvt. Ltd.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
from odoo.exceptions import UserError
class HrPayslip(models.Model):
_inherit = "hr.payslip"
hr_period_id = fields.Many2one(
"hr.period",
string="Period",
readonly=True,
states={"draft": [("readonly", False)]},
)
date_payment = fields.Date(
"Date of Payment", readonly=True, states={"draft": [("readonly", False)]}
)
@api.constrains("hr_period_id", "company_id")
def _check_period_company(self):
for slip in self:
if slip.hr_period_id and slip.hr_period_id.company_id != slip.company_id:
if slip.hr_period_id.company_id != slip.company_id:
raise UserError(
_(
"The company on the selected period must be the same "
"as the company on the payslip."
)
)
@api.onchange("company_id", "contract_id")
def onchange_company_id(self):
if self.company_id:
if self.contract_id:
contract = self.contract_id
period = self.env["hr.period"].get_next_period(
self.company_id.id, contract.schedule_pay
)
else:
schedule_pay = self.env["hr.payslip.run"].get_default_schedule(
self.company_id.id
)
if self.company_id and schedule_pay:
period = self.env["hr.period"].get_next_period(
self.company_id.id, schedule_pay
)
self.hr_period_id = period.id if period else False
@api.onchange("contract_id")
def onchange_contract_period(self):
if self.contract_id.employee_id and self.contract_id:
employee = self.contract_id.employee_id
contract = self.contract_id
period = self.env["hr.period"].get_next_period(
employee.company_id.id, contract.schedule_pay
)
if period:
self.hr_period_id = period.id if period else False
@api.onchange("hr_period_id")
def onchange_hr_period_id(self):
if self.hr_period_id:
# dates must be updated together to prevent constraint
self.date_from = self.hr_period_id.date_start
self.date_to = self.hr_period_id.date_end
self.date_payment = self.hr_period_id.date_payment
@api.model
def create(self, vals):
if vals.get("payslip_run_id"):
payslip_run = self.env["hr.payslip.run"].browse(vals["payslip_run_id"])
self.env["hr.employee"].browse(vals["employee_id"])
period = payslip_run.hr_period_id
vals["date_payment"] = payslip_run.date_payment
vals["hr_period_id"] = period.id
elif vals.get("date_to") and not vals.get("date_payment"):
vals["date_payment"] = vals["date_to"]
return super(HrPayslip, self).create(vals)