# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import api, fields, models, tools, _ from odoo.osv import expression class LeaveReport(models.Model): _name = "hr.leave.report" _description = 'Time Off Summary / Report' _auto = False _order = "date_from DESC, employee_id" active = fields.Boolean(readonly=True) employee_id = fields.Many2one('hr.employee', string="Employee", readonly=True) leave_id = fields.Many2one('hr.leave', string="Leave Request", readonly=True) allocation_id = fields.Many2one('hr.leave.allocation', string="Allocation Request", readonly=True) active_employee = fields.Boolean(readonly=True) name = fields.Char('Description', readonly=True) number_of_days = fields.Float('Number of Days', readonly=True) leave_type = fields.Selection([ ('allocation', 'Allocation'), ('request', 'Time Off') ], string='Request Type', readonly=True) department_id = fields.Many2one('hr.department', string='Department', readonly=True) category_id = fields.Many2one('hr.employee.category', string='Employee Tag', readonly=True) holiday_status_id = fields.Many2one("hr.leave.type", string="Leave Type", readonly=True) state = fields.Selection([ ('draft', 'To Submit'), ('cancel', 'Cancelled'), ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved') ], string='Status', readonly=True) holiday_type = fields.Selection([ ('employee', 'By Employee'), ('category', 'By Employee Tag') ], string='Allocation Mode', readonly=True) date_from = fields.Datetime('Start Date', readonly=True) date_to = fields.Datetime('End Date', readonly=True) company_id = fields.Many2one('res.company', string="Company", readonly=True) def init(self): tools.drop_view_if_exists(self._cr, 'hr_leave_report') self._cr.execute(""" CREATE or REPLACE view hr_leave_report as ( SELECT row_number() over(ORDER BY leaves.employee_id) as id, leaves.allocation_id as allocation_id, leaves.leave_id as leave_id, leaves.employee_id as employee_id, leaves.name as name, leaves.active_employee as active_employee, leaves.active as active, leaves.number_of_days as number_of_days, leaves.leave_type as leave_type, leaves.category_id as category_id, leaves.department_id as department_id, leaves.holiday_status_id as holiday_status_id, leaves.state as state, leaves.holiday_type as holiday_type, leaves.date_from as date_from, leaves.date_to as date_to, leaves.company_id from (select allocation.active as active, allocation.id as allocation_id, null as leave_id, allocation.employee_id as employee_id, employee.active as active_employee, allocation.private_name as name, allocation.number_of_days as number_of_days, allocation.category_id as category_id, allocation.department_id as department_id, allocation.holiday_status_id as holiday_status_id, allocation.state as state, allocation.holiday_type, allocation.date_from as date_from, allocation.date_to as date_to, 'allocation' as leave_type, allocation.employee_company_id as company_id from hr_leave_allocation as allocation inner join hr_employee as employee on (allocation.employee_id = employee.id) union all select request.active as active, null as allocation_id, request.id as leave_id, request.employee_id as employee_id, employee.active as active_employee, request.private_name as name, (request.number_of_days * -1) as number_of_days, request.category_id as category_id, request.department_id as department_id, request.holiday_status_id as holiday_status_id, request.state as state, request.holiday_type, request.date_from as date_from, request.date_to as date_to, 'request' as leave_type, request.employee_company_id as company_id from hr_leave as request inner join hr_employee as employee on (request.employee_id = employee.id) ) leaves ); """) @api.model def action_time_off_analysis(self): domain = [('holiday_type', '=', 'employee')] if self.env.context.get('active_ids'): domain = expression.AND([ domain, [('employee_id', 'in', self.env.context.get('active_ids', []))] ]) return { 'name': _('Time Off Analysis'), 'type': 'ir.actions.act_window', 'res_model': 'hr.leave.report', 'view_mode': 'tree,pivot,form', 'search_view_id': [self.env.ref('hr_holidays.view_hr_holidays_filter_report').id], 'domain': domain, 'context': { 'search_default_group_type': True, 'search_default_year': True, 'search_default_validated': True, 'search_default_active_employee': True, } } def action_open_record(self): self.ensure_one() return { 'type': 'ir.actions.act_window', 'view_mode': 'form', 'res_id': self.leave_id.id if self.leave_id else self.allocation_id.id, 'res_model': 'hr.leave' if self.leave_id else 'hr.leave.allocation', }