mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
It could not work properly here as we need the "fallback" to apply even if there is no quantity at all in the stock. As we hook the reservation rules in StockMove._update_reserved_quantity(), and this method is called only if we have at least 1 product in qty, the fallback was not applied with zero qty. A new module will handle this concept: https://github.com/OCA/wms/pull/28
518 lines
16 KiB
HTML
518 lines
16 KiB
HTML
<?xml version="1.0" encoding="utf-8" ?>
|
||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||
<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
|
||
<title>Stock Reservation Rules</title>
|
||
<style type="text/css">
|
||
|
||
/*
|
||
:Author: David Goodger (goodger@python.org)
|
||
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
|
||
:Copyright: This stylesheet has been placed in the public domain.
|
||
|
||
Default cascading style sheet for the HTML output of Docutils.
|
||
|
||
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||
customize this style sheet.
|
||
*/
|
||
|
||
/* used to remove borders from tables and images */
|
||
.borderless, table.borderless td, table.borderless th {
|
||
border: 0 }
|
||
|
||
table.borderless td, table.borderless th {
|
||
/* Override padding for "table.docutils td" with "! important".
|
||
The right padding separates the table cells. */
|
||
padding: 0 0.5em 0 0 ! important }
|
||
|
||
.first {
|
||
/* Override more specific margin styles with "! important". */
|
||
margin-top: 0 ! important }
|
||
|
||
.last, .with-subtitle {
|
||
margin-bottom: 0 ! important }
|
||
|
||
.hidden {
|
||
display: none }
|
||
|
||
.subscript {
|
||
vertical-align: sub;
|
||
font-size: smaller }
|
||
|
||
.superscript {
|
||
vertical-align: super;
|
||
font-size: smaller }
|
||
|
||
a.toc-backref {
|
||
text-decoration: none ;
|
||
color: black }
|
||
|
||
blockquote.epigraph {
|
||
margin: 2em 5em ; }
|
||
|
||
dl.docutils dd {
|
||
margin-bottom: 0.5em }
|
||
|
||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||
overflow: hidden;
|
||
}
|
||
|
||
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||
dl.docutils dt {
|
||
font-weight: bold }
|
||
*/
|
||
|
||
div.abstract {
|
||
margin: 2em 5em }
|
||
|
||
div.abstract p.topic-title {
|
||
font-weight: bold ;
|
||
text-align: center }
|
||
|
||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||
div.hint, div.important, div.note, div.tip, div.warning {
|
||
margin: 2em ;
|
||
border: medium outset ;
|
||
padding: 1em }
|
||
|
||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||
div.important p.admonition-title, div.note p.admonition-title,
|
||
div.tip p.admonition-title {
|
||
font-weight: bold ;
|
||
font-family: sans-serif }
|
||
|
||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||
div.danger p.admonition-title, div.error p.admonition-title,
|
||
div.warning p.admonition-title, .code .error {
|
||
color: red ;
|
||
font-weight: bold ;
|
||
font-family: sans-serif }
|
||
|
||
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||
compound paragraphs.
|
||
div.compound .compound-first, div.compound .compound-middle {
|
||
margin-bottom: 0.5em }
|
||
|
||
div.compound .compound-last, div.compound .compound-middle {
|
||
margin-top: 0.5em }
|
||
*/
|
||
|
||
div.dedication {
|
||
margin: 2em 5em ;
|
||
text-align: center ;
|
||
font-style: italic }
|
||
|
||
div.dedication p.topic-title {
|
||
font-weight: bold ;
|
||
font-style: normal }
|
||
|
||
div.figure {
|
||
margin-left: 2em ;
|
||
margin-right: 2em }
|
||
|
||
div.footer, div.header {
|
||
clear: both;
|
||
font-size: smaller }
|
||
|
||
div.line-block {
|
||
display: block ;
|
||
margin-top: 1em ;
|
||
margin-bottom: 1em }
|
||
|
||
div.line-block div.line-block {
|
||
margin-top: 0 ;
|
||
margin-bottom: 0 ;
|
||
margin-left: 1.5em }
|
||
|
||
div.sidebar {
|
||
margin: 0 0 0.5em 1em ;
|
||
border: medium outset ;
|
||
padding: 1em ;
|
||
background-color: #ffffee ;
|
||
width: 40% ;
|
||
float: right ;
|
||
clear: right }
|
||
|
||
div.sidebar p.rubric {
|
||
font-family: sans-serif ;
|
||
font-size: medium }
|
||
|
||
div.system-messages {
|
||
margin: 5em }
|
||
|
||
div.system-messages h1 {
|
||
color: red }
|
||
|
||
div.system-message {
|
||
border: medium outset ;
|
||
padding: 1em }
|
||
|
||
div.system-message p.system-message-title {
|
||
color: red ;
|
||
font-weight: bold }
|
||
|
||
div.topic {
|
||
margin: 2em }
|
||
|
||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||
margin-top: 0.4em }
|
||
|
||
h1.title {
|
||
text-align: center }
|
||
|
||
h2.subtitle {
|
||
text-align: center }
|
||
|
||
hr.docutils {
|
||
width: 75% }
|
||
|
||
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||
clear: left ;
|
||
float: left ;
|
||
margin-right: 1em }
|
||
|
||
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||
clear: right ;
|
||
float: right ;
|
||
margin-left: 1em }
|
||
|
||
img.align-center, .figure.align-center, object.align-center {
|
||
display: block;
|
||
margin-left: auto;
|
||
margin-right: auto;
|
||
}
|
||
|
||
table.align-center {
|
||
margin-left: auto;
|
||
margin-right: auto;
|
||
}
|
||
|
||
.align-left {
|
||
text-align: left }
|
||
|
||
.align-center {
|
||
clear: both ;
|
||
text-align: center }
|
||
|
||
.align-right {
|
||
text-align: right }
|
||
|
||
/* reset inner alignment in figures */
|
||
div.align-right {
|
||
text-align: inherit }
|
||
|
||
/* div.align-center * { */
|
||
/* text-align: left } */
|
||
|
||
.align-top {
|
||
vertical-align: top }
|
||
|
||
.align-middle {
|
||
vertical-align: middle }
|
||
|
||
.align-bottom {
|
||
vertical-align: bottom }
|
||
|
||
ol.simple, ul.simple {
|
||
margin-bottom: 1em }
|
||
|
||
ol.arabic {
|
||
list-style: decimal }
|
||
|
||
ol.loweralpha {
|
||
list-style: lower-alpha }
|
||
|
||
ol.upperalpha {
|
||
list-style: upper-alpha }
|
||
|
||
ol.lowerroman {
|
||
list-style: lower-roman }
|
||
|
||
ol.upperroman {
|
||
list-style: upper-roman }
|
||
|
||
p.attribution {
|
||
text-align: right ;
|
||
margin-left: 50% }
|
||
|
||
p.caption {
|
||
font-style: italic }
|
||
|
||
p.credits {
|
||
font-style: italic ;
|
||
font-size: smaller }
|
||
|
||
p.label {
|
||
white-space: nowrap }
|
||
|
||
p.rubric {
|
||
font-weight: bold ;
|
||
font-size: larger ;
|
||
color: maroon ;
|
||
text-align: center }
|
||
|
||
p.sidebar-title {
|
||
font-family: sans-serif ;
|
||
font-weight: bold ;
|
||
font-size: larger }
|
||
|
||
p.sidebar-subtitle {
|
||
font-family: sans-serif ;
|
||
font-weight: bold }
|
||
|
||
p.topic-title {
|
||
font-weight: bold }
|
||
|
||
pre.address {
|
||
margin-bottom: 0 ;
|
||
margin-top: 0 ;
|
||
font: inherit }
|
||
|
||
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||
margin-left: 2em ;
|
||
margin-right: 2em }
|
||
|
||
pre.code .ln { color: grey; } /* line numbers */
|
||
pre.code, code { background-color: #eeeeee }
|
||
pre.code .comment, code .comment { color: #5C6576 }
|
||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||
|
||
span.classifier {
|
||
font-family: sans-serif ;
|
||
font-style: oblique }
|
||
|
||
span.classifier-delimiter {
|
||
font-family: sans-serif ;
|
||
font-weight: bold }
|
||
|
||
span.interpreted {
|
||
font-family: sans-serif }
|
||
|
||
span.option {
|
||
white-space: nowrap }
|
||
|
||
span.pre {
|
||
white-space: pre }
|
||
|
||
span.problematic {
|
||
color: red }
|
||
|
||
span.section-subtitle {
|
||
/* font-size relative to parent (h1..h6 element) */
|
||
font-size: 80% }
|
||
|
||
table.citation {
|
||
border-left: solid 1px gray;
|
||
margin-left: 1px }
|
||
|
||
table.docinfo {
|
||
margin: 2em 4em }
|
||
|
||
table.docutils {
|
||
margin-top: 0.5em ;
|
||
margin-bottom: 0.5em }
|
||
|
||
table.footnote {
|
||
border-left: solid 1px black;
|
||
margin-left: 1px }
|
||
|
||
table.docutils td, table.docutils th,
|
||
table.docinfo td, table.docinfo th {
|
||
padding-left: 0.5em ;
|
||
padding-right: 0.5em ;
|
||
vertical-align: top }
|
||
|
||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||
font-weight: bold ;
|
||
text-align: left ;
|
||
white-space: nowrap ;
|
||
padding-left: 0 }
|
||
|
||
/* "booktabs" style (no vertical lines) */
|
||
table.docutils.booktabs {
|
||
border: 0px;
|
||
border-top: 2px solid;
|
||
border-bottom: 2px solid;
|
||
border-collapse: collapse;
|
||
}
|
||
table.docutils.booktabs * {
|
||
border: 0px;
|
||
}
|
||
table.docutils.booktabs th {
|
||
border-bottom: thin solid;
|
||
text-align: left;
|
||
}
|
||
|
||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||
font-size: 100% }
|
||
|
||
ul.auto-toc {
|
||
list-style-type: none }
|
||
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="document" id="stock-reservation-rules">
|
||
<h1 class="title">Stock Reservation Rules</h1>
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
!! This file is generated by oca-gen-addon-readme !!
|
||
!! changes will be overwritten. !!
|
||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Alpha" src="https://img.shields.io/badge/maturity-Alpha-red.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/stock-logistics-warehouse/tree/12.0/stock_reserve_rule"><img alt="OCA/stock-logistics-warehouse" src="https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/stock-logistics-warehouse-12-0/stock-logistics-warehouse-12-0-stock_reserve_rule"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/153/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
|
||
<p>This module adds rules for advanced reservation / removal strategies.</p>
|
||
<p>Rules are applied on a location and its sub-locations.</p>
|
||
<p>A rule can exclude quants or locations based on configurable criteria,
|
||
and based on the selected quants, apply advanced removal strategies.</p>
|
||
<p>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.</p>
|
||
<p>The advanced removal strategies are applied on top of the default one (fifo,
|
||
fefo, …).</p>
|
||
<p>The included advanced removal strategies are:</p>
|
||
<ul class="simple">
|
||
<li>Default Removal Strategy: apply the default configured one (fifo, fefo, …)</li>
|
||
<li>Empty Bins: goods are removed from a bin only if the bin will be empty after
|
||
the removal (favor smallest bins first, then apply the default removal
|
||
strategy for equal quantities).</li>
|
||
<li>Prefer Full Packaging: tries to remove full packaging (configured on the
|
||
products) first, by largest to smallest package (default removal strategy is
|
||
then applied for equal quantities).</li>
|
||
</ul>
|
||
<p>Examples of scenario:</p>
|
||
<p>rules:</p>
|
||
<ul class="simple">
|
||
<li>location A: no filter, no advanced removal strategy</li>
|
||
<li>location B: no filter, Empty Bins</li>
|
||
<li>location C: no filter, no advanced removal strategy</li>
|
||
</ul>
|
||
<p>result:</p>
|
||
<ul class="simple">
|
||
<li>take what is available in location A</li>
|
||
<li>then take in location B if available, only if bin(s) are emptied</li>
|
||
<li>then take what is available in location C</li>
|
||
</ul>
|
||
<p>The module is meant to be extensible, with a core mechanism on which new rules
|
||
and advanced removal strategies can be added.</p>
|
||
<div class="admonition important">
|
||
<p class="first admonition-title">Important</p>
|
||
<p class="last">This is an alpha version, the data model and design can change at any time without warning.
|
||
Only for development or testing purpose, do not use in production.
|
||
<a class="reference external" href="https://odoo-community.org/page/development-status">More details on development status</a></p>
|
||
</div>
|
||
<p><strong>Table of contents</strong></p>
|
||
<div class="contents local topic" id="contents">
|
||
<ul class="simple">
|
||
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
|
||
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
|
||
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
|
||
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
|
||
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
|
||
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
|
||
<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="section" id="configuration">
|
||
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
|
||
<p>The configuration of the rules is done in “Inventory > Configuration > Stock Reservation Rules”.</p>
|
||
<p>Creation of a rule:</p>
|
||
<p>Properties that define where the rule will be applied:</p>
|
||
<ul class="simple">
|
||
<li>Location: Define where the rule will look for goods (a parent of the move’s source location).</li>
|
||
<li>Rule Domain: The rule is used only if the Stock Move matches the domain.</li>
|
||
</ul>
|
||
<p>Removal rules for the locations:</p>
|
||
<ul class="simple">
|
||
<li>Quants Domain: this domain includes/excludes quants based on a domain.</li>
|
||
<li>Advanced Removal Strategy: the strategy that will be used for this location
|
||
and sub-location when the rule is used.</li>
|
||
</ul>
|
||
<p>The sequences have to be sorted in the view list to define the reservation priorities.</p>
|
||
</div>
|
||
<div class="section" id="usage">
|
||
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
|
||
<p>If you are using a database with demo data, you can give a try
|
||
to the following scenario to understand how it works.</p>
|
||
<p>The demo data created by the module contains:</p>
|
||
<p>A product: Funky Socks</p>
|
||
<p>3 Locations:</p>
|
||
<ul class="simple">
|
||
<li>Stock / Zone A / Bin A1: 200 Funky socks</li>
|
||
<li>Stock / Zone B / Bin B1: 100 Funky socks</li>
|
||
<li>Stock / Zone C / Bin C1: 100 Funky socks</li>
|
||
</ul>
|
||
<p>3 Reservation Rules, in the following order</p>
|
||
<ul class="simple">
|
||
<li>Zone A must have full quantities</li>
|
||
<li>Zone B</li>
|
||
<li>Zone C</li>
|
||
</ul>
|
||
<p>2 Delivery Orders:</p>
|
||
<ul class="simple">
|
||
<li>Origin: Outgoing shipment (reservation rules demo 1)</li>
|
||
<li>Origin: Outgoing shipment (reservation rules demo 2)</li>
|
||
</ul>
|
||
<p>Scenario:</p>
|
||
<ul class="simple">
|
||
<li>Activate Storage Locations and Multi-Warehouses</li>
|
||
<li>You can open Inventory > Configuration > Stock Reservation Rules to see the
|
||
rules</li>
|
||
<li>Open Transfer: Outgoing shipment (reservation rules demo 1)</li>
|
||
<li>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)</li>
|
||
<li>Unreserve this transfer (to test the second case)</li>
|
||
<li>Open Transfer: Outgoing shipment (reservation rules demo 2)</li>
|
||
<li>Check availability: it has 250 units, it can empty Zone A, it will take 200 in
|
||
Bin A1 and 50 in Bin B1.</li>
|
||
<li>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).</li>
|
||
</ul>
|
||
</div>
|
||
<div class="section" id="bug-tracker">
|
||
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
|
||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/stock-logistics-warehouse/issues">GitHub Issues</a>.
|
||
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
|
||
<a class="reference external" href="https://github.com/OCA/stock-logistics-warehouse/issues/new?body=module:%20stock_reserve_rule%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||
</div>
|
||
<div class="section" id="credits">
|
||
<h1><a class="toc-backref" href="#id4">Credits</a></h1>
|
||
<div class="section" id="authors">
|
||
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
|
||
<ul class="simple">
|
||
<li>Camptocamp</li>
|
||
</ul>
|
||
</div>
|
||
<div class="section" id="contributors">
|
||
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
|
||
<ul class="simple">
|
||
<li>Guewen Baconnier <<a class="reference external" href="mailto:guewen.baconnier@camptocamp.com">guewen.baconnier@camptocamp.com</a>></li>
|
||
</ul>
|
||
</div>
|
||
<div class="section" id="maintainers">
|
||
<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
|
||
<p>This module is maintained by the OCA.</p>
|
||
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
|
||
<p>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.</p>
|
||
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/stock-logistics-warehouse/tree/12.0/stock_reserve_rule">OCA/stock-logistics-warehouse</a> project on GitHub.</p>
|
||
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</body>
|
||
</html>
|