DEV: Probation Tracking

This commit is contained in:
Bhagya-K 2026-06-16 17:05:42 +05:30
parent 9ce8c135d0
commit e2c8a25c7b
7 changed files with 302 additions and 0 deletions

View File

@ -0,0 +1 @@
from . import models

View File

@ -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,
}

View File

@ -0,0 +1 @@
from . import hr_employee_inherit

View File

@ -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

View File

@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_probation_review_user probation.review.user model_hr_employee_probation_review hr.group_hr_user 1 1 1 1

View File

@ -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>

View File

@ -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>