Skip to content

Commit

Permalink
Merge PR #1753 into 15.0
Browse files Browse the repository at this point in the history
Signed-off-by dreispt
  • Loading branch information
OCA-git-bot committed Jul 4, 2023
2 parents 6d0bb77 + 8c3fb8f commit a8b4367
Show file tree
Hide file tree
Showing 27 changed files with 2,588 additions and 0 deletions.
1 change: 1 addition & 0 deletions setup/stock_reserve_rule/odoo/addons/stock_reserve_rule
6 changes: 6 additions & 0 deletions setup/stock_reserve_rule/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
176 changes: 176 additions & 0 deletions stock_reserve_rule/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
=======================
Stock Reservation Rules
=======================

.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github
:target: https://github.com/OCA/stock-logistics-warehouse/tree/15.0/stock_reserve_rule
:alt: OCA/stock-logistics-warehouse
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-14-0/stock-logistics-warehouse-14-0-stock_reserve_rule
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/153/15.0
:alt: Try me on Runbot

|badge1| |badge2| |badge3| |badge4| |badge5|

This module adds rules for advanced reservation / removal strategies.

Rules are applied on a location and its sub-locations.

A rule can exclude quants or locations based on configurable criteria,
and based on the selected quants, apply advanced removal strategies.

The rules have a sequence, which will be respected for the reservation.
So even without filter or advanced removal strategies, we can give a priority to
reserve in a location before another.

The advanced removal strategies are applied on top of the default one (fifo,
fefo, ...).

The included advanced removal strategies are:

* Default Removal Strategy: apply the default configured one (fifo, fefo, ...)
* Empty Bins: goods are removed from a bin only if the bin will be empty after
the removal (favor largest bins first to minimize the number of operations,
then apply the default removal strategy for equal quantities).
* Full Packaging: tries to remove full packaging (configured on the products)
first, by largest to smallest package or based on a pre-selected package
(default removal strategy is then applied for equal quantities).

Examples of scenario:

rules:

* location A: no filter, no advanced removal strategy
* location B: no filter, Empty Bins
* location C: no filter, no advanced removal strategy

result:

* take what is available in location A
* then take in location B if available, only if bin(s) are emptied
* then take what is available in location C

The module is meant to be extensible, with a core mechanism on which new rules
and advanced removal strategies can be added.

**Table of contents**

.. contents::
:local:

Configuration
=============

The configuration of the rules is done in "Inventory > Configuration > Stock Reservation Rules".

Creation of a rule:

Properties that define where the rule will be applied:

