Initial commit: Hr packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:50 +02:00
commit 62531cd146
2820 changed files with 1432848 additions and 0 deletions

View file

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import hr_attendance_report

View file

@ -0,0 +1,73 @@
# -*- 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())
)

View file

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_attendance_report_view_search" model="ir.ui.view">
<field name="name">hr.attendance.report.view.search</field>
<field name="model">hr.attendance.report</field>
<field name="arch" type="xml">
<search string="HR Attendance Search">
<field name="employee_id"/>
<field name="department_id" operator="child_of"/>
<filter name="check_in" string="Check In" date="check_in" default_period="last_month"/>
<group expand="0" string="Group By">
<filter string="Employee" name="groupby_employee" context="{'group_by': 'employee_id'}"/>
<filter string="Check In" name="groupby_check_in" context="{'group_by': 'check_in'}"/>
</group>
</search>
</field>
</record>
<record id="hr_attendance_report_view_pivot" model="ir.ui.view">
<field name="name">hr.attendance.report.view.pivot</field>
<field name="model">hr.attendance.report</field>
<field name="arch" type="xml">
<pivot string="Attendance" js_class="attendance_report_pivot">
<field name="employee_id" type="row"/>
<field name="check_in" type="col"/>
<field name="worked_hours" type="measure" widget="float_time"/>
<field name="overtime_hours" type="measure" widget="float_time"/>
</pivot>
</field>
</record>
<record id="hr_attendance_report_view_graph" model="ir.ui.view">
<field name="name">hr.attendance.report.view.graph</field>
<field name="model">hr.attendance.report</field>
<field name="arch" type="xml">
<graph string="Attendance Statistics" stacked="0" js_class="attendance_report_graph">
<field name="employee_id"/>
<field name="check_in"/>
<field name="overtime_hours" type="measure" />
<field name="worked_hours" type="measure" />
</graph>
</field>
</record>
<record id="hr_attendance_report_action" model="ir.actions.act_window">
<field name="name">Attendance Analysis</field>
<field name="res_model">hr.attendance.report</field>
<field name="view_mode">graph,pivot</field>
<field name="search_view_id" ref="hr_attendance_report_view_search"/>
<field name="context">{'group_by': ['check_in:day', 'employee_id'], 'search_default_check_in': '1'}</field>
</record>
<record id="hr_attendance_report_action_filtered" model="ir.actions.act_window">
<field name="name">Attendance Analysis</field>
<field name="res_model">hr.attendance.report</field>
<field name="view_mode">graph,pivot</field>
<field name="search_view_id" ref="hr_attendance_report_view_search"/>
<field name="context">{
'group_by': ['check_in:day', 'employee_id'],
'search_default_department_id': [active_id]}
</field>
</record>
<menuitem
id="menu_hr_attendance_report"
name="Reporting"
sequence="30"
parent="hr_attendance.menu_hr_attendance_root"
action="hr_attendance_report_action"
groups="hr_attendance.group_hr_attendance_user"/>
</odoo>