@ -0,0 +1,39 @@ |
|||||
|
Open HRMS Employee Transfer v11 |
||||
|
=============================== |
||||
|
|
||||
|
Employee transfer between branches. |
||||
|
|
||||
|
Depends |
||||
|
======= |
||||
|
[hr] addon Odoo |
||||
|
|
||||
|
Tech |
||||
|
==== |
||||
|
* [Python] - Models |
||||
|
* [XML] - Odoo views |
||||
|
|
||||
|
Installation |
||||
|
============ |
||||
|
- www.odoo.com/documentation/11.0/setup/install.html |
||||
|
- Install our custom addon |
||||
|
|
||||
|
|
||||
|
Bug Tracker |
||||
|
=========== |
||||
|
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
* Cybrosys Techno Solutions <https://www.cybrosys.com> |
||||
|
|
||||
|
Author |
||||
|
------ |
||||
|
|
||||
|
Developer: Sreejith P @ cybrosys, sreejith@cybrosys.in |
||||
|
|
||||
|
Maintainer |
||||
|
---------- |
||||
|
|
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit https://www.cybrosys.com. |
@ -0,0 +1,2 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from . import models |
@ -0,0 +1,45 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################### |
||||
|
# A part of Open HRMS Project <https://www.openhrms.com> |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
||||
|
# Author: Sreejith P (<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/>. |
||||
|
# |
||||
|
################################################################################### |
||||
|
{ |
||||
|
'name': 'Open HRMS Branch Transfer', |
||||
|
'version': '11.0.1.0.0', |
||||
|
'summary': 'Employee transfer between branches', |
||||
|
'category': 'Generic Modules/Human Resources', |
||||
|
'author': 'Cybrosys Techno solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'website': 'https://www.openhrms.com', |
||||
|
'depends': ['base', |
||||
|
'hr_employee_updation' |
||||
|
], |
||||
|
'data': [ |
||||
|
'views/employee_transfer.xml', |
||||
|
'security/ir.model.access.csv', |
||||
|
'security/branch_security.xml', |
||||
|
], |
||||
|
'images': ['static/description/banner.jpg'], |
||||
|
'installable': True, |
||||
|
'application': True, |
||||
|
'auto_install': False, |
||||
|
'license': 'AGPL-3', |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
## Module hr_employee_transfer |
||||
|
|
||||
|
#### 21.04.2018 |
||||
|
#### Version 11.0.1.0.0 |
||||
|
##### ADD |
||||
|
- Initial commit for OpenHrms Project |
@ -0,0 +1,4 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from . import employee_transfer |
||||
|
from . import hr_contract |
||||
|
from . import res_company |
@ -0,0 +1,106 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from datetime import date |
||||
|
from odoo import models, fields, api, _ |
||||
|
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT |
||||
|
from odoo.exceptions import Warning |
||||
|
|
||||
|
|
||||
|
class EmployeeTransfer(models.Model): |
||||
|
_name = 'employee.transfer' |
||||
|
_description = 'Employee Transfer' |
||||
|
_order = "id desc" |
||||
|
|
||||
|
def _default_employee(self): |
||||
|
emp_ids = self.env['hr.employee'].search([('user_id', '=', self.env.uid)]) |
||||
|
return emp_ids and emp_ids[0] or False |
||||
|
|
||||
|
name = fields.Char(string='Name', help='Give a name to the Transfer', copy=False, default="/", readonly=True) |
||||
|
employee_id = fields.Many2one('hr.employee', string='Employee', required=True, |
||||
|
help='Select the employee you are going to transfer') |
||||
|
date = fields.Date(string='Date', default=fields.Date.today()) |
||||
|
branch = fields.Many2one('transfer.company', string='Transfer Branch', requried=True, copy=False, |
||||
|
help='The Branch/Company which the employee is transferred') |
||||
|
state = fields.Selection( |
||||
|
[('draft', 'New'), ('cancel', 'Cancelled'), ('transfer', 'Transferred'), ('done', 'Done')], |
||||
|
string='Status', readonly=True, copy=False, default='draft', |
||||
|
help=" * The 'Draft' status is used when a transfer is created and unconfirmed Transfer.\n" |
||||
|
" * The 'Transferred' status is used when the user confirm the transfer. It stays in the open status till the other branch/company receive the employee.\n" |
||||
|
" * The 'Done' status is set automatically when the employee is Joined/Received.\n" |
||||
|
" * The 'Cancelled' status is used when user cancel Transfer." |
||||
|
) |
||||
|
sequence_number = fields.Integer(string='Sequence Number', help='A unique sequence number for the Transfer', |
||||
|
default=1, copy=False) |
||||
|
company_id = fields.Many2one('res.company', string='Company', required=True, |
||||
|
related='employee_id.company_id', store=True) |
||||
|
note = fields.Text(string='Internal Notes') |
||||
|
responsible = fields.Many2one('hr.employee', string='Responsible', default=_default_employee, readonly=True) |
||||
|
|
||||
|
@api.one |
||||
|
def transfer(self): |
||||
|
obj_emp = self.env['hr.employee'].browse(self.employee_id.id) |
||||
|
emp = {} |
||||
|
if not self.branch: |
||||
|
raise Warning(_( |
||||
|
'You should select the transfer branch/company.')) |
||||
|
for this in self: |
||||
|
emp = { |
||||
|
'name': self.employee_id.name, |
||||
|
'company_id': self.branch.company_id, |
||||
|
|
||||
|
} |
||||
|
new_emp = self.env['hr.employee'].create(emp) |
||||
|
if obj_emp.address_home_id: |
||||
|
obj_emp.address_home_id.active = False |
||||
|
for obj_contract in self.env['hr.contract'].search([('employee_id', '=', self.employee_id.id)]): |
||||
|
if obj_contract.date_end: |
||||
|
continue |
||||
|
if not obj_contract.date_end: |
||||
|
obj_contract.write({'date_end': date.today().strftime(DEFAULT_SERVER_DATE_FORMAT)}) |
||||
|
self.wage = obj_contract.wage |
||||
|
self.state = 'transfer' |
||||
|
self.employee_id = new_emp |
||||
|
obj_emp.write({'active': False}) |
||||
|
|
||||
|
@api.multi |
||||
|
def receive_employee(self): |
||||
|
for this in self: |
||||
|
if this._context is None: |
||||
|
context = {} |
||||
|
partner = {} |
||||
|
for i in this: |
||||
|
partner = { |
||||
|
'name': i.employee_id.name, |
||||
|
'company_id': i.branch.company_id, |
||||
|
} |
||||
|
partner_created = self.env['res.partner'].create(partner) |
||||
|
self.env['hr.employee'].browse(this.employee_id.id).write({'address_home_id': partner_created.id}) |
||||
|
return { |
||||
|
'name': _('Contract'), |
||||
|
'view_type': 'form', |
||||
|
'view_mode': 'form', |
||||
|
'res_model': 'hr.contract', |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'target': 'current', |
||||
|
'context': {'default_employee_id': this.employee_id.id, |
||||
|
'default_date_start': this.date, |
||||
|
'default_emp_transfer': this.id, |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
@api.one |
||||
|
def cancel_transfer(self): |
||||
|
obj_emp = self.env['hr.employee'].browse(self.employee_id.id) |
||||
|
emp = { |
||||
|
'name': self.employee_id.name, |
||||
|
'company_id': self.company_id.id, |
||||
|
} |
||||
|
obj_emp.write(emp) |
||||
|
for obj_contract in self.env['hr.contract'].search([('employee_id', '=', self.employee_id.id)]): |
||||
|
obj_contract.unlink() |
||||
|
self.state = 'cancel' |
||||
|
|
||||
|
@api.model |
||||
|
def create(self, vals): |
||||
|
vals['name'] = "Transfer Of " + self.env['hr.employee'].browse(vals['employee_id']).name |
||||
|
res = super(EmployeeTransfer, self).create(vals) |
||||
|
return res |
@ -0,0 +1,16 @@ |
|||||
|
from odoo import models, fields, api |
||||
|
|
||||
|
|
||||
|
class HrContract(models.Model): |
||||
|
_inherit = 'hr.contract' |
||||
|
|
||||
|
company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env.user.company_id) |
||||
|
from_transfer = fields.Boolean(string='Transferred', default=False) |
||||
|
emp_transfer = fields.Many2one('employee.transfer', string='Transferred Employee') |
||||
|
|
||||
|
@api.model |
||||
|
def create(self, vals): |
||||
|
res = super(HrContract, self).create(vals) |
||||
|
if res.emp_transfer: |
||||
|
self.env['employee.transfer'].browse(res.emp_transfer.id).write({'state': 'done'}) |
||||
|
return res |
@ -0,0 +1,19 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from odoo import models, fields, api |
||||
|
|
||||
|
|
||||
|
class HrContract(models.Model): |
||||
|
_inherit = 'hr.employee' |
||||
|
|
||||
|
transfer_detail = fields.One2many('transfer.detail', 'employee_id', string='Transfer Details') |
||||
|
|
||||
|
|
||||
|
class TransferDetails(models.Model): |
||||
|
|
||||
|
_name = 'transfer.detail' |
||||
|
_description = 'Transfer Details' |
||||
|
|
||||
|
employee_id = fields.Many2one('hr.employee', string='Employee') |
||||
|
date = fields.Date(string='Date', copy=False) |
||||
|
company_id = fields.Many2one('res.company', string='Company') |
||||
|
pre_company = fields.Many2one('res.company', string='Previous Company') |
@ -0,0 +1,40 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from odoo import models, fields, api |
||||
|
|
||||
|
|
||||
|
class EmployeeTransfer(models.Model): |
||||
|
_name = 'transfer.company' |
||||
|
_description = 'Transfer Company' |
||||
|
_order = "id desc" |
||||
|
|
||||
|
name = fields.Char(string='Name', copy=False, ondelete='cascade') |
||||
|
company_id = fields.Integer(string='Company', help='Company name same as res.company', copy=False) |
||||
|
|
||||
|
|
||||
|
class ResCompany(models.Model): |
||||
|
_inherit = 'res.company' |
||||
|
|
||||
|
def init(self): |
||||
|
obj_company = self.env['res.company'].search([]) |
||||
|
|
||||
|
for company in obj_company: |
||||
|
obj_branch = self.env['transfer.company'].search([('company_id', '=', company.id)]) |
||||
|
com = {} |
||||
|
if not obj_branch: |
||||
|
com = { |
||||
|
'name': company.name, |
||||
|
'company_id': company.id, |
||||
|
} |
||||
|
obj = self.env['transfer.company'].create(com) |
||||
|
|
||||
|
@api.model |
||||
|
def create(self, res): |
||||
|
result = super(ResCompany, self).create(res) |
||||
|
com = {} |
||||
|
com = { |
||||
|
'name': result.name, |
||||
|
'company_id': result.id, |
||||
|
|
||||
|
} |
||||
|
self.env['transfer.company'].create(com) |
||||
|
return result |
@ -0,0 +1,18 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<record id="employee_rule" model="ir.rule"> |
||||
|
<field name="name">Employee Rule</field> |
||||
|
<field name="model_id" ref="hr.model_hr_employee"/> |
||||
|
<field name="global" eval="True"/> |
||||
|
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="employee_contract_rule" model="ir.rule"> |
||||
|
<field name="name">Contract Rules</field> |
||||
|
<field name="model_id" ref="hr_contract.model_hr_contract"/> |
||||
|
<field name="global" eval="True"/> |
||||
|
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
|
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 118 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 221 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 33 KiB |
@ -0,0 +1,111 @@ |
|||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan">Open HRMS</h2> |
||||
|
<h3 class="oe_slogan">Most advanced open source HR management software</h3> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced oe_mt32"> |
||||
|
<div class="oe_span"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<a href="https://www.openhrms.com/#request-demo"> |
||||
|
<img src="HRMS-BUTTON.png"> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan">Branch Transfer</h2> |
||||
|
<h3 class="oe_slogan">Employee transfer between branches</h3> |
||||
|
<h4 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a> </h4> |
||||
|
</div> |
||||
|
<div class="oe_row oe_spaced" style="padding-left:65px;"> |
||||
|
<h4>Features:</h4> |
||||
|
<div> |
||||
|
<span style="color:green;"> ☑ </span> Transfer Employee between branches.<br/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container "> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<div class="oe_picture"> |
||||
|
<h3 class="oe_slogan">Overview</h3> |
||||
|
<p class="oe_mt32 text-justify" style="text-align: center;"> |
||||
|
Transferring employees between company is a basic thing in a organization. Now Odoo lacks a provision for employee transfer. This module gives a basic structure for employee transfer<br/> |
||||
|
Make sure that you are multi company is enabled. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h4 class="oe_slogan">Employee Transfer</h4> |
||||
|
<div class="oe_span12"> |
||||
|
<p class='oe_mt32'> |
||||
|
☛ Create a Employee Transfer.<br> |
||||
|
☛ Select the Transfer Company.<br> |
||||
|
☛ Click on the sent button.<br> |
||||
|
</p> |
||||
|
<div class="oe_row_img oe_centered"> |
||||
|
<img class="oe_picture oe_screenshot" src="create_a_transfer.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container "> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h4 class="oe_slogan">Contract</h4> |
||||
|
<div class="oe_span12"> |
||||
|
<p class='oe_mt32'> |
||||
|
☛ Create new contract.<br> |
||||
|
<p> |
||||
|
<div class="oe_row_img oe_centered"> |
||||
|
<img class="oe_picture oe_screenshot" src="create_contract.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<div class="row section-content"> |
||||
|
<div class="col-md-6 img-content"> |
||||
|
<h3>Our Odoo Services</h3> |
||||
|
|
||||
|
|
||||
|
</div> <div class="bc-span col-md-12"><div class="inner-span"><a target="_blank" href="https://www.openhrms.com"><img class="img-border img-responsive thumbnail" src="cybro-service.png"></a></div></div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2> |
||||
|
<div class="oe_slogan" style="margin-top:10px !important;"> |
||||
|
<div> |
||||
|
<a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="https://www.cybrosys.com/contact/" target="_blank"><i |
||||
|
class="fa fa-phone"></i> Contact Us </a> |
||||
|
|
||||
|
<a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="https://www.odoo.com/apps/modules/browse?search=open+hrms" target="_blank"><i |
||||
|
class="fa fa-suitcase"></i> Other Open HRMS Addons </a> |
||||
|
|
||||
|
<a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank"><i |
||||
|
class="fa fa-wrench"></i> Request Customization </a> |
||||
|
|
||||
|
</div> |
||||
|
<br> |
||||
|
<a href="https://www.cybrosys.com/" target="_blank"> |
||||
|
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
||||
|
</a> |
||||
|
</div> |
||||
|
</section> |
@ -0,0 +1,80 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<odoo> |
||||
|
<record id="employee_transfer" model="ir.ui.view"> |
||||
|
<field name="name">Employee Transfer</field> |
||||
|
<field name="model">employee.transfer</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Employee Transfer"> |
||||
|
<header> |
||||
|
<button name="transfer" string="Transfer" class="oe_highlight" type="object" states="draft" |
||||
|
groups="hr.group_hr_manager"/> |
||||
|
<button name="receive_employee" string="Receive" class="oe_highlight" type="object" |
||||
|
groups="hr.group_hr_manager" states="transfer"/> |
||||
|
<button name="cancel_transfer" string="Cancel" type="object" |
||||
|
attrs="{'invisible':[('state','in',('draft', 'cancel'))]}" groups="hr.group_hr_manager"/> |
||||
|
<field name="state" widget="statusbar" statusbar_visible="draft,transfer,done" /> |
||||
|
</header> |
||||
|
<sheet> |
||||
|
<div class="oe_title oe_left"> |
||||
|
<h2> |
||||
|
<field name="name" class="oe_inline" placeholder="Name"/> |
||||
|
</h2> |
||||
|
</div> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="employee_id" options="{'no_create': True}" attrs="{'readonly' : [('state', '!=', 'draft')] }"/> |
||||
|
<field name="date" attrs="{'readonly' : [('state', '!=', 'draft')] }"/> |
||||
|
<field name="branch" groups="base.group_multi_company" options="{'no_create': True}" |
||||
|
attrs="{'readonly' : [('state', '!=', 'draft')] }"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/> |
||||
|
<field name="responsible" options="{'no_create': True}"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<notebook colspan="4"> |
||||
|
<page string="Internal Notes" > |
||||
|
<field name="note"/> |
||||
|
</page> |
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<record id="employee_transfer_tree" model="ir.ui.view"> |
||||
|
<field name="name">Employee Transfer Tree</field> |
||||
|
<field name="model">employee.transfer</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Employee Transfer" decoration-info="state == 'draft'" decoration-muted="state in ('done','cancel')"> |
||||
|
<field name="name"/> |
||||
|
<field name="employee_id"/> |
||||
|
<field name="date"/> |
||||
|
<field name="branch" groups="base.group_multi_company"/> |
||||
|
<!--<field name="amount_total" sum="Amount total" widget="monetary"/>--> |
||||
|
<field name="company_id" groups="base.group_multi_company"/> |
||||
|
<field name="state"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_employee_transfer" model="ir.actions.act_window"> |
||||
|
<field name="name">Employee Transfer</field> |
||||
|
<field name="type">ir.actions.act_window</field> |
||||
|
<field name="res_model">employee.transfer</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="view_id" eval="False"/> |
||||
|
<field name="domain">[]</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Click to create a new Transfer. |
||||
|
</p><p> |
||||
|
Use this menu to browse previous transfer. To record new |
||||
|
transfer, you may use the create button. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!--<menuitem id="menu_transfer_root" name="Employee Transfer" parent="hr.menu_hr_root" sequence="2" groups="hr.group_hr_manager"/>--> |
||||
|
<menuitem id="menu_employee_transfer" name="Employee Transfer" parent="hr_employee_updation.menu_hr_management" sequence="3" |
||||
|
action="action_employee_transfer" groups="hr.group_hr_manager"/> |
||||
|
</odoo> |