# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import api, fields, models, tools, SUPERUSER_ID from odoo.addons.base.models.res_partner import _tz_get class LeaveReportCalendar(models.Model): _name = "hr.leave.report.calendar" _description = 'Time Off Calendar' _auto = False _order = "start_datetime DESC, employee_id" name = fields.Char(string='Name', readonly=True) start_datetime = fields.Datetime(string='From', readonly=True) stop_datetime = fields.Datetime(string='To', readonly=True) tz = fields.Selection(_tz_get, string="Timezone", readonly=True) duration = fields.Float(string='Duration', readonly=True) employee_id = fields.Many2one('hr.employee', readonly=True) department_id = fields.Many2one('hr.department', readonly=True) job_id = fields.Many2one('hr.job', readonly=True) company_id = fields.Many2one('res.company', readonly=True) state = fields.Selection([ ('draft', 'To Submit'), ('cancel', 'Cancelled'), # YTI This state seems to be unused. To remove ('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved') ], readonly=True) is_hatched = fields.Boolean('Hatched', readonly=True) is_striked = fields.Boolean('Striked', readonly=True) is_absent = fields.Boolean(related='employee_id.is_absent') def init(self): tools.drop_view_if_exists(self._cr, 'hr_leave_report_calendar') self._cr.execute("""CREATE OR REPLACE VIEW hr_leave_report_calendar AS (SELECT hl.id AS id, CONCAT(em.name, ': ', hl.duration_display) AS name, hl.date_from AS start_datetime, hl.date_to AS stop_datetime, hl.employee_id AS employee_id, hl.state AS state, hl.department_id AS department_id, hl.number_of_days as duration, em.company_id AS company_id, em.job_id AS job_id, COALESCE( CASE WHEN hl.holiday_type = 'employee' THEN COALESCE(rr.tz, rc.tz) END, cc.tz, 'UTC' ) AS tz, hl.state = 'refuse' as is_striked, hl.state not in ('validate', 'refuse') as is_hatched FROM hr_leave hl LEFT JOIN hr_employee em ON em.id = hl.employee_id LEFT JOIN resource_resource rr ON rr.id = em.resource_id LEFT JOIN resource_calendar rc ON rc.id = em.resource_calendar_id LEFT JOIN res_company co ON co.id = em.company_id LEFT JOIN resource_calendar cc ON cc.id = co.resource_calendar_id WHERE hl.state IN ('confirm', 'validate', 'validate1') AND hl.active IS TRUE ); """) def _fetch_query(self, query, fields): records = super()._fetch_query(query, fields) if self.env.context.get('hide_employee_name') and 'employee_id' in self.env.context.get('group_by', []): self.env.cache.update(records, self._fields['name'], [ record.name.split(':')[-1].strip() for record in records.with_user(SUPERUSER_ID) ]) return records @api.model def get_unusual_days(self, date_from, date_to=None): return self.env.user.employee_id._get_unusual_days(date_from, date_to)