IMP rma_sale add option to decrement ordered qty when RMA is completed.

This commit is contained in:
Jared Kipe
2018-12-08 12:36:58 -08:00
parent f928e68069
commit 7ba56bd1ef
4 changed files with 71 additions and 2 deletions

View File

@@ -11,5 +11,6 @@
<field name="in_procure_method">make_to_stock</field> <field name="in_procure_method">make_to_stock</field>
<field name="in_to_refund" eval="True"/> <field name="in_to_refund" eval="True"/>
<field name="in_require_return" eval="True"/> <field name="in_require_return" eval="True"/>
<field name="so_decrement_order_qty" eval="True"/>
</record> </record>
</odoo> </odoo>

View File

@@ -2,10 +2,24 @@ from odoo import api, fields, models, _
from odoo.exceptions import UserError 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): class RMATemplate(models.Model):
_inherit = 'rma.template' _inherit = 'rma.template'
usage = fields.Selection(selection_add=[('sale_order', 'Sale Order')]) 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): class RMA(models.Model):
@@ -54,6 +68,45 @@ class RMA(models.Model):
rma.partner_id = rma.sale_order_id.partner_id rma.partner_id = rma.sale_order_id.partner_id
rma.partner_shipping_id = rma.sale_order_id.partner_shipping_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 @api.multi
def action_add_so_lines(self): def action_add_so_lines(self):
@@ -74,7 +127,7 @@ class RMA(models.Model):
sale_id = self.sale_order_id.id sale_id = self.sale_order_id.id
values = self.template_id._values_for_in_picking(self) values = self.template_id._values_for_in_picking(self)
update = {'sale_id': sale_id, 'group_id': group_id} 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) return self._picking_from_values(values, update, update_lines)
lines = self.lines.filtered(lambda l: l.product_uom_qty >= 1) 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 sale_id = self.sale_order_id.id
values = self.template_id._values_for_out_picking(self) values = self.template_id._values_for_out_picking(self)
update = {'sale_id': sale_id, 'group_id': group_id} 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) return self._picking_from_values(values, update, update_lines)
lines = self.lines.filtered(lambda l: l.product_uom_qty >= 1) lines = self.lines.filtered(lambda l: l.product_uom_qty >= 1)

View File

@@ -72,6 +72,9 @@ class TestRMASale(TestRMA):
rma.in_picking_id.do_transfer() rma.in_picking_id.do_transfer()
rma.action_done() 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 # Make another RMA for the same sale order
rma2 = self.env['rma.rma'].create({ rma2 = self.env['rma.rma'].create({
'template_id': self.template_sale_return.id, 'template_id': self.template_sale_return.id,

View File

@@ -1,6 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<!-- RMA Template -->
<record id="view_rma_template_form_sale" model="ir.ui.view">
<field name="name">rma.template.form.sale</field>
<field name="model">rma.template</field>
<field name="inherit_id" ref="rma.view_rma_template_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='usage']" position="after">
<field name="so_decrement_order_qty" string="Decrement Ordered Qty" attrs="{'invisible': [('usage', '!=', 'sale_order')]}"/>
</xpath>
</field>
</record>
<!-- RMA --> <!-- RMA -->
<record id="view_rma_rma_form_sale" model="ir.ui.view"> <record id="view_rma_rma_form_sale" model="ir.ui.view">
<field name="name">rma.rma.form.sale</field> <field name="name">rma.rma.form.sale</field>