mirror of
https://github.com/OCA/rma.git
synced 2025-02-16 17:11:47 +02:00
[IMP] rma_sale: operation required
The rma operation is required in the portal, and it makes sense for it to be required in the sales wizard as well
This commit is contained in:
committed by
Víctor Martínez
parent
994d480b41
commit
6404daedcb
@@ -91,8 +91,8 @@ To use this module, you need to:
|
||||
it will be accessible via the smart button labeled Refund. The RMA
|
||||
will be set automatically to 'Refunded' state when the refund is
|
||||
validated.
|
||||
- If you click on 'Replace' or 'Return to customer' button instead, a
|
||||
popup wizard will guide you to create a Delivery order to the
|
||||
- If you click on 'Replace' or 'Return to customer' button instead,
|
||||
a popup wizard will guide you to create a Delivery order to the
|
||||
client and this order will be accessible via the smart button
|
||||
labeled Delivery. The RMA will be set automatically to 'Replaced'
|
||||
or 'Returned' state when the RMA quantity is equal or lower than
|
||||
@@ -140,9 +140,9 @@ Known issues / Roadmap
|
||||
- As soon as the picking is selected, the user should select the move,
|
||||
but perhaps stock.move \_rec_name could be improved to better show
|
||||
what the product of that move is.
|
||||
- Add RMA reception and/or RMA delivery on several steps - 2 or 3 - like
|
||||
normal receptions/deliveries. It should be a separate option inside
|
||||
the warehouse definition.
|
||||
- Add RMA reception and/or RMA delivery on several steps - 2 or 3 -
|
||||
like normal receptions/deliveries. It should be a separate option
|
||||
inside the warehouse definition.
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
@@ -179,6 +179,8 @@ Contributors
|
||||
- Antoni Marroig <amarroig@apsl.net>
|
||||
|
||||
- Michael Tietz (MT Software) mtietz@mt-software.de
|
||||
- Jacques-Etienne Baudoux - BCIM je@bcim.be
|
||||
- Souheil Bejaoui - ACSONE SA/NV souheil.bejaoui@acsone.eu
|
||||
|
||||
Maintainers
|
||||
-----------
|
||||
|
||||
@@ -856,6 +856,7 @@ class Rma(models.Model):
|
||||
"partner_invoice_id",
|
||||
"product_id",
|
||||
"location_id",
|
||||
"operation_id",
|
||||
]
|
||||
for record in self:
|
||||
desc = ""
|
||||
|
||||
@@ -8,3 +8,5 @@
|
||||
- [APSL-Nagarro](https://www.apsl.tech):
|
||||
- Antoni Marroig \<<amarroig@apsl.net>\>
|
||||
- Michael Tietz (MT Software) <mtietz@mt-software.de>
|
||||
- Jacques-Etienne Baudoux - BCIM <je@bcim.be>
|
||||
- Souheil Bejaoui - ACSONE SA/NV <souheil.bejaoui@acsone.eu>
|
||||
|
||||
@@ -439,8 +439,8 @@ operations can be done by clicking on the buttons in the status bar.<ul>
|
||||
it will be accessible via the smart button labeled Refund. The RMA
|
||||
will be set automatically to ‘Refunded’ state when the refund is
|
||||
validated.</li>
|
||||
<li>If you click on ‘Replace’ or ‘Return to customer’ button instead, a
|
||||
popup wizard will guide you to create a Delivery order to the
|
||||
<li>If you click on ‘Replace’ or ‘Return to customer’ button instead,
|
||||
a popup wizard will guide you to create a Delivery order to the
|
||||
client and this order will be accessible via the smart button
|
||||
labeled Delivery. The RMA will be set automatically to ‘Replaced’
|
||||
or ‘Returned’ state when the RMA quantity is equal or lower than
|
||||
@@ -494,9 +494,9 @@ team will be the default one if no team is set.</li>
|
||||
<li>As soon as the picking is selected, the user should select the move,
|
||||
but perhaps stock.move _rec_name could be improved to better show
|
||||
what the product of that move is.</li>
|
||||
<li>Add RMA reception and/or RMA delivery on several steps - 2 or 3 - like
|
||||
normal receptions/deliveries. It should be a separate option inside
|
||||
the warehouse definition.</li>
|
||||
<li>Add RMA reception and/or RMA delivery on several steps - 2 or 3 -
|
||||
like normal receptions/deliveries. It should be a separate option
|
||||
inside the warehouse definition.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="bug-tracker">
|
||||
@@ -532,6 +532,8 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
|
||||
</ul>
|
||||
</li>
|
||||
<li>Michael Tietz (MT Software) <a class="reference external" href="mailto:mtietz@mt-software.de">mtietz@mt-software.de</a></li>
|
||||
<li>Jacques-Etienne Baudoux - BCIM <a class="reference external" href="mailto:je@bcim.be">je@bcim.be</a></li>
|
||||
<li>Souheil Bejaoui - ACSONE SA/NV <a class="reference external" href="mailto:souheil.bejaoui@acsone.eu">souheil.bejaoui@acsone.eu</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
|
||||
@@ -71,8 +71,11 @@ class TestRma(BaseCommon):
|
||||
cls.warehouse = cls.env.ref("stock.warehouse0")
|
||||
# Ensure grouping
|
||||
cls.env.company.rma_return_grouping = True
|
||||
cls.operation = cls.env.ref("rma.rma_operation_replace")
|
||||
|
||||
def _create_rma(self, partner=None, product=None, qty=None, location=None):
|
||||
def _create_rma(
|
||||
self, partner=None, product=None, qty=None, location=None, operation=None
|
||||
):
|
||||
vals = {}
|
||||
if partner:
|
||||
vals["partner_id"] = partner.id
|
||||
@@ -82,14 +85,17 @@ class TestRma(BaseCommon):
|
||||
vals["product_uom_qty"] = qty
|
||||
if location:
|
||||
vals["location_id"] = location.id
|
||||
|
||||
if operation:
|
||||
vals["operation_id"] = operation.id
|
||||
elif operation is None:
|
||||
vals["operation_id"] = self.operation.id
|
||||
vals["user_id"] = self.env.user.id
|
||||
return self.env["rma"].create(vals)
|
||||
|
||||
def _create_confirm_receive(
|
||||
self, partner=None, product=None, qty=None, location=None
|
||||
self, partner=None, product=None, qty=None, location=None, operation=None
|
||||
):
|
||||
rma = self._create_rma(partner, product, qty, location)
|
||||
rma = self._create_rma(partner, product, qty, location, operation)
|
||||
rma.action_confirm()
|
||||
rma.reception_move_id.quantity = rma.product_uom_qty
|
||||
rma.reception_move_id.picking_id.button_validate()
|
||||
@@ -221,19 +227,26 @@ class TestRmaCase(TestRma):
|
||||
self.assertEqual(rma.product_uom, self.product.uom_id)
|
||||
|
||||
def test_ensure_required_fields_on_confirm(self):
|
||||
rma = self._create_rma()
|
||||
rma = self._create_rma(operation=False)
|
||||
with self.assertRaises(ValidationError) as e:
|
||||
rma.action_confirm()
|
||||
self.assertEqual(
|
||||
e.exception.args[0],
|
||||
"Required field(s):\nCustomer\nShipping Address\nInvoice Address\nProduct",
|
||||
"Required field(s):\nCustomer\nShipping Address\nInvoice Address\nProduct"
|
||||
"\nRequested operation",
|
||||
)
|
||||
rma.partner_id = self.partner.id
|
||||
with self.assertRaises(ValidationError) as e:
|
||||
rma.action_confirm()
|
||||
self.assertEqual(e.exception.args[0], "Required field(s):\nProduct")
|
||||
self.assertEqual(
|
||||
e.exception.args[0], "Required field(s):\nProduct\nRequested operation"
|
||||
)
|
||||
rma.product_id = self.product.id
|
||||
rma.location_id = self.rma_loc.id
|
||||
with self.assertRaises(ValidationError) as e:
|
||||
rma.action_confirm()
|
||||
self.assertEqual(e.exception.args[0], "Required field(s):\nRequested operation")
|
||||
rma.operation_id = self.operation
|
||||
rma.action_confirm()
|
||||
self.assertEqual(rma.state, "confirmed")
|
||||
|
||||
@@ -670,6 +683,7 @@ class TestRmaCase(TestRma):
|
||||
)
|
||||
)
|
||||
stock_return_picking_form.create_rma = True
|
||||
stock_return_picking_form.rma_operation_id = self.operation
|
||||
return_wizard = stock_return_picking_form.save()
|
||||
picking_action = return_wizard.create_returns()
|
||||
# Each origin move is linked to a different RMA
|
||||
@@ -698,6 +712,7 @@ class TestRmaCase(TestRma):
|
||||
rma_form.move_id = origin_delivery.move_ids.filtered(
|
||||
lambda r: r.product_id == self.product
|
||||
)
|
||||
rma_form.operation_id = self.operation
|
||||
rma = rma_form.save()
|
||||
rma.action_confirm()
|
||||
rma.reception_move_id.quantity = 10
|
||||
|
||||
@@ -11,6 +11,20 @@ from odoo.tools import float_compare
|
||||
class ReturnPickingLine(models.TransientModel):
|
||||
_inherit = "stock.return.picking.line"
|
||||
|
||||
rma_operation_id = fields.Many2one(
|
||||
comodel_name="rma.operation",
|
||||
string="Operation",
|
||||
compute="_compute_rma_operation_id",
|
||||
store=True,
|
||||
readonly=False,
|
||||
)
|
||||
|
||||
@api.depends("wizard_id.rma_operation_id")
|
||||
def _compute_rma_operation_id(self):
|
||||
for rec in self:
|
||||
if rec.wizard_id.rma_operation_id:
|
||||
rec.rma_operation_id = rec.wizard_id.rma_operation_id
|
||||
|
||||
def _prepare_rma_vals(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
@@ -19,6 +33,7 @@ class ReturnPickingLine(models.TransientModel):
|
||||
"product_uom_qty": self.quantity,
|
||||
"product_uom": self.product_id.uom_id.id,
|
||||
"location_id": self.wizard_id.location_id.id or self.move_id.location_id.id,
|
||||
"operation_id": self.rma_operation_id.id,
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +45,10 @@ class ReturnPicking(models.TransientModel):
|
||||
rma_location_ids = fields.Many2many(
|
||||
comodel_name="stock.location", compute="_compute_rma_location_id"
|
||||
)
|
||||
rma_operation_id = fields.Many2one(
|
||||
comodel_name="rma.operation",
|
||||
string="Requested operation",
|
||||
)
|
||||
# Expand domain for RMAs
|
||||
location_id = fields.Many2one(
|
||||
domain="create_rma and [('id', 'child_of', rma_location_ids)]"
|
||||
|
||||
@@ -8,12 +8,20 @@
|
||||
<field name="model">stock.return.picking</field>
|
||||
<field name="inherit_id" ref="stock.view_stock_return_picking_form" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="product_return_moves" position="after">
|
||||
<xpath expr="//field[@name='product_return_moves']//tree" position="inside">
|
||||
<field
|
||||
name="rma_operation_id"
|
||||
required="parent.create_rma and quantity>0"
|
||||
column_invisible="not parent.create_rma"
|
||||
/>
|
||||
</xpath>
|
||||
<field name="product_return_moves" position="before">
|
||||
<group name="group_rma">
|
||||
<field
|
||||
name="create_rma"
|
||||
invisible="picking_type_code != 'outgoing'"
|
||||
/>
|
||||
<field name="rma_operation_id" invisible="not create_rma" />
|
||||
<field name="rma_location_ids" invisible="1" />
|
||||
<field name="picking_id" invisible="1" />
|
||||
<field name="picking_type_code" invisible="1" />
|
||||
|
||||
Reference in New Issue
Block a user