[IMP] hr_payroll: Add notion of full time/part time on resource calendar
Purpose ======= In order to be able to manage payroll, we need to know if a resource calendar is a full time or a part time. For instance, in belgium, 23h a week is a full time for a teacher but in cp 200 it is 38h. In belgium every employee can take a parental leave in part time but he cannot take it in part time if they are not full time. Having a field indicating if the contract is full time or not is useful for computing salary rules. Specification ============= On the calendar model - Display a computed field with the number of hours in the calendar - Display a field with the required number of hours to be full time - Display a computed checkbox, ticked if full time or not On the contract model - Add a related on these fields, to ease the access on the salary rules computation. closes odoo/odoo#30034
This commit is contained in:
committed by
Yannick Tivisse
parent
e6c0a326d6
commit
75ef4686ff
@@ -1,6 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="0">
|
||||
|
||||
<record id="resource.resource_calendar_std" model="resource.calendar">
|
||||
<field name="full_time_required_hours">40</field>
|
||||
</record>
|
||||
|
||||
<record id="resource.resource_calendar_std_35h" model="resource.calendar">
|
||||
<field name="full_time_required_hours">35</field>
|
||||
</record>
|
||||
|
||||
<record id="resource.resource_calendar_std_38h" model="resource.calendar">
|
||||
<field name="full_time_required_hours">38</field>
|
||||
</record>
|
||||
|
||||
<record id="contrib_register_employees" model="hr.contribution.register">
|
||||
<field name="name">Employees</field>
|
||||
<field name="partner_id" eval="False"/>
|
||||
|
||||
@@ -21,6 +21,10 @@ class HrContract(models.Model):
|
||||
help="Defines the frequency of the wage payment.")
|
||||
resource_calendar_id = fields.Many2one(required=True, help="Employee's working schedule.")
|
||||
|
||||
hours_per_week = fields.Float(related='resource_calendar_id.hours_per_week')
|
||||
full_time_required_hours = fields.Float(related='resource_calendar_id.full_time_required_hours')
|
||||
is_fulltime = fields.Boolean(related='resource_calendar_id.is_fulltime')
|
||||
|
||||
@api.multi
|
||||
def get_all_structures(self):
|
||||
"""
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
# -*- coding:utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
from odoo import models, fields
|
||||
from odoo import models, fields, api
|
||||
from odoo.osv.expression import AND, OR
|
||||
|
||||
from odoo.tools import float_compare
|
||||
|
||||
class ResourceCalendar(models.Model):
|
||||
_inherit = 'resource.calendar'
|
||||
|
||||
hours_per_week = fields.Float(compute="_compute_hours_per_week", string="Hours per Week")
|
||||
full_time_required_hours = fields.Float(string="Fulltime Hours", help="Number of hours to work to be considered as fulltime.")
|
||||
is_fulltime = fields.Boolean(compute='_compute_is_fulltime', string="Is Full Time")
|
||||
|
||||
# UI fields
|
||||
normal_attendance_ids = fields.One2many(
|
||||
'resource.calendar.attendance', 'calendar_id', 'Normal working Time',
|
||||
@@ -16,6 +20,15 @@ class ResourceCalendar(models.Model):
|
||||
'resource.calendar.attendance', 'calendar_id', 'Employees working Time',
|
||||
domain=[('resource_id', '!=', False)])
|
||||
|
||||
@api.depends('normal_attendance_ids.hour_from', 'normal_attendance_ids.hour_to')
|
||||
def _compute_hours_per_week(self):
|
||||
for calendar in self:
|
||||
calendar.hours_per_week = sum((attendance.hour_to - attendance.hour_from) for attendance in calendar.normal_attendance_ids)
|
||||
|
||||
def _compute_is_fulltime(self):
|
||||
for calendar in self:
|
||||
calendar.is_fulltime = not float_compare(calendar.full_time_required_hours, calendar.hours_per_week, 3)
|
||||
|
||||
|
||||
class ResourceCalendarAttendance(models.Model):
|
||||
_inherit = 'resource.calendar.attendance'
|
||||
@@ -25,8 +38,10 @@ class ResourceCalendarAttendance(models.Model):
|
||||
|
||||
benefit_type_id = fields.Many2one('hr.benefit.type', 'Benefit Type', default=_default_benefit_type_id)
|
||||
|
||||
|
||||
class ResourceCalendarLeave(models.Model):
|
||||
_inherit = 'resource.calendar.leaves'
|
||||
|
||||
benefit_type_id = fields.Many2one('hr.benefit.type', 'Benefit Type')
|
||||
|
||||
|
||||
|
||||
@@ -7,21 +7,38 @@
|
||||
<field name="model">resource.calendar</field>
|
||||
<field name="inherit_id" ref="resource.resource_calendar_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//group[@name='resource_details']" position="inside">
|
||||
<group>
|
||||
<label for="full_time_required_hours" string="Full Time"/>
|
||||
<div class="o_row">
|
||||
<field name="full_time_required_hours" nolabel="1"/>
|
||||
<span> hours/week</span>
|
||||
</div>
|
||||
<field name="is_fulltime" invisible="1"/>
|
||||
</group>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='attendance_ids']" position="replace">
|
||||
<field name="normal_attendance_ids"/>
|
||||
<group class="oe_subtotal_footer oe_right" style="width: 25% !important;">
|
||||
<label for="hours_per_week" string="Total"/>
|
||||
<div class="o_row">
|
||||
<field name="hours_per_week" nolabel="1"/>
|
||||
<span> hours/week</span>
|
||||
</div>
|
||||
</group>
|
||||
</xpath>
|
||||
<xpath expr="//notebook" position="inside">
|
||||
<page string="Employees Working Hours">
|
||||
<page string="Employees Working Hours" groups="base.group_no_one">
|
||||
<field name="extra_attendance_ids">
|
||||
<tree string="Working Time" editable="top">
|
||||
<field name="resource_id" string="Employee"/>
|
||||
<field name="name"/>
|
||||
<field name="dayofweek"/>
|
||||
<field name="day_period"/>
|
||||
<field name="hour_from" widget="float_time"/>
|
||||
<field name="hour_to" widget="float_time"/>
|
||||
<field name="date_from"/>
|
||||
<field name="date_to"/>
|
||||
<field name="day_period"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
@@ -179,7 +179,7 @@ class ResourceCalendar(models.Model):
|
||||
'resource.calendar.leaves', 'calendar_id', 'Global Leaves',
|
||||
domain=[('resource_id', '=', False)]
|
||||
)
|
||||
hours_per_day = fields.Float("Average hour per day", default=HOURS_PER_DAY,
|
||||
hours_per_day = fields.Float("Average Hour per Day", default=HOURS_PER_DAY,
|
||||
help="Average hours per day a resource is supposed to work with this calendar.")
|
||||
tz = fields.Selection(
|
||||
_tz_get, string='Timezone', required=True,
|
||||
|
||||
@@ -189,11 +189,11 @@
|
||||
<tree string="Working Time" editable="top">
|
||||
<field name="name"/>
|
||||
<field name="dayofweek"/>
|
||||
<field name="day_period"/>
|
||||
<field name="hour_from" widget="float_time"/>
|
||||
<field name="hour_to" widget="float_time"/>
|
||||
<field name="date_from"/>
|
||||
<field name="date_to"/>
|
||||
<field name="day_period"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
@@ -241,7 +241,7 @@
|
||||
<button name="%(resource_calendar_leaves_action_from_calendar)d" type="action"
|
||||
string="Leaves" icon="fa-calendar-times-o"
|
||||
class="oe_stat_button"
|
||||
groups="base.group_user"/>
|
||||
groups="base.group_no_one"/>
|
||||
<button name="%(resource_resource_action_from_calendar)d" type="action"
|
||||
string="Work Resources" icon="fa-cogs"
|
||||
class="oe_stat_button"
|
||||
@@ -251,9 +251,11 @@
|
||||
<field name="name"/>
|
||||
</h1>
|
||||
<group name="resource_details">
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="hours_per_day"/>
|
||||
<field name="tz"/>
|
||||
<group>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="hours_per_day"/>
|
||||
<field name="tz"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Working Hours" name="working_hours">
|
||||
|
||||
Reference in New Issue
Block a user