mirror of
https://github.com/bringout/oca-ocb-hr.git
synced 2026-04-27 12:52:01 +02:00
Initial commit: Hr packages
This commit is contained in:
commit
62531cd146
2820 changed files with 1432848 additions and 0 deletions
|
|
@ -0,0 +1,4 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import hr_attendance_report
|
||||
|
|
@ -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())
|
||||
)
|
||||
|
|
@ -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>
|
||||
Loading…
Add table
Add a link
Reference in a new issue