Skip to content

Commit

Permalink
[16.0][ADD] rma_product_exchange
Browse files Browse the repository at this point in the history
  • Loading branch information
chafique-delli committed Jul 1, 2024
1 parent d53b227 commit 5f5ef85
Show file tree
Hide file tree
Showing 17 changed files with 247 additions and 4 deletions.
11 changes: 7 additions & 4 deletions rma/wizards/rma_make_picking.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,10 @@ def _get_procurement_data(self, item, group, qty, picking_type):
}
return procurement_data

@api.model
def _get_product(self, item):
return item.line_id.product_id

@api.model
def _create_procurement(self, item, picking_type):
errors = []
Expand All @@ -149,7 +153,7 @@ def _create_procurement(self, item, picking_type):
else:
qty = item.qty_to_deliver
values = self._get_procurement_data(item, group, qty, picking_type)
product = item.line_id.product_id
product = self._get_product(item)
if float_compare(qty, 0, product.uom_id.rounding) != 1:
raise ValidationError(
_(
Expand All @@ -162,16 +166,15 @@ def _create_procurement(self, item, picking_type):
procurements = []
try:
procurement = group.Procurement(
item.line_id.product_id,
product,
qty,
item.line_id.product_id.product_tmpl_id.uom_id,
product.product_tmpl_id.uom_id,
values.get("location_id"),
values.get("origin"),
values.get("origin"),
self.env.company,
values,
)

procurements.append(procurement)
# Trigger a route check with a mutable in the context that can be
# cleared after the first rule selection
Expand Down
34 changes: 34 additions & 0 deletions rma_product_exchange/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg
:alt: License LGPL-3

====================
RMA Product Exchange
====================

This module allows you to:

#. to exchange one product for another in an RMA.

Usage
=====

Bug Tracker
===========

Bugs are tracked on `GitHub Issues
<https://github.com/Eficent/stock-rma/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smashing it by providing a detailed and welcomed feedback.

Credits
=======

Contributors
------------

* Chafique DELLI <[email protected]>

Maintainer
----------

This module is maintained by Eficent
2 changes: 2 additions & 0 deletions rma_product_exchange/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import models
from . import wizards
21 changes: 21 additions & 0 deletions rma_product_exchange/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright 2024 Akretion
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)

{
"name": "RMA Product Exchange",
"version": "16.0.1.0.0",
"license": "LGPL-3",
"category": "RMA",
"summary": "Manage RMA for product exchange",
"author": "Akretion, ForgeFlow",
"website": "https://github.com/ForgeFlow/stock-rma",
"depends": [
"rma",
],
"data": [
"views/rma_order_view.xml",
"views/rma_operation_view.xml",
"views/rma_order_line_view.xml",
],
"installable": True,
}
3 changes: 3 additions & 0 deletions rma_product_exchange/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from . import rma_order_line
from . import rma_operation
from . import procurement_group
20 changes: 20 additions & 0 deletions rma_product_exchange/models/procurement_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2024 Akretion
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)
from odoo import api, models


class ProcurementGroup(models.Model):
_inherit = "procurement.group"

@api.model
def run(self, procurements, raise_user_error=True):
if self.env.context.get("rma_item"):
new_procurements = []
for procurement in procurements:
new_procurements.append(
procurement._replace(
product_id=self._context.get("rma_item").product_id
)
)
procurements = new_procurements
return super().run(procurements, raise_user_error=raise_user_error)
11 changes: 11 additions & 0 deletions rma_product_exchange/models/rma_operation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Copyright 2024 Akretion
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)
from odoo import fields, models


class RmaOperation(models.Model):
_inherit = "rma.operation"

product_exchange = fields.Boolean(
help="Check if you wish to authorize product exchange.", default=False
)
13 changes: 13 additions & 0 deletions rma_product_exchange/models/rma_order_line.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Copyright 2024 Akretion
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)
from odoo import fields, models


class RmaOrderLine(models.Model):
_inherit = "rma.order.line"

new_product_id = fields.Many2one(
comodel_name="product.product",
tracking=True,
)
product_exchange = fields.Boolean(related="operation_id.product_exchange")
1 change: 1 addition & 0 deletions rma_product_exchange/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import test_rma_product_exchange
27 changes: 27 additions & 0 deletions rma_product_exchange/tests/test_rma_product_exchange.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Copyright 2024 Akretion
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)

from odoo.addons.rma.tests.test_rma import TestRma


class TestRmaProductExchange(TestRma):
@classmethod
def setUpClass(cls):
super().setUpClass()

def test_customer_rma_with_product_exchange(self):
self.rma_cust_replace_op_id.product_exchange = True
self.rma_customer_id.rma_line_ids[0].new_product_id = self.product_id
self.rma_customer_id.rma_line_ids.action_rma_to_approve()
wizard = self.rma_make_picking.with_context(
**{
"active_ids": self.rma_customer_id.rma_line_ids.ids,
"active_model": "rma.order.line",
"picking_type": "outgoing",
"active_id": 1,
}
).create({})
wizard._create_picking()
res = self.rma_customer_id.action_view_out_shipments()
picking = self.env["stock.picking"].browse(res["res_id"])
self.assertEqual(picking.move_ids[0].product_id, self.product_id)
24 changes: 24 additions & 0 deletions rma_product_exchange/views/rma_operation_view.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>

<record id="rma_operation_tree" model="ir.ui.view">
<field name="model">rma.operation</field>
<field name="inherit_id" ref="rma.rma_operation_tree" />
<field name="arch" type="xml">
<field name="delivery_policy" position="after">
<field name="product_exchange" optional="show" />
</field>
</field>
</record>

<record id="rma_operation_form" model="ir.ui.view">
<field name="model">rma.operation</field>
<field name="inherit_id" ref="rma.rma_operation_form" />
<field name="arch" type="xml">
<xpath expr="//group[@name='policies']" position="inside">
<field name="product_exchange" />
</xpath>
</field>
</record>

</odoo>
21 changes: 21 additions & 0 deletions rma_product_exchange/views/rma_order_line_view.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>

<record id="view_rma_line_form" model="ir.ui.view">
<field name="model">rma.order.line</field>
<field name="inherit_id" ref="rma.view_rma_line_form" />
<field name="arch" type="xml">
<xpath
expr="//group[@name='product']/field[@name='product_id']"
position="after"
>
<field name="product_exchange" invisible="True" />
<field
name="new_product_id"
attrs="{'invisible':['|',('operation_id', '=', False),('product_exchange', '=', False)]}"
/>
</xpath>
</field>
</record>

</odoo>
19 changes: 19 additions & 0 deletions rma_product_exchange/views/rma_order_view.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_rma_form" model="ir.ui.view">
<field name="model">rma.order</field>
<field name="inherit_id" ref="rma.view_rma_form" />
<field name="arch" type="xml">
<xpath
expr="//field[@name='rma_line_ids']/tree/field[@name='product_id']"
position="after"
>
<field name="product_exchange" invisible="True" />
<field
name="new_product_id"
attrs="{'invisible':['|',('operation_id', '=', False),('product_exchange', '=', False)]}"
/>
</xpath>
</field>
</record>
</odoo>
1 change: 1 addition & 0 deletions rma_product_exchange/wizards/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import rma_make_picking
36 changes: 36 additions & 0 deletions rma_product_exchange/wizards/rma_make_picking.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Copyright (C) 2024 Akretion
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)

from odoo import api, models


class RmaMakePicking(models.TransientModel):
_inherit = "rma_make_picking.wizard"

@api.returns("rma.order.line")
def _prepare_item(self, line):
values = super()._prepare_item(line)
if (
self.env.context.get("picking_type") == "outgoing"
and line.product_exchange
and line.new_product_id
):
values["product_id"] = line.new_product_id.id
return values

@api.model
def _create_procurement(self, item, picking_type):
if self.env.context.get("picking_type") == "outgoing":
self = self.with_context(rma_item=item)
return super()._create_procurement(item, picking_type)

@api.model
def _get_product(self, item):
product = super()._get_product(item)
if (
self.env.context.get("picking_type") == "outgoing"
and item.line_id.product_exchange
and item.line_id.new_product_id
):
product = item.line_id.new_product_id
return product
6 changes: 6 additions & 0 deletions setup/rma_product_exchange/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

0 comments on commit 5f5ef85

Please sign in to comment.