TIP: You can type at any time to perform a new search.
Route Planning
route_planning · OCA/route-planning
- Repository
- OCA/route-planning · module folder · Try on Runboat
- Module version
- 1.0.0
- Category
- Uncategorized
- Folder size
- 0.28 MB
- License
- AGPL-3
- Application
- No
- Auto-installable
- No
- Website
- https://github.com/OCA/route-planning
- Last tracking update
- 2026-08-07 08:42:56
- Authors
- Odoo Community Association (OCA), Tecnativa
- Maintainers
- Odoo Community Association (OCA), Tecnativa
- Committers
- Carlos Lopez, Weblate, OCA-git-bot, oca-ci
- Odoo dependencies
- Python dependencies
- ortools
- System dependencies
- None
- Required by
- route_planning_stock
- Description
This module allows to manage delivery routes, checkpoints, and visit windows. Before using this module, you must configure the required master data: **Route Areas**, **Checkpoints**, and **Routes**. Without this data, the route planning functionality will not be operational. ## Models ### Route Area Defines a geographic or logical zone used to group routes. Each area helps organize delivery operations by region or territory. ### Checkpoint Represents a specific stop or delivery point within a route. Checkpoints define the locations that must be visited, along with any time window constraints for the visit. ### Route A route is an ordered sequence of checkpoints assigned to a specific area. It defines the order in which checkpoints must be visited, making it possible to optimize daily or weekly operations for any kind of service or delivery workflow. ### Visit Windows A visit window defines the time interval during which a checkpoint must be reached. Windows are configured on the **contact (partner)**, where one or more slots can be defined specifying the earliest arrival time (*time from*) and the latest allowed arrival time (*time to*). This allows the same availability constraints to be reused across different routes and checkpoints.
Code Analysis ⓘ
Views touched (23)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
route_checkpoint_view_calendar |
route.checkpoint.view.calendar | route.checkpoint | calendar | New |
route_checkpoint_view_kanban |
route.checkpoint.view.kanban | route.checkpoint | kanban | New |
route_route_view_calendar |
route.route.view.calendar | route.route | calendar | New |
route_route_view_kanban |
route.route.view.kanban | route.route | kanban | New |
view_partner_form_route |
res.partner.form.route | res.partner | form | Inherits base.view_partner_form |
view_partner_geolocalize_form |
res.partner.form | res.partner | form | Inherits base_geolocalize.view_crm_partner_geo_form |
view_route_area_form |
route.area.form | route.area | form | New |
view_route_area_list |
route.area.list | route.area | list | New |
view_route_area_search |
route.area.search | route.area | search | New |
view_route_checkpoint_form |
route.checkpoint.form | route.checkpoint | form | New |
view_route_checkpoint_list |
route.checkpoint.list | route.checkpoint | list | New |
view_route_checkpoint_map |
route.checkpoint | New | ||
view_route_checkpoint_search |
route.checkpoint.search | route.checkpoint | search | New |
view_route_create_incident_form |
route.create.incident.form | route.create.incident | form | New |
view_route_incident_type_form |
route.incident.type.form | route.incident.type | form | New |
view_route_incident_type_list |
route.incident.type.list | route.incident.type | list | New |
view_route_incident_type_search |
route.incident.type.search | route.incident.type | search | New |
view_route_route_form |
route.route.form | route.route | form | New |
view_route_route_list |
route.route.list | route.route | list | New |
view_route_route_search |
route.route.search | route.route | search | New |
view_route_visitwindow_template_form |
route.visitwindow.template.form | route.visitwindow.template | form | New |
view_route_visitwindow_template_list |
route.visitwindow.template.list | route.visitwindow.template | list | New |
view_route_visitwindow_template_search |
route.visitwindow.template.search | route.visitwindow.template | search | New |
HTTP endpoints (0)
No HTTP endpoints found for this module.
Models touched (11)
New fields (3)
-
route_area_idMany2one → route.areacompany_dependent=Truecompute='_compute_route_area_id'readonly=Falsestore=True args: 'route.area' -
route_visitwindow_idsOne2many → route.partner.visitwindowargs: 'route.partner.visitwindow', 'partner_id' -
route_visitwindow_template_idMany2one → route.visitwindow.templatehelp='Template to pre-fill visit windows for this partner, this field will be cleared after applying the template.'string='Visit Window Template' args: 'route.visitwindow.template'
No public methods.
New fields (11)
-
activeBooleandefault=True -
auto_assignBooleanhelp='Automatically assign this area to partners matching its criteria, based on country, state, and zip code range.' -
codeCharrequired=True -
company_idMany2one → res.companydefault=<expr>required=True args: 'res.company' -
country_idsMany2many → res.countrycomodel_name='res.country' -
nameCharrequired=True -
state_idsMany2many → res.country.statecomodel_name='res.country.state'domain="[('country_id', 'in', country_ids)]" -
time_startFloat -
user_idMany2one → res.usersargs: 'res.users' -
waiting_timeFloathelp='Average waiting time at each stop, expressed in minutes.' -
zip_idsOne2many → route.area.zipstring='Zip ranges' args: 'route.area.zip', 'route_area_id'
No public methods.
New fields (3)
-
route_area_idMany2one → route.areacomodel_name='route.area'ondelete='cascade'required=True -
zip_fromCharrequired=True -
zip_toCharrequired=True
No public methods.
New fields (18)
-
checkpoint_idsOne2many → route.checkpointstring='Checkpoints' args: 'route.checkpoint', 'origin_checkpoint_id' -
company_idMany2one → res.companyrelated='route_id.company_id'store=True args: 'res.company' -
date_doneDatetimecopy=Falsereadonly=True -
date_localizationDaterelated='partner_id.date_localization' -
display_addressCharcompute='_compute_display_address' -
incident_type_idMany2one → route.incident.typecopy=Falseondelete='restrict'readonly=Truetracking=True args: 'route.incident.type' -
latitudeFloatcompute='_compute_latitude'digits=(10, 7)readonly=Falsestore=True -
longitudeFloatcompute='_compute_longitude'digits=(10, 7)readonly=Falsestore=True -
noteText -
origin_checkpoint_idMany2one → route.checkpointcopy=Falsehelp='Original checkpoint when this is created from an incident'readonly=True args: 'route.checkpoint' -
partner_idMany2one → res.partnerondelete='restrict'tracking=True args: 'res.partner' -
route_idMany2one → route.routeondelete='cascade'required=Truetracking=True args: 'route.route' -
route_stateSelectionrelated='route_id.state'string='Route State' -
schedule_dateDaterelated='route_id.schedule_date'store=True -
schedule_timeFloatcopy=Falsetracking=True -
sequenceIntegercopy=Falsedefault=10tracking=True -
stateSelectiondefault='draft'tracking=True args: [('draft', 'Draft'), ('planned', 'Planned'), ('done', 'Done'), ('incident', 'Incident')] -
user_idMany2one → res.usersrelated='route_id.user_id'store=True args: 'res.users'
-
action_back_to_planned(self) -
action_done(self) -
action_draft(self) -
action_open_checkpoint(self) -
action_planned(self) -
action_view_origin_checkpoint(self) -
write(self, vals)
New fields (3)
-
checkpoint_idMany2one → route.checkpointstring='Checkpoint' args: 'route.checkpoint' -
incident_type_idMany2one → route.incident.typerequired=True args: 'route.incident.type' -
noteText
-
action_create_incident(self) -
default_get(self, fields_list)
New fields (4)
-
activeBooleandefault=True -
company_idMany2one → res.companyargs: 'res.company' -
nameCharrequired=Truetranslate=True -
rescheduledBooleandefault=Falsehelp='If checked, checkpoints with this incident type will be rescheduled'
No public methods.
New fields (1)
-
partner_idMany2one → res.partnerhelp='Partner for this visit window'ondelete='cascade'required=Truestring='Partner' args: 'res.partner'
No public methods.
New fields (10)
-
checkpoint_idsOne2many → route.checkpointargs: 'route.checkpoint', 'route_id' -
company_idMany2one → res.companydefault=<expr>required=Truetracking=True args: 'res.company' -
nameCharcopy=Falsedefault=<expr>readonly=Truerequired=True -
route_area_idMany2one → route.areaondelete='restrict'required=Truetracking=True args: 'route.area' -
schedule_dateDatedefault=fields.Date.context_todayrequired=Truetracking=True -
start_location_idMany2one → res.partnercomodel_name='res.partner'default=<expr>tracking=True -
stateSelectioncompute='_compute_state'store=Truetracking=True args: [('draft', 'Draft'), ('planned', 'Planned'), ('in_progress', 'In Progress'), ('done', 'Done')] -
time_startFloatcompute='_compute_time_start'precompute=Truereadonly=Falsestore=Truetracking=True -
user_idMany2one → res.userscompute='_compute_user_id'precompute=Truereadonly=Falsestore=Truetracking=True args: 'res.users' -
waiting_timeFloatcompute='_compute_waiting_time'help='Average waiting time at each stop, expressed in minutes.'precompute=Truereadonly=Falsestore=Truetracking=True
-
action_draft(self) -
action_open_google_maps(self) -
action_planned(self) -
action_view_map(self) -
create(self, vals_list)@api.model_create_multiOverride to set sequence and add user as follower -
message_subscribe(self, partner_ids=None, subtype_ids=None) -
write(self, vals)
New fields (3)
-
day_of_weekSelectionrequired=True args: [('0', 'Monday'), ('1', 'Tuesday'), ('2', 'Wednesday'), ('3', 'Thursday'), ('4', 'Friday'), ('5', 'Saturday'), ('6', 'Sunday')] -
time_fromFloathelp='Start time of the visit window' -
time_toFloatdefault=24.0help='End time of the visit window'
No public methods.
New fields (3)
-
activeBooleandefault=True -
line_idsOne2many → route.visitwindow.template.linecomodel_name='route.visitwindow.template.line'copy=Trueinverse_name='template_id' -
nameCharrequired=True
No public methods.
New fields (1)
-
template_idMany2one → route.visitwindow.templatecomodel_name='route.visitwindow.template'ondelete='cascade'required=True
No public methods.