You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							172 lines
						
					
					
						
							7.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							172 lines
						
					
					
						
							7.7 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################### | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Gayathri V(odoo@cybrosys.com) | |
| # | |
| #    You can modify it under the terms of the GNU AFFERO | |
| #    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | |
| # | |
| #    This program is distributed in the hope that it will be useful, | |
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| #    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |
| #    (AGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################### | |
| import pytz | |
| from odoo import api, fields, models | |
| 
 | |
| 
 | |
| class HrLeave(models.Model): | |
|     """Inherit the model hr.leave to introduce supplementary functionality | |
|     aimed at incorporating specific employee details.""" | |
|     _inherit = 'hr.leave' | |
| 
 | |
|     def _prepare_employee_data(self, employee): | |
|         """Function to prepare employee data for the dashboard""" | |
|         return { | |
|             'id': employee.id, | |
|             'name': employee.name, | |
|             'job_id': employee.job_id.name, | |
|             'approval_status_count': self.get_approval_status_count(employee.id) | |
|         } | |
| 
 | |
|     @api.model | |
|     def get_current_employee(self): | |
|         """This function fetches current employee details in a dictionary""" | |
|         current_employee = self.env.user.employee_ids | |
|         return { | |
|             'id': current_employee.id, | |
|             'name': current_employee.name, | |
|             'job_id': current_employee.job_id.id, | |
|             'image_1920': current_employee.image_1920, | |
|             'work_email': current_employee.work_email, | |
|             'work_phone': current_employee.work_phone, | |
|             'resource_calendar_id': current_employee.resource_calendar_id.name, | |
|             'link': '/mail/view?model=%s&res_id=%s' % ( | |
|                 'hr.employee.public', current_employee.id,), | |
|             'department_id': current_employee.department_id.name, | |
|             'company': current_employee.company_id.name, | |
|             'job_position': current_employee.job_id.name, | |
|             'parent_id': current_employee.parent_id.ids, | |
|             'child_ids': current_employee.child_ids.ids, | |
|             'child_all_count': current_employee.child_all_count, | |
|             'manager': self._prepare_employee_data( | |
|                 current_employee.parent_id) if ( | |
|                 current_employee.parent_id) else {}, | |
|             'manager_all_count': len(current_employee.parent_id.ids), | |
|             'children': [self._prepare_employee_data(child) for child in | |
|                          current_employee.child_ids if | |
|                          child != current_employee], | |
|         } | |
| 
 | |
|     @api.model | |
|     def get_absentees(self): | |
|         """The function retrieves a list of employees who are absent on the | |
|         current date by querying the hr_leave table and comparing the | |
|         date_from and date_to fields of validated leave requests. It returns | |
|         a list of dictionaries containing the employee's name, employee_id, | |
|         date_from, and date_to""" | |
|         current_employee = self.env.user.employee_ids | |
|         children = [self._prepare_employee_data(child) for child in | |
|                     current_employee.child_ids if | |
|                     child != current_employee] | |
|         child_list = [child.get('id') for child in children] | |
|         if len(child_list) > 1: | |
|             query = "SELECT employee_id,name,date_from,date_to FROM hr_leave " \ | |
|                     "INNER JOIN hr_employee ON hr_leave.employee_id = " \ | |
|                     "hr_employee.id WHERE state = 'validate' AND " \ | |
|                     "employee_id in %s" % str(tuple(child_list)) | |
|             self._cr.execute(query) | |
|         elif len(child_list) == 1: | |
|             query = "SELECT employee_id,name,date_from,date_to FROM hr_leave " \ | |
|                     "INNER JOIN hr_employee ON hr_leave.employee_id = " \ | |
|                     "hr_employee.id WHERE state = 'validate' AND " \ | |
|                     "employee_id = %s" % child_list[0] | |
|             self._cr.execute(query) | |
|         leave = self._cr.dictfetchall() | |
|         absentees = [ | |
|             leave[leave_date] for leave_date in range(len(leave)) | |
|             if leave[leave_date].get('date_from') <= fields.datetime.now() <= leave[ | |
|                 leave_date].get('date_to') | |
|         ] | |
|         return absentees | |
| 
 | |
