Skip to content

Commit

Permalink
[8.0.1.4.0] hr_attendance_overtime_request
Browse files Browse the repository at this point in the history
* Overtime realization computation
  • Loading branch information
andhit-r committed Sep 7, 2018
1 parent f1d1a70 commit 2edb2df
Show file tree
Hide file tree
Showing 8 changed files with 192 additions and 1 deletion.
3 changes: 2 additions & 1 deletion hr_attendance_overtime_request/__openerp__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# -*- coding: utf-8 -*-
# Copyright 2018 OpenSynergy Indonesia
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
# pylint: disable=locally-disabled, manifest-required-author
{
"name": "Attendance Overtime Request",
"version": "8.0.1.3.0",
"version": "8.0.1.4.0",
"category": "Human Resources",
"website": "https://opensynergy-indonesia.com",
"author": "OpenSynergy Indonesia",
Expand Down
1 change: 1 addition & 0 deletions hr_attendance_overtime_request/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# Copyright 2018 OpenSynergy Indonesia
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import hr_attendance
from . import hr_overtime_request
from . import res_company
from . import res_config
38 changes: 38 additions & 0 deletions hr_attendance_overtime_request/models/hr_attendance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
# Copyright 2018 OpenSynergy Indonesia
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from dateutil.relativedelta import relativedelta
from openerp import models, fields, api


class HrAttendance(models.Model):
_inherit = "hr.attendance"

@api.multi
@api.depends("name")
def _compute_overtime(self):
obj_overtime = self.env["hr.overtime_request"]
for attn in self:
company = attn.employee_id.company_id
start_buffer = fields.Datetime.from_string(attn.name) + \
relativedelta(hours=company.start_overtime_buffer)
start_buffer = fields.Datetime.to_string(start_buffer)
end_buffer = fields.Datetime.from_string(attn.name) + \
relativedelta(hours=-company.end_overtime_buffer)
end_buffer = fields.Datetime.to_string(end_buffer)

criteria = [
("employee_id", "=", attn.employee_id.id),
("date_start", "<=", start_buffer),
("date_end", ">=", end_buffer),
]
overtimes = obj_overtime.search(criteria, limit=1)
attn.overtime_id = overtimes[0].id if len(overtimes) > 0 else False

overtime_id = fields.Many2one(
string="Overtime Request",
comodel_name="hr.overtime_request",
compute="_compute_overtime",
store=True,
)
106 changes: 106 additions & 0 deletions hr_attendance_overtime_request/models/hr_overtime_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,75 @@ def _default_employee_id(self):
employee = employees[0]
return employee.id

@api.multi
@api.depends("attendance_ids")
def _compute_attendance(self):
for overtime in self:
attendances = overtime.attendance_ids.filtered(
lambda r: r.action == "sign_in").sorted(key=lambda r: r.name)
overtime.start_attendance_id = attendances[
0].id if len(attendances) > 0 else False

attendances = overtime.attendance_ids.\
filtered(lambda r: r.action == "sign_out").\
sorted(key=lambda r: r.name, reverse=True)
overtime.end_attendance_id = attendances[
0].id if len(attendances) > 0 else False

@api.multi
@api.depends(
"start_attendance_id",
"date_start")
def _compute_real_start(self):
for overtime in self:
overtime.real_date_start = False
if not overtime.start_attendance_id or \
not overtime.date_start:
continue

if overtime.start_attendance_id.name <= \
overtime.date_start:
overtime.real_date_start = \
overtime.date_start
else:
overtime.real_date_start = \
overtime.start_attendance_id.name

@api.multi
@api.depends(
"end_attendance_id",
"date_end")
def _compute_real_end(self):
for overtime in self:
overtime.real_date_end = False
if not overtime.end_attendance_id or \
not overtime.date_end:
continue

if overtime.end_attendance_id.name <= \
overtime.date_end:
overtime.real_date_end = \
overtime.end_attendance_id.name
else:
overtime.real_date_end = \
overtime.date_end

@api.multi
@api.depends(
"real_date_start",
"real_date_end")
def _compute_real(self):
for overtime in self:
overtime.real_overtime_hour = 0.0
if overtime.real_date_start and \
overtime.real_date_end:
dt_start = fields.Datetime.\
from_string(overtime.real_date_start)
dt_end = fields.Datetime.\
from_string(overtime.real_date_end)
overtime.real_overtime_hour = (dt_end - dt_start).\
total_seconds() / 3600.00

@api.multi
@api.depends(
"date_start", "date_end")
Expand Down Expand Up @@ -130,14 +199,51 @@ def _compute_policy(self):
},
track_visibility="onchange",
)
real_date_start = fields.Datetime(
string="Real Date Start",
readonly=True,
compute="_compute_real_start",
store=True,
)
real_date_end = fields.Datetime(
string="Real Date End",
readonly=True,
compute="_compute_real_end",
store=True,
)
overtime_hour = fields.Float(
string="Overtime Hour",
compute="_compute_hour",
store=True,
)
real_overtime_hour = fields.Float(
string="Real Overtime Hour",
compute="_compute_real",
store=True,
)
note = fields.Text(
string="Note",
)
attendance_ids = fields.One2many(
string="Attendances",
comodel_name="hr.attendance",
inverse_name="overtime_id",
readonly=True,
)
start_attendance_id = fields.Many2one(
string="Start Attendance",
comodel_name="hr.attendance",
compute="_compute_attendance",
store=True,
readonly=True,
)
end_attendance_id = fields.Many2one(
string="End Attendance",
comodel_name="hr.attendance",
compute="_compute_attendance",
store=True,
readonly=True,
)
state = fields.Selection(
string="State",
required=True,
Expand Down
10 changes: 10 additions & 0 deletions hr_attendance_overtime_request/models/res_company.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@
class ResCompany(models.Model):
_inherit = "res.company"

start_overtime_buffer = fields.Float(
string="Start Overtime Buffer",
default=0.0,
required=True,
)
end_overtime_buffer = fields.Float(
string="End Overtime Buffer",
default=0.0,
required=True,
)
overtime_request_sequence_id = fields.Many2one(
string="Overtime Request Sequence",
comodel_name="ir.sequence",
Expand Down
8 changes: 8 additions & 0 deletions hr_attendance_overtime_request/models/res_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ def _default_company_id(self):
required=True,
default=lambda self: self._default_company_id(),
)
start_overtime_buffer = fields.Float(
string="Start Overtime Buffer",
related="company_id.start_overtime_buffer",
)
end_overtime_buffer = fields.Float(
string="End Overtime Buffer",
related="company_id.end_overtime_buffer",
)
overtime_request_sequence_id = fields.Many2one(
string="Sequence Overtime Request",
comodel_name="ir.sequence",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@
<label for="id" string="Sequence" class="oe_inline"/>
<field name="overtime_request_sequence_id" class="oe_inline" domain="[('code','=','hr.overtime_request')]"/>
</div>
<div>
<label for="id" string="Start Overtime Buffer" class="oe_inline"/>
<field name="start_overtime_buffer" widget="float_time" class="oe_inline"/>
<label for="id" string="hour(s)" class="oe_inline"/>
</div>
<div>
<label for="id" string="End Overtime Buffer" class="oe_inline"/>
<field name="end_overtime_buffer" widget="float_time" class="oe_inline"/>
<label for="id" string="hour(s)" class="oe_inline"/>
</div>
</div>
</group>
<group name="overtime_group">
Expand Down
17 changes: 17 additions & 0 deletions hr_attendance_overtime_request/views/hr_overtime_request_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,33 @@
<field name="manager_id" groups="base.group_system"/>
</group>
<group name="group_1_2" colspan="1" col="2">
<separator string="Planned" colspan="2"/>
<field name="date_start"/>
<field name="date_end"/>
<label for="overtime_hour"/>
<div>
<field name="overtime_hour" class="oe_inline" widget="float_time"/>
hour(s)
</div>
<separator string="Realization" colspan="2"/>
<field name="start_attendance_id"/>
<field name="end_attendance_id"/>
<field name="real_date_start"/>
<field name="real_date_end"/>
<label for="real_overtime_hour"/>
<div>
<field name="real_overtime_hour" class="oe_inline" widget="float_time"/>
hour(s)
</div>
</group>
</group>
<notebook>
<page name="note" string="Note">
<field name="note" colspan="4" nolabel="1"/>
</page>
<page name="attendances" string="Attendance(s)">
<field name="attendance_ids" colspan="4" nolabel="1"/>
</page>
<page name="policy" string="Policy" groups="base.group_system">
<group name="group_policy_1" colspan="4" col="2">
<field name="confirm_ok"/>
Expand Down Expand Up @@ -85,6 +99,9 @@
<field name="date_start"/>
<field name="date_end"/>
<field name="overtime_hour" widget="float_time"/>
<field name="real_date_start"/>
<field name="real_date_end"/>
<field name="real_overtime_hour" widget="float_time"/>
<field name="state"/>
</tree>
</field>
Expand Down

0 comments on commit 2edb2df

Please sign in to comment.