mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
IMP rma_sale add option to decrement ordered qty when RMA is completed.
This commit is contained in:
@@ -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>
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user