Odoo18-Base/addons/hr_attendance/report/hr_attendance_report.py
2025-03-10 11:12:23 +07:00

74 lines
2.5 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, tools
class HRAttendanceReport(models.Model):
_name = "hr.attendance.report"
_description = "Attendance Statistics"
_auto = False
department_id = fields.Many2one('hr.department', string="Department", readonly=True)
employee_id = fields.Many2one('hr.employee', string="Employee", readonly=True)
company_id = fields.Many2one('res.company', string="Company", readonly=True)
check_in = fields.Date("Check In", readonly=True)
worked_hours = fields.Float("Hours Worked", readonly=True)
overtime_hours = fields.Float("Extra Hours", readonly=True)
@api.model
def _select(self):
return """
SELECT
hra.id,
hr_employee.department_id,
hra.employee_id,
hr_employee.company_id,
hra.check_in,
hra.worked_hours,
coalesce(ot.duration, 0) as overtime_hours
"""
@api.model
def _from(self):
return """
FROM (
SELECT
id,
row_number() over (partition by employee_id, CAST(check_in AS DATE)) as ot_check,
employee_id,
CAST(check_in
at time zone 'utc'
at time zone
(SELECT calendar.tz FROM resource_calendar as calendar
INNER JOIN hr_employee as employee ON employee.id = hr_attendance.employee_id
WHERE calendar.id = employee.resource_calendar_id)
as DATE) as check_in,
worked_hours
FROM
hr_attendance
) as hra
"""
def _join(self):
return """
LEFT JOIN hr_employee ON hr_employee.id = hra.employee_id
LEFT JOIN hr_attendance_overtime ot
ON hra.ot_check = 1
AND ot.employee_id = hra.employee_id
AND ot.date = hra.check_in
AND ot.adjustment = FALSE
"""
def init(self):
tools.drop_view_if_exists(self.env.cr, self._table)
self.env.cr.execute("""
CREATE OR REPLACE VIEW %s AS (
%s
%s
%s
)
""" % (self._table, self._select(), self._from(), self._join())
)