From 8f5bc31f90d15f74600c654d35924e70535d2e60 Mon Sep 17 00:00:00 2001 From: Felicious Date: Wed, 21 Aug 2024 01:58:42 +0000 Subject: [PATCH] [IMP] inventory: improve routes definitions closes odoo/documentation#11167 X-original-commit: 21cb6bb5cf31f2d801d18f557eb86b8b70dd0ef2 Signed-off-by: Samuel Lieber (sali) Signed-off-by: Felicia Kuan (feku) --- .../configure/packaging.rst | 2 + .../receipts_delivery_two_steps.rst | 2 + .../daily_operations/use_routes.rst | 106 +++++++++--------- .../daily_operations/use_routes/pull-rule.png | Bin 0 -> 7739 bytes .../daily_operations/use_routes/push-rule.png | Bin 0 -> 6046 bytes 5 files changed, 58 insertions(+), 52 deletions(-) create mode 100644 content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-rule.png create mode 100644 content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/push-rule.png diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst b/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst index 6f59145fc..fe60f904e 100644 --- a/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst +++ b/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst @@ -167,6 +167,8 @@ warehouse. Next, in the :guilabel:`Applicable on` section, tick the :guilabel:`P Route with "Packagings" selected, with "Products" and "Warehouses" not selected. +.. _inventory/product_management/route-on-packaging: + Apply route on packaging ------------------------ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.rst b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.rst index 90665f302..79abca48e 100644 --- a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.rst +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.rst @@ -143,6 +143,8 @@ deliveries or manufacturing orders. :align: center :alt: Internal transfer form for products ordered from vendor. +.. _inventory/shipping_receiving/two-step-delivery: + Process delivery order in two steps (pick + ship) ================================================= diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.rst b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.rst index 4b4704204..e44dae4bc 100644 --- a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.rst +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.rst @@ -1,19 +1,21 @@ -.. _use-routes: - ========================== Routes and push/pull rules ========================== -In inventory management, the supply chain strategy determines when products should be -purchased/manufactured, delivered to distribution centers, and made available to the retail -channel. +*Routes* in Odoo control the movement of products between different locations, whether internal or +external, using push and pull rules. Once set up, these rules help automate the logistics of product +movement based on specific conditions. -In Odoo, a product's supply chain strategy can be configured using *Routes*, which feature *Pull -and Push Rules*. Once everything is properly configured, the Inventory app can automatically -generate transfers following the configured push/pull rules. +.. seealso:: + - `Odoo Tutorials: Routes `_ + - :doc:`Standard routes in Odoo <../daily_operations>` -Inside the warehouse -==================== +.. note:: + Routes are applicable on products, product categories, shipping methods, :ref:`packagings + `, and on the sales order line. + +About routes and terminology +============================ In a generic warehouse, there are receiving docks, a quality control area, storage locations, picking and packing areas, and shipping docks. All products go through all these locations. As the @@ -42,58 +44,56 @@ boxes, and conveyor belts bring them to the shipping docks, ready to be delivere :align: center :alt: View of a generic pull from rule when preparing deliveries. -Pull rules -========== - -With *Pull Rules*, a demand for some products triggers procurements, while *Push Rules* are -triggered by products arriving in a specific location. - -Pull Rules are used to fulfill a sales order. Odoo generates a need at the *Customer Location* for -each product in the order. Because pull rules are triggered by a need, Odoo looks for a pull rule -defined on the *Customer Location*. - -In this case, a "delivery order" pull rule that transfers products from the *Shipping Area* to the -*Customer Location* is found, and a transfer between the two locations is created. - -Then, Odoo finds another pull rule that tries to fulfill the need for the *Shipping Area*: the -"packing" rule that transfers products from the *Packing Area* to the *Shipping Area*. Finally, -other pull rules are triggered until a transfer between the *Stock* and the *Picking Area* is -created. - -.. note:: - All these product transfers are automatically generated by Odoo based on the pull rules, starting - from the end (the customer location) and going backward (the stock warehouse). While working, the - operator processes these transfers in the opposite order: first the picking, then the packing, - and finally the delivery order. - Push rules -========== +---------- -On the other hand, *Push Rules* are much easier to understand. Instead of generating documents -based on needs, they are triggered in real time when products arrive in a specific location. Push -rules basically say: "when a product arrives at a specific location, move it to another location." - -An example of a push rule would be: when a product arrives in the *Receipt Area*, move it to the -*Storage Location*. As different push rules can be applied to different products, the user can -assign different storage locations for different products. - -Another push rule could be: when products arrive at a location, move them to the *Quality Control -Area*. Then, once the quality check is done, move them to their *Storage Location*. +Push rules are used to *supply products into a storage locations* as soon as they arrive at a +specific receiving location. .. note:: Push rules can only be triggered if there are no pull rules that have already generated the product transfers. -.. important:: - Sets of push/pull rules like those are called *Routes*. The grouping on the rule decides if - products are grouped in the same transfer or not. For example, during the picking operation, all - orders and their products are grouped in one transfer, whereas the packing operation respects the - grouping per customer order. +In a :doc:`one-step receipt route `, which uses one push rule, when a +product arrives in the warehouse, a push rule can automatically transfer it to the *Storage +Location*. Different push rules can be applied to different products, allowing for customized +storage locations. + +.. figure:: use_routes/push-rule.png + :align: center + :alt: Rule for a Receive in one step route. + + Push rule for the 'Receive in one step' route. + +For more information about configuring rules, skip to the :ref:`Configure rules section +`. + +Pull rules +---------- + +Pull rules trigger product moves on demand, such as a sales order or a :doc:`need to restock +<../../warehouses_storage/replenishment/reordering_rules>`. + +Pull rules work backward from the demand location. For example, in a :ref:`two-step delivery +` route, where items move from *Stock* to *Output* +before being delivered to the *Customer Location*, the pull rule first creates a transfer from +*Output* to the customer. If the product is not at *Output*, another pull rule creates a transfer +from *Stock* to *Output*. The warehouse workers then process these transfers in the reverse order: +picking, then shipping. + +.. figure:: use_routes/pull-rule.png + :align: center + :alt: Example pull rule. + + Pull rules for the 'Deliver in two steps' route. + +For more information about configuring rules, skip to the :ref:`Configure rules section +`. .. _use-routes/routes-rules: -Use routes and rules -==================== +Configuration +============= Since *Routes* are a collection of *Push and Pull Rules*, Odoo helps you manage advanced route configurations such as: @@ -221,6 +221,8 @@ section, select the :guilabel:`Routes`. .. important:: Rules must be set on the route in order for the route to work. +.. _inventory/shipping_receiving/configure-rules: + Rules ~~~~~ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-rule.png b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-rule.png new file mode 100644 index 0000000000000000000000000000000000000000..37dbae92b0349c5db2ef254e49a4bb41f043fa83 GIT binary patch literal 7739 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 literal 0 HcmV?d00001 diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/push-rule.png b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/push-rule.png new file mode 100644 index 0000000000000000000000000000000000000000..78685fbc753a5339850de5b1c27056005047ac63 GIT binary patch literal 6046 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 pYi+d)83#^C+pFVrflfbSI2YR3Sm;@%QT{(a