Browse Source

Jan 22 [UPDT] : Updated 'employee_stages'

pull/302/head
AjmalCybro 1 year ago
parent
commit
d716f5ad6f
  1. 2
      employee_stages/__init__.py
  2. 3
      employee_stages/__manifest__.py
  3. 6
      employee_stages/doc/RELEASE_NOTES.md
  4. 7
      employee_stages/models/__init__.py
  5. 62
      employee_stages/models/hr_employee.py
  6. 4
      employee_stages/security/ir.model.access.csv
  7. 70
      employee_stages/views/hr_employee_views.xml
  8. 22
      employee_stages/wizard/__init__.py
  9. 41
      employee_stages/wizard/employee_stage.py
  10. 29
      employee_stages/wizard/employee_stage_views.xml

2
employee_stages/__init__.py

@ -20,6 +20,6 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
from . import models
from . import wizard

3
employee_stages/__manifest__.py

@ -33,7 +33,8 @@
'depends': ['base', 'hr'],
'data': [
'security/ir.model.access.csv',
'views/employee_stages_view.xml',
'wizard/employee_stage_views.xml',
'views/hr_employee_views.xml',
],
'images': ['static/description/banner.png'],
'license': 'AGPL-3',

6
employee_stages/doc/RELEASE_NOTES.md

@ -4,3 +4,9 @@
#### Version 16.0.1.0.0
##### ADD
- Initial commit for Employee Stages
#### 18.01.2024
#### Version 16.0.1.0.0
##### ADD
- Added Access right for the employee manager to reverse the stages.

7
employee_stages/models/__init__.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
###################################################################################
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
@ -19,7 +19,6 @@
# 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 . import employee_stages
###############################################################################
from . import hr_employee

62
employee_stages/models/employee_stages.py → employee_stages/models/hr_employee.py

