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