| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/shift-planning |
| GIT | |
| GIT | https://github.com/OCA/shift-planning.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/shift-planning/tree/18.0/hr_shift |
| VERSION | |
| VERSION | 1.1.0 |
| CATEGORY | |
| CATEGORY | Human Resources/Shifts |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA) |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA) |
| COMMITTERS | |
| COMMITTERS | Pedro M. Baeza, Víctor Martínez, Mathieu Benoit, OCA-git-bot, Abraham Anes, oca-ci, FernandoRomera, David Bañón |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/shift-planning |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:30:20 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - hr - base_setup - base - web - digest - bus - web_tour - html_editor - portal - web_editor - http_routing - auth_signup - resource - phone_validation - resource_mail - base_sparse_field |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Shifts to employees with variable work schedules. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
hr_employee_form |
hr.employee | field | Inherits hr.view_employee_form | |
res_config_settings_view_form |
res.config.settings | xpath | Inherits hr.res_config_settings_view_form | |
shift_planning_calendar |
hr.shift.planning | calendar | New | |
shift_planning_form |
hr.shift.planning | form | New | |
shift_planning_kanban |
hr.shift.planning | kanban | New | |
shift_planning_line_calendar |
hr.shift.planning.line | calendar | New | |
shift_planning_line_form |
hr.shift.planning.line | form | New | |
shift_planning_line_kanban |
hr.shift.planning.line | kanban | New | |
shift_planning_line_search |
hr.shift.planning.line | search | New | |
shift_planning_line_tree |
hr.shift.planning.line | list | New | |
shift_planning_shift_kanban |
hr.shift.planning.shift | kanban | New | |
shift_planning_shift_kanban_quick_create |
hr.shift.planning.shift.quick_create | hr.shift.planning.shift | form | New |
shift_planning_shift_search |
hr.shift.planning.shift | search | New | |
shift_planning_shift_tree |
hr.shift.planning.shift | list | New | |
shift_planning_tree |
hr.shift.planning | list | New | |
shift_planning_wizard_form |
shift.planning.wizard | form | New | |
shift_template_form |
hr.shift.template | form | New | |
shift_template_search |
hr.shift.template | search | New | |
shift_template_tree |
hr.shift.template | list | New |
current_shift_id
Many2one → hr.shift.planning.line
comodel_name='hr.shift.planning.line'
compute='_compute_current_shift_id'
shift_planning
Boolean
group_expand='_group_expand_shift_planning'
help='Generate shifts for this employee in the shifts plannings'
No public methods.
days_data
Serialized
compute='_compute_days_data'
default={}
end_date
Date
compute='_compute_dates'
readonly=True
store=True
issued_shift_ids
One2many → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
compute='_compute_issued_shift_ids'
issued_shifts_count
Integer
compute='_compute_issued_shift_ids'
shift_ids
One2many → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
inverse_name='planning_id'
shifts_count
Integer
compute='_compute_shifts_count'
start_date
Date
compute='_compute_dates'
inverse='_inverse_start_date'
store=True
state
Selection
default='new'
selection=[('new', 'New'), ('assignment', 'Assignment'), ('planned', 'Planned')]
week_number
Integer
required=True
year
Integer
required=True
action_view_day_shifts(self)
action_view_issued_shifts(self)
action_view_shifts(self)
copy_to_planning(self)
default_get(self, fields_list)
generate_shifts(self)
regenerate_shifts(self)
color
Integer
related='template_id.color'
day_number
Selection
selection=WEEK_DAYS_SELECTION
string='Day'
duration_days
Float
compute='_compute_duration'
store=True
string='Duration (Days)'
duration_hours
Float
compute='_compute_duration'
store=True
string='Duration (Hours)'
employee_id
Many2one
related='shift_id.employee_id'
store=True
end_hour
Float
related='template_id.end_time'
string='End hour'
end_time
Datetime
compute='_compute_shift_time'
store=True
planning_id
Many2one
related='shift_id.planning_id'
resource_id
Many2one
related='employee_id.resource_id'
store=True
reviewed
Boolean
help="For unavailable shifts that we don't want to be listed as issued"
shift_id
Many2one → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
ondelete='cascade'
start_date
Date
compute='_compute_start_date'
string='Date'
start_hour
Float
related='template_id.start_time'
string='Start hour'
start_time
Datetime
compute='_compute_shift_time'
store=True
state
Selection
compute='_compute_state'
readonly=False
selection=[('assigned', 'Assigned'), ('on_leave', 'On leave'), ('unassigned', 'Unassigned'), ('holiday', 'Holiday')]
store=True
template_id
Many2one → hr.shift.template
comodel_name='hr.shift.template'
compute='_compute_template_id'
group_expand='_group_expand_template_id'
readonly=False
store=True
action_unassign_shift(self)
color
Integer
related='template_id.color'
employee_id
Many2one → hr.employee
comodel_name='hr.employee'
ondelete='cascade'
image_128
Image
related='employee_id.image_128'
line_ids
One2many → hr.shift.planning.line
comodel_name='hr.shift.planning.line'
inverse_name='shift_id'
lines_data
Serialized
compute='_compute_lines_data'
default={}
planning_id
Many2one → hr.shift.planning
comodel_name='hr.shift.planning'
ondelete='cascade'
reviewed
Boolean
compute='_compute_reviewed'
help="For unavailable shifts that we don't want to be listed as issued"
inverse='_inverse_reviewed'
readonly=False
state
Selection
selection=[('available', 'Fully available'), ('partial', 'Partially available'), ('unavailable', 'Unavailable')]
template_id
Many2one → hr.shift.template
comodel_name='hr.shift.template'
group_expand='_group_expand_template_id'
action_toggle_reviewed(self)
action_view_shift_details(self)
create(self, vals_list)
write(self, vals)
active
Boolean
default=True
color
Integer
day_of_week_end
Selection
selection=WEEK_DAYS_SELECTION
day_of_week_start
Selection
selection=WEEK_DAYS_SELECTION
end_time
Float
name
Char
start_time
Float
tz
Selection
default=<expr>
help='This field is used in order to define in which timezone the employees will work.'
required=True
string='Timezone'
args: _tz_get
create(self, vals_list)
shift_end_day
Selection
default='4'
selection=WEEK_DAYS_SELECTION
shift_start_day
Selection
default='0'
selection=WEEK_DAYS_SELECTION
No public methods.
shift_end_day
Selection
readonly=False
related='company_id.shift_end_day'
shift_start_day
Selection
readonly=False
related='company_id.shift_start_day'
No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (2)create(self, vals_list)
unlink(self)
copy_shift_details
Boolean
help='Copy shift planning details. For example, an employee that goes half the week in a shift and the other half in other'
from_planning_id
Many2one → hr.shift.planning
comodel_name='hr.shift.planning'
compute='_compute_from_planning_id'
readonly=False
required=True
store=True
generation_type
Selection
default='from_last'
required=True
selection=[('from_last', 'Copy from the last planning'), ('from_planning', 'Copy from another planning')]
week_number
Integer
help='Generate for this week number'
required=True
year
Integer
help='Generate for this year'
required=True
default_get(self, fields_list)
generate(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/shift-planning |
| GIT | |
| GIT | https://github.com/OCA/shift-planning.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/shift-planning/tree/17.0/hr_shift |
| VERSION | |
| VERSION | 1.1.0 |
| CATEGORY | |
| CATEGORY | Human Resources/Shifts |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA) |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA) |
| COMMITTERS | |
| COMMITTERS | Víctor Martínez, Weblate, OCA-git-bot, Abraham Anes, oca-ci, neitherkx |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/shift-planning |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:20:11 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - hr - base_setup - base - web - phone_validation - bus - web_tour - resource - base_sparse_field |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Shifts to employees with variable work schedules. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
hr_employee_form |
hr.employee | field | Inherits hr.view_employee_form | |
res_config_settings_view_form |
res.config.settings | xpath | Inherits hr.res_config_settings_view_form | |
shift_planning_calendar |
hr.shift.planning | calendar | New | |
shift_planning_form |
hr.shift.planning | form | New | |
shift_planning_kanban |
hr.shift.planning | kanban | New | |
shift_planning_line_calendar |
hr.shift.planning.line | calendar | New | |
shift_planning_line_form |
hr.shift.planning.line | form | New | |
shift_planning_line_kanban |
hr.shift.planning.line | kanban | New | |
shift_planning_line_search |
hr.shift.planning.line | search | New | |
shift_planning_line_tree |
hr.shift.planning.line | tree | New | |
shift_planning_shift_kanban |
hr.shift.planning.shift | kanban | New | |
shift_planning_shift_search |
hr.shift.planning.shift | search | New | |
shift_planning_shift_tree |
hr.shift.planning.shift | tree | New | |
shift_planning_tree |
hr.shift.planning | tree | New | |
shift_planning_wizard_form |
shift.planning.wizard | form | New | |
shift_template_form |
hr.shift.template | form | New | |
shift_template_search |
hr.shift.template | search | New | |
shift_template_tree |
hr.shift.template | tree | New |
current_shift_id
Many2one → hr.shift.planning.line
comodel_name='hr.shift.planning.line'
compute='_compute_current_shift_id'
shift_planning
Boolean
group_expand='_group_expand_shift_planning'
help='Generate shifts for this employee in the shifts plannings'
No public methods.
days_data
Serialized
compute='_compute_days_data'
default={}
end_date
Date
compute='_compute_dates'
readonly=True
store=True
issued_shift_ids
One2many → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
compute='_compute_issued_shift_ids'
issued_shifts_count
Integer
compute='_compute_issued_shift_ids'
shift_ids
One2many → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
inverse_name='planning_id'
shifts_count
Integer
compute='_compute_shifts_count'
start_date
Date
compute='_compute_dates'
inverse='_inverse_start_date'
store=True
state
Selection
default='new'
selection=[('new', 'New'), ('assignment', 'Assignment'), ('planned', 'Planned')]
week_number
Integer
required=True
year
Integer
required=True
action_view_day_shifts(self)
action_view_issued_shifts(self)
action_view_shifts(self)
copy_to_planning(self)
default_get(self, fields_list)
generate_shifts(self)
regenerate_shifts(self)
color
Integer
related='template_id.color'
day_number
Selection
selection=WEEK_DAYS_SELECTION
string='Day'
duration_days
Float
compute='_compute_duration'
store=True
string='Duration (Days)'
duration_hours
Float
compute='_compute_duration'
store=True
string='Duration (Hours)'
employee_id
Many2one
related='shift_id.employee_id'
store=True
end_hour
Float
related='template_id.end_time'
string='End hour'
end_time
Datetime
compute='_compute_shift_time'
store=True
planning_id
Many2one
related='shift_id.planning_id'
resource_id
Many2one
related='employee_id.resource_id'
store=True
reviewed
Boolean
help="For unavailable shifts that we don't want to be listed as issued"
shift_id
Many2one → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
ondelete='cascade'
start_date
Date
compute='_compute_start_date'
string='Date'
start_hour
Float
related='template_id.start_time'
string='Start hour'
start_time
Datetime
compute='_compute_shift_time'
store=True
state
Selection
compute='_compute_state'
readonly=False
selection=[('assigned', 'Assigned'), ('on_leave', 'On leave'), ('unassigned', 'Unassigned'), ('holiday', 'Holiday')]
store=True
template_id
Many2one → hr.shift.template
comodel_name='hr.shift.template'
compute='_compute_template_id'
group_expand='_group_expand_template_id'
readonly=False
store=True
action_unassign_shift(self)
color
Integer
related='template_id.color'
employee_id
Many2one → hr.employee
comodel_name='hr.employee'
ondelete='cascade'
image_128
Image
related='employee_id.image_128'
line_ids
One2many → hr.shift.planning.line
comodel_name='hr.shift.planning.line'
inverse_name='shift_id'
lines_data
Serialized
compute='_compute_lines_data'
default={}
planning_id
Many2one → hr.shift.planning
comodel_name='hr.shift.planning'
ondelete='cascade'
reviewed
Boolean
compute='_compute_reviewed'
help="For unavailable shifts that we don't want to be listed as issued"
inverse='_inverse_reviewed'
readonly=False
state
Selection
selection=[('available', 'Fully available'), ('partial', 'Partially available'), ('unavailable', 'Unavailable')]
template_id
Many2one → hr.shift.template
comodel_name='hr.shift.template'
group_expand='_group_expand_template_id'
action_toggle_reviewed(self)
action_view_shift_details(self)
write(self, vals)
active
Boolean
default=True
color
Integer
day_of_week_end
Selection
selection=WEEK_DAYS_SELECTION
day_of_week_start
Selection
selection=WEEK_DAYS_SELECTION
end_time
Float
name
Char
start_time
Float
tz
Selection
default=<expr>
help='This field is used in order to define in which timezone the employees will work.'
required=True
string='Timezone'
args: _tz_get
create(self, vals)
shift_end_day
Selection
default='4'
selection=WEEK_DAYS_SELECTION
shift_start_day
Selection
default='0'
selection=WEEK_DAYS_SELECTION
No public methods.
shift_end_day
Selection
readonly=False
related='company_id.shift_end_day'
shift_start_day
Selection
readonly=False
related='company_id.shift_start_day'
No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (2)create(self, vals_list)
unlink(self)
copy_shift_details
Boolean
help='Copy shift planning details. For example, an employee that goes half the week in a shift and the other half in other'
from_planning_id
Many2one → hr.shift.planning
comodel_name='hr.shift.planning'
compute='_compute_from_planning_id'
readonly=False
required=True
store=True
generation_type
Selection
default='from_last'
required=True
selection=[('from_last', 'Copy from the last planning'), ('from_planning', 'Copy from another planning')]
week_number
Integer
help='Generate for this week number'
required=True
year
Integer
help='Generate for this year'
required=True
default_get(self, fields_list)
generate(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/shift-planning |
| GIT | |
| GIT | https://github.com/OCA/shift-planning.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/shift-planning/tree/15.0/hr_shift |
| VERSION | |
| VERSION | 1.1.2 |
| CATEGORY | |
| CATEGORY | Human Resources/Shifts |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA) |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA) |
| COMMITTERS | |
| COMMITTERS | Pedro M. Baeza, Víctor Martínez, Weblate, OCA-git-bot, oca-ci |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/shift-planning |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:00:43 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - hr - base_setup - base - web - bus - web_tour - resource - base_sparse_field |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Shifts to employees with variable work schedules. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
hr_employee_form |
hr.employee | field | Inherits hr.view_employee_form | |
res_config_settings_view_form |
res.config.settings | xpath | Inherits hr.res_config_settings_view_form | |
shift_planning_calendar |
hr.shift.planning | calendar | New | |
shift_planning_form |
hr.shift.planning | form | New | |
shift_planning_kanban |
hr.shift.planning | kanban | New | |
shift_planning_line_calendar |
hr.shift.planning.line | calendar | New | |
shift_planning_line_form |
hr.shift.planning.line | form | New | |
shift_planning_line_kanban |
hr.shift.planning.line | kanban | New | |
shift_planning_line_search |
hr.shift.planning.line | search | New | |
shift_planning_line_tree |
hr.shift.planning.line | tree | New | |
shift_planning_shift_kanban |
hr.shift.planning.shift | kanban | New | |
shift_planning_shift_search |
hr.shift.planning.shift | search | New | |
shift_planning_shift_tree |
hr.shift.planning.shift | tree | New | |
shift_planning_tree |
hr.shift.planning | tree | New | |
shift_planning_wizard_form |
shift.planning.wizard | form | New | |
shift_template_form |
hr.shift.template | form | New | |
shift_template_tree |
hr.shift.template | tree | New |
current_shift_id
Many2one → hr.shift.planning.line
comodel_name='hr.shift.planning.line'
compute='_compute_current_shift_id'
shift_planning
Boolean
group_expand='_group_expand_shift_planning'
help='Generate shifts for this employee in the shifts plannings'
No public methods.
days_data
Serialized
compute='_compute_days_data'
default={}
end_date
Date
compute='_compute_dates'
readonly=True
store=True
issued_shift_ids
One2many → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
compute='_compute_issued_shift_ids'
issued_shifts_count
Integer
compute='_compute_issued_shift_ids'
shift_ids
One2many → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
inverse_name='planning_id'
shifts_count
Integer
compute='_compute_shifts_count'
start_date
Date
compute='_compute_dates'
inverse='_inverse_start_date'
store=True
state
Selection
default='new'
selection=[('new', 'New'), ('assignment', 'Assignment'), ('planned', 'Planned')]
week_number
Integer
required=True
year
Integer
required=True
action_view_day_shifts(self)
action_view_issued_shifts(self)
action_view_shifts(self)
copy_to_planning(self)
default_get(self, fields_list)
generate_shifts(self)
name_get(self)
regenerate_shifts(self)
color
Integer
related='template_id.color'
day_number
Selection
selection=WEEK_DAYS_SELECTION
string='Day'
employee_id
Many2one
related='shift_id.employee_id'
store=True
end_hour
Float
related='template_id.end_time'
string='End hour'
end_time
Datetime
compute='_compute_shift_time'
store=True
planning_id
Many2one
related='shift_id.planning_id'
resource_id
Many2one
related='employee_id.resource_id'
store=True
reviewed
Boolean
help="For unavailable shifts that we don't want to be listed as issued"
shift_id
Many2one → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
ondelete='cascade'
start_date
Date
compute='_compute_start_date'
string='Date'
start_hour
Float
related='template_id.start_time'
string='Start hour'
start_time
Datetime
compute='_compute_shift_time'
store=True
state
Selection
compute='_compute_state'
readonly=False
selection=[('assigned', 'Assigned'), ('on_leave', 'On leave'), ('unassigned', 'Unassigned'), ('holiday', 'Holiday')]
store=True
template_id
Many2one → hr.shift.template
comodel_name='hr.shift.template'
compute='_compute_template_id'
group_expand='_group_expand_template_id'
readonly=False
store=True
action_unassign_shift(self)
name_get(self)
color
Integer
related='template_id.color'
employee_id
Many2one → hr.employee
comodel_name='hr.employee'
ondelete='cascade'
image_128
Image
related='employee_id.image_128'
line_ids
One2many → hr.shift.planning.line
comodel_name='hr.shift.planning.line'
inverse_name='shift_id'
lines_data
Serialized
compute='_compute_lines_data'
default={}
planning_id
Many2one → hr.shift.planning
comodel_name='hr.shift.planning'
ondelete='cascade'
reviewed
Boolean
compute='_compute_reviewed'
help="For unavailable shifts that we don't want to be listed as issued"
inverse='_inverse_reviewed'
readonly=False
state
Selection
selection=[('available', 'Fully available'), ('partial', 'Partially available'), ('unavailable', 'Unavailable')]
template_id
Many2one → hr.shift.template
comodel_name='hr.shift.template'
group_expand='_group_expand_template_id'
action_toggle_reviewed(self)
action_view_shift_details(self)
write(self, vals)
color
Integer
day_of_week_end
Selection
selection=WEEK_DAYS_SELECTION
day_of_week_start
Selection
selection=WEEK_DAYS_SELECTION
end_time
Float
name
Char
start_time
Float
tz
Selection
default=<expr>
help='This field is used in order to define in which timezone the employees will work.'
required=True
string='Timezone'
args: _tz_get
No public methods.
shift_end_day
Selection
default='4'
selection=WEEK_DAYS_SELECTION
shift_start_day
Selection
default='0'
selection=WEEK_DAYS_SELECTION
No public methods.
shift_end_day
Selection
readonly=False
related='company_id.shift_end_day'
shift_start_day
Selection
readonly=False
related='company_id.shift_start_day'
No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (2)create(self, vals_list)
unlink(self)
copy_shift_details
Boolean
help='Copy shift planning details. For example, an employee that goes half the week in a shift and the other half in other'
from_planning_id
Many2one → hr.shift.planning
comodel_name='hr.shift.planning'
compute='_compute_from_planning_id'
readonly=False
required=True
store=True
generation_type
Selection
default='from_last'
required=True
selection=[('from_last', 'Copy from the last planning'), ('from_planning', 'Copy from another planning')]
week_number
Integer
help='Generate for this week number'
required=True
year
Integer
help='Generate for this year'
required=True
default_get(self, fields_list)
generate(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/shift-planning |
| GIT | |
| GIT | https://github.com/OCA/shift-planning.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/shift-planning/tree/14.0/hr_shift |
| VERSION | |
| VERSION | 1.0.0 |
| CATEGORY | |
| CATEGORY | Human Resources/Shifts |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA) |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA) |
| COMMITTERS | |
| COMMITTERS | Víctor Martínez, Weblate, OCA-git-bot, oca-ci |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/shift-planning |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 18:50:18 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - hr - base_setup - base - web - bus - web_tour - resource - base_sparse_field |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Shifts to employees with variable work schedules. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
assets_backend | ir.ui.view | qweb | Inherits web.assets_backend |
hr_employee_form |
hr.employee | field | Inherits hr.view_employee_form | |
res_config_settings_view_form |
res.config.settings | xpath | Inherits hr.res_config_settings_view_form | |
shift_planning_calendar |
hr.shift.planning | calendar | New | |
shift_planning_form |
hr.shift.planning | form | New | |
shift_planning_kanban |
hr.shift.planning | kanban | New | |
shift_planning_line_calendar |
hr.shift.planning.line | calendar | New | |
shift_planning_line_form |
hr.shift.planning.line | form | New | |
shift_planning_line_kanban |
hr.shift.planning.line | kanban | New | |
shift_planning_line_search |
hr.shift.planning.line | search | New | |
shift_planning_line_tree |
hr.shift.planning.line | tree | New | |
shift_planning_shift_kanban |
hr.shift.planning.shift | kanban | New | |
shift_planning_shift_search |
hr.shift.planning.shift | search | New | |
shift_planning_shift_tree |
hr.shift.planning.shift | tree | New | |
shift_planning_tree |
hr.shift.planning | tree | New | |
shift_planning_wizard_form |
shift.planning.wizard | form | New | |
shift_template_form |
hr.shift.template | form | New | |
shift_template_tree |
hr.shift.template | tree | New |
current_shift_id
Many2one → hr.shift.planning.line
comodel_name='hr.shift.planning.line'
compute='_compute_current_shift_id'
shift_planning
Boolean
group_expand='_group_expand_shift_planning'
help='Generate shifts for this employee in the shifts plannings'
No public methods.
days_data
Serialized
compute='_compute_days_data'
default={}
end_date
Date
compute='_compute_dates'
readonly=True
store=True
issued_shift_ids
One2many → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
compute='_compute_issued_shift_ids'
issued_shifts_count
Integer
compute='_compute_issued_shift_ids'
shift_ids
One2many → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
inverse_name='planning_id'
shifts_count
Integer
compute='_compute_shifts_count'
start_date
Date
compute='_compute_dates'
inverse='_inverse_start_date'
store=True
state
Selection
default='new'
selection=[('new', 'New'), ('assignment', 'Assignment'), ('planned', 'Planned')]
week_number
Integer
required=True
year
Integer
required=True
action_view_day_shifts(self)
action_view_issued_shifts(self)
action_view_shifts(self)
copy_to_planning(self)
default_get(self, fields_list)
generate_shifts(self)
name_get(self)
regenerate_shifts(self)
color
Integer
related='template_id.color'
day_number
Selection
selection=WEEK_DAYS_SELECTION
string='Day'
employee_id
Many2one
related='shift_id.employee_id'
end_hour
Float
related='template_id.end_time'
string='End hour'
end_time
Datetime
compute='_compute_shift_time'
store=True
planning_id
Many2one
related='shift_id.planning_id'
resource_id
Many2one
related='employee_id.resource_id'
store=True
reviewed
Boolean
help="For unavailable shifts that we don't want to be listed as issued"
shift_id
Many2one → hr.shift.planning.shift
comodel_name='hr.shift.planning.shift'
ondelete='cascade'
start_date
Date
compute='_compute_start_date'
string='Date'
start_hour
Float
related='template_id.start_time'
string='Start hour'
start_time
Datetime
compute='_compute_shift_time'
store=True
state
Selection
compute='_compute_state'
readonly=False
selection=[('assigned', 'Assigned'), ('on_leave', 'On leave'), ('unassigned', 'Unassigned'), ('holiday', 'Holiday')]
store=True
template_id
Many2one → hr.shift.template
comodel_name='hr.shift.template'
compute='_compute_template_id'
group_expand='_group_expand_template_id'
readonly=False
store=True
action_unassign_shift(self)
name_get(self)
color
Integer
related='template_id.color'
employee_id
Many2one → hr.employee
comodel_name='hr.employee'
ondelete='cascade'
image_128
Image
related='employee_id.image_128'
line_ids
One2many → hr.shift.planning.line
comodel_name='hr.shift.planning.line'
inverse_name='shift_id'
lines_data
Serialized
compute='_compute_lines_data'
default={}
planning_id
Many2one → hr.shift.planning
comodel_name='hr.shift.planning'
ondelete='cascade'
reviewed
Boolean
compute='_compute_reviewed'
help="For unavailable shifts that we don't want to be listed as issued"
inverse='_inverse_reviewed'
readonly=False
state
Selection
selection=[('available', 'Fully available'), ('partial', 'Partially available'), ('unavailable', 'Unavailable')]
template_id
Many2one → hr.shift.template
comodel_name='hr.shift.template'
group_expand='_group_expand_template_id'
action_toggle_reviewed(self)
action_view_shift_details(self)
write(self, vals)
color
Integer
day_of_week_end
Selection
selection=WEEK_DAYS_SELECTION
day_of_week_start
Selection
selection=WEEK_DAYS_SELECTION
end_time
Float
name
Char
start_time
Float
tz
Selection
default=<expr>
help='This field is used in order to define in which timezone the employees will work.'
required=True
string='Timezone'
args: _tz_get
No public methods.
shift_end_day
Selection
default='4'
selection=WEEK_DAYS_SELECTION
shift_start_day
Selection
default='0'
selection=WEEK_DAYS_SELECTION
No public methods.
shift_end_day
Selection
readonly=False
related='company_id.shift_end_day'
shift_start_day
Selection
readonly=False
related='company_id.shift_start_day'
No public methods.
No new fields.
Public methods (0)No public methods.
from_planning_id
Many2one → hr.shift.planning
comodel_name='hr.shift.planning'
compute='_compute_from_planning_id'
readonly=False
required=True
store=True
generation_type
Selection
default='from_last'
required=True
selection=[('from_last', 'Copy from the last planning'), ('from_planning', 'Copy from another planning')]
week_number
Integer
help='Generate for this week number'
required=True
year
Integer
help='Generate for this year'
required=True
default_get(self, fields_list)
generate(self)
| STATUS | |
|---|---|
| STATUS | Open migration PR - not merged yet for this version |
| REPOSITORY | |
| REPOSITORY | OCA/shift-planning |
| PULL REQUEST | |
| PULL REQUEST | 16.0 mig hr shift (#35) |