From cb654769c76bf662da93166705ed3fe28665d583 Mon Sep 17 00:00:00 2001 From: odex Date: Thu, 18 Jul 2024 16:28:41 +0300 Subject: [PATCH] add task permation and fix holiday --- .../models/hr_personal_permission.py | 51 +++++++++----- .../views/hr_personal_permission.xml | 70 +++++++++---------- .../models/hr_holidays_status.py | 32 +++++---- .../views/hr_holidays_view.xml | 5 ++ 4 files changed, 89 insertions(+), 69 deletions(-) diff --git a/odex25_hr/employee_requests/models/hr_personal_permission.py b/odex25_hr/employee_requests/models/hr_personal_permission.py index a4df239d0..30a8dbdb7 100644 --- a/odex25_hr/employee_requests/models/hr_personal_permission.py +++ b/odex25_hr/employee_requests/models/hr_personal_permission.py @@ -21,12 +21,9 @@ class HrPersonalPermission(models.Model): duration = fields.Float(compute='get_duration_no' ,store=True) employee_contract_id = fields.Many2one(comodel_name='hr.contract.type') balance = fields.Float(related='employee_id.contract_id.working_hours.permission_hours') - - permission_number = fields.Float(store=True, readonly=True, - help='The Remaining Number of Hours permission This Month') + permission_number = fields.Float(store=True, readonly=True, help='The Remaining Number of Hours permission This Month') early_exit = fields.Boolean() mission_purpose = fields.Text() - employee_no = fields.Char(related='employee_id.emp_no', readonly=True) job_id = fields.Many2one(related='employee_id.job_id', readonly=True) department_id = fields.Many2one(related='employee_id.department_id', readonly=True) @@ -34,20 +31,40 @@ class HrPersonalPermission(models.Model): attach_ids = fields.One2many('ir.attachment', 'personal_permission_id') approved_by = fields.Many2one(comodel_name='res.users') refused_by = fields.Many2one(comodel_name='res.users') - employee_id = fields.Many2one('hr.employee', 'Employee Id', default=lambda item: item.get_user_id(), - domain=[('state', '=', 'open')]) - - state = fields.Selection( - [('draft', _('Draft')), ('send', _('Waiting Direct Manager')), ('direct_manager', _('Wait HR Department')), - ('approve', _('Approved')) - , ('refused', _('Refused'))], default="draft", tracking=True) - - type_exit = fields.Selection( - [('early_exit', _('Early Exit')), ('late entry', _('Late Entry')), ('during work', _('During Work'))], - default="early_exit") - + employee_id = fields.Many2one('hr.employee', 'Employee Id', default=lambda item: item.get_user_id(),domain=[('state', '=', 'open')]) + state = fields.Selection([('draft', _('Draft')), ('send', _('Waiting Direct Manager')), ('direct_manager', _('Wait HR Department')),('approve', _('Approved')), ('refused', _('Refused'))], default="draft", tracking=True) + type_exit = fields.Selection([('early_exit', _('Early Exit')), ('late entry', _('Late Entry')), ('during work', _('During Work'))],default="early_exit") company_id = fields.Many2one('res.company',string="Company", default=lambda self: self.env.user.company_id) + time_permission_from = fields.Float(string="Permission From (24h format)", help="Time in 24-hour format (e.g., 13.5 for 1:30 PM)") + time_permission_to = fields.Float(string="Permission To (24h format)", help="Time in 24-hour format (e.g., 15.75 for 3:45 PM)") + + + @api.onchange('time_permission_from', 'time_permission_to', 'date') + def _onchange_time(self): + for record in self: + if (not record.time_permission_from < record.time_permission_to): + record.time_permission_to = record.time_permission_from + 0.5 + record.time_permission_from = record.time_permission_from + if record.date: + date_from = self._combine_date_and_time(record.date, record.time_permission_from) + record.date_from = date_from + if record.date: + date_to = self._combine_date_and_time(record.date, record.time_permission_to) + record.date_to = date_to + + def _combine_date_and_time(self, date, time_float): + """ Combine a date and a float time (e.g. 13.5) into a datetime object. """ + hours = int(time_float) + minutes = int((time_float - hours) * 60) + import pytz + date_time = datetime.combine(date, datetime.min.time()) + timedelta(hours=hours, minutes=minutes) + # if time_float > 0: + date_time = fields.Datetime.to_string(pytz.timezone(self.env.context['tz']).localize(fields.Datetime.from_string(date_time), is_dst=None).astimezone(pytz.utc)) + # date_time = fields.Datetime.to_string(pytz.timezone(self.env.context['tz']).localize(fields.Datetime.from_string(date_time), is_dst=None).astimezone(pytz.utc) + timedelta(hours=24)) + return date_time + + @api.model def create(self, vals): new_record = super(HrPersonalPermission, self).create(vals) @@ -79,6 +96,7 @@ class HrPersonalPermission(models.Model): @api.depends('date_from', 'date_to') def get_duration_no(self): for item in self: + item._onchange_time() if item.date_from and item.date_to: start_date_value = datetime.strptime(str(item.date_from), "%Y-%m-%d %H:%M:%S") end_date = datetime.strptime(str(item.date_to), "%Y-%m-%d %H:%M:%S") @@ -93,6 +111,7 @@ class HrPersonalPermission(models.Model): @api.onchange('date_to', 'date_from', 'employee_id') def permission_number_decrement(self): for item in self: + item._onchange_time() if item.employee_id: if not item.employee_id.first_hiring_date: raise exceptions.Warning( diff --git a/odex25_hr/employee_requests/views/hr_personal_permission.xml b/odex25_hr/employee_requests/views/hr_personal_permission.xml index eaed4d772..36e30d9cf 100644 --- a/odex25_hr/employee_requests/views/hr_personal_permission.xml +++ b/odex25_hr/employee_requests/views/hr_personal_permission.xml @@ -7,7 +7,7 @@ tree,form,calendar - + hr.personal.permission.calendar hr.personal.permission @@ -25,58 +25,55 @@
-
- - - + + + - - - + + + - + diff --git a/odex25_hr/hr_holidays_public/models/hr_holidays_status.py b/odex25_hr/hr_holidays_public/models/hr_holidays_status.py index 1e552f03c..442abc5d1 100644 --- a/odex25_hr/hr_holidays_public/models/hr_holidays_status.py +++ b/odex25_hr/hr_holidays_public/models/hr_holidays_status.py @@ -109,21 +109,23 @@ class HrHolidaysStatus(models.Model): leaves = self.browse(leave_ids) sort_key = lambda l: (l.leave_type, l.sickness_severity, l.virtual_remaining_leaves) employee_id = self._context.get('employee_id') - balance = self.env['hr.holidays'].search([ - ('employee_id', '=', int(employee_id)), - ('holiday_status_id.leave_type', '!=', 'sick'), - ('type', '=', 'add'), - ('check_allocation_view', '=', 'balance') - ]).mapped('holiday_status_id') - balance_sick = self.env['hr.holidays'].search([ - ('employee_id', '=', int(employee_id)), - ('holiday_status_id.leave_type', '=', 'sick'), - ('type', '=', 'add'), - ('check_allocation_view', '=', 'balance'), - ('remaining_leaves', '>', 0) - ]).mapped('holiday_status_id').sorted(key=lambda eval: eval.sickness_severity, reverse=False) - balance_sick = balance_sick and balance_sick[0] or balance_sick - leaves = balance | balance_sick + type_holiday = self._context.get('type') + if type_holiday == "remove": + balance = self.env['hr.holidays'].search([ + ('employee_id', '=', int(employee_id)), + ('holiday_status_id.leave_type', '!=', 'sick'), + ('type', '=', 'add'), + ('check_allocation_view', '=', 'balance') + ]).mapped('holiday_status_id') + balance_sick = self.env['hr.holidays'].search([ + ('employee_id', '=', int(employee_id)), + ('holiday_status_id.leave_type', '=', 'sick'), + ('type', '=', 'add'), + ('check_allocation_view', '=', 'balance'), + ('remaining_leaves', '>', 0) + ]).mapped('holiday_status_id').sorted(key=lambda eval: eval.sickness_severity, reverse=False) + balance_sick = balance_sick and balance_sick[0] or balance_sick + leaves = balance | balance_sick return leaves.sorted(key=sort_key, reverse=False).ids return leave_ids diff --git a/odex25_hr/hr_holidays_public/views/hr_holidays_view.xml b/odex25_hr/hr_holidays_public/views/hr_holidays_view.xml index 766b0f19d..752e3612d 100644 --- a/odex25_hr/hr_holidays_public/views/hr_holidays_view.xml +++ b/odex25_hr/hr_holidays_public/views/hr_holidays_view.xml @@ -24,6 +24,11 @@ hr_base.group_division_manager,hr_holidays_community.group_hr_holidays_user + + + {'employee_id':employee_id,'type':type} + + True True