diff --git a/rma_sale/data/rma_demo.xml b/rma_sale/data/rma_demo.xml index f326f1a4..7f6914ae 100644 --- a/rma_sale/data/rma_demo.xml +++ b/rma_sale/data/rma_demo.xml @@ -11,5 +11,6 @@ make_to_stock + \ No newline at end of file diff --git a/rma_sale/models/rma.py b/rma_sale/models/rma.py index f6fc0fff..41583b8b 100644 --- a/rma_sale/models/rma.py +++ b/rma_sale/models/rma.py @@ -2,10 +2,24 @@ from odoo import api, fields, models, _ from odoo.exceptions import UserError +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + def _get_protected_fields(self): + res = super(SaleOrderLine, self)._get_protected_fields() + context = self._context or {} + if context.get('rma_done') and 'product_uom_qty' in res: + res.remove('product_uom_qty') + return res + + class RMATemplate(models.Model): _inherit = 'rma.template' usage = fields.Selection(selection_add=[('sale_order', 'Sale Order')]) + so_decrement_order_qty = fields.Boolean(string='SO Decrement Ordered Qty.', + help='When completing the RMA, the Ordered Quantity will be decremented by ' + 'the RMA qty.') class RMA(models.Model): @@ -54,6 +68,45 @@ class RMA(models.Model): rma.partner_id = rma.sale_order_id.partner_id rma.partner_shipping_id = rma.sale_order_id.partner_shipping_id + @api.multi + def action_done(self): + res = super(RMA, self).action_done() + res2 = self._so_action_done() + if isinstance(res, dict) and isinstance(res2, dict): + if 'warning' in res and 'warning' in res2: + res['warning'] = '\n'.join([res['warning'], res2['warning']]) + return res + if 'warning' in res2: + res['warning'] = res2['warning'] + return res + elif isinstance(res2, dict): + return res2 + return res + + def _so_action_done(self): + warnings = [] + for rma in self: + if rma.template_id.so_decrement_order_qty: + for rma_line in rma.lines: + so_lines = rma.sale_order_id.order_line.filtered(lambda l: l.product_id == rma_line.product_id) + qty_remaining = rma_line.product_uom_qty + for sale_line in so_lines: + if qty_remaining == 0: + continue + sale_line_qty = sale_line.product_uom_qty + sale_line_qty = sale_line_qty - qty_remaining + if sale_line_qty < 0: + qty_remaining = abs(sale_line_qty) + sale_line_qty = 0 + else: + qty_remaining = 0 + sale_line.with_context(rma_done=True).write({'product_uom_qty': sale_line_qty}) + if qty_remaining: + warnings.append((rma, rma.sale_order_id, rma_line, qty_remaining)) + if warnings: + return {'warning': _('Could not reduce all ordered qty:\n %s' % '\n'.join( + ['%s %s %s : %s' % (w[0].name, w[1].name, w[2].product_id.display_name, w[3]) for w in warnings]))} + return True @api.multi def action_add_so_lines(self): @@ -74,7 +127,7 @@ class RMA(models.Model): sale_id = self.sale_order_id.id values = self.template_id._values_for_in_picking(self) update = {'sale_id': sale_id, 'group_id': group_id} - update_lines = {'group_id': group_id} + update_lines = {'to_refund': self.template_id.in_to_refund, 'group_id': group_id} return self._picking_from_values(values, update, update_lines) lines = self.lines.filtered(lambda l: l.product_uom_qty >= 1) @@ -98,7 +151,7 @@ class RMA(models.Model): sale_id = self.sale_order_id.id values = self.template_id._values_for_out_picking(self) update = {'sale_id': sale_id, 'group_id': group_id} - update_lines = {'to_refund_so': self.template_id.in_to_refund_so, 'group_id': group_id} + update_lines = {'group_id': group_id} return self._picking_from_values(values, update, update_lines) lines = self.lines.filtered(lambda l: l.product_uom_qty >= 1) diff --git a/rma_sale/tests/test_rma.py b/rma_sale/tests/test_rma.py index 9cb31d0a..0564c3c5 100644 --- a/rma_sale/tests/test_rma.py +++ b/rma_sale/tests/test_rma.py @@ -72,6 +72,9 @@ class TestRMASale(TestRMA): rma.in_picking_id.do_transfer() rma.action_done() + # Test Ordered Qty was decremented. + self.assertEqual(order.order_line.product_uom_qty, 0.0) + # Make another RMA for the same sale order rma2 = self.env['rma.rma'].create({ 'template_id': self.template_sale_return.id, diff --git a/rma_sale/views/rma_views.xml b/rma_sale/views/rma_views.xml index d3570806..f97ce8a8 100644 --- a/rma_sale/views/rma_views.xml +++ b/rma_sale/views/rma_views.xml @@ -1,6 +1,18 @@ + + + rma.template.form.sale + rma.template + + + + + + + + rma.rma.form.sale