diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index be0590059aa..a2b56e48249 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -1052,16 +1052,17 @@ class purchase_order_line(osv.osv):
def action_cancel(self, cr, uid, ids, context=None):
self.write(cr, uid, ids, {'state': 'cancel'}, context=context)
- for po_line in self.browse(cr, uid, ids, context=context):
- if all([l.state == 'cancel' for l in po_line.order_id.order_line]):
- self.pool.get('purchase.order').action_cancel(cr, uid, [po_line.order_id.id], context=context)
+ # We will group by PO first, so we do the check only once for each PO
+ purchase_orders = list(set([x.order_id for x in self.browse(cr, uid, ids, context=context)]))
+ for purchase in purchase_orders:
+ if all([l.state == 'cancel' for l in purchase.order_line]):
+ self.pool.get('purchase.order').action_cancel(cr, uid, [purchase.id], context=context)
def _check_product_uom_group(self, cr, uid, context=None):
group_uom = self.pool.get('ir.model.data').get_object(cr, uid, 'product', 'group_uom')
res = [user for user in group_uom.users if user.id == uid]
return len(res) and True or False
-
def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id,
partner_id, date_order=False, fiscal_position_id=False, date_planned=False,
name=False, price_unit=False, state='draft', context=None):
@@ -1179,9 +1180,15 @@ class procurement_order(osv.osv):
def propagate_cancel(self, cr, uid, procurement, context=None):
if procurement.rule_id.action == 'buy' and procurement.purchase_line_id:
+ uom_obj = self.pool.get("product.uom")
purchase_line_obj = self.pool.get('purchase.order.line')
- if procurement.purchase_line_id.product_qty > procurement.product_qty and procurement.purchase_line_id.order_id.state == 'draft':
- purchase_line_obj.write(cr, uid, [procurement.purchase_line_id.id], {'product_qty': procurement.purchase_line_id.product_qty - procurement.product_qty}, context=context)
+ uom = procurement.purchase_line_id.product_uom
+ product_qty = uom_obj._compute_qty_obj(cr, uid, procurement.product_uom, procurement.product_qty, uom, context=context)
+ if procurement.purchase_line_id.state not in ('draft', 'cancel'):
+ raise osv.except_osv(_('Error!'),
+ _('Can not cancel this procurement as the related purchase order has been confirmed already. Please cancel the purchase order first. '))
+ if float_compare(procurement.purchase_line_id.product_qty, product_qty, 0, precision_rounding=uom.rounding) > 0:
+ purchase_line_obj.write(cr, uid, [procurement.purchase_line_id.id], {'product_qty': procurement.purchase_line_id.product_qty - product_qty}, context=context)
else:
purchase_line_obj.action_cancel(cr, uid, [procurement.purchase_line_id.id], context=context)
return super(procurement_order, self).propagate_cancel(cr, uid, procurement, context=context)
diff --git a/addons/stock/wizard/stock_change_product_qty_view.xml b/addons/stock/wizard/stock_change_product_qty_view.xml
index 6cd31e76432..10bad736bb2 100644
--- a/addons/stock/wizard/stock_change_product_qty_view.xml
+++ b/addons/stock/wizard/stock_change_product_qty_view.xml
@@ -10,7 +10,7 @@
-
+