From 1168e73a72ad8824c64f308d38d263d7aba456de Mon Sep 17 00:00:00 2001 From: Pierre Masereel Date: Mon, 10 Jul 2017 14:41:54 +0200 Subject: [PATCH] [REF] sale, sale_stock: decrease sale order lines usability * If the user tries to decrease the quantity of a sale order line below the received quantity, we raise a warning telling him to create a return first. * As we do not propagate the decrase to the already created pickings, we post a message in the chatter of these pickings informing the pickers of the change. --- addons/sale/models/sale.py | 40 ++++++++++++++------------ addons/sale_stock/models/sale_order.py | 14 +++++++++ 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index 4ff43dd1b35..c87649c8166 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -743,32 +743,34 @@ class SaleOrderLine(models.Model): return line + def _update_line_quantity(self, values): + orders = self.mapped('order_id') + for order in orders: + order_lines = self.filtered(lambda x: x.order_id == order) + msg = "" + if any([values['product_uom_qty'] < x.product_uom_qty for x in order_lines]): + msg += "" + _( + 'The ordered quantity has been decreased. Do not forget to take it into account on your invoices and delivery orders.') + '' + msg += "" + order.message_post(body=msg) + @api.multi def write(self, values): lines = False - changed_lines = False if 'product_uom_qty' in values: precision = self.env['decimal.precision'].precision_get('Product Unit of Measure') lines = self.filtered( lambda r: r.state == 'sale' and float_compare(r.product_uom_qty, values['product_uom_qty'], precision_digits=precision) == -1) - changed_lines = self.filtered( - lambda r: r.state == 'sale' and float_compare(r.product_uom_qty, values['product_uom_qty'], precision_digits=precision) != 0) - if changed_lines: - orders = self.mapped('order_id') - for order in orders: - order_lines = changed_lines.filtered(lambda x: x.order_id == order) - msg = "" - if any([values['product_uom_qty'] < x.product_uom_qty for x in order_lines]): - msg += "" + _('The ordered quantity has been decreased. Do not forget to take it into account on your invoices and delivery orders.') + '' - msg += "" - order.message_post(body=msg) + self.filtered( + lambda r: r.state == 'sale' and float_compare(r.product_uom_qty, values['product_uom_qty'], precision_digits=precision) != 0)._update_line_quantity(values) result = super(SaleOrderLine, self).write(values) if lines: lines._action_procurement_create() diff --git a/addons/sale_stock/models/sale_order.py b/addons/sale_stock/models/sale_order.py index 98d3aef829b..556c755cfe5 100644 --- a/addons/sale_stock/models/sale_order.py +++ b/addons/sale_stock/models/sale_order.py @@ -158,6 +158,10 @@ class SaleOrderLine(models.Model): @api.onchange('product_uom_qty') def _onchange_product_uom_qty(self): if self.state == 'sale' and self.product_id.type in ['product', 'consu'] and self.product_uom_qty < self._origin.product_uom_qty: + # Do not display this warning if the new quantity is below the delivered + # one; the `write` will raise an `UserError` anyway. + if self.product_uom_qty < self.qty_delivered: + return {} warning_mess = { 'title': _('Ordered quantity decreased!'), 'message' : _('You are decreasing the ordered quantity! Do not forget to manually update the delivery order if needed.'), @@ -242,3 +246,13 @@ class SaleOrderLine(models.Model): break return is_available + + def _update_line_quantity(self, values): + if self.mapped('qty_delivered') and values['product_uom_qty'] < max(self.mapped('qty_delivered')): + raise UserError('You cannot decrease the ordered quantity below your delivered quantity.\n' + 'Create a return first.') + for line in self: + pickings = self.order_id.picking_ids.filtered(lambda p: p.state not in ('done', 'cancel')) + pickings.message_post("The quantity of %s has been updated from %d to %d in %s" % + (line.product_id.name, line.product_uom_qty, values['product_uom_qty'], self.order_id.name)) + super(SaleOrderLine, self)._update_line_quantity(values)