124 lines
3.0 KiB
Python
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'
|
|
)
|