odoo18/addons_extensions/flutter_odoo/models/hr_leave.py

107 lines
5.4 KiB
Python

from odoo import api, models, _, fields
from odoo.exceptions import ValidationError
from odoo.tools.misc import format_date
from datetime import datetime
class HRLeave(models.Model):
_inherit = "hr.leave"
def flutter_check_overlap_constrain(self,employee_id, to_date, from_date):
if self.env.context.get('leave_skip_date_check', False):
return
date_from = datetime.fromisoformat(from_date).replace(hour=0, minute=0, second=0)
date_to = datetime.fromisoformat(to_date).replace(hour=23, minute=59, second=59)
employee_id = int(employee_id)
all_leaves = self.search([
('date_from', '<', date_to),
('date_to', '>', date_from),
('employee_id', 'in', [employee_id]),
('state', 'not in', ['cancel', 'refuse']),
])
domain = [
('employee_id', '=', employee_id),
('date_from', '<', date_to),
('date_to', '>', date_from),
('state', 'not in', ['cancel', 'refuse']),
]
conflicting_holidays = all_leaves.filtered_domain(domain)
if conflicting_holidays:
conflicting_holidays_list = []
# Do not display the name of the employee if the conflicting holidays have an employee_id.user_id equivalent to the user id
holidays_only_have_uid = bool(employee_id)
holiday_states = dict(conflicting_holidays.fields_get(allfields=['state'])['state']['selection'])
for conflicting_holiday in conflicting_holidays:
conflicting_holiday_data = {}
conflicting_holiday_data['employee_name'] = conflicting_holiday.employee_id.name
conflicting_holiday_data['date_from'] = format_date(self.env,
min(conflicting_holiday.mapped('date_from')))
conflicting_holiday_data['date_to'] = format_date(self.env,
min(conflicting_holiday.mapped('date_to')))
conflicting_holiday_data['state'] = holiday_states[conflicting_holiday.state]
if conflicting_holiday.employee_id.user_id.id != self.env.uid:
holidays_only_have_uid = False
if conflicting_holiday_data not in conflicting_holidays_list:
conflicting_holidays_list.append(conflicting_holiday_data)
if not conflicting_holidays_list:
return
conflicting_holidays_strings = []
if holidays_only_have_uid:
for conflicting_holiday_data in conflicting_holidays_list:
conflicting_holidays_string = _('from %(date_from)s to %(date_to)s - %(state)s',
date_from=conflicting_holiday_data['date_from'],
date_to=conflicting_holiday_data['date_to'],
state=conflicting_holiday_data['state'])
conflicting_holidays_strings.append(conflicting_holidays_string)
error = """\
You've already booked time off which overlaps with this period:
%s
Attempting to double-book your time off won't magically make your vacation 2x better!
""".join(conflicting_holidays_strings)
return error
for conflicting_holiday_data in conflicting_holidays_list:
conflicting_holidays_string = "\n" + _(
'%(employee_name)s - from %(date_from)s to %(date_to)s - %(state)s',
employee_name=conflicting_holiday_data['employee_name'],
date_from=conflicting_holiday_data['date_from'],
date_to=conflicting_holiday_data['date_to'],
state=conflicting_holiday_data['state'])
conflicting_holidays_strings.append(conflicting_holidays_string)
error = "An employee already booked time off which overlaps with this period:%s","".join(conflicting_holidays_strings)
return error
@api.model
def calculate_leave_duration(self, date_from, date_to, employee_id):
"""
Calculate the number of days and hours for the given date range and employee.
"""
employee = self.env['hr.employee'].browse(employee_id)
if not employee:
return {'error': 'Employee not found'}
from_date = datetime.fromisoformat(date_from).replace(hour=0, minute=0, second=0)
to_date = datetime.fromisoformat(date_to).replace(hour=23, minute=59, second=59)
# Define a fake leave record to use _get_durations
leave_values = {
'employee_id': employee.id,
'date_from': fields.Datetime.from_string(from_date),
'date_to': fields.Datetime.from_string(to_date),
'holiday_status_id': self.env['hr.leave.type'].search([], limit=1).id,
# Replace with appropriate leave type ID
'resource_calendar_id': employee.resource_calendar_id.id,
}
leave = self.new(leave_values)
durations = leave._get_durations()
leave_id = list(durations.keys())[0]
days, hours = durations[leave_id]
return {
'days': float(days),
'hours': float(hours),
}
@api.model
def submit_leave_flutter_odoo(self,leave_request_data):
print(leave_request_data)
pass