odoo18/addons_extensions/leaves_timesheets_extended/models/hr_leave.py

124 lines
3.0 KiB
Python

from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class HrLeave(models.Model):
_inherit = 'hr.leave'
project_id = fields.Many2one(
'project.project',related="holiday_status_id.project_id",
string='Project'
)
task_id = fields.Many2one(
'project.task',related="holiday_status_id.task_id",
string='Task'
)
timesheet_line_id = fields.Many2one(
'account.analytic.line',
string='Timesheet Entry',
readonly=True,
copy=False
)
# CREATE TIMESHEET ON APPROVAL
def action_draft(self):
res = super().action_draft()
default_project = self.env.ref(
'leaves_timesheets_extended.project_internal_leave'
)
default_task = self.env.ref(
'leaves_timesheets_extended.task_leave_management'
)
for leave in self:
# Prevent duplicate creation
if leave.timesheet_line_id:
continue
project = (
leave.project_id
or default_project
)
task = (
leave.task_id
or default_task
)
# Hours Calculation
if leave.request_unit_half:
hours = 4
else:
hours = leave.number_of_days * 8
analytic_line = self.env['account.analytic.line'].create({
'name': f"Leave: {leave.holiday_status_id.name}",
'employee_id': leave.employee_id.id,
'user_id': leave.employee_id.user_id.id,
'project_id': project.id,
'task_id': task.id,
'unit_amount': hours,
'date': leave.request_date_from,
'company_id': leave.company_id.id,
})
leave.timesheet_line_id = analytic_line.id
return res
def action_refuse(self):
res = super().action_refuse()
for leave in self:
if leave.timesheet_line_id:
leave.timesheet_line_id.unlink()
leave.timesheet_line_id = False
return res
#ACTION CANCEL
def action_cancel(self):
res = super().action_cancel()
for leave in self:
if leave.timesheet_line_id:
leave.timesheet_line_id.unlink()
leave.timesheet_line_id = False
return res
def _check_validity(self):
res = super(HrLeave, self)._check_validity()
for leave in self:
# Public holiday / weekoff validation
if leave.number_of_days <= 0:
raise ValidationError(_(
"The selected day is either a Public Holiday or Week Off."
))
return res
class HRLeaveType(models.Model):
_inherit='hr.leave.type'
project_id = fields.Many2one(
'project.project',
string='Project'
)
task_id = fields.Many2one(
'project.task',
string='Task'
)