diff --git a/addons/mrp/stock.py b/addons/mrp/stock.py
index 4b442077a5d..cd66ae8ffae 100644
--- a/addons/mrp/stock.py
+++ b/addons/mrp/stock.py
@@ -65,6 +65,8 @@ class StockMove(osv.osv):
"""
bom_obj = self.pool.get('mrp.bom')
move_obj = self.pool.get('stock.move')
+ prod_obj = self.pool.get("product.product")
+ proc_obj = self.pool.get("procurement.order")
to_explode_again_ids = []
processed_ids = []
bis = self._check_phantom_bom(cr, uid, move, context=context)
@@ -72,24 +74,44 @@ class StockMove(osv.osv):
factor = move.product_qty
bom_point = bom_obj.browse(cr, SUPERUSER_ID, bis[0], context=context)
res = bom_obj._bom_explode(cr, SUPERUSER_ID, bom_point, move.product_id, factor, [])
+
state = 'confirmed'
if move.state == 'assigned':
state = 'assigned'
for line in res[0]:
- valdef = {
- 'picking_id': move.picking_id.id if move.picking_id else False,
- 'product_id': line['product_id'],
- 'product_uom': line['product_uom'],
- 'product_uom_qty': line['product_qty'],
- 'product_uos': line['product_uos'],
- 'product_uos_qty': line['product_uos_qty'],
- 'state': state,
- 'name': line['name'],
- 'procurement_id': move.procurement_id.id,
- 'split_from': move.id, #Needed in order to keep purchase connection, but will be removed by unlink
- }
- mid = move_obj.copy(cr, uid, move.id, default=valdef)
- to_explode_again_ids.append(mid)
+ product = prod_obj.browse(cr, uid, line['product_id'], context=context)
+ if product.type != 'service':
+ valdef = {
+ 'picking_id': move.picking_id.id if move.picking_id else False,
+ 'product_id': line['product_id'],
+ 'product_uom': line['product_uom'],
+ 'product_uom_qty': line['product_qty'],
+ 'product_uos': line['product_uos'],
+ 'product_uos_qty': line['product_uos_qty'],
+ 'state': state,
+ 'name': line['name'],
+ 'procurement_id': move.procurement_id.id,
+ 'split_from': move.id, #Needed in order to keep purchase connection, but will be removed by unlink
+ }
+ mid = move_obj.copy(cr, uid, move.id, default=valdef)
+ to_explode_again_ids.append(mid)
+ else:
+ if prod_obj.need_procurement(cr, uid, [product.id], context=context):
+ vals = {
+ 'name': move.rule_id and move.rule_id.name or "/",
+ 'origin': move.origin,
+ 'company_id': move.company_id and move.company_id.id or False,
+ 'date_planned': move.date,
+ 'product_id': line['product_id'],
+ 'product_qty': line['product_qty'],
+ 'product_uom': line['product_uom'],
+ 'product_uos_qty': line['product_uos_qty'],
+ 'product_uos': line['product_uos'],
+ 'group_id': move.group_id.id,
+ 'priority': move.priority,
+ }
+ proc = proc_obj.create(cr, uid, vals, context=context)
+ proc_obj.run(cr, uid, [proc], context=context)
#delete the move with original product which is not relevant anymore
move_obj.unlink(cr, SUPERUSER_ID, [move.id], context=context)
diff --git a/addons/product/product.py b/addons/product/product.py
index 8c0a919797d..5d16651fe75 100644
--- a/addons/product/product.py
+++ b/addons/product/product.py
@@ -764,6 +764,9 @@ class product_template(osv.osv):
return super(product_template, self).name_get(cr, user, ids, context)
+
+
+
class product_product(osv.osv):
_name = "product.product"
_description = "Product"
@@ -1089,6 +1092,11 @@ class product_product(osv.osv):
return super(product_product, self).create(cr, uid, vals, context=ctx)
+
+ def need_procurement(self, cr, uid, ids, context=None):
+ return False
+
+
class product_packaging(osv.osv):
_name = "product.packaging"
_description = "Packaging"
diff --git a/addons/sale_service/models/sale_service.py b/addons/sale_service/models/sale_service.py
index 3b0832a4f41..386761feec0 100644
--- a/addons/sale_service/models/sale_service.py
+++ b/addons/sale_service/models/sale_service.py
@@ -139,13 +139,22 @@ class project_task(osv.osv):
self._validate_subflows(cr, uid, ids, context=context)
return res
-class product_product(osv.osv):
+class product_template(osv.osv):
_inherit = "product.template"
_columns = {
'project_id': fields.many2one('project.project', 'Project', ondelete='set null',),
'auto_create_task': fields.boolean('Create Task Automatically', help="Thick this option if you want to create a task automatically each time this product is sold"),
}
+class product_product(osv.osv):
+ _inherit = "product.product"
+
+ def need_procurement(self, cr, uid, ids, context=None):
+ for product in self.browse(cr, uid, ids, context=context):
+ if product.type == 'service' and product.auto_create_task:
+ return True
+ return super(product_product, self).need_procurement(cr, uid, ids, context=context)
+
class sale_order_line(osv.osv):
_inherit = 'sale.order.line'
diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py
index f2c6f529dcc..6489690233c 100644
--- a/addons/sale_stock/sale_stock.py
+++ b/addons/sale_stock/sale_stock.py
@@ -202,6 +202,17 @@ class sale_order(osv.osv):
return False
+class product_product(osv.osv):
+ _inherit = 'product.product'
+
+ def need_procurement(self, cr, uid, ids, context=None):
+ #when sale is installed alone, there is no need to create procurements, but with sale_stock
+ #we must create a procurement for each product that is not a service.
+ for product in self.browse(cr, uid, ids, context=context):
+ if product.type != 'service':
+ return True
+ return super(product_product, self).need_procurement(cr, uid, ids, context=context)
+
class sale_order_line(osv.osv):
_inherit = 'sale.order.line'
diff --git a/addons/stock_account/product_view.xml b/addons/stock_account/product_view.xml
index cf8af6bf3a5..97eb7a05722 100644
--- a/addons/stock_account/product_view.xml
+++ b/addons/stock_account/product_view.xml
@@ -26,7 +26,7 @@
-
+
@@ -36,7 +36,7 @@
-
+