diff --git a/stock_available/__init__.py b/stock_available/__init__.py index 6dff1269a..036bf665c 100644 --- a/stock_available/__init__.py +++ b/stock_available/__init__.py @@ -18,5 +18,4 @@ # ############################################################################## -from . import product -from . import res_config +from . import models diff --git a/stock_available/__openerp__.py b/stock_available/__openerp__.py index 0f2042a78..55f7f217b 100644 --- a/stock_available/__openerp__.py +++ b/stock_available/__openerp__.py @@ -26,7 +26,7 @@ 'depends': ['stock'], 'license': 'AGPL-3', 'data': [ - 'product_view.xml', - 'res_config_view.xml', + 'views/product_view.xml', + 'views/res_config_view.xml', ] } diff --git a/stock_available/models/__init__.py b/stock_available/models/__init__.py new file mode 100644 index 000000000..bf26a289f --- /dev/null +++ b/stock_available/models/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module is copyright (C) 2014 Numérigraphe SARL. All Rights Reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import product_template +from . import product_product +from . import res_config diff --git a/stock_available/product.py b/stock_available/models/product_product.py similarity index 88% rename from stock_available/product.py rename to stock_available/models/product_product.py index 430ec432f..b7ff07210 100644 --- a/stock_available/product.py +++ b/stock_available/models/product_product.py @@ -22,12 +22,12 @@ from openerp import models, fields, api from openerp.addons import decimal_precision as dp -class ProductTemplate(models.Model): +class ProductProduct(models.Model): """Add a field for the stock available to promise. Useful implementations need to be installed through the Settings menu or by installing one of the modules stock_available_* """ - _inherit = 'product.template' + _inherit = 'product.product' @api.one @api.depends('virtual_available') @@ -48,6 +48,4 @@ class ProductTemplate(models.Model): 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 , this number is obtained by using the new odoo 8 " - "quants, so it gives us the actual current quants minus reserved" - "quants") + "your needs") diff --git a/stock_available/models/product_template.py b/stock_available/models/product_template.py new file mode 100644 index 000000000..6fbb204cb --- /dev/null +++ b/stock_available/models/product_template.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module is copyright (C) 2014 Numérigraphe SARL. All Rights Reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp import models, fields, api +from openerp.addons import decimal_precision as dp + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + + + @api.one + @api.depends('virtual_available') + def _immediately_usable_qty(self): + """Compute the quantity using all the variants""" + self.immediately_usable_qty = sum( + [v.immediately_usable_qty for v in self.product_variant_ids]) + + + immediately_usable_qty = fields.Float( + digits=dp.get_precision('Product Unit of Measure'), + compute='_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") diff --git a/stock_available/res_config.py b/stock_available/models/res_config.py similarity index 100% rename from stock_available/res_config.py rename to stock_available/models/res_config.py diff --git a/stock_available/tests/test_stock_available.py b/stock_available/tests/test_stock_available.py deleted file mode 100644 index 2c46f6460..000000000 --- a/stock_available/tests/test_stock_available.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2015 Therp BV -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -from openerp.tests.common import TransactionCase - - -class testStockLogisticsWarehouse(TransactionCase): - - def test01_stock_levels(self): - """checking that immediately_usable_qty actually reflects \ -the variations in stock, both on product and template""" - moveObj = self.env['stock.move'] - productObj = self.env['product.product'] - templateObj = self.env['product.template'] - supplier_location = self.env.ref('stock.stock_location_suppliers') - stock_location = self.env.ref('stock.stock_location_stock') - customer_location = self.env.ref('stock.stock_location_customers') - uom_unit = self.env.ref('product.product_uom_unit') - - # Create product template - templateAB = templateObj.create( - {'name': 'templAB', - 'uom_id': uom_unit.id, - }) - - # Create product A and B - productA = productObj.create( - {'name': 'product A', - 'standard_price': 1, - 'type': 'product', - 'uom_id': uom_unit.id, - 'default_code': 'A', - 'product_tmpl_id': templateAB.id, - }) - - productB = productObj.create( - {'name': 'product B', - 'standard_price': 1, - 'type': 'product', - 'uom_id': uom_unit.id, - 'default_code': 'B', - 'product_tmpl_id': templateAB.id, - }) - - # Create a stock move from INCOMING to STOCK - stockMoveInA = moveObj.create( - {'location_id': supplier_location.id, - 'location_dest_id': stock_location.id, - 'name': 'MOVE INCOMING -> STOCK ', - 'product_id': productA.id, - 'product_uom': productA.uom_id.id, - 'product_uom_qty': 2, - }) - - stockMoveInB = moveObj.create( - {'location_id': supplier_location.id, - 'location_dest_id': stock_location.id, - 'name': 'MOVE INCOMING -> STOCK ', - 'product_id': productB.id, - 'product_uom': productB.uom_id.id, - 'product_uom_qty': 3, - }) - - def compare_product_usable_qty(product, value): - # Refresh, because the function field is not recalculated between - # transactions - product.refresh() - self.assertEqual(product.immediately_usable_qty, value) - - compare_product_usable_qty(productA, 0) - compare_product_usable_qty(templateAB, 0) - - stockMoveInA.action_confirm() - compare_product_usable_qty(productA, 0) - compare_product_usable_qty(templateAB, 0) - - stockMoveInA.action_assign() - compare_product_usable_qty(productA, 0) - compare_product_usable_qty(templateAB, 0) - - stockMoveInA.action_done() - compare_product_usable_qty(productA, 2) - compare_product_usable_qty(templateAB, 2) - - # will directly trigger action_done on productB - stockMoveInB.action_done() - compare_product_usable_qty(productA, 2) - compare_product_usable_qty(productB, 3) - compare_product_usable_qty(templateAB, 5) - - # Create a stock move from STOCK to CUSTOMER - stockMoveOutA = moveObj.create( - {'location_id': stock_location.id, - 'location_dest_id': customer_location.id, - 'name': ' STOCK --> CUSTOMER ', - 'product_id': productA.id, - 'product_uom': productA.uom_id.id, - 'product_uom_qty': 1, - 'state': 'confirmed', - }) - - stockMoveOutA.action_done() - compare_product_usable_qty(productA, 1) - compare_product_usable_qty(templateAB, 4) diff --git a/stock_available/product_view.xml b/stock_available/views/product_view.xml similarity index 100% rename from stock_available/product_view.xml rename to stock_available/views/product_view.xml diff --git a/stock_available/res_config_view.xml b/stock_available/views/res_config_view.xml similarity index 100% rename from stock_available/res_config_view.xml rename to stock_available/views/res_config_view.xml diff --git a/stock_available_immediately/__init__.py b/stock_available_immediately/__init__.py index 46f811108..207739f8d 100755 --- a/stock_available_immediately/__init__.py +++ b/stock_available_immediately/__init__.py @@ -18,4 +18,4 @@ # ############################################################################## -from . import product +from . import models diff --git a/stock_available_immediately/models/__init__.py b/stock_available_immediately/models/__init__.py new file mode 100755 index 000000000..5ec9a622a --- /dev/null +++ b/stock_available_immediately/models/__init__.py @@ -0,0 +1,21 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Author Guewen Baconnier. Copyright Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import product_product diff --git a/stock_available_immediately/product.py b/stock_available_immediately/models/product_product.py similarity index 81% rename from stock_available_immediately/product.py rename to stock_available_immediately/models/product_product.py index 491e44d1d..d3050f872 100644 --- a/stock_available_immediately/product.py +++ b/stock_available_immediately/models/product_product.py @@ -19,15 +19,14 @@ # ############################################################################## -from openerp import models +from openerp import models, api -class Product(models.Model): - """Subtract incoming qty from immediately_usable_qty""" +class ProductProduct(models.Model): _inherit = 'product.product' + @api.one def _immediately_usable_qty(self): """Ignore the incoming goods in the quantity available to promise""" - super(Product, self)._immediately_usable_qty() - for product in self: - product.immediately_usable_qty -= product.incoming_qty + super(ProductProduct, self)._immediately_usable_qty() + self.immediately_usable_qty -= self.incoming_qty diff --git a/stock_available_immediately/tests/__init__.py b/stock_available_immediately/tests/__init__.py index 84148ecde..d6af52dfa 100644 --- a/stock_available_immediately/tests/__init__.py +++ b/stock_available_immediately/tests/__init__.py @@ -1 +1,3 @@ +# -*- encoding: utf-8 -*- + from . import test_stock_available_immediately