@ -0,0 +1,43 @@ |
|||||
|
OHRMS Employee Shift v10 |
||||
|
======================== |
||||
|
|
||||
|
Easily create, manage, and track employee shift schedules |
||||
|
|
||||
|
Depends |
||||
|
======= |
||||
|
[hr] addon Odoo |
||||
|
|
||||
|
Tech |
||||
|
==== |
||||
|
* [Python] - Models |
||||
|
* [XML] - Odoo views |
||||
|
|
||||
|
Installation |
||||
|
============ |
||||
|
- www.odoo.com/documentation/10.0/setup/install.html |
||||
|
- Install our custom addon |
||||
|
|
||||
|
License |
||||
|
======= |
||||
|
GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (LGPLv3) |
||||
|
(http://www.gnu.org/licenses/agpl.html) |
||||
|
|
||||
|
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: Saritha Sahadevan, saritha@cybrosys.in |
||||
|
|
||||
|
Maintainer |
||||
|
---------- |
||||
|
|
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit https://www.cybrosys.com. |
@ -0,0 +1,6 @@ |
|||||
|
## Module hr_employee_shift |
||||
|
|
||||
|
#### 30.03.2018 |
||||
|
#### Version 10.0.1.0.0 |
||||
|
##### ADD |
||||
|
- Initial commit for OpenHrms Project |
@ -0,0 +1,23 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################### |
||||
|
# A part of OpenHrms Project <https://www.openhrms.com> |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
||||
|
# Author: Saritha Sahadevan (<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 . import models |
@ -0,0 +1,46 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################### |
||||
|
# A part of OpenHrms Project <https://www.openhrms.com> |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
||||
|
# Author: Saritha Sahadevan (<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': "OHRMS Employee Shift", |
||||
|
'version': '10.0.1.0', |
||||
|
'summary': """Easily create, manage, and track employee shift schedules.""", |
||||
|
'description': """Easily create, manage, and track employee shift schedules.""", |
||||
|
'category': 'Human Resource', |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': "https://www.openhrms.com", |
||||
|
'depends': ['hr', 'hr_payroll'], |
||||
|
'data': [ |
||||
|
'security/ir.model.access.csv', |
||||
|
'security/hr_employee_shift_security.xml', |
||||
|
'views/hr_employee_shift_view.xml', |
||||
|
'views/hr_employee_contract_view.xml', |
||||
|
'views/hr_generate_shift_view.xml', |
||||
|
'views/templates.xml', |
||||
|
], |
||||
|
'images': ["static/description/banner.jpg"], |
||||
|
'license': "AGPL-3", |
||||
|
'installable': True, |
||||
|
'application': True, |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################### |
||||
|
# A part of OpenHrms Project <https://www.openhrms.com> |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
||||
|
# Author: Saritha Sahadevan (<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 . import hr_employee_shift, hr_employee_contract, hr_generate_shift, hr_shift_payroll |
@ -0,0 +1,75 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################### |
||||
|
# A part of OpenHrms Project <https://www.openhrms.com> |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
||||
|
# Author: Saritha Sahadevan (<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.exceptions import Warning |
||||
|
from odoo import models, fields, api, _ |
||||
|
|
||||
|
|
||||
|
class HrEmployeeContract(models.Model): |
||||
|
_inherit = 'hr.contract' |
||||
|
|
||||
|
shift_schedule = fields.One2many('hr.shift.schedule', 'rel_hr_schedule', string="Shift Schedule") |
||||
|
working_hours = fields.Many2one('resource.calendar', string='Working Schedule') |
||||
|
department_id = fields.Many2one('hr.department', string="Department", required=True) |
||||
|
|
||||
|
|
||||
|
class HrSchedule(models.Model): |
||||
|
_name = 'hr.shift.schedule' |
||||
|
|
||||
|
start_date = fields.Date(string="Date From", required=True) |
||||
|
end_date = fields.Date(string="Date To", required=True) |
||||
|
rel_hr_schedule = fields.Many2one('hr.contract') |
||||
|
hr_shift = fields.Many2one('resource.calendar', string="Shift", required=True) |
||||
|
|
||||
|
@api.onchange('start_date', 'end_date') |
||||
|
def get_department(self): |
||||
|
"""Adding domain to the hr_shift field""" |
||||
|
hr_department = None |
||||
|
if self.start_date: |
||||
|
hr_department = self.rel_hr_schedule.department_id.id |
||||
|
return { |
||||
|
'domain': { |
||||
|
'hr_shift': [('hr_department', '=', hr_department)] |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@api.multi |
||||
|
def write(self, vals): |
||||
|
self._check_overlap(vals) |
||||
|
return super(HrSchedule, self).write(vals) |
||||
|
|
||||
|
@api.model |
||||
|
def create(self, vals): |
||||
|
self._check_overlap(vals) |
||||
|
return super(HrSchedule, self).create(vals) |
||||
|
|
||||
|
def _check_overlap(self, vals): |
||||
|
if vals.get('start_date', False) and vals.get('end_date', False): |
||||
|
shifts = self.env['hr.shift.schedule'].search([('rel_hr_schedule', '=', vals.get('rel_hr_schedule'))]) |
||||
|
for each in shifts: |
||||
|
if each != shifts[-1]: |
||||
|
if each.end_date >= vals.get('start_date') or each.start_date >= vals.get('start_date'): |
||||
|
raise Warning(_('The dates may not overlap with one another.')) |
||||
|
if vals.get('start_date') > vals.get('end_date'): |
||||
|
raise Warning(_('Start date should be less than end date.')) |
||||
|
return True |
||||
|
|
@ -0,0 +1,41 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################### |
||||
|
# A part of OpenHrms Project <https://www.openhrms.com> |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
||||
|
# Author: Saritha Sahadevan (<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.exceptions import ValidationError |
||||
|
from odoo import models, fields, api |
||||
|
|
||||
|
|
||||
|
class HrEmployeeShift(models.Model): |
||||
|
_inherit = 'resource.calendar' |
||||
|
|
||||
|
color = fields.Integer(string='Color Index') |
||||
|
hr_department = fields.Many2one('hr.department', string="Department", required=True) |
||||
|
sequence = fields.Integer(string="Sequence", required=True, default=1) |
||||
|
|
||||
|
@api.constrains('sequence') |
||||
|
def validate_seq(self): |
||||
|
record = self.env['resource.calendar'].search([('hr_department', '=', self.hr_department.id), |
||||
|
('sequence', '=', self.sequence) |
||||
|
]) |
||||
|
if len(record) > 1: |
||||
|
raise ValidationError("One record with same sequence is already active." |
||||
|
"You can't activate more than one record at a time") |
@ -0,0 +1,101 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################### |
||||
|
# A part of OpenHrms Project <https://www.openhrms.com> |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
||||
|
# Author: Saritha Sahadevan (<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 models, fields |
||||
|
|
||||
|
|
||||
|
class HrGenerateShift(models.Model): |
||||
|
_name = 'hr.shift.generate' |
||||
|
|
||||
|
hr_department = fields.Many2one('hr.department', string="Department") |
||||
|
start_date = fields.Date(string="Start Date", required=True) |
||||
|
end_date = fields.Date(string="End Date", required=True) |
||||
|
|
||||
|
def action_schedule_shift(self): |
||||
|
"""Create mass schedule for all departments based on the shift scheduled in corresponding employee's contract""" |
||||
|
|
||||
|
if self.hr_department: |
||||
|
for contract in self.env['hr.contract'].search([('department_id', '=', self.hr_department.id)]): |
||||
|
if contract.shift_schedule: |
||||
|
for shift_val in contract.shift_schedule: |
||||
|
shift = shift_val.hr_shift |
||||
|
start_date = self.start_date |
||||
|
end_date = self.end_date |
||||
|
shift_obj = self.env['resource.calendar'].search([('hr_department', '=', self.hr_department.id), |
||||
|
('name', '=', shift.name)], limit=1) |
||||
|
sequence = shift_obj.sequence |
||||
|
seq_no = sequence + 1 |
||||
|
new_shift = self.env['resource.calendar'].search([ |
||||
|
('sequence', '=', seq_no), ('hr_department', '=', self.hr_department.id)], limit=1) |
||||
|
if new_shift: |
||||
|
shift_ids = [(0, 0, { |
||||
|
'hr_shift': new_shift.id, |
||||
|
'start_date': start_date, |
||||
|
'end_date': end_date |
||||
|
})] |
||||
|
contract.shift_schedule = shift_ids |
||||
|
else: |
||||
|
seq_no = 1 |
||||
|
new_shift = self.env['resource.calendar'].search([ |
||||
|
('sequence', '=', seq_no), ('hr_department', '=', self.hr_department.id)], limit=1) |
||||
|
if new_shift: |
||||
|
shift_ids = [(0, 0, { |
||||
|
'hr_shift': new_shift.id, |
||||
|
'start_date': start_date, |
||||
|
'end_date': end_date |
||||
|
})] |
||||
|
contract.shift_schedule = shift_ids |
||||
|
else: |
||||
|
for contract in self.env['hr.contract'].search([]): |
||||
|
if contract.shift_schedule and contract.department_id: |
||||
|
for shift_val in contract.shift_schedule: |
||||
|
shift = shift_val.hr_shift |
||||
|
start_date = self.start_date |
||||
|
end_date = self.end_date |
||||
|
shift_obj = self.env['resource.calendar'].search([('hr_department', '=', contract.department_id.id), |
||||
|
('name', '=', shift.name)], limit=1) |
||||
|
sequence = shift_obj.sequence |
||||
|
seq_no = sequence + 1 |
||||
|
new_shift = self.env['resource.calendar'].search([ |
||||
|
('sequence', '=', seq_no), ('hr_department', '=', contract.department_id.id)], limit=1) |
||||
|
if new_shift: |
||||
|
shift_ids = [(0, 0, { |
||||
|
'hr_shift': new_shift.id, |
||||
|
'start_date': start_date, |
||||
|
'end_date': end_date |
||||
|
})] |
||||
|
contract.shift_schedule = shift_ids |
||||
|
else: |
||||
|
seq_no = 1 |
||||
|
new_shift = self.env['resource.calendar'].search([ |
||||
|
('sequence', '=', seq_no), ('hr_department', '=', contract.department_id.id)], limit=1) |
||||
|
shift_ids = [(0, 0, { |
||||
|
'hr_shift': new_shift.id, |
||||
|
'start_date': start_date, |
||||
|
'end_date': end_date |
||||
|
})] |
||||
|
contract.shift_schedule = shift_ids |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
@ -0,0 +1,109 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################### |
||||
|
# A part of OpenHrms Project <https://www.openhrms.com> |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
||||
|
# Author: Saritha Sahadevan (<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 datetime import datetime, timedelta |
||||
|
from odoo import models, fields, api, _, tools |
||||
|
|
||||
|
|
||||
|
class HrPayroll(models.Model): |
||||
|
_inherit = 'hr.payslip' |
||||
|
|
||||
|
@api.model |
||||
|
def get_worked_day_lines(self, contract_ids, date_from, date_to): |
||||
|
""" |
||||
|
@param contract_ids: list of contract id |
||||
|
@return: returns a list of dict containing the input that should be applied for the given contract between date_from and date_to |
||||
|
""" |
||||
|
|
||||
|
def was_on_leave_interval(employee_id, date_from, date_to): |
||||
|
date_from = fields.Datetime.to_string(date_from) |
||||
|
date_to = fields.Datetime.to_string(date_to) |
||||
|
return self.env['hr.holidays'].search([ |
||||
|
('state', '=', 'validate'), |
||||
|
('employee_id', '=', employee_id), |
||||
|
('type', '=', 'remove'), |
||||
|
('date_from', '<=', date_from), |
||||
|
('date_to', '>=', date_to) |
||||
|
], limit=1) |
||||
|
|
||||
|
res = [] |
||||
|
# fill only if the contract as a working schedule linked |
||||
|
uom_day = self.env.ref('product.product_uom_day', raise_if_not_found=False) |
||||
|
for contract in self.env['hr.contract'].browse(contract_ids).filtered(lambda contract: contract): |
||||
|
uom_hour = contract.employee_id.resource_id.calendar_id.uom_id or self.env.ref('product.product_uom_hour', |
||||
|
raise_if_not_found=False) |
||||
|
interval_data = [] |
||||
|
holidays = self.env['hr.holidays'] |
||||
|
attendances = { |
||||
|
'name': _("Normal Working Days paid at 100%"), |
||||
|
'sequence': 1, |
||||
|
'code': 'WORK100', |
||||
|
'number_of_days': 0.0, |
||||
|
'number_of_hours': 0.0, |
||||
|
'contract_id': contract.id, |
||||
|
} |
||||
|
leaves = {} |
||||
|
|
||||
|
# Gather all intervals and holidays |
||||
|
for days in contract.shift_schedule: |
||||
|
start_date = datetime.strptime(days.start_date, tools.DEFAULT_SERVER_DATE_FORMAT) |
||||
|
end_date = datetime.strptime(days.end_date, tools.DEFAULT_SERVER_DATE_FORMAT) |
||||
|
|
||||
|
nb_of_days = (end_date - start_date).days + 1 |
||||
|
for day in range(0, nb_of_days): |
||||
|
|
||||
|
working_intervals_on_day = days.hr_shift.get_working_intervals_of_day( |
||||
|
start_dt=start_date + timedelta(days=day)) |
||||
|
for interval in working_intervals_on_day: |
||||
|
interval_data.append( |
||||
|
(interval, was_on_leave_interval(contract.employee_id.id, interval[0], interval[1]))) |
||||
|
|
||||
|
# Extract information from previous data. A working interval is considered: |
||||
|
# - as a leave if a hr.holiday completely covers the period |
||||
|
# - as a working period instead |
||||
|
for interval, holiday in interval_data: |
||||
|
holidays |= holiday |
||||
|
hours = (interval[1] - interval[0]).total_seconds() / 3600.0 |
||||
|
if holiday: |
||||
|
# if he was on leave, fill the leaves dict |
||||
|
if holiday.holiday_status_id.name in leaves: |
||||
|
leaves[holiday.holiday_status_id.name]['number_of_hours'] += hours |
||||
|
else: |
||||
|
leaves[holiday.holiday_status_id.name] = { |
||||
|
'name': holiday.holiday_status_id.name, |
||||
|
'sequence': 5, |
||||
|
'code': holiday.holiday_status_id.name, |
||||
|
'number_of_days': 0.0, |
||||
|
'number_of_hours': hours, |
||||
|
'contract_id': contract.id, |
||||
|
} |
||||
|
else: |
||||
|
# add the input vals to tmp (increment if existing) |
||||
|
attendances['number_of_hours'] += hours |
||||
|
# Clean-up the results |
||||
|
leaves = [value for key, value in leaves.items()] |
||||
|
for data in [attendances] + leaves: |
||||
|
data['number_of_days'] = uom_hour._compute_quantity(data['number_of_hours'], uom_day) \ |
||||
|
if uom_day and uom_hour \ |
||||
|
else data['number_of_hours'] / 8.0 |
||||
|
res.append(data) |
||||
|
return res |
@ -0,0 +1,16 @@ |
|||||
|
<?xml version="1.0" ?> |
||||
|
<odoo> |
||||
|
<record id="property_rule_hr_shift" model="ir.rule"> |
||||
|
<field name="name">Hr Shift Multi Company</field> |
||||
|
<field name="model_id" ref="model_hr_shift_schedule"/> |
||||
|
<field eval="True" name="global"/> |
||||
|
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="property_rule_hr_shift_generate" model="ir.rule"> |
||||
|
<field name="name">Hr Shift Genarate Multi Company</field> |
||||
|
<field name="model_id" ref="model_hr_shift_generate"/> |
||||
|
<field eval="True" name="global"/> |
||||
|
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> |
||||
|
</record> |
||||
|
</odoo> |
|
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 221 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 34 KiB |
@ -0,0 +1,129 @@ |
|||||
|
<section class="oe_container bg-gray-lighter" xmlns="http://www.w3.org/1999/html"> |
||||
|
<div class="oe_row"> |
||||
|
<div class="oe_span"> |
||||
|
<h2 class="oe_slogan">OpenHRMS</h2> |
||||
|
<h3 class="oe_slogan">Most advanced open source HR management software</h3> |
||||
|
</div> |
||||
|
</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"> |
||||
|
<div class="oe_span12"> |
||||
|
<h2 class="oe_slogan">Employee Shift Management</h2> |
||||
|
<h3 class="oe_slogan">Easily create, manage, and track employee shift schedules.</h3> |
||||
|
<h3 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a> </h3> |
||||
|
</div> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h4><p style="margin-left: 42px;">Major Features:</p></h4> |
||||
|
<ul> |
||||
|
<li style="list-style:none !important;"><span style="color:green;"> ★</span> Define list of Work Shifts</li> |
||||
|
<li style="list-style:none !important;"><span style="color:green;"> ★</span> Define flexible hour wise shift</li> |
||||
|
<li style="list-style:none !important;"><span style="color:green;"> ★</span> Assign shift in employee contract</li> |
||||
|
<li style="list-style:none !important;"><span style="color:green;"> ★</span> Assign new shift automatically</li> |
||||
|
</ul> |
||||
|
</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"> |
||||
|
Employee Shift Management is a component of Open HRMS suit. |
||||
|
This module allows the user to create and manage employee work shifts. |
||||
|
Administrator can create various shifts according to the working hours and assign the Shift in |
||||
|
employee work contract. The module also helps to automatically assign new shift according to |
||||
|
the shift sequence |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<div class="oe_span12"> |
||||
|
<p><h1>Create Employee Shift</h1> </p> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img src="create_shift.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<p><h2>Employee Shift In Contract</h2> </p> |
||||
|
<div class="oe_span6"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img src="contract1.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="oe_span6"> |
||||
|
<p>Have an option to schedule shift in employee contract form. |
||||
|
It is very important to create atleast one shift schedule manually in contract form</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<p><h2>Generate Automatic Shifts</h2></p> |
||||
|
<p class="oe_mt32"> |
||||
|
<p>Automatically assign new shift according to the shift sequence</p> |
||||
|
</p> |
||||
|
<div class="oe_span6"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img src="generate_schedule.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="oe_span6"> |
||||
|
<p><h1> Employee Shifts</h1> </p> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img src="shift.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"><i |
||||
|
class="fa fa-envelope"></i> Email </a> <a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="https://www.cybrosys.com/contact/"><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.cybrosys.com/odoo-customization-and-installation/"><i |
||||
|
class="fa fa-check-square"></i> Request Customization </a> |
||||
|
</div> |
||||
|
<br> |
||||
|
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
After Width: | Height: | Size: 96 KiB |
@ -0,0 +1,7 @@ |
|||||
|
|
||||
|
.style_shift{ |
||||
|
color: black !important; |
||||
|
font-size: 15px; |
||||
|
text-align: center; |
||||
|
padding: 10px 0px 2px 3px; |
||||
|
} |
@ -0,0 +1,18 @@ |
|||||
|
@dashboard-bg-color: white; |
||||
|
|
||||
|
.o_kanban_view.o_kanban_dashboard.o_shift_kanban { |
||||
|
@sale-table-spacing: 20px; |
||||
|
|
||||
|
.o_kanban_record { |
||||
|
min-height: 150px; |
||||
|
max-width: 250px !important; |
||||
|
@media (min-width: @screen-sm-min) { |
||||
|
min-width: 20px; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
.oe_kanban_content{ |
||||
|
padding-top: 50px!important; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,29 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<record id="employee_contract_form_inherited" model="ir.ui.view"> |
||||
|
<field name="name">employee.contract</field> |
||||
|
<field name="model">hr.contract</field> |
||||
|
<field name="inherit_id" ref="hr_contract.hr_contract_view_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//field[@name='working_hours']" position="replace"> |
||||
|
<field name="working_hours" invisible="1"/> |
||||
|
</xpath> |
||||
|
<xpath expr="//field[@name='department_id']" position="replace"> |
||||
|
<field name="department_id"/> |
||||
|
</xpath> |
||||
|
<xpath expr="//group[@name='duration_group']" position="after"> |
||||
|
<group colspan="2" string="Shift Schedule"> |
||||
|
<field name="shift_schedule" nolabel="1"> |
||||
|
<tree editable="1"> |
||||
|
<field name="start_date"/> |
||||
|
<field name="end_date"/> |
||||
|
<field name="hr_shift"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</group> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,76 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<record id="resource_calendar_form" model="ir.ui.view"> |
||||
|
<field name="name">resource.calendar</field> |
||||
|
<field name="model">resource.calendar</field> |
||||
|
<field name="inherit_id" ref="resource.resource_calendar_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//field[@name='name']" position="after"> |
||||
|
<field name="hr_department"/> |
||||
|
<field name="sequence"/> |
||||
|
<field name="color" invisible="1"/> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="shift_template_kanban_view" model="ir.ui.view"> |
||||
|
<field name="name">employee.shift.kanban</field> |
||||
|
<field name="model">resource.calendar</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<kanban class="oe_background_grey o_kanban_dashboard o_shift_kanban"> |
||||
|
<field name="color"/> |
||||
|
<templates> |
||||
|
<t t-name="kanban-box"> |
||||
|
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click "> |
||||
|
<div class="o_dropdown_kanban dropdown"> |
||||
|
<a class="dropdown-toggle btn" data-toggle="dropdown" href="#" > |
||||
|
<span class="fa fa-bars fa-lg"/> |
||||
|
</a> |
||||
|
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel"> |
||||
|
<t t-if="widget.editable"><li><a type="edit">Edit</a></li></t> |
||||
|
<t t-if="widget.deletable"><li><a type="delete">Delete</a></li></t> |
||||
|
<li><ul class="oe_kanban_colorpicker" data-field="color"/></li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
<div class="oe_kanban_content"> |
||||
|
<div class="row"> |
||||
|
<div class="o_primary style_shift"> |
||||
|
<div class="text-center"><strong><field name="name"/></strong></div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="oe_kanban_details"> |
||||
|
<strong> |
||||
|
<div class="text-center"> |
||||
|
<span t-if="record.hr_department.value">[<field name="hr_department"/>]</span> |
||||
|
</div> |
||||
|
</strong> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</templates> |
||||
|
</kanban> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="resource.action_resource_calendar_form" model="ir.actions.act_window"> |
||||
|
<field name="name">Shift Working Time</field> |
||||
|
<field name="res_model">resource.calendar</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">kanban,tree,form</field> |
||||
|
<field name="view_id" eval="False"/> |
||||
|
<field name="search_view_id" ref="resource.view_resource_calendar_search"/> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Define working hours and time table that could be scheduled to your project members |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem name="Shifts" id="hr_employee_shift.menu_shift" parent="hr.menu_human_resources_configuration" |
||||
|
action="resource.action_resource_calendar_form"/> |
||||
|
|
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,50 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
|
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!-- explicit wizard view definition --> |
||||
|
<record model="ir.ui.view" id="hr_employee_shift.generate_schedule_form"> |
||||
|
<field name="name">hr_employee_shift_generate_schedule form</field> |
||||
|
<field name="model">hr.shift.generate</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form create="false" edit="false"> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="hr_department"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="start_date"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="end_date"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<footer> |
||||
|
<button string="Generate" name="action_schedule_shift" type="object" |
||||
|
class="oe_highlight"/> |
||||
|
<button string="Cancel" special="cancel" |
||||
|
class="oe_link"/> |
||||
|
</footer> |
||||
|
</sheet> |
||||
|
|
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<!-- actions opening views on models --> |
||||
|
<record model="ir.actions.act_window" id="hr_employee_shift.generate_schedule_action_window"> |
||||
|
<field name="name">Employee Shift</field> |
||||
|
<field name="res_model">hr.shift.generate</field> |
||||
|
<field name="view_mode">form</field> |
||||
|
<field name="target">new</field> |
||||
|
</record> |
||||
|
|
||||
|
<!-- menu item --> |
||||
|
<menuitem name="Employee Shift" id="menu_shift_schedule_generate_id_menu" parent="hr.menu_hr_root" action="hr_employee_shift.generate_schedule_action_window" groups="hr.group_hr_manager"/> |
||||
|
<menuitem name="Generate Schedule" id="hr_employee_shift.menu_shift_schedule_generate_id" parent="menu_shift_schedule_generate_id_menu" action="hr_employee_shift.generate_schedule_action_window" groups="hr.group_hr_manager"/> |
||||
|
|
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,9 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<template id="assets_backend" name="project assets" inherit_id="web.assets_backend"> |
||||
|
<xpath expr="." position="inside"> |
||||
|
<link rel="stylesheet" href="/hr_employee_shift/static/src/css/shift_dashboard.css"/> |
||||
|
<link rel="stylesheet" href="/hr_employee_shift/static/src/less/shift_dashboard.less"/> |
||||
|
</xpath> |
||||
|
</template> |
||||
|
</odoo> |