añadido stock_available de OCA/stock-logistics-workflow por dependencia de website_stock_available
This commit is contained in:
parent
c14ed5b4ef
commit
9bd253a931
45 changed files with 5494 additions and 0 deletions
77
stock_available/models/product_template.py
Normal file
77
stock_available/models/product_template.py
Normal file
|
@ -0,0 +1,77 @@
|
|||
# Copyright 2014 Numérigraphe
|
||||
# Copyright 2016 Sodexis
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from odoo import models, fields, api
|
||||
from odoo.addons import decimal_precision as dp
|
||||
from odoo.addons.stock.models.product import OPERATORS
|
||||
|
||||
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = 'product.template'
|
||||
|
||||
@api.multi
|
||||
@api.depends('product_variant_ids.immediately_usable_qty',
|
||||
'product_variant_ids.potential_qty')
|
||||
def _compute_available_quantities(self):
|
||||
res = self._compute_available_quantities_dict()
|
||||
for product in self:
|
||||
for key, value in res[product.id].items():
|
||||
if key in product._fields:
|
||||
product[key] = value
|
||||
|
||||
@api.multi
|
||||
def _compute_available_quantities_dict(self):
|
||||
variants_dict, _ = self.mapped(
|
||||
'product_variant_ids')._compute_available_quantities_dict()
|
||||
res = {}
|
||||
for template in self:
|
||||
immediately_usable_qty = sum(
|
||||
[variants_dict[p.id]["immediately_usable_qty"] -
|
||||
variants_dict[p.id]["potential_qty"] for p in
|
||||
template.product_variant_ids])
|
||||
potential_qty = max(
|
||||
[variants_dict[p.id]["potential_qty"] for p in
|
||||
template.product_variant_ids] or [0.0])
|
||||
res[template.id] = {
|
||||
"immediately_usable_qty": immediately_usable_qty +
|
||||
potential_qty,
|
||||
"potential_qty": potential_qty,
|
||||
}
|
||||
return res
|
||||
|
||||
immediately_usable_qty = fields.Float(
|
||||
digits=dp.get_precision('Product Unit of Measure'),
|
||||
compute='_compute_available_quantities',
|
||||
search="_search_immediately_usable_qty",
|
||||
string='Available to promise',
|
||||
help="Stock for this Product that can be safely proposed "
|
||||
"for sale to Customers.\n"
|
||||
"The definition of this value can be configured to suit "
|
||||
"your needs")
|
||||
potential_qty = fields.Float(
|
||||
compute='_compute_available_quantities',
|
||||
digits=dp.get_precision('Product Unit of Measure'),
|
||||
string='Potential',
|
||||
help="Quantity of this Product that could be produced using "
|
||||
"the materials already at hand. "
|
||||
"If the product has several variants, this will be the biggest "
|
||||
"quantity that can be made for a any single variant.")
|
||||
|
||||
@api.model
|
||||
def _search_immediately_usable_qty(self, operator, value):
|
||||
""" Search function for the immediately_usable_qty field.
|
||||
The search is quite similar to the Odoo search about quantity available
|
||||
(addons/stock/models/product.py,253; _search_product_quantity function)
|
||||
:param operator: str
|
||||
:param value: str
|
||||
:return: list of tuple (domain)
|
||||
"""
|
||||
products = self.search([])
|
||||
# Force prefetch
|
||||
products.mapped("immediately_usable_qty")
|
||||
product_ids = []
|
||||
for product in products:
|
||||
if OPERATORS[operator](product.immediately_usable_qty, value):
|
||||
product_ids.append(product.id)
|
||||
return [('id', 'in', product_ids)]
|
Loading…
Add table
Add a link
Reference in a new issue