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