You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
6.5 KiB
142 lines
6.5 KiB
# -- coding: utf-8 --
|
|
###############################################################################
|
|
# A part of Open HRMS Project <https://www.openhrms.com>
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Cybrosys (<https://www.cybrosys.com>)
|
|
#
|
|
# This program is free software: you can modify
|
|
# it under the terms of the GNU Affero General Public License (AGPL) as
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
#
|
|
###############################################################################
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class DisciplinaryAction(models.Model):
|
|
"""Model representing an action for disciplinary"""
|
|
_name = 'disciplinary.action'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
_description = "Disciplinary Action"
|
|
|
|
# Assigning the sequence for the record
|
|
@api.model
|
|
def create(self, vals):
|
|
vals['name'] = self.env['ir.sequence'].next_by_code(
|
|
'disciplinary.action')
|
|
return super(DisciplinaryAction, self).create(vals)
|
|
|
|
state = fields.Selection([
|
|
('draft', 'Draft'),
|
|
('explain', 'Waiting Explanation'),
|
|
('submitted', 'Waiting Action'),
|
|
('action', 'Action Validated'),
|
|
('cancel', 'Cancelled'),
|
|
], default='draft', track_visibility='onchange',
|
|
help="Stage for disciplinary action")
|
|
name = fields.Char(string='Reference', required=True, copy=False,
|
|
readonly=True,
|
|
default=lambda self: _('New'),
|
|
help="Name for disciplinary action")
|
|
employee_id = fields.Many2one('hr.employee', string='Employee',
|
|
required=True, help="Employee name")
|
|
department_id = fields.Many2one('hr.department', string='Department',
|
|
required=True, help="Department name")
|
|
discipline_reason_id = fields.Many2one('discipline.category', string='Reason',
|
|
required=True,
|
|
help="Choose a disciplinary reason")
|
|
explanation = fields.Text(string="Explanation by Employee",
|
|
help='Employee have to give Explanation'
|
|
'to manager about the violation of discipline')
|
|
action_id = fields.Many2one('discipline.category', string="Action",
|
|
help="Choose an action for this disciplinary action")
|
|
read_only = fields.Boolean(compute="_compute_get_user", default=True,
|
|
help="Boolean field for get the user")
|
|
warning_letter = fields.Html(string="Warning Letter",
|
|
help="Warning letter as disciplinary action")
|
|
suspension_letter = fields.Html(string="Suspension Letter",
|
|
help="Suspension letter as disciplinary action")
|
|
termination_letter = fields.Html(string="Termination Letter",
|
|
help="Termination letter as disciplinary action")
|
|
warning = fields.Boolean(string='Warning', default=False,
|
|
help='Boolean field for to show the message as warning message')
|
|
action_details = fields.Text(string="Action Details",
|
|
help="Give the details for this action")
|
|
attachment_ids = fields.Many2many('ir.attachment', string="Attachments",
|
|
help="Employee can submit any documents which supports their explanation")
|
|
note = fields.Text(string="Internal Note",
|
|
help='Internal notes regarding the disciplinary action')
|
|
joined_date = fields.Date(string="Joined Date",
|
|
help="Employee joining date")
|
|
|
|
|
|
# Check the user is a manager or employee
|
|
@api.depends_context('uid')
|
|
def _compute_get_user(self):
|
|
"""Method for getting the user from the groups"""
|
|
if self.env.user.has_group('hr.group_hr_manager'):
|
|
self.read_only = True
|
|
else:
|
|
self.read_only = False
|
|
|
|
@api.onchange('employee_id')
|
|
def onchange_employee_id(self):
|
|
"""On change function for the employee name and based on the
|
|
value it updated the department"""
|
|
employee = self.env['hr.employee'].search(
|
|
[('name', '=', self.employee_id.name)])
|
|
self.department_id = employee.department_id.id
|
|
if self.state == 'action':
|
|
raise ValidationError(_('You Can not edit a Validated Action !!'))
|
|
|
|
@api.onchange('discipline_reason_id')
|
|
def onchange_reason(self):
|
|
"""On change function for the discipline reason and that check the
|
|
state and raise a validation error"""
|
|
if self.state == 'action':
|
|
raise ValidationError(_('You Can not edit a Validated Action !!'))
|
|
|
|
def assign_function(self):
|
|
"""Method to update state"""
|
|
for rec in self:
|
|
rec.state = 'explain'
|
|
|
|
def cancel_function(self):
|
|
"""Cancel function for the discipline reason"""
|
|
for rec in self:
|
|
rec.state = 'cancel'
|
|
|
|
def set_to_function(self):
|
|
"""State set to draft state"""
|
|
for rec in self:
|
|
rec.state = 'draft'
|
|
|
|
def action_function(self):
|
|
"""Method used for raise validation based on the actions"""
|
|
for rec in self:
|
|
if not rec.action_id:
|
|
raise ValidationError(_('You have to select an Action !!'))
|
|
if not rec.action_details or rec.action_details == '<p><br></p>':
|
|
raise ValidationError(
|
|
_('You have to fill up the Action Details in Action Information !!'))
|
|
rec.state = 'action'
|
|
|
|
def explanation_function(self):
|
|
"""Method used for raise validation based on the explanation"""
|
|
for rec in self:
|
|
if not rec.explanation:
|
|
raise ValidationError(_('You must give an explanation !!'))
|
|
self.write({
|
|
'state': 'submitted'
|
|
})
|
|
|