DEV: Probation Tracking
This commit is contained in:
parent
9ce8c135d0
commit
e2c8a25c7b
|
|
@ -0,0 +1 @@
|
|||
from . import models
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
'name': 'Probation Management',
|
||||
'version': '18.0.1.0.0',
|
||||
'category': 'Human Resources',
|
||||
'summary': 'Integrate Probation with Employees',
|
||||
'author': 'Srivyn Platforms',
|
||||
'license': 'LGPL-3',
|
||||
|
||||
'depends': [
|
||||
'hr',
|
||||
'mail',
|
||||
],
|
||||
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'views/hr_employee_inherit.xml',
|
||||
'views/probation_review_views.xml',
|
||||
],
|
||||
|
||||
'installable': True,
|
||||
'application': False,
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import hr_employee_inherit
|
||||
|
|
@ -0,0 +1,159 @@
|
|||
from odoo import api, fields, models
|
||||
from datetime import datetime, time
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
|
||||
class HrEmployee(models.Model):
|
||||
_inherit = 'hr.employee'
|
||||
|
||||
emp_type_id = fields.Many2one('hr.contract.type')
|
||||
probation_state = fields.Selection([
|
||||
('not_applicable', 'Not Applicable'),
|
||||
('probation', 'On Probation'),
|
||||
('confirmed', 'Confirmed'),
|
||||
('extended', 'Extended'),
|
||||
('terminated', 'Terminated'),
|
||||
], default='not_applicable')
|
||||
|
||||
probation_start_date = fields.Date()
|
||||
probation_end_date = fields.Date(
|
||||
compute='_compute_probation_end_date',
|
||||
store=True
|
||||
)
|
||||
|
||||
@api.depends('probation_start_date', 'milestone_days')
|
||||
def _compute_probation_end_date(self):
|
||||
for rec in self:
|
||||
if rec.probation_start_date and rec.milestone_days:
|
||||
rec.probation_end_date = (
|
||||
rec.probation_start_date +
|
||||
relativedelta(days=rec.milestone_days)
|
||||
)
|
||||
else:
|
||||
rec.probation_end_date = False
|
||||
|
||||
milestone_days = fields.Integer(
|
||||
string='Milestone Days',
|
||||
required=True
|
||||
)
|
||||
|
||||
probation_review_ids = fields.One2many(
|
||||
'hr.employee.probation.review',
|
||||
'employee_id'
|
||||
)
|
||||
|
||||
def write(self, vals):
|
||||
res = super().write(vals)
|
||||
|
||||
for emp in self:
|
||||
|
||||
if (
|
||||
emp.emp_type_id
|
||||
and emp.probation_start_date
|
||||
and emp.milestone_days
|
||||
and not emp.probation_review_ids
|
||||
):
|
||||
self.env['hr.employee.probation.review'].create({
|
||||
'employee_id': emp.id,
|
||||
'review_date': (
|
||||
emp.probation_start_date +
|
||||
relativedelta(days=emp.milestone_days)
|
||||
),
|
||||
'milestone_days': emp.milestone_days,
|
||||
})
|
||||
|
||||
return res
|
||||
|
||||
def cron_probation_completion(self):
|
||||
|
||||
today = fields.Date.today()
|
||||
|
||||
employees = self.search([
|
||||
('probation_state', '=', 'probation'),
|
||||
('probation_end_date', '<=', today)
|
||||
])
|
||||
|
||||
for emp in employees:
|
||||
|
||||
last_review = self.env[
|
||||
'hr.employee.probation.review'
|
||||
].search([
|
||||
('employee_id', '=', emp.id)
|
||||
], limit=1, order='review_date desc')
|
||||
|
||||
if last_review.outcome == 'confirmed':
|
||||
emp.probation_state = 'confirmed'
|
||||
|
||||
elif last_review.outcome == 'extended':
|
||||
emp.probation_state = 'probation'
|
||||
|
||||
emp.probation_end_date = (
|
||||
emp.probation_end_date
|
||||
+ relativedelta(months=1)
|
||||
)
|
||||
|
||||
elif last_review.outcome == 'terminated':
|
||||
emp.probation_state = 'terminated'
|
||||
|
||||
else:
|
||||
pass
|
||||
|
||||
class HrEmployeeProbationReview(models.Model):
|
||||
_name = 'hr.employee.probation.review'
|
||||
_description = 'Employee Probation Review'
|
||||
_rec_name = 'employee_id'
|
||||
|
||||
employee_id = fields.Many2one(
|
||||
'hr.employee',
|
||||
required=True
|
||||
)
|
||||
|
||||
review_date = fields.Date(required=True)
|
||||
|
||||
milestone_days = fields.Integer(
|
||||
string='Milestone Days'
|
||||
)
|
||||
|
||||
manager_feedback = fields.Text()
|
||||
|
||||
outcome = fields.Selection([
|
||||
('pending', 'Pending'),
|
||||
('confirmed', 'Confirmed'),
|
||||
('extended', 'Extended'),
|
||||
('terminated', 'Terminated')
|
||||
], default='pending')
|
||||
|
||||
extension_days = fields.Integer()
|
||||
|
||||
def write(self, vals):
|
||||
result = super().write(vals)
|
||||
|
||||
for review in self:
|
||||
|
||||
if vals.get('outcome') == 'confirmed':
|
||||
review.employee_id.probation_state = 'confirmed'
|
||||
|
||||
elif vals.get('outcome') == 'terminated':
|
||||
review.employee_id.probation_state = 'terminated'
|
||||
|
||||
elif (
|
||||
vals.get('outcome') == 'extended'
|
||||
and review.extension_days
|
||||
):
|
||||
|
||||
review.employee_id.probation_state = 'probation'
|
||||
|
||||
next_review_date = (
|
||||
review.review_date +
|
||||
relativedelta(days=review.extension_days)
|
||||
)
|
||||
|
||||
self.create({
|
||||
'employee_id': review.employee_id.id,
|
||||
'review_date': next_review_date,
|
||||
'milestone_days': review.extension_days,
|
||||
})
|
||||
|
||||
review.employee_id.probation_end_date = next_review_date
|
||||
|
||||
return result
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_probation_review_user,probation.review.user,model_hr_employee_probation_review,hr.group_hr_user,1,1,1,1
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="view_employee_form_probation" model="ir.ui.view">
|
||||
<field name="name">hr.employee.form.probation</field>
|
||||
<field name="model">hr.employee</field>
|
||||
<field name="inherit_id" ref="hr.view_employee_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//notebook" position="inside">
|
||||
<page string="Probation">
|
||||
<field name="probation_state"
|
||||
widget="statusbar"
|
||||
statusbar_visible="probation,confirmed,extended,terminated"/>
|
||||
<group>>
|
||||
<group>
|
||||
<field name="emp_type_id"/>
|
||||
<field name="milestone_days"/>
|
||||
<field name="probation_state" readonly="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="probation_start_date"/>
|
||||
<field name="probation_end_date" readonly="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<field name="probation_review_ids">
|
||||
<list editable="bottom">
|
||||
<field name="review_date"/>
|
||||
<field name="milestone_days"/>
|
||||
<field name="outcome"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- List View -->
|
||||
<record id="view_probation_review_list" model="ir.ui.view">
|
||||
<field name="name">hr.employee.probation.review.list</field>
|
||||
<field name="model">hr.employee.probation.review</field>
|
||||
<field name="arch" type="xml">
|
||||
<list>
|
||||
<field name="employee_id"/>
|
||||
<field name="review_date"/>
|
||||
<field name="milestone_days"/>
|
||||
<field name="outcome"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Form View -->
|
||||
<record id="view_probation_review_form" model="ir.ui.view">
|
||||
<field name="name">hr.employee.probation.review.form</field>
|
||||
<field name="model">hr.employee.probation.review</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="employee_id"/>
|
||||
<field name="review_date"/>
|
||||
<field name="milestone_days"/>
|
||||
</group>
|
||||
|
||||
<group>
|
||||
<field name="outcome"/>
|
||||
<field name="extension_days"
|
||||
invisible="outcome != 'extended'"/>
|
||||
</group>
|
||||
|
||||
<group>
|
||||
<field name="manager_feedback"/>
|
||||
</group>
|
||||
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="ir_cron_probation_completion"
|
||||
model="ir.cron">
|
||||
|
||||
<field name="name">
|
||||
Probation Completion Check
|
||||
</field>
|
||||
|
||||
<field name="model_id"
|
||||
ref="hr.model_hr_employee"/>
|
||||
|
||||
<field name="state">code</field>
|
||||
|
||||
<field name="code">
|
||||
model.cron_probation_completion()
|
||||
</field>
|
||||
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="active">True</field>
|
||||
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Action -->
|
||||
<record id="action_probation_reviews" model="ir.actions.act_window">
|
||||
<field name="name">Probation Reviews</field>
|
||||
<field name="res_model">hr.employee.probation.review</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
</record>
|
||||
<menuitem
|
||||
id="menu_probation_root"
|
||||
name="Probation Management"
|
||||
sequence="50"
|
||||
parent="hr.menu_hr_root"
|
||||
action="action_probation_reviews"/>
|
||||
|
||||
</odoo>
|
||||
Loading…
Reference in New Issue