@ -20,9 +20,8 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
from datetime import date
from odoo import models, fields, api
from odoo import models, fields, api ,_
class EmployeeFormInherit(models.Model):
@ -43,6 +42,7 @@ class EmployeeFormInherit(models.Model):
'state': 'grounding'})
def set_as_employee(self):
print('Setting')
self.state = 'employment'
stage_obj = self.stages_history.search([('employee_id', '=', self.id),
('state', '=', 'test_period')])
@ -66,7 +66,8 @@ class EmployeeFormInherit(models.Model):
self.state = 'relieved'
self.active = False
stage_obj = self.stages_history.search([('employee_id', '=', self.id),
('state', '=', 'notice_period')])
(
'state', '=', 'notice_period')])
if stage_obj:
stage_obj.sudo().write({'end_date': date.today()})
self.stages_history.sudo().create({'end_date': date.today(),
@ -76,7 +77,8 @@ class EmployeeFormInherit(models.Model):
def start_test_period(self):
self.state = 'test_period'
self.stages_history.search([('employee_id', '=', self.id),
('state', '=', 'grounding')]).sudo().write({'end_date': date.today()})
('state', '=', 'grounding')]).sudo().write(
{'end_date': date.today()})
self.stages_history.sudo().create({'start_date': date.today(),
'employee_id': self.id,
'state': 'test_period'})
@ -91,7 +93,9 @@ class EmployeeFormInherit(models.Model):
stage_obj.sudo().write({'end_date': date.today()})
else:
self.stages_history.search([('employee_id', '=', self.id),
('state', '=', 'grounding')]).sudo().write({'end_date': date.today()})
('state', '=',
'grounding')]).sudo().write(
{'end_date': date.today()})
self.stages_history.sudo().create({'end_date': date.today(),
'employee_id': self.id,
'state': 'terminate'})
@ -102,11 +106,33 @@ class EmployeeFormInherit(models.Model):
('employment', 'Employment'),
('notice_period', 'Notice Period'),
('relieved', 'Resigned'),
('terminate', 'Terminated')], string='Status', default='joined',
('terminate', 'Terminated')], string='Status',
default='joined',
track_visibility='always', copy=False,
help="Employee Stages.\nSlap On: Joined\nGrounding: Training\nTest period : Probation")
stages_history = fields.One2many('hr.employee.status.history', 'employee_id', string='Stage History',
help='It shows the duration and history of each stages')
help="Employee Stages.\nSlap On: "
"Joined\nGrounding: Training\nTest period : "
"Probation")
stages_history = fields.One2many('hr.employee.status.history',
'employee_id', string='Stage History',
help='It shows the duration and history '
'of each stages')
@api.onchange('state')
def onchange_state(self):
if self.state == 'grounding':
self.start_grounding()
if self.state == 'test_period':
self.start_test_period()
if self.state == 'notice_period':
self.start_notice_period()
if self.state == 'relieved':
self.relived()
if self.state == 'terminate':
self.terminate()
if self.state == 'employment':
if not self.user_id:
return {'warning': {'title': _('Warning'), 'message': _(
'Please set a related user for this employee')}}
class EmployeeStageHistory(models.Model):
@ -116,12 +142,15 @@ class EmployeeStageHistory(models.Model):
start_date = fields.Date(string='Start Date')
end_date = fields.Date(string='End Date')
duration = fields.Integer(compute='get_duration', string='Duration(days)')
description = fields.Char(string='Description', help='Description if add '
'anything')
def get_duration(self):
self.duration = 0
for each in self:
if each.end_date and each.start_date:
duration = fields.Date.from_string(each.end_date) - fields.Date.from_string(each.start_date)
duration = fields.Date.from_string(
each.end_date) - fields.Date.from_string(each.start_date)
each.duration = duration.days
state = fields.Selection([('joined', 'Slap On'),
@ -134,19 +163,6 @@ class EmployeeStageHistory(models.Model):
employee_id = fields.Many2one('hr.employee', invisible=1)
class WizardEmployee(models.TransientModel):
_name = 'wizard.employee.stage'
def set_as_employee(self):
context = self._context
employee_obj = self.env['hr.employee'].search([('id', '=', context.get('employee_id'))])
if self.related_user:
employee_obj.user_id = self.related_user
employee_obj.set_as_employee()
related_user = fields.Many2one('res.users', string="Related User")
class HrEmployeePublic(models.Model):
_inherit = 'hr.employee.public'

4
employee_stages/security/ir.model.access.csv

@ -1,6 +1,6 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_wizard_employee_stage_manager,wizard.employee.stage.manager,model_wizard_employee_stage,hr.group_hr_manager,1,1,1,1
access_wizard_employee_stage_hr_user,wizard.employee.stage.user,model_wizard_employee_stage,hr.group_hr_user,1,1,1,0
access_employee_stage_manager,employee.stage.manager,model_employee_stage,hr.group_hr_manager,1,1,1,1
access_employee_stage_hr_user,employee.stage.user,model_employee_stage,hr.group_hr_user,1,1,1,0
access_hr_employee_status_history_manager,hr.employee.status.history.manager,model_hr_employee_status_history,hr.group_hr_manager,1,1,1,1
access_hr_employee_status_history_hr_user,hr.employee.status.history.user,model_hr_employee_status_history,hr.group_hr_user,1,1,1,0

1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 access_wizard_employee_stage_manager access_employee_stage_manager wizard.employee.stage.manager employee.stage.manager model_wizard_employee_stage model_employee_stage hr.group_hr_manager 1 1 1 1
3 access_wizard_employee_stage_hr_user access_employee_stage_hr_user wizard.employee.stage.user employee.stage.user model_wizard_employee_stage model_employee_stage hr.group_hr_user 1 1 1 0
4 access_hr_employee_status_history_manager hr.employee.status.history.manager model_hr_employee_status_history hr.group_hr_manager 1 1 1 1
5 access_hr_employee_status_history_hr_user hr.employee.status.history.user model_hr_employee_status_history hr.group_hr_user 1 1 1 0
6

70
employee_stages/views/employee_stages_view.xml → employee_stages/views/hr_employee_views.xml

@ -1,52 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id='wizard_employee_form' model='ir.ui.view'>
<field name="name">wizard.employee.form</field>
<field name="model">wizard.employee.stage</field>
<field name="arch" type="xml">
<form string="Set as Employee">
<group>
<field name="related_user"/>
</group>
<footer>
<button name="set_as_employee" string="Set as Employee" type="object" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record id='wizard_employee_act' model='ir.actions.act_window'>
<field name="name">Set as Employee</field>
<field name="res_model">wizard.employee.stage</field>
<field name="view_mode">form</field>
<field name="view_id" ref="wizard_employee_form"/>
<field name="target">new</field>
</record>
<record model="ir.ui.view" id="hr_employee_stages_inherit_form_view">
<field name="name">hr.employee.form.view</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<button name="start_grounding" string="Start Grounding" type="object" states="joined"/>
<button name="start_test_period" string="Start Test Period" type="object" states="grounding"/>
<button name="%(employee_stages.wizard_employee_act)d" string="Set as Employee" type="action"
states="joined,test_period" context="{'employee_id':id}"/>
<button name="start_notice_period" string="Start Notice Period" type="object" states="employment"/>
<button name="relived" string="Relieved" type="object" states="notice_period"/>
<button name="terminate" string="Terminate" type="object" states="grounding,employment"/>
<field name="state" widget="statusbar" statusbar_visible="joined,grounding,employment"/>
<button name="start_grounding" string="Start Grounding"
type="object" states="joined"/>
<button name="start_test_period" string="Start Test Period"
type="object" states="grounding"/>
<button name="%(employee_stages.employee_stage_action)d"
string="Set as Employee" type="action"
states="joined,test_period"
context="{'employee_id':id}"/>
<button name="start_notice_period" string="Start Notice Period"
type="object" states="employment"/>
<button name="relived" string="Relieved" type="object"
states="notice_period"/>
<button name="terminate" string="Terminate" type="object"
states="grounding,employment"/>
<field name="state" widget="statusbar"
groups="!hr.group_hr_manager"
statusbar_visible="joined,grounding,employment"/>
<field name="state" widget="statusbar"
groups="hr.group_hr_manager"
options="{'clickable': '1'}"/>
</xpath>
<page name="hr_settings" position="after">
<page name="stage_history" string="Status History">
<page name="stage_history" string="Status History"
groups="hr.group_hr_manager">
<field name="stages_history">
<tree>
<field name="state"/>
<field name="start_date"/>
<field name="end_date"/>
<field name="description"/>
<field name="duration" sum="Total"/>
</tree>
</field>
@ -73,10 +62,12 @@
<field name="arch" type="xml">
<field name="job_id" position="after">
<field name="state"/>
<filter string="Employees" name="employee" domain="[('state','=','employment')]"/>
<filter string="Employees" name="employee"
domain="[('state','=','employment')]"/>
</field>
<xpath expr="//group" position="inside">
<filter name="state" string="State" domain="[]" context="{'group_by':'state'}"/>
<filter name="state" string="State" domain="[]"
context="{'group_by':'state'}"/>
</xpath>
</field>
</record>
@ -87,7 +78,9 @@
<field name="inherit_id" ref="hr.hr_kanban_view_employees"/>
<field name="arch" type="xml">
<xpath expr="//li[3]" position="after">
<li t-if="record.state.raw_value"><field name="state"/></li>
<li t-if="record.state.raw_value">
<field name="state"/>
</li>
</xpath>
</field>
</record>
@ -103,7 +96,8 @@
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a new employee.
</p><p>
</p>
<p>
With just a quick glance on the Odoo employee screen, you
can easily find all the information you need for each person;
contact data, job position, availability, etc.

22
employee_stages/wizard/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri v (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import employee_stage

41
employee_stages/wizard/employee_stage.py

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri v (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class EmployeeStage(models.TransientModel):
"""Wizards to set the related user"""
_name = 'employee.stage'
_description = "Set Related User"
related_user_id = fields.Many2one('res.users', string="Related User",
help="Set related user for the employee")
def set_as_employee(self):
"""This is used to create a related user for the employee in
employment stage"""
context = self._context
employee_obj = self.env['hr.employee'].browse(
context.get('employee_id'))
if self.related_user_id:
employee_obj.user_id = self.related_user_id
employee_obj.set_as_employee()

29
employee_stages/wizard/employee_stage_views.xml

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- This is used to create related user-->
<record id='employee_stage_view_form' model='ir.ui.view'>
<field name="name">employee.stage.view.form</field>
<field name="model">employee.stage</field>
<field name="arch" type="xml">
<form string="Set as Employee">
<group>
<field name="related_user_id"/>
</group>
<footer>
<button name="set_as_employee" string="Set as Employee"
type="object" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<!-- Action for employee stages-->
<record id='employee_stage_action' model='ir.actions.act_window'>
<field name="name">Employee Stages</field>
<field name="res_model">employee.stage</field>
<field name="view_mode">form</field>
<field name="view_id" ref="employee_stage_view_form"/>
<field name="target">new</field>
</record>
</odoo>
Loading…
Cancel
Save