mirror of
https://github.com/OCA/rma.git
synced 2025-02-16 17:11:47 +02:00
[IMP] rma_sale: prepare kits integration
When a sale line has a phantom product (mrp kits) the RMA would not be possible as the wizard couldn't pair the components moves with the product in the line. With this approach, we can at least return the spare components of the original kit line. We also need some hooks to intervine in the main methods, like in invoicing.
This commit is contained in:
@@ -40,7 +40,7 @@ class CustomerPortal(CustomerPortal):
|
|||||||
wizard = wizard_obj.with_context(active_id=order_id).create(
|
wizard = wizard_obj.with_context(active_id=order_id).create(
|
||||||
{"line_ids": line_vals, "location_id": location_id}
|
{"line_ids": line_vals, "location_id": location_id}
|
||||||
)
|
)
|
||||||
rma = wizard.sudo().create_rma()
|
rma = wizard.sudo().create_rma(from_portal=True)
|
||||||
for rec in rma:
|
for rec in rma:
|
||||||
rec.origin += _(" (Portal)")
|
rec.origin += _(" (Portal)")
|
||||||
# Add the user as follower of the created RMAs so they can
|
# Add the user as follower of the created RMAs so they can
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class Rma(models.Model):
|
|||||||
comodel_name="sale.order.line", compute="_compute_allowed_move_ids",
|
comodel_name="sale.order.line", compute="_compute_allowed_move_ids",
|
||||||
)
|
)
|
||||||
move_id = fields.Many2one(domain="[('id', 'in', allowed_move_ids)]")
|
move_id = fields.Many2one(domain="[('id', 'in', allowed_move_ids)]")
|
||||||
|
sale_line_id = fields.Many2one(related="move_id.sale_line_id",)
|
||||||
allowed_product_ids = fields.Many2many(
|
allowed_product_ids = fields.Many2many(
|
||||||
comodel_name="product.product", compute="_compute_allowed_product_ids",
|
comodel_name="product.product", compute="_compute_allowed_product_ids",
|
||||||
)
|
)
|
||||||
@@ -83,3 +84,24 @@ class Rma(models.Model):
|
|||||||
if self.order_id:
|
if self.order_id:
|
||||||
invoice_form.invoice_user_id = self.order_id.user_id
|
invoice_form.invoice_user_id = self.order_id.user_id
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def _get_refund_line_price_unit(self):
|
||||||
|
"""Get the sale order price unit"""
|
||||||
|
if self.sale_line_id:
|
||||||
|
return self.sale_line_id.price_unit
|
||||||
|
return super()._get_refund_line_price_unit()
|
||||||
|
|
||||||
|
def _get_refund_line_product(self):
|
||||||
|
"""To be overriden in a third module with the proper origin values
|
||||||
|
in case a kit is linked with the rma """
|
||||||
|
if not self.sale_line_id:
|
||||||
|
return super()._get_refund_line_product()
|
||||||
|
return self.sale_line_id.product_id
|
||||||
|
|
||||||
|
def _prepare_refund_line(self, line_form):
|
||||||
|
"""Add line data"""
|
||||||
|
super()._prepare_refund_line(line_form)
|
||||||
|
line = self.sale_line_id
|
||||||
|
if line:
|
||||||
|
line_form.discount = line.discount
|
||||||
|
line_form.sequence = line.sequence
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import _, fields, models
|
from odoo import _, api, fields, models
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
@@ -22,6 +22,16 @@ class SaleOrder(models.Model):
|
|||||||
for record in self:
|
for record in self:
|
||||||
record.rma_count = mapped_data.get(record.id, 0)
|
record.rma_count = mapped_data.get(record.id, 0)
|
||||||
|
|
||||||
|
def _prepare_rma_wizard_line_vals(self, data):
|
||||||
|
"""So we can extend the wizard easily"""
|
||||||
|
return {
|
||||||
|
"product_id": data["product"].id,
|
||||||
|
"quantity": data["quantity"],
|
||||||
|
"sale_line_id": data["sale_line_id"].id,
|
||||||
|
"uom_id": data["uom"].id,
|
||||||
|
"picking_id": data["picking"] and data["picking"].id,
|
||||||
|
}
|
||||||
|
|
||||||
def action_create_rma(self):
|
def action_create_rma(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
if self.state not in ["sale", "done"]:
|
if self.state not in ["sale", "done"]:
|
||||||
@@ -30,17 +40,7 @@ class SaleOrder(models.Model):
|
|||||||
)
|
)
|
||||||
wizard_obj = self.env["sale.order.rma.wizard"]
|
wizard_obj = self.env["sale.order.rma.wizard"]
|
||||||
line_vals = [
|
line_vals = [
|
||||||
(
|
(0, 0, self._prepare_rma_wizard_line_vals(data))
|
||||||
0,
|
|
||||||
0,
|
|
||||||
{
|
|
||||||
"product_id": data["product"].id,
|
|
||||||
"quantity": data["quantity"],
|
|
||||||
"sale_line_id": data["sale_line_id"].id,
|
|
||||||
"uom_id": data["uom"].id,
|
|
||||||
"picking_id": data["picking"] and data["picking"].id,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
for data in self.get_delivery_rma_data()
|
for data in self.get_delivery_rma_data()
|
||||||
]
|
]
|
||||||
wizard = wizard_obj.with_context(active_id=self.id).create(
|
wizard = wizard_obj.with_context(active_id=self.id).create(
|
||||||
@@ -76,6 +76,19 @@ class SaleOrder(models.Model):
|
|||||||
data += line.prepare_sale_rma_data()
|
data += line.prepare_sale_rma_data()
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
@api.depends("rma_ids.refund_id")
|
||||||
|
def _get_invoiced(self):
|
||||||
|
"""Search for possible RMA refunds and link them to the order. We
|
||||||
|
don't want to link their sale lines as that would unbalance the
|
||||||
|
qtys to invoice wich isn't correct for this case"""
|
||||||
|
super()._get_invoiced()
|
||||||
|
for order in self:
|
||||||
|
refunds = order.sudo().rma_ids.mapped("refund_id")
|
||||||
|
if not refunds:
|
||||||
|
continue
|
||||||
|
order.invoice_ids += refunds
|
||||||
|
order.invoice_count = len(order.invoice_ids)
|
||||||
|
|
||||||
|
|
||||||
class SaleOrderLine(models.Model):
|
class SaleOrderLine(models.Model):
|
||||||
_inherit = "sale.order.line"
|
_inherit = "sale.order.line"
|
||||||
@@ -98,7 +111,7 @@ class SaleOrderLine(models.Model):
|
|||||||
def prepare_sale_rma_data(self):
|
def prepare_sale_rma_data(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
product = self.product_id
|
product = self.product_id
|
||||||
if self.product_id.type != "product":
|
if self.product_id.type not in ["product", "consu"]:
|
||||||
return {}
|
return {}
|
||||||
moves = self.get_delivery_move()
|
moves = self.get_delivery_move()
|
||||||
data = []
|
data = []
|
||||||
|
|||||||
@@ -131,12 +131,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-left">
|
<td class="text-left">
|
||||||
<t t-if="data['picking']">
|
<span
|
||||||
<span t-esc="data['picking'].name"/>
|
t-esc="data['picking'] and data['picking'].name"
|
||||||
<input type="hidden"
|
/>
|
||||||
|
<input
|
||||||
|
type="hidden"
|
||||||
t-attf-name="#{data_index}-picking_id"
|
t-attf-name="#{data_index}-picking_id"
|
||||||
t-att-value="data['picking'].id"/>
|
t-att-value="data['picking'] and data['picking'].id"
|
||||||
</t>
|
/>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-left">
|
<td class="text-left">
|
||||||
<select
|
<select
|
||||||
|
|||||||
Reference in New Issue
Block a user