add new module
43
hr_employee_shift/README.rst
Normal file
@@ -0,0 +1,43 @@
|
||||
OHRMS Employee Shift v13
|
||||
========================
|
||||
|
||||
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.
|
||||
23
hr_employee_shift/__init__.py
Normal file
@@ -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
|
||||
49
hr_employee_shift/__manifest__.py
Normal file
@@ -0,0 +1,49 @@
|
||||
# -*- 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: 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': "Open HRMS Employee Shift",
|
||||
'version': '13.0.1.0.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_community', 'resource'],
|
||||
'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',
|
||||
],
|
||||
'demo': [
|
||||
'demo/shift_schedule_data.xml',
|
||||
],
|
||||
'images': ["static/description/banner.png"],
|
||||
'license': "AGPL-3",
|
||||
'installable': True,
|
||||
'application': True,
|
||||
}
|
||||
25
hr_employee_shift/demo/shift_schedule_data.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<odoo>
|
||||
<data>
|
||||
<delete model="resource.calendar" search="[('id', '=', ref('resource.resource_calendar_std_35h'))]"/>
|
||||
<delete model="resource.calendar" search="[('id', '=', ref('resource.resource_calendar_std_38h'))]"/>
|
||||
<delete model="hr.contract" search="[('id', '=', ref('hr_payroll_community.hr_contract_firstcontract1'))]"/>
|
||||
<delete model="hr.contract" search="[('id', '=', ref('hr_payroll_community.hr_contract_gilles_gravie'))]"/>
|
||||
|
||||
<record id="resource_calendar_std_35h" model="resource.calendar">
|
||||
<field name="name">Morning</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="hr_department" ref="hr.dep_management"/>
|
||||
<field name="attendance_ids"
|
||||
eval="[
|
||||
(0, 0, {'name': 'Monday Morning', 'dayofweek': '0', 'hour_from': 8, 'hour_to': 12}),
|
||||
(0, 0, {'name': 'Tuesday Morning', 'dayofweek': '1', 'hour_from': 8, 'hour_to': 12}),
|
||||
(0, 0, {'name': 'Wednesday Morning', 'dayofweek': '2', 'hour_from': 8, 'hour_to': 12}),
|
||||
(0, 0, {'name': 'Thursday Morning', 'dayofweek': '3', 'hour_from': 8, 'hour_to': 12}),
|
||||
(0, 0, {'name': 'Friday Morning', 'dayofweek': '4', 'hour_from': 8, 'hour_to': 12}),
|
||||
]"
|
||||
/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
11
hr_employee_shift/doc/RELEASE_NOTES.md
Normal file
@@ -0,0 +1,11 @@
|
||||
## Module <hr_employee_shift>
|
||||
|
||||
#### 21.04.2018
|
||||
#### Version 13.0.1.0.0
|
||||
##### ADD
|
||||
- Initial commit for OpenHrms Project
|
||||
|
||||
#### 17.12.2018
|
||||
#### Version 13.0.1.0.1
|
||||
##### ADD
|
||||
- Payslip creation considering employee shift
|
||||
4928
hr_employee_shift/i18n/ar_001.po
Normal file
4
hr_employee_shift/models/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import hr_employee_shift, hr_employee_contract, hr_generate_shift, hr_shift_payroll
|
||||
# from . import resource
|
||||
56
hr_employee_shift/models/hr_employee_contract.py
Normal file
@@ -0,0 +1,56 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
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", help="Shift schedule")
|
||||
working_hours = fields.Many2one('resource.calendar', string='Working Schedule', help="Working hours")
|
||||
department_id = fields.Many2one('hr.department', string="Department", help="Department",
|
||||
required=True)
|
||||
|
||||
|
||||
class HrSchedule(models.Model):
|
||||
_name = 'hr.shift.schedule'
|
||||
|
||||
start_date = fields.Date(string="Date From", required=True, help="Starting date for the shift")
|
||||
end_date = fields.Date(string="Date To", required=True, help="Ending date for the shift")
|
||||
rel_hr_schedule = fields.Many2one('hr.contract')
|
||||
hr_shift = fields.Many2one('resource.calendar', string="Shift", required=True, help="Shift")
|
||||
company_id = fields.Many2one('res.company', string='Company', help="Company")
|
||||
|
||||
@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)]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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
|
||||
|
||||
42
hr_employee_shift/models/hr_employee_shift.py
Normal file
@@ -0,0 +1,42 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
|
||||
class HrEmployeeInherited(models.Model):
|
||||
_inherit = 'hr.employee'
|
||||
|
||||
resource_calendar_ids = fields.Many2one('resource.calendar', 'Working Hours')
|
||||
|
||||
|
||||
class HrEmployeeShift(models.Model):
|
||||
_inherit = 'resource.calendar'
|
||||
|
||||
def _get_default_attendance_ids(self):
|
||||
return [
|
||||
(0, 0, {'name': _('Monday Morning'), 'dayofweek': '0', 'hour_from': 8, 'hour_to': 12}),
|
||||
(0, 0, {'name': _('Tuesday Morning'), 'dayofweek': '1', 'hour_from': 8, 'hour_to': 12}),
|
||||
(0, 0, {'name': _('Wednesday Morning'), 'dayofweek': '2', 'hour_from': 8, 'hour_to': 12}),
|
||||
(0, 0, {'name': _('Thursday Morning'), 'dayofweek': '3', 'hour_from': 8, 'hour_to': 12}),
|
||||
(0, 0, {'name': _('Friday Morning'), 'dayofweek': '4', 'hour_from': 8, 'hour_to': 12}),
|
||||
]
|
||||
|
||||
color = fields.Integer(string='Color Index', help="Color")
|
||||
hr_department = fields.Many2one('hr.department', string="Department", required=True, help="Department")
|
||||
sequence = fields.Integer(string="Sequence", required=True, default=1, help="Sequence")
|
||||
attendance_ids = fields.One2many(
|
||||
'resource.calendar.attendance', 'calendar_id', 'Workingssss Time',
|
||||
copy=True, default=_get_default_attendance_ids)
|
||||
|
||||
@api.constrains('sequence')
|
||||
def validate_seq(self):
|
||||
if self.hr_department.id:
|
||||
record = self.env['resource.calendar'].search([('hr_department', '=', self.hr_department.id),
|
||||
('sequence', '=', self.sequence),
|
||||
('company_id', '=', self.company_id.id)
|
||||
])
|
||||
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")
|
||||
|
||||
|
||||
81
hr_employee_shift/models/hr_generate_shift.py
Normal file
@@ -0,0 +1,81 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class HrGenerateShift(models.Model):
|
||||
_name = 'hr.shift.generate'
|
||||
|
||||
hr_department = fields.Many2one('hr.department', string="Department", help="Department")
|
||||
start_date = fields.Date(string="Start Date", required=True, help="Start date")
|
||||
end_date = fields.Date(string="End Date", required=True, help="End date")
|
||||
company_id = fields.Many2one('res.company', string='Company', help="Company")
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
176
hr_employee_shift/models/hr_shift_payroll.py
Normal file
@@ -0,0 +1,176 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from datetime import timedelta
|
||||
from odoo import models, fields, api, _, tools
|
||||
from datetime import datetime, time
|
||||
import datetime
|
||||
import math
|
||||
from pytz import utc
|
||||
from odoo.tools.float_utils import float_round
|
||||
from collections import namedtuple
|
||||
|
||||
|
||||
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.leave'].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 contract_ids:
|
||||
uom_hour = self.env.ref('product.product_uom_hour', raise_if_not_found=False)
|
||||
interval_data = []
|
||||
holidays = self.env['hr.leave']
|
||||
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.datetime.strptime(str(days.start_date), tools.DEFAULT_SERVER_DATE_FORMAT)
|
||||
end_date = datetime.datetime.strptime(str(days.end_date), tools.DEFAULT_SERVER_DATE_FORMAT)
|
||||
nb_of_days = (days.end_date - days.start_date).days + 1
|
||||
for day in range(0, nb_of_days):
|
||||
working_intervals_on_day = days.hr_shift._get_day_work_intervals(
|
||||
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
|
||||
|
||||
|
||||
class Calendar(models.Model):
|
||||
_inherit = 'resource.calendar'
|
||||
_interval_obj = namedtuple('Interval', ('start_datetime', 'end_datetime', 'data'))
|
||||
|
||||
def string_to_datetime(self, value):
|
||||
""" Convert the given string value to a datetime in UTC. """
|
||||
return utc.localize(fields.Datetime.from_string(value))
|
||||
|
||||
def float_to_time(self, hours):
|
||||
""" Convert a number of hours into a time object. """
|
||||
if hours == 24.0:
|
||||
return time.max
|
||||
fractional, integral = math.modf(hours)
|
||||
return time(int(integral), int(float_round(60 * fractional, precision_digits=0)), 0)
|
||||
|
||||
def _interval_new(self, start_datetime, end_datetime, kw=None):
|
||||
kw = kw if kw is not None else dict()
|
||||
kw.setdefault('attendances', self.env['resource.calendar.attendance'])
|
||||
kw.setdefault('leaves', self.env['resource.calendar.leaves'])
|
||||
return self._interval_obj(start_datetime, end_datetime, kw)
|
||||
|
||||
|
||||
def _get_day_work_intervals(self, day_date, start_time=None, end_time=None, compute_leaves=False,
|
||||
resource_id=None):
|
||||
self.ensure_one()
|
||||
|
||||
if not start_time:
|
||||
start_time = datetime.time.min
|
||||
if not end_time:
|
||||
end_time = datetime.time.max
|
||||
|
||||
working_intervals = [att_interval for att_interval in
|
||||
self._iter_day_attendance_intervals(day_date, start_time, end_time)]
|
||||
|
||||
# filter according to leaves
|
||||
if compute_leaves:
|
||||
leaves = self._get_leave_intervals(
|
||||
resource_id=resource_id,
|
||||
start_datetime=datetime.datetime.combine(day_date, start_time),
|
||||
end_datetime=datetime.datetime.combine(day_date, end_time))
|
||||
working_intervals = [
|
||||
sub_interval
|
||||
for interval in working_intervals
|
||||
for sub_interval in self._leave_intervals(interval, leaves)]
|
||||
|
||||
# adapt tz
|
||||
return [self._interval_new(
|
||||
self.string_to_datetime(interval[0]),
|
||||
self.string_to_datetime(interval[1]),
|
||||
interval[2]) for interval in working_intervals]
|
||||
|
||||
|
||||
def _get_day_attendances(self, day_date, start_time, end_time):
|
||||
""" Given a day date, return matching attendances. Those can be limited
|
||||
by starting and ending time objects. """
|
||||
self.ensure_one()
|
||||
weekday = day_date.weekday()
|
||||
attendances = self.env['resource.calendar.attendance']
|
||||
|
||||
for attendance in self.attendance_ids.filtered(
|
||||
lambda att:
|
||||
int(att.dayofweek) == weekday and
|
||||
not (att.date_from and fields.Date.from_string(att.date_from) > day_date) and
|
||||
not (att.date_to and fields.Date.from_string(att.date_to) < day_date)):
|
||||
if start_time and self.float_to_time(attendance.hour_to) < start_time:
|
||||
continue
|
||||
if end_time and self.float_to_time(attendance.hour_from) > end_time:
|
||||
continue
|
||||
attendances |= attendance
|
||||
return attendances
|
||||
|
||||
def _iter_day_attendance_intervals(self, day_date, start_time, end_time):
|
||||
""" Get an iterator of all interval of current day attendances. """
|
||||
for calendar_working_day in self._get_day_attendances(day_date, start_time, end_time):
|
||||
from_time = self.float_to_time(calendar_working_day.hour_from)
|
||||
to_time = self.float_to_time(calendar_working_day.hour_to)
|
||||
|
||||
dt_f = datetime.datetime.combine(day_date, max(from_time, start_time))
|
||||
dt_t = datetime.datetime.combine(day_date, min(to_time, end_time))
|
||||
|
||||
yield self._interval_new(dt_f, dt_t, {'attendances': calendar_working_day})
|
||||
|
||||
|
||||
|
||||
16
hr_employee_shift/security/hr_employee_shift_security.xml
Normal file
@@ -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>
|
||||
3
hr_employee_shift/security/ir.model.access.csv
Normal file
@@ -0,0 +1,3 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_hr_employee_shift_schedule,hr_employee_shift.hr_shift_schedule,model_hr_shift_schedule,hr.group_hr_manager,1,1,1,1
|
||||
access_hr_employee_shift_generate,hr_employee_shift.hr_shift_generate,model_hr_shift_generate,hr.group_hr_manager,1,1,1,1
|
||||
|
BIN
hr_employee_shift/static/description/banner.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
hr_employee_shift/static/description/icon.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
hr_employee_shift/static/description/images/1employee shift.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
hr_employee_shift/static/description/images/2shift alloc.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 42 KiB |
BIN
hr_employee_shift/static/description/images/4shift.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
hr_employee_shift/static/description/images/appraisal_image.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
hr_employee_shift/static/description/images/bio_image.png
Normal file
|
After Width: | Height: | Size: 159 KiB |
BIN
hr_employee_shift/static/description/images/checked.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
hr_employee_shift/static/description/images/checked.psd
Normal file
BIN
hr_employee_shift/static/description/images/core_image.gif
Normal file
|
After Width: | Height: | Size: 612 KiB |
BIN
hr_employee_shift/static/description/images/dash_image.gif
Normal file
|
After Width: | Height: | Size: 408 KiB |
BIN
hr_employee_shift/static/description/images/employee_shift.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
hr_employee_shift/static/description/images/openhrms.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
hr_employee_shift/static/description/images/salary_image.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
hr_employee_shift/static/description/images/shift_image.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
547
hr_employee_shift/static/description/index.html
Normal file
@@ -0,0 +1,547 @@
|
||||
<div class="row"
|
||||
style="margin: 0;position: relative;color: #000;background-position: center;background: #ffffff;border-bottom: 1px solid #e4e4e4;text-align: center; margin: auto; display: flex;justify-content: center;">
|
||||
<a href="https://www.openhrms.com/" target="_blank"><img src="images/openhrms.png"
|
||||
style=" width: 293px; padding: 1rem 0rem; margin: auto"
|
||||
alt="cybrosys-logo"></a>
|
||||
</div>
|
||||
<div class="row"
|
||||
style="margin:75px 0;position: relative;color: #000;background-position: center;background: #ffffff;border-bottom: 1px solid #e4e4e4; padding-bottom: 30px;">
|
||||
<div class="col-md-7 col-sm-12 col-xs-12" style="padding: 0px">
|
||||
<div style=" margin: 0 0 0px;padding: 20px 0 10;font-size: 23px;line-height: 35px;font-weight: 400;color: #000;border-top: 1px solid rgba(255,255,255,0.1);border-bottom: 1px solid rgba(255,255,255,0.11);text-align: left;">
|
||||
<h1 style="font-size: 39px;font-weight: 600;margin: 0px !important;"> Employee Shift Management </h1>
|
||||
<h3 style="font-size: 21px;margin-top: 8px;position: relative;"> Easily create, manage, and track employee shift schedules. </h3>
|
||||
</div>
|
||||
<h2 style="font-weight: 600;font-size: 1.8rem;margin-top: 15px;">Key Highlights</h2>
|
||||
<ul style=" padding: 0 1px; list-style: none; ">
|
||||
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px;"><img src="images/checked.png"
|
||||
style=" width: 22px; margin-right: 6px; "
|
||||
alt="check">
|
||||
Define list of Work Shifts
|
||||
</li>
|
||||
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px;"><img src="images/checked.png"
|
||||
style=" width: 22px; margin-right: 6px; "
|
||||
alt="check">
|
||||
Define flexible hour wise shift
|
||||
</li>
|
||||
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px;"><img src="images/checked.png"
|
||||
style=" width: 22px; margin-right: 6px; "
|
||||
alt="check">
|
||||
Assign shift in employee contract
|
||||
</li>
|
||||
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px;"><img src="images/checked.png"
|
||||
style=" width: 22px; margin-right: 6px; "
|
||||
alt="check">
|
||||
Assign new shift automatically
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-5 col-sm-12 col-xs-12"><img src="images/employee_shift.png" class="img-responsive" alt=""></div>
|
||||
</div>
|
||||
<div>
|
||||
<section class="oe_container" style="padding: 1rem 0rem 1rem; background-color: #ffffff !important;">
|
||||
<div class="row py-4 px-3">
|
||||
<div class="w-100" style="padding-top:30px;padding-bottom:45px;border-radius: 10px;">
|
||||
<ul role="tablist" class="nav nav-pills justify-content-center" data-tabs="tabs" id="pills-tab"
|
||||
style="border: none;background: unset;">
|
||||
<li class="nav-item mr-1 mb-3"
|
||||
style="font-size: 1.05rem;font-weight: 400;transition: all .15s ease;color: #d31c22;background-color: #00438b;box-shadow: 0 4px 6px rgba(50,50,93,.11), 0 1px 3px rgba(0,0,0,.08);border: 0;font-family: 'Open Sans',sans-serif;width: 140px;border-radius: 0.30rem;">
|
||||
<a id="pills-home-tab" data-toggle="pill" href="#pills-home" role="tab"
|
||||
aria-controls="pills-home" aria-selected="true" class="nav-link active show"
|
||||
style="color: #fff;line-height: 33px;border: 0;border-radius: .25rem;font-weight: 400; text-align: center;">Overview </a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item mr-1 mb-3" style="font-size: 1.05rem;font-weight: 400;transition: all .15s ease;color: #ffffff;background-color: #00438b;box-shadow: 0 4px 6px rgba(50,50,93,.11), 0 1px 3px rgba(0,0,0,.08);border: 0;font-family: 'Open Sans',sans-serif;width: 140px;border-radius: 0.30rem;"> <a class="nav-link" id="pills-profile-tab" data-toggle="pill" href="#pills-video" role="tab" aria-controls="pills-profile" aria-selected="false" style="color: #000000;line-height: 33px;border: 0;border-radius: .25rem;font-weight: 400; text-align: center;
|
||||
color: #fff;">Configuration </a> </li>
|
||||
<li class="nav-item mr-1 mb-3"
|
||||
style="font-size: 1.05rem;font-weight: 400;transition: all .15s ease;color: #d31c22;background-color: #00438b;box-shadow: 0 4px 6px rgba(50,50,93,.11), 0 1px 3px rgba(0,0,0,.08);border: 0;font-family: 'Open Sans',sans-serif;width: 140px;border-radius: 0.30rem;">
|
||||
<a id="pills-home-tab" data-toggle="pill" href="#pills-features" role="tab"
|
||||
aria-controls="pills-home" aria-selected="true" class="nav-link "
|
||||
style="color: #fff;line-height: 33px;border: 0;border-radius: .25rem;font-weight: 400; text-align: center;">Features </a>
|
||||
</li>
|
||||
<li class="nav-item mr-1 mb-3"
|
||||
style="font-size: 1.05rem;font-weight: 400;transition: all .15s ease;color: #ffffff;background-color: #00438b;box-shadow: 0 4px 6px rgba(50,50,93,.11), 0 1px 3px rgba(0,0,0,.08);border: 0;font-family: 'Open Sans',sans-serif;width: 140px;border-radius: 0.30rem;">
|
||||
<a class="nav-link" id="pills-profile-tab" data-toggle="pill" href="#pills-profile" role="tab"
|
||||
aria-controls="pills-profile" aria-selected="false"
|
||||
style="color: #fff;line-height: 33px;border: 0;border-radius: .25rem;font-weight: 400; text-align: center;">Screenshots </a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content" id="pills-tabContent"
|
||||
style="padding-top: 30px; padding-bottom: 30px; padding: 30px;">
|
||||
<div class="px-3 pt-1 tab-pane fade active show" id="pills-home" role="tabpanel" aria-labelledby="
|
||||
pills-home-tab">
|
||||
<!-- Overview-->
|
||||
<h2 style="font-weight: 600;text-align: center;width: 100%;">Overview</h2>
|
||||
<hr style="margin-top: 0px;margin-bottom: 2%;border: 0;text-align: center;border-top: 3px solid #d21c22;width: 5%;">
|
||||
<h3 class="oe_slogan"
|
||||
style="text-align: center;font-size: 19px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 31px;font-weight: 400;letter-spacing: .5px;margin-bottom: 21px;">
|
||||
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.
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="px-3 pt-1 tab-pane fade" id="pills-video" role="tabpanel" aria-labelledby="
|
||||
pills-home-tab">
|
||||
<!-- Video-->
|
||||
<h2 style="font-weight: 600;text-align: center;width: 100%;"> Configuration </h2>
|
||||
<hr style="margin-top: 0px;margin-bottom: 2%;border: 0;text-align: center;border-top: 3px solid #d21c22;width: 5%;">
|
||||
<h3 class="oe_slogan"
|
||||
style="text-align: center;font-size: 19px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 31px;font-weight: 400;letter-spacing: .5px;margin-bottom: 21px;">
|
||||
No additional configuration is required.
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="px-3 pt-1 tab-pane fade " id="pills-features" role="tabpanel" aria-labelledby="
|
||||
pills-home-tab">
|
||||
<!-- feature tab-->
|
||||
<h2 style="font-weight: 600;text-align: center;width: 100%;"> Employee Shift Management </h2>
|
||||
<hr style="margin-top: 0px;margin-bottom: 2%;border: 0;text-align: center;border-top: 3px solid #d21c22;width: 5%;">
|
||||
<ul>
|
||||
<li class="mb8"
|
||||
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
|
||||
<img src="images/checked.png" style=" width: 22px; margin-right: 6px; " alt="check">
|
||||
Define list of Work Shifts
|
||||
</li>
|
||||
<li class="mb8"
|
||||
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
|
||||
<img src="images/checked.png" style=" width: 22px; margin-right: 6px; " alt="check">
|
||||
Define flexible hour wise shift
|
||||
</li>
|
||||
<li class="mb8"
|
||||
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
|
||||
<img src="images/checked.png" style=" width: 22px; margin-right: 6px; " alt="check">
|
||||
Assign shift in employee contract
|
||||
</li>
|
||||
<li class="mb8"
|
||||
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
|
||||
<img src="images/checked.png" style=" width: 22px; margin-right: 6px; " alt="check">
|
||||
Assign new shift automatically
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- Screenshot tab-->
|
||||
<div class="px-3 tab-pane fade" id="pills-profile" role="tabpanel"
|
||||
aria-labelledby="pills-profile-tab">
|
||||
<div class="tab-pane">
|
||||
<h2 style="font-weight: 600;text-align: center;width: 100%;">Screenshots</h2>
|
||||
<hr style="margin-top: 0px;margin-bottom: 2%;border: 0;text-align: center;border-top: 3px solid #d21c22;width: 5%;">
|
||||
<div>
|
||||
<section class="oe_container">
|
||||
<div id="demo" class="row carousel slide mb32" data-ride="carousel">
|
||||
<div class="carousel-inner">
|
||||
<div class="carousel-item active" style="min-height: 0px;">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
|
||||
style="float: left;">
|
||||
<h3 class="alert"
|
||||
style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;">
|
||||
<img src="images/checked.png"
|
||||
style=" width: 22px; margin-right: 6px; " alt="check">
|
||||
Create Employee Shift
|
||||
</h3>
|
||||
<div style=""><img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/1employee shift.png"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel-item" style="min-height: 0px;">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
|
||||
style="float: left;">
|
||||
<h3 class="alert"
|
||||
style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;">
|
||||
<img src="images/checked.png"
|
||||
style=" width: 22px; margin-right: 6px; " alt="check">
|
||||
Employee Shift In Contract
|
||||
<br>
|
||||
</h3>
|
||||
<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 style=""><img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/2shift alloc.png"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div id="demo" class="row carousel slide mb32" data-ride="carousel">-->
|
||||
<!-- <div class="carousel-inner">-->
|
||||
<div class="carousel-item" style="min-height: 0px;">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
|
||||
style="float: left;">
|
||||
<h3 class="alert"
|
||||
style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;">
|
||||
<img src="images/checked.png"
|
||||
style=" width: 22px; margin-right: 6px; "
|
||||
alt="check">
|
||||
Generate Automatic Shifts
|
||||
</h3>
|
||||
<p> Automatically assign new shift according to the shift sequence. </p>
|
||||
<div style=""><img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/3auto shift alloc.png">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel-item" style="min-height: 0px;">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
|
||||
style="float: left;">
|
||||
<h3 class="alert"
|
||||
style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;">
|
||||
<img src="images/checked.png"
|
||||
style=" width: 22px; margin-right: 6px; "
|
||||
alt="check">
|
||||
Employee Shifts
|
||||
</h3>
|
||||
<div style=""><img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/4shift.png">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<a class="carousel-control-prev" href="#demo" data-slide="prev" style="left:-25px;width: 35px;color: #000;"> <span class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span> </a> <a class="carousel-control-next" href="#demo" data-slide="next" style="right:-25px;width: 35px;color: #000;"> <span class="carousel-control-next-icon"><i class="fa fa-chevron-right" style="font-size:24px"></i></span> </a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- faq tab-->
|
||||
<div class="px-2 px-lg-4 pt-3 tab-pane fade" id="pills-contact"
|
||||
role="tabpanel"
|
||||
aria-labelledby="pills-contact-tab">
|
||||
<ul class="list-unstyled">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="oe_container" style="padding: 2rem 3rem 1rem;">
|
||||
<h2 style="font-weight: 600;text-align: center;margin-bottom: 25px;width: 100%;">Suggested Products</h2>
|
||||
<hr style="margin-top: 0px;margin-bottom: 2%;border: 0;text-align: center;border-top: 3px solid #d21c22;width: 5%;">
|
||||
<div id="demo1" class="row carousel slide" data-ride="carousel">
|
||||
<!-- The slideshow -->
|
||||
<div class="carousel-inner">
|
||||
<div class="carousel-item active" style="min-height: 0px;">
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;"><a
|
||||
href="https://apps.odoo.com/apps/modules/13.0/ohrms_core/" target="_blank">
|
||||
<div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
|
||||
<img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/core_image.gif"></div>
|
||||
</a></div>
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;"><a
|
||||
href="https://apps.odoo.com/apps/modules/13.0/hrms_dashboard/" target="_blank">
|
||||
<div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
|
||||
<img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/dash_image.gif"></div>
|
||||
</a></div>
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;"><a
|
||||
href="https://apps.odoo.com/apps/modules/13.0/oh_hr_zk_attendance/" target="_blank">
|
||||
<div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
|
||||
<img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/bio_image.png"></div>
|
||||
</a></div>
|
||||
</div>
|
||||
<div class="carousel-item" style="min-height: 0px;">
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;"><a
|
||||
href="https://apps.odoo.com/apps/modules/13.0/oh_appraisal/" target="_blank">
|
||||
<div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
|
||||
<img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/appraisal_image.png"></div>
|
||||
</a></div>
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;"><a
|
||||
href="https://apps.odoo.com/apps/modules/13.0/hr_employee_shift/" target="_blank">
|
||||
<div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
|
||||
<img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/shift_image.png"></div>
|
||||
</a></div>
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;"><a
|
||||
href="https://apps.odoo.com/apps/modules/13.0/ohrms_salary_advance/" target="_blank">
|
||||
<div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
|
||||
<img class="img img-responsive center-block"
|
||||
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
|
||||
src="images/salary_image.png"></div>
|
||||
</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Left and right controls -->
|
||||
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
|
||||
style="left:-25px;width: 35px;color: #000;"> <span class="carousel-control-prev-icon"><i
|
||||
class="fa fa-chevron-left" style="font-size:24px"></i></span> </a> <a class="carousel-control-next"
|
||||
href="#demo1"
|
||||
data-slide="next"
|
||||
style="right:-25px;width: 35px;color: #000;">
|
||||
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right" style="font-size:24px"></i></span>
|
||||
</a></div>
|
||||
</section>
|
||||
<section class="row" style="padding: 2rem 3rem 1rem;margin:0px">
|
||||
<h2 style="font-weight: 600;margin-bottom: 20px;text-align: center;width: 100%;">Our Service</h2>
|
||||
<hr style="margin-top: 0px;margin-bottom: 2%;border: 0;text-align: center;border-top: 3px solid #d21c22;width: 5%;">
|
||||
<div class="row" style=" display: flex; justify-content: center; flex-wrap: wrap;width: 100%; ">
|
||||
<!-- <div style="display:flex;padding-top: 20px;justify-content: space-between;"> -->
|
||||
<div class="col-md-2 col-sm-6 col-xs-12">
|
||||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"><a
|
||||
href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank"> <img
|
||||
src="https://www.cybrosys.com/images/odoo-customization.png"
|
||||
style="width: 100%;border-radius: 100%;"/> </a></div>
|
||||
<h3 class="oe_slogan"
|
||||
style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
|
||||
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none; font-family: 'Montserrat',sans-serif;">
|
||||
Odoo Customization </a></h3>
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-6 col-xs-12">
|
||||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"><a
|
||||
href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank"> <img
|
||||
src="https://www.cybrosys.com/images/odoo-erp-implementation.png"
|
||||
style="width: 100%;border-radius: 100%;"/> </a></div>
|
||||
<h3 class="oe_slogan"
|
||||
style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
|
||||
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none; font-family: 'Montserrat',sans-serif;">
|
||||
Odoo Implementation </a></h3>
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-6 col-xs-12">
|
||||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"><a
|
||||
href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank"> <img
|
||||
src="https://www.cybrosys.com/images/odoo-erp-integration.png"
|
||||
style="width: 100%;border-radius: 100%;"/> </a></div>
|
||||
<h3 class="oe_slogan"
|
||||
style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
|
||||
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none; font-family: 'Montserrat',sans-serif;">
|
||||
Odoo Integration </a></h3>
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-6 col-xs-12">
|
||||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"><a
|
||||
href="https://www.cybrosys.com/odoo-erp-support/" target="_blank"> <img
|
||||
src="https://www.cybrosys.com/images/odoo-erp-support.png"
|
||||
style="width: 100%;border-radius: 100%;"/> </a></div>
|
||||
<h3 class="oe_slogan"
|
||||
style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
|
||||
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none; font-family: 'Montserrat',sans-serif;">
|
||||
Odoo Support</a></h3>
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-6 col-xs-12">
|
||||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"><a
|
||||
href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank"> <img
|
||||
src="https://www.cybrosys.com/images/hire-odoo-developer.png"
|
||||
style="width: 100%;border-radius: 100%;"/> </a></div>
|
||||
<h3 class="oe_slogan"
|
||||
style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
|
||||
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none; font-family: 'Montserrat',sans-serif;">
|
||||
Hire Odoo Developers</a></h3>
|
||||
</a> </div>
|
||||
<!-- </div> -->
|
||||
</div>
|
||||
</section>
|
||||
<section class="row" style="padding: 2rem 3rem 1rem;margin:0px">
|
||||
<div class="row" style="margin: 0">
|
||||
<h2 style="font-weight: 600;margin-bottom: 20px;text-align: center;width: 100%;">Our Industries</h2>
|
||||
<hr style="margin-top: 0px;margin-bottom: 2%;border: 0;text-align: center;border-top: 3px solid #d21c22;width: 5%;">
|
||||
<!-- <div style="display:flex;justify-content: space-between;flex-wrap:wrap;"> -->
|
||||
<div class="row" style="width: 100%">
|
||||
<div class="col-md-4 col-sm-6 col-xs-12" style=" margin-bottom: 10px; ">
|
||||
<div>
|
||||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank"> <img
|
||||
src="https://www.cybrosys.com/images/odoo-index-industry-1.png" alt="Odoo Industry"
|
||||
style=" border-radius: 100%;width:100%;"/> </a></div>
|
||||
</div>
|
||||
<div style="width:70%;float:left;">
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none;font-family: 'Montserrat',sans-serif;">
|
||||
Trading </a></h3>
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 12px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px; font-family: 'Montserrat',sans-serif;">
|
||||
Easily procure and sell your products. </h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-6 col-xs-12" style=" margin-bottom: 10px; ">
|
||||
<div>
|
||||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/"
|
||||
target="_blank"> <img src="https://www.cybrosys.com/images/odoo-index-industry-2.png"
|
||||
alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
|
||||
</a></div>
|
||||
</div>
|
||||
<div style="width:70%;float:left;" style=" margin-bottom: 10px; ">
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/"
|
||||
target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none;font-family: 'Montserrat',sans-serif;">
|
||||
Manufacturing</a></h3>
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 12px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;font-family: 'Montserrat',sans-serif;">
|
||||
Plan, track and schedule your operations. </h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-6 col-xs-12" style=" margin-bottom: 10px; ">
|
||||
<div>
|
||||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank">
|
||||
<img src="https://www.cybrosys.com/images/odoo-index-industry-3.png" alt="Odoo Industry"
|
||||
style=" border-radius: 100%;width:100%;"/> </a></div>
|
||||
</div>
|
||||
<div style="width:70%;float:left;">
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none;font-family: 'Montserrat',sans-serif;">
|
||||
Restaurant</a></h3>
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 12px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;font-family: 'Montserrat',sans-serif;">
|
||||
Run your bar or restaurant methodical. </h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-6 col-xs-12" style=" margin-bottom: 10px; ">
|
||||
<div>
|
||||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank"> <img
|
||||
src="https://www.cybrosys.com/images/odoo-index-industry-4.png" alt="Odoo Industry"
|
||||
style=" border-radius: 100%;width:100%;"/> </a></div>
|
||||
</div>
|
||||
<div style="width:70%;float:left;">
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none;font-family: 'Montserrat',sans-serif;">
|
||||
POS</a></h3>
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 12px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;font-family: 'Montserrat',sans-serif;">
|
||||
Easy configuring and convivial selling. </h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-6 col-xs-12" style=" margin-bottom: 10px; ">
|
||||
<div>
|
||||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank"> <img
|
||||
src="https://www.cybrosys.com/images/odoo-index-industry-5.png" alt="Odoo Industry"
|
||||
style=" border-radius: 100%;width:100%;"/> </a></div>
|
||||
</div>
|
||||
<div style="width:70%;float:left;">
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 0px;margin-left: 16px;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none; font-family: 'Montserrat',sans-serif;">
|
||||
E-commerce & Website</a></h3>
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 12px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px; font-family: 'Montserrat',sans-serif;">
|
||||
Mobile friendly, awe-inspiring product pages. </h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-6 col-xs-12" style=" margin-bottom: 10px; ">
|
||||
<div>
|
||||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank">
|
||||
<img src="https://www.cybrosys.com/images/odoo-index-industry-6.png" alt="Odoo Industry"
|
||||
style=" border-radius: 100%;width:100%;"/> </a></div>
|
||||
</div>
|
||||
<div style="width:70%;float:left;">
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none; font-family: 'Montserrat',sans-serif;">
|
||||
Hotel Management</a></h3>
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 12px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px; font-family: 'Montserrat',sans-serif;">
|
||||
An all-inclusive hotel management application. </h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-6 col-xs-12" style=" margin-bottom: 10px; ">
|
||||
<div>
|
||||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank">
|
||||
<img src="https://www.cybrosys.com/images/odoo-index-industry-7.png" alt="Odoo Industry"
|
||||
style=" border-radius: 100%;width:100%;"/> </a></div>
|
||||
</div>
|
||||
<div style="width:70%;float:left;">
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none; font-family: 'Montserrat',sans-serif;">
|
||||
Education</a></h3>
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 12px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px; font-family: 'Montserrat',sans-serif;">
|
||||
A Collaborative platform for educational management. </h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-6 col-xs-12" style=" margin-bottom: 10px; ">
|
||||
<div>
|
||||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank"> <img
|
||||
src="https://www.cybrosys.com/images/odoo-index-industry-8.png" alt="Odoo Industry"
|
||||
style=" border-radius: 100%;width:100%;"/> </a></div>
|
||||
</div>
|
||||
<div style="width:70%;float:left;">
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
|
||||
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank"
|
||||
style="list-style: none; color:#000; text-decoration: none; font-family: 'Montserrat',sans-serif;">
|
||||
Service Management</a></h3>
|
||||
<h3 class="oe_slogan"
|
||||
style=" text-align: left;font-size: 12px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px; font-family: 'Montserrat',sans-serif;">
|
||||
Keep track of services and invoice accordingly. </h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="oe_container" style="padding: 0% 0% 6% 0%;">
|
||||
<center>
|
||||
<div class="col-md-12" style="margin: auto !important;
|
||||
width: 70%;
|
||||
padding: 30px;">
|
||||
<h2 style="font-weight: 600;text-align: center;width: 100%;">Need Any Help?</h2>
|
||||
<hr style="margin-top: 0px;margin-bottom: 2%;border: 0;text-align: center;border-top: 3px solid #d21c22;width: 5%;">
|
||||
<h4 style="font-size:16px;"> If you have anything to share with us based on your use of this module, please
|
||||
let us know. We are ready to offer our support.
|
||||
</h4>
|
||||
<div class="col-md-6" style="float:left; padding:20px;">
|
||||
<h4><i class="fa fa-envelope"></i>Email us </h4>
|
||||
<p>odoo@cybrosys.com / info@cybrosys.com</p>
|
||||
</div>
|
||||
<div class="col-md-6" style="float:left; padding:20px;">
|
||||
<h4><i class="fa fa-phone"></i> Contact Us </h4>
|
||||
<a href="https://www.cybrosys.com/contact/" target="_blank"> www.cybrosys.com</a>
|
||||
</div>
|
||||
</div>
|
||||
Suggested Products
|
||||
</center>
|
||||
</section>
|
||||
<section class="oe_container" style="padding: 0% 0% 6% 0%;">
|
||||
<div class="oe_slogan" style="margin-bottom: 0px;">
|
||||
<div style=" display: flex; justify-content: center; flex-wrap: wrap; ">
|
||||
</div>
|
||||
<br>
|
||||
<img src="https://www.cybrosys.com/images/logo.png" style="width: 190px; margin-bottom: 25px;margin-top: 30px;"
|
||||
class="center-block">
|
||||
<div style=" display: flex; justify-content: center; flex-wrap: wrap; "><a href="https://twitter.com/cybrosys"
|
||||
target="_blank"><i
|
||||
class="fa fa-2x fa-twitter"
|
||||
style="color:white;background: #00a0d1;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a>
|
||||
</td>
|
||||
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i
|
||||
class="fa fa-2x fa-linkedin"
|
||||
style="color:white;background: #31a3d6;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a>
|
||||
</td>
|
||||
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook"
|
||||
style="color:white;background: #3b5998;width:35px; height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a>
|
||||
</td>
|
||||
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest"
|
||||
style="color:white;background: #ac0f18;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a>
|
||||
</td>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
7
hr_employee_shift/static/src/css/shift_dashboard.css
Normal file
@@ -0,0 +1,7 @@
|
||||
|
||||
.style_shift{
|
||||
color: black !important;
|
||||
font-size: 15px;
|
||||
text-align: center;
|
||||
padding: 10px 0px 2px 3px;
|
||||
}
|
||||
10
hr_employee_shift/static/src/less/shift_dashboard.less
Normal file
@@ -0,0 +1,10 @@
|
||||
@dashboard-bg-color: white;
|
||||
|
||||
.o_kanban_view.o_kanban_dashboard.o_shift_kanban {
|
||||
@sale-table-spacing: 20px;
|
||||
|
||||
.oe_kanban_content{
|
||||
padding-top: 50px!important;
|
||||
}
|
||||
|
||||
}
|
||||
29
hr_employee_shift/views/hr_employee_contract_view.xml
Normal file
@@ -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='resource_calendar_id']" position="replace">
|
||||
<field name="resource_calendar_id" 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>
|
||||
96
hr_employee_shift/views/hr_employee_shift_view.xml
Normal file
@@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<record id="employee_form_inherited" model="ir.ui.view">
|
||||
<field name="name">hr.employee.resource</field>
|
||||
<field name="model">hr.employee</field>
|
||||
<field name="inherit_id" ref="hr.view_employee_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//page[@name='public']//field[@name='resource_calendar_id']" position="replace">
|
||||
<field name="resource_calendar_ids"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<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" style="height:30px;width:200px">
|
||||
<group>
|
||||
<field name="hr_department" style="height:30px;width:200px;font-size:16px;" />
|
||||
<field name="sequence" style="height:30px;width:200px;font-size:20px;"/>
|
||||
</group>
|
||||
<field name="color" invisible="1"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='attendance_ids']" position="replace">
|
||||
<field name="attendance_ids"/>
|
||||
</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"><span style="margin-left:25px;"><strong><field name="name"/></strong></span></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_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="menu_shift"
|
||||
groups="hr.group_hr_manager"
|
||||
web_icon="hr_employee_shift,static/description/shift_icon.png"/>
|
||||
<menuitem name="Configuration" id="shift_configuration" parent="hr_employee_shift.menu_shift"/>
|
||||
<menuitem name="Shifts" id="menu_conf_shift" parent="shift_configuration"
|
||||
action="resource.action_resource_calendar_form"/>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
54
hr_employee_shift/views/hr_generate_shift_view.xml
Normal file
@@ -0,0 +1,54 @@
|
||||
<?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="Shift" id="menu_shift_schedule_generate_id_menu" parent="menu_shift" 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>
|
||||
9
hr_employee_shift/views/templates.xml
Normal file
@@ -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>
|
||||