|     @api.model | |
|     def get_current_shift(self): | |
|         """ This function fetches current employee's current shift""" | |
|         current_employee = self.env.user.employee_ids | |
|         employee_tz = current_employee.tz or self.env.context.get('tz') | |
|         employee_pytz = pytz.timezone(employee_tz) if employee_tz else pytz.utc | |
|         employee_datetime = fields.datetime.now().astimezone(employee_pytz) | |
|         hour = employee_datetime.strftime("%H") | |
|         minute = employee_datetime.strftime("%M") | |
|         day = employee_datetime.strftime("%A") | |
|         time = hour + '.' + minute | |
|         day_num = '0' if day == 'Monday' else '1' if day == 'Tuesday' \ | |
|             else '2' if day == 'Wednesday' else '3' if day == 'Thursday' \ | |
|             else '4' if day == 'Friday' else '5' if day == 'Saturday' else '6' | |
|         for shift in current_employee.resource_calendar_id.attendance_ids: | |
|             if shift.dayofweek == day_num and shift.hour_from <= float( | |
|                     time) <= shift.hour_to: | |
|                 return shift.name | |
|         return False | |
| 
 | |
|     @api.model | |
|     def get_upcoming_holidays(self): | |
|         """ This function fetches upcoming holidays""" | |
|         current_employee = self.env.user.employee_ids | |
|         employee_tz = current_employee.tz or self.env.context.get('tz') | |
|         employee_pytz = pytz.timezone(employee_tz) if employee_tz else pytz.utc | |
|         employee_datetime = fields.datetime.now().astimezone(employee_pytz) | |
|         query = "SELECT * FROM public.resource_calendar_leaves WHERE " \ | |
|                 "resource_id is null" | |
|         self._cr.execute(query) | |
|         holidays = self._cr.dictfetchall() | |
|         upcoming_holidays = [holiday for holiday in holidays if | |
|                              employee_datetime.date() < holiday.get( | |
|                                  'date_to').date()] | |
|         return upcoming_holidays | |
| 
 | |
|     @api.model | |
|     def get_approval_status_count(self, current_employee): | |
|         """ This function fetches approval status count""" | |
|         return { | |
|             'validate_count': self.env['hr.leave'].search_count([ | |
|                 ('employee_id', '=', current_employee), | |
|                 ('state', '=', 'validate') | |
|             ]), | |
|             'confirm_count': self.env['hr.leave'].search_count([ | |
|                 ('employee_id', '=', current_employee), | |
|                 ('state', '=', 'confirm') | |
|             ]), | |
|             'refuse_count': self.env['hr.leave'].search_count([ | |
|                 ('employee_id', '=', current_employee), | |
|                 ('state', '=', 'refuse') | |
|             ]) | |
|         } | |
| 
 | |
|     @api.model | |
|     def get_all_validated_leaves(self): | |
|         """ This function fetches all validated leaves""" | |
|         leaves = self.env['hr.leave'].search([('state', '=', 'validate')]) | |
|         all_validated_leaves = [ | |
|             { | |
|                 'id': leave.id, | |
|                 'employee_id': leave.employee_id.id, | |
|                 'employee_name': leave.employee_id.name, | |
|                 'request_date_from': leave.request_date_from, | |
|                 'request_date_to': leave.request_date_to, | |
|                 'leave_type_id': leave.holiday_status_id.id, | |
|                 'leave_type': leave.holiday_status_id.name, | |
|                 'number_of_days': leave.number_of_days | |
|             } | |
|             for leave in leaves | |
|         ] | |
|         return all_validated_leaves
 | |
| 
 |