| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/stock-logistics-workflow |
| GIT | |
| GIT | https://github.com/OCA/stock-logistics-workflow.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/stock-logistics-workflow/tree/18.0/stock_dynamic_routing |
| VERSION | |
| VERSION | 1.3.0 |
| CATEGORY | |
| CATEGORY | Warehouse Management |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Camptocamp, BCIM |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Camptocamp, BCIM |
| COMMITTERS | |
| COMMITTERS | Jacques-Etienne Baudoux, Sébastien Alix, Ruchir Shukla, Weblate, OCA-git-bot, Iván Todorovich, oca-ci |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/stock-logistics-workflow |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:30:15 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - stock - product - base - base_setup - web - bus - web_tour - html_editor - uom - barcodes_gs1_nomenclature - barcodes - digest - portal - web_editor - http_routing - auth_signup - resource |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Standard Stock Routes explain the steps you want to produce whereas the “Dynamic Routing” defines how operations are grouped according to their final source and destination location. This allows for example: - To parallelize transfers in two locations of a warehouse, splitting them in two different operation type - To define pre-picking (wave) in some sub-locations, then roundtrip picking of the sub-location waves Context for the use cases: In the warehouse, you have a High-Bay which requires to place goods in a handover when you move goods in or out of it. The High-Bay contains many sub-locations. A product can be stored either in the High-Bay, either in the Shelving zone. When picking: When there is enough stock in the Shelving, you expect the moves to have the usual Pick(Highbay)-Pack-Ship steps. If the good is picked from the High-Bay, you will need an extra operation: Pick(Highbay)-Handover-Pack-Ship. This is what this feature is doing: on the High-Bay location, you define a "routing rule". A routing rule selects a different operation type for the move. The extra transfer will have the selected operation type, and be added dynamically, on reservation, before the chain of moves. When putting away: A put-away rule targets the High-Bay location. An operation Input-Highbay is created. You expect Input-Handover-Highbay. You can configure a dynamic routing for the put-away on the High-Bay Location. The operation type of the new Handover move will the one of the matching routing rule, and its destination will be the destination of the operation type. **Notes about Odoo 18.0+** Compared to new Odoo dynamic push rules, here all steps are planned in advance. The move to the final destination always exists and the put-away has already been executed so that the final bin is already known. The intermediate step before reaching this final destination will also have it's put-away computed. As each step is planned in advance, you can also properly respect the operation shipping policy. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_stock_routing_form |
stock.routing.form | stock.routing | form | New |
view_stock_routing_search |
stock.routing.search | stock.routing | search | New |
view_stock_routing_tree |
stock.routing | stock.routing | list | New |
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (1)write(self, values)
No new fields.
Public methods (0)No public methods.
canceled_by_routing
Boolean
default=False
help='Technical field. Indicates the transfer is canceled because it was left empty after a dynamic routing.'
No public methods.
active
Boolean
default=True
location_id
Many2one → stock.location
comodel_name='stock.location'
index=True
ondelete='cascade'
required=True
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Apply this routing only if the operation type of the move is the same.'
required=True
string='Operation Type'
routing_message
Html
compute='_compute_routing_message'
rule_ids
One2many → stock.routing.rule
comodel_name='stock.routing.rule'
inverse_name='routing_id'
string='Routing Rules'
sequence
Integer
default=<expr>
No public methods.
location_dest_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_dest_id'
location_src_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_src_id'
method
Selection
help='On pull, the routing is applied when the source location of a move line matches the source location of the rule. On push, the routing is applied when the destination location of a move line matches the destination location of the rule.'
selection=[('pull', 'Pull'), ('push', 'Push')]
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Operation type that will be applied on the move.'
required=True
routing_id
Many2one → stock.routing
comodel_name='stock.routing'
ondelete='cascade'
required=True
routing_location_id
Many2one
index=True
related='routing_id.location_id'
store=True
routing_picking_type_id
Many2one
help='Routing applied only on moves of this operation type.'
index=True
related='routing_id.picking_type_id'
store=True
rule_domain
Char
default=[]
help='Domain based on Stock Moves, to define if the routing rule is applicable or not.'
string='Source Routing Domain'
sequence
Integer
default=<expr>
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/wms |
| GIT | |
| GIT | https://github.com/OCA/wms.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/wms/tree/16.0/stock_dynamic_routing |
| VERSION | |
| VERSION | 1.0.4 |
| CATEGORY | |
| CATEGORY | Warehouse Management |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Camptocamp |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Camptocamp |
| COMMITTERS | |
| COMMITTERS | Laurent Mignon (ACSONE), Denis Roussel, sbejaoui, Sébastien Alix, Weblate, OCA-git-bot, oca-ci |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/wms |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:53:59 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/stock-logistics-warehouse: - stock_helper odoo/odoo: - stock - product - base - base_setup - web - bus - web_tour - uom - barcodes_gs1_nomenclature - barcodes - digest - portal - web_editor - http_routing - auth_signup - resource |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_stock_routing_form |
stock.routing.form | stock.routing | form | New |
view_stock_routing_search |
stock.routing.search | stock.routing | search | New |
view_stock_routing_tree |
stock.routing | stock.routing | tree | New |
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (1)write(self, values)
canceled_by_routing
Boolean
default=False
help='Technical field. Indicates the transfer is canceled because it was left empty after a dynamic routing.'
No public methods.
active
Boolean
default=True
location_id
Many2one → stock.location
comodel_name='stock.location'
index=True
ondelete='cascade'
required=True
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Apply this routing only if the operation type of the move is the same.'
required=True
string='Operation Type'
routing_message
Html
compute='_compute_routing_message'
rule_ids
One2many → stock.routing.rule
comodel_name='stock.routing.rule'
inverse_name='routing_id'
string='Routing Rules'
sequence
Integer
default=<expr>
No public methods.
location_dest_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_dest_id'
location_src_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_src_id'
method
Selection
help='On pull, the routing is applied when the source location of a move line matches the source location of the rule. On push, the routing is applied when the destination location of a move line matches the destination location of the rule.'
selection=[('pull', 'Pull'), ('push', 'Push')]
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Operation type that will be applied on the move.'
required=True
routing_id
Many2one → stock.routing
comodel_name='stock.routing'
ondelete='cascade'
required=True
routing_location_id
Many2one
index=True
related='routing_id.location_id'
store=True
routing_picking_type_id
Many2one
help='Routing applied only on moves of this operation type.'
index=True
related='routing_id.picking_type_id'
store=True
rule_domain
Char
default=[]
help='Domain based on Stock Moves, to define if the routing rule is applicable or not.'
string='Source Routing Domain'
sequence
Integer
default=<expr>
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/wms |
| GIT | |
| GIT | https://github.com/OCA/wms.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/wms/tree/14.0/stock_dynamic_routing |
| VERSION | |
| VERSION | 1.1.2 |
| CATEGORY | |
| CATEGORY | Warehouse Management |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Camptocamp, BCIM |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Camptocamp, BCIM |
| COMMITTERS | |
| COMMITTERS | Jacques-Etienne Baudoux, OCA Transbot, Sébastien Alix, Thierry Ducrest, Sébastien BEAU, oca-travis, Weblate, OCA-git-bot, Michael Tietz, oca-ci |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/wms |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:41:12 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/stock-logistics-warehouse: - stock_helper odoo/odoo: - stock - product - base - base_setup - web - bus - web_tour - uom - barcodes - digest - portal - web_editor - http_routing - auth_signup - resource |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_stock_routing_form |
stock.routing.form | stock.routing | form | New |
view_stock_routing_search |
stock.routing.search | stock.routing | search | New |
view_stock_routing_tree |
stock.routing | stock.routing | tree | New |
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (1)write(self, values)
canceled_by_routing
Boolean
default=False
help='Technical field. Indicates the transfer is canceled because it was left empty after a dynamic routing.'
No public methods.
active
Boolean
default=True
location_id
Many2one → stock.location
comodel_name='stock.location'
index=True
ondelete='cascade'
required=True
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Apply this routing only if the operation type of the move is the same.'
required=True
string='Operation Type'
routing_message
Html
compute='_compute_routing_message'
rule_ids
One2many → stock.routing.rule
comodel_name='stock.routing.rule'
inverse_name='routing_id'
sequence
Integer
default=<expr>
No public methods.
location_dest_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_dest_id'
location_src_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_src_id'
method
Selection
help='On pull, the routing is applied when the source location of a move line matches the source location of the rule. On push, the routing is applied when the destination location of a move line matches the destination location of the rule.'
selection=[('pull', 'Pull'), ('push', 'Push')]
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Operation type that will be applied on the move.'
required=True
routing_id
Many2one → stock.routing
comodel_name='stock.routing'
ondelete='cascade'
required=True
routing_location_id
Many2one
index=True
related='routing_id.location_id'
store=True
routing_picking_type_id
Many2one
help='Routing applied only on moves of this operation type.'
index=True
related='routing_id.picking_type_id'
store=True
rule_domain
Char
default=[]
help='Domain based on Stock Moves, to define if the routing rule is applicable or not.'
string='Source Routing Domain'
sequence
Integer
default=<expr>
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/wms |
| GIT | |
| GIT | https://github.com/OCA/wms.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/wms/tree/13.0/stock_dynamic_routing |
| VERSION | |
| VERSION | 1.1.1 |
| CATEGORY | |
| CATEGORY | Warehouse Management |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Camptocamp |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Camptocamp |
| COMMITTERS | |
| COMMITTERS | Guewen Baconnier, Jacques-Etienne Baudoux, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Simone Orsi |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/wms |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:34:20 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/stock-logistics-warehouse: - stock_helper odoo/odoo: - stock - product - base - base_setup - web - bus - web_tour - uom - barcodes |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_stock_routing_form |
stock.routing.form | stock.routing | form | New |
view_stock_routing_search |
stock.routing.search | stock.routing | search | New |
view_stock_routing_tree |
stock.routing | stock.routing | tree | New |
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (1)write(self, values)
canceled_by_routing
Boolean
default=False
help='Technical field. Indicates the transfer is canceled because it was left empty after a dynamic routing.'
No public methods.
active
Boolean
default=True
location_id
Many2one → stock.location
comodel_name='stock.location'
index=True
ondelete='cascade'
required=True
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Apply this routing only if the operation type of the move is the same.'
required=True
string='Operation Type'
routing_message
Html
compute='_compute_routing_message'
rule_ids
One2many → stock.routing.rule
comodel_name='stock.routing.rule'
inverse_name='routing_id'
sequence
Integer
default=<expr>
No public methods.
location_dest_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_dest_id'
location_src_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_src_id'
method
Selection
help='On pull, the routing is applied when the source location of a move line matches the source location of the rule. On push, the routing is applied when the destination location of a move line matches the destination location of the rule.'
selection=[('pull', 'Pull'), ('push', 'Push')]
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Operation type that will be applied on the move.'
required=True
routing_id
Many2one → stock.routing
comodel_name='stock.routing'
ondelete='cascade'
required=True
routing_location_id
Many2one
index=True
related='routing_id.location_id'
store=True
routing_picking_type_id
Many2one
help='Routing applied only on moves of this operation type.'
index=True
related='routing_id.picking_type_id'
store=True
rule_domain
Char
default=[]
help='Domain based on Stock Moves, to define if the routing rule is applicable or not.'
string='Source Routing Domain'
sequence
Integer
default=<expr>
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/wms |
| GIT | |
| GIT | https://github.com/OCA/wms.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/wms/tree/10.0/stock_dynamic_routing |
| VERSION | |
| VERSION | 1.0.1 |
| CATEGORY | |
| CATEGORY | Warehouse Management |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Camptocamp |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Camptocamp |
| COMMITTERS | |
| COMMITTERS | Guewen Baconnier, Laurent Mignon (ACSONE), oca-travis, OCA-git-bot |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/wms |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:20:03 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - stock - product - base - decimal_precision - base_setup - web_kanban - web - bus - web_tour - report - procurement - barcodes - web_planner |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_stock_routing_form |
stock.routing.form | stock.routing | form | New |
view_stock_routing_search |
stock.routing.search | stock.routing | search | New |
view_stock_routing_tree |
stock.routing | stock.routing | tree | New |
No new fields.
Public methods (1)is_sublocation_of(self, others)
No new fields.
Public methods (1)write(self, values)
canceled_by_routing
Boolean
default=False
help='Technical field. Indicates the transfer is canceled because it was left empty after a dynamic routing.'
No public methods.
active
Boolean
default=True
location_id
Many2one → stock.location
comodel_name='stock.location'
index=True
ondelete='cascade'
required=True
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Apply this routing only if the operation type of the move is the same.'
required=True
string='Operation Type'
routing_message
Html
compute='_compute_routing_message'
rule_ids
One2many → stock.routing.rule
comodel_name='stock.routing.rule'
inverse_name='routing_id'
sequence
Integer
default=<expr>
No public methods.
location_dest_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_dest_id'
location_src_id
Many2one → stock.location
comodel_name='stock.location'
compute='_compute_location_src_id'
method
Selection
help='On pull, the routing is applied when the source location of a move line matches the source location of the rule. On push, the routing is applied when the destination location of a move line matches the destination location of the rule.'
selection=[('pull', 'Pull'), ('push', 'Push')]
picking_type_id
Many2one → stock.picking.type
comodel_name='stock.picking.type'
help='Operation type that will be applied on the move.'
required=True
routing_id
Many2one → stock.routing
comodel_name='stock.routing'
ondelete='cascade'
required=True
routing_location_id
Many2one
index=True
related='routing_id.location_id'
store=True
routing_picking_type_id
Many2one
help='Routing applied only on moves of this operation type.'
index=True
related='routing_id.picking_type_id'
store=True
rule_domain
Char
default=[]
help='Domain based on Stock Moves, to define if the routing rule is applicable or not.'
string='Source Routing Domain'
sequence
Integer
default=<expr>
No public methods.