* Location: Define where the rule will look for goods (a parent of the move's source location).
* Rule Domain: The rule is used only if the Stock Move matches the domain.

Removal rules for the locations:

* Quants Domain: this domain includes/excludes quants based on a domain.
* Advanced Removal Strategy: the strategy that will be used for this location
and sub-location when the rule is used.

The sequences have to be sorted in the view list to define the reservation priorities.

Usage
=====

If you are using a database with demo data, you can give a try
to the following scenario to understand how it works.

The demo data created by the module contains:

A product: Funky Socks

3 Locations:

* Stock / Zone A / Bin A1: 200 Funky socks
* Stock / Zone B / Bin B1: 100 Funky socks
* Stock / Zone C / Bin C1: 100 Funky socks

3 Reservation Rules, in the following order

* Zone A must have full quantities
* Zone B
* Zone C

2 Delivery Orders:

* Origin: Outgoing shipment (reservation rules demo 1)
* Origin: Outgoing shipment (reservation rules demo 2)

Scenario:

* Activate Storage Locations and Multi-Warehouses
* You can open Inventory > Configuration > Stock Reservation Rules to activate
and see the rules (by default in demo, the rules are created inactive)
* Open Transfer: Outgoing shipment (reservation rules demo 1)
* Check availability: it has 150 units, as it will not empty Zone A, it will not
take products there, it should take 100 in B and 50 in C (following the rules
order)
* Unreserve this transfer (to test the second case)
* Open Transfer: Outgoing shipment (reservation rules demo 2)
* Check availability: it has 250 units, it can empty Zone A, it will take 200 in
Bin A1 and 50 in Bin B1.
* If you want to explore further, you can add a custom domain to exclude rules
(for instance, a product category will not use Zone B).

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/stock-logistics-warehouse/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/stock-logistics-warehouse/issues/new?body=module:%20stock_reserve_rule%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
~~~~~~~

* Camptocamp

Contributors
~~~~~~~~~~~~

* Guewen Baconnier <[email protected]>
* Jacques-Etienne Baudoux (BCIM) <[email protected]>

Maintainers
~~~~~~~~~~~

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/stock-logistics-warehouse <https://github.com/OCA/stock-logistics-warehouse/tree/15.0/stock_reserve_rule>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions stock_reserve_rule/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
29 changes: 29 additions & 0 deletions stock_reserve_rule/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

{
"name": "Stock Reservation Rules",
"summary": "Configure reservation rules by location",
"version": "15.0.1.0.0",
"author": "Camptocamp, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Stock Management",
"depends": [
"stock",
"stock_helper",
],
"demo": [
"data/demo/product_demo.xml",
"data/demo/stock_location_demo.xml",
"data/demo/stock_reserve_rule_demo.xml",
"data/demo/stock_inventory_demo.xml",
"data/demo/stock_picking_demo.xml",
],
"data": [
"views/stock_reserve_rule_views.xml",
"security/ir.model.access.csv",
"security/stock_reserve_rule_security.xml",
],
"installable": True,
"development_status": "Beta",
"license": "AGPL-3",
}
15 changes: 15 additions & 0 deletions stock_reserve_rule/data/demo/product_demo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="product_funky_socks" model="product.product">
<field name="default_code">RS700</field>
<field name="name">Funky Socks</field>
<field name="type">product</field>
<field name="categ_id" ref="product.product_category_6" />
<field name="lst_price">30.0</field>
<field name="standard_price">20.0</field>
<field name="weight">1.0</field>
<field name="tracking">none</field>
<field name="uom_id" ref="uom.product_uom_unit" />
<field name="uom_po_id" ref="uom.product_uom_unit" />
</record>
</odoo>
41 changes: 41 additions & 0 deletions stock_reserve_rule/data/demo/stock_inventory_demo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="stock_inventory_1_demo" model="stock.inventory">
<field name="name">Funky Socks Demo Inventory</field>
</record>
<record id="stock_inventory_1_line_1_demo" model="stock.inventory.line">
<field name="product_id" ref="product_funky_socks" />
<field name="product_uom_id" ref="uom.product_uom_unit" />
<field name="inventory_id" ref="stock_inventory_1_demo" />
<field name="product_qty">200.0</field>
<field name="location_id" ref="stock_location_zone_a_bin_1_demo" />
</record>
<record id="stock_inventory_1_line_2_demo" model="stock.inventory.line">
<field name="product_id" ref="product_funky_socks" />
<field name="product_uom_id" ref="uom.product_uom_unit" />
<field name="inventory_id" ref="stock_inventory_1_demo" />
<field name="product_qty">100.0</field>
<field name="location_id" ref="stock_location_zone_b_bin_1_demo" />
</record>
<record id="stock_inventory_1_line_3_demo" model="stock.inventory.line">
<field name="product_id" ref="product_funky_socks" />
<field name="product_uom_id" ref="uom.product_uom_unit" />
<field name="inventory_id" ref="stock_inventory_1_demo" />
<field name="product_qty">100.0</field>
<field name="location_id" ref="stock_location_zone_c_bin_1_demo" />
</record>
<function model="stock.inventory" name="_action_start">
<function
eval="[[('state','=','draft'),('id', '=', ref('stock_reserve_rule.stock_inventory_1_demo'))]]"
model="stock.inventory"
name="search"
/>
</function>
<function model="stock.inventory" name="action_validate">
<function
eval="[[('state','=','confirm'),('id', '=', ref('stock_reserve_rule.stock_inventory_1_demo'))]]"
model="stock.inventory"
name="search"
/>
</function>
</odoo>
27 changes: 27 additions & 0 deletions stock_reserve_rule/data/demo/stock_location_demo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="stock_location_zone_a_demo" model="stock.location">
<field name="name">Zone A</field>
<field name="location_id" ref="stock.stock_location_stock" />
</record>
<record id="stock_location_zone_b_demo" model="stock.location">
<field name="name">Zone B</field>
<field name="location_id" ref="stock.stock_location_stock" />
</record>
<record id="stock_location_zone_c_demo" model="stock.location">
<field name="name">Zone C</field>
<field name="location_id" ref="stock.stock_location_stock" />
</record>
<record id="stock_location_zone_a_bin_1_demo" model="stock.location">
<field name="name">Bin A1</field>
<field name="location_id" ref="stock_location_zone_a_demo" />
</record>
<record id="stock_location_zone_b_bin_1_demo" model="stock.location">
<field name="name">Bin B1</field>
<field name="location_id" ref="stock_location_zone_b_demo" />
</record>
<record id="stock_location_zone_c_bin_1_demo" model="stock.location">
<field name="name">Bin C1</field>
<field name="location_id" ref="stock_location_zone_c_demo" />
</record>
</odoo>
45 changes: 45 additions & 0 deletions stock_reserve_rule/data/demo/stock_picking_demo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="stock_picking_out_1_demo" model="stock.picking">
<field name="picking_type_id" ref="stock.picking_type_out" />
<field name="origin">Outgoing shipment (reservation rules demo 1)</field>
<field name="partner_id" ref="base.res_partner_1" />
<field name="date" eval="DateTime.today()" />
<field name="location_id" ref="stock.stock_location_stock" />
<field name="location_dest_id" ref="stock.stock_location_customers" />
<field
name="move_lines"
model="stock.move"
eval="[(0, 0, {
'name': obj().env.ref('stock_reserve_rule.product_funky_socks').name,
'product_id': ref('stock_reserve_rule.product_funky_socks'),
'product_uom': ref('uom.product_uom_unit'),
'product_uom_qty': 150.0,
'picking_type_id': ref('stock.picking_type_out'),
'location_id': ref('stock.stock_location_stock'),
'location_dest_id': ref('stock.stock_location_customers'),
})]"
/>
</record>
<record id="stock_picking_out_2_demo" model="stock.picking">
<field name="picking_type_id" ref="stock.picking_type_out" />
<field name="origin">Outgoing shipment (reservation rules demo 2)</field>
<field name="partner_id" ref="base.res_partner_1" />
<field name="date" eval="DateTime.today()" />
<field name="location_id" ref="stock.stock_location_stock" />
<field name="location_dest_id" ref="stock.stock_location_customers" />
<field
name="move_lines"
model="stock.move"
eval="[(0, 0, {
'name': obj().env.ref('stock_reserve_rule.product_funky_socks').name,
'product_id': ref('stock_reserve_rule.product_funky_socks'),
'product_uom': ref('uom.product_uom_unit'),
'product_uom_qty': 250.0,
'picking_type_id': ref('stock.picking_type_out'),
'location_id': ref('stock.stock_location_stock'),
'location_dest_id': ref('stock.stock_location_customers'),
})]"
/>
</record>
</odoo>
28 changes: 28 additions & 0 deletions stock_reserve_rule/data/demo/stock_reserve_rule_demo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="stock_reserve_rule_1_demo" model="stock.reserve.rule">
<field name="name">Stock</field>
<field name="sequence">1</field>
<field name="location_id" ref="stock.stock_location_stock" />
<field name="company_id" ref="base.main_company" />
<field name="active" eval="False" />
</record>
<record id="stock_reserve_rule_removal_1_demo" model="stock.reserve.rule.removal">
<field name="rule_id" ref="stock_reserve_rule_1_demo" />
<field name="sequence">1</field>
<field name="location_id" ref="stock_location_zone_a_demo" />
<field name="removal_strategy">empty_bin</field>
</record>
<record id="stock_reserve_rule_2_removal_demo" model="stock.reserve.rule.removal">
<field name="rule_id" ref="stock_reserve_rule_1_demo" />
<field name="sequence">2</field>
<field name="location_id" ref="stock_location_zone_b_demo" />
<field name="removal_strategy">default</field>
</record>
<record id="stock_reserve_rule_3_removal_demo" model="stock.reserve.rule.removal">
<field name="rule_id" ref="stock_reserve_rule_1_demo" />
<field name="sequence">3</field>
<field name="location_id" ref="stock_location_zone_c_demo" />
<field name="removal_strategy">default</field>
</record>
</odoo>
Loading

0 comments on commit a8b4367

Please sign in to comment.