oca-technical/odoo-bringout-oca-rma-rma/rma/tests/test_rma_operation.py
2025-08-29 15:43:03 +02:00

335 lines
15 KiB
Python

# Copyright 2020 Tecnativa - Ernesto Tejeda
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.exceptions import ValidationError
from odoo.tests.common import Form
from .test_rma import TestRma
class TestRmaOperation(TestRma):
def test_01(self):
"""
ensure that the receipt creation behaves correctly according to the
action_create_receipt setting.
- "automatic_on_confirm":
- receipts are created automatically
- the manual button is hidden
- "manual_on_confirm"
- manual button is visible after confirmation
- disappears once a receipt is manually created
"""
self.assertEqual(self.operation.action_create_receipt, "automatic_on_confirm")
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
self.assertFalse(rma.show_create_receipt)
rma.action_confirm()
self.assertTrue(rma.reception_move_id)
self.assertFalse(rma.show_create_receipt)
self.operation.action_create_receipt = "manual_on_confirm"
rma2 = self._create_rma(self.partner, self.product, 10, self.rma_loc)
rma2.action_confirm()
self.assertTrue(rma2.show_create_receipt)
self.assertFalse(rma2.reception_move_id)
rma2.action_create_receipt()
self.assertFalse(rma2.show_create_receipt)
def test_02(self):
"""
test delivery button visibility based on operation settings.
No deliver possible
"""
self.operation.action_create_delivery = False
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.can_be_replaced)
rma.action_confirm()
self.assertEqual(rma.state, "confirmed")
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.show_create_return)
self.assertFalse(rma.can_be_replaced)
self.assertFalse(rma.show_create_replace)
def test_03(self):
"""
test delivery button visibility based on operation settings.
deliver manually after confirm
"""
self.operation.action_create_delivery = "manual_on_confirm"
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.can_be_replaced)
rma.action_confirm()
self.assertEqual(rma.state, "confirmed")
self.assertTrue(rma.can_be_returned)
self.assertTrue(rma.show_create_return)
self.assertTrue(rma.can_be_replaced)
self.assertTrue(rma.show_create_replace)
def test_04(self):
"""
test delivery button visibility based on operation settings.
deliver automatically after confirm, return same product
"""
self.operation.action_create_delivery = "automatic_on_confirm"
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.can_be_replaced)
rma.action_confirm()
self.assertEqual(rma.state, "waiting_replacement")
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.show_create_return)
self.assertFalse(rma.can_be_replaced)
self.assertFalse(rma.show_create_replace)
self.assertTrue(rma.delivery_move_ids)
self.assertEqual(rma.delivery_move_ids.product_id, self.product)
self.assertEqual(rma.delivery_move_ids.product_uom_qty, 10)
def test_05(self):
"""
test delivery button visibility based on operation settings.
deliver manually after receipt
"""
self.operation.action_create_delivery = "manual_after_receipt"
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.can_be_replaced)
rma.action_confirm()
self.assertEqual(rma.state, "confirmed")
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.show_create_return)
self.assertFalse(rma.can_be_replaced)
self.assertFalse(rma.show_create_replace)
rma.reception_move_id.quantity_done = rma.product_uom_qty
rma.reception_move_id.picking_id._action_done()
self.assertEqual(rma.state, "received")
self.assertTrue(rma.can_be_returned)
self.assertTrue(rma.show_create_return)
self.assertTrue(rma.can_be_replaced)
self.assertTrue(rma.show_create_replace)
def test_06(self):
"""
test delivery button visibility based on operation settings.
deliver automatically after receipt
"""
self.operation.action_create_delivery = "automatic_after_receipt"
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.can_be_replaced)
rma.action_confirm()
self.assertEqual(rma.state, "confirmed")
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.show_create_return)
self.assertFalse(rma.can_be_replaced)
self.assertFalse(rma.show_create_replace)
self.assertFalse(rma.delivery_move_ids)
rma.reception_move_id.quantity_done = rma.product_uom_qty
rma.reception_move_id.picking_id._action_done()
self.assertEqual(rma.delivery_move_ids.product_id, self.product)
self.assertEqual(rma.delivery_move_ids.product_uom_qty, 10)
self.assertEqual(rma.state, "waiting_replacement")
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.show_create_return)
self.assertTrue(rma.can_be_replaced)
self.assertFalse(rma.show_create_replace)
def test_07(self):
"""
test delivery button visibility based on operation settings.
deliver automatically after confirm, different product
"""
self.operation.action_create_delivery = "automatic_on_confirm"
self.operation.different_return_product = True
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
with self.assertRaises(AssertionError, msg="Replacement fields are required"):
with Form(rma) as rma_form:
rma_form.save()
with self.assertRaises(
ValidationError, msg="Complete the replacement information"
):
rma.action_confirm()
rma.return_product_id = self.product_product.create(
{"name": "return Product test 1", "type": "product"}
)
rma.action_confirm()
self.assertEqual(rma.delivery_move_ids.product_id, rma.product_id)
self.assertEqual(rma.reception_move_id.product_id, rma.return_product_id)
self.assertEqual(rma.state, "waiting_replacement")
def test_08(self):
"""test refund, manually after confirm"""
self.operation.action_create_refund = "manual_on_confirm"
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
rma.action_confirm()
self.assertEqual(rma.state, "confirmed")
self.assertTrue(rma.can_be_refunded)
self.assertTrue(rma.show_create_refund)
def test_09(self):
"""test refund, manually after receipt"""
self.operation.action_create_refund = "manual_after_receipt"
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
rma.action_confirm()
self.assertEqual(rma.state, "confirmed")
self.assertFalse(rma.can_be_refunded)
self.assertFalse(rma.show_create_refund)
rma.reception_move_id.quantity_done = rma.product_uom_qty
rma.reception_move_id.picking_id._action_done()
self.assertEqual(rma.state, "received")
self.assertTrue(rma.can_be_refunded)
self.assertTrue(rma.show_create_refund)
def test_10(self):
"""test refund, automatic after confirm"""
self.operation.action_create_refund = "automatic_on_confirm"
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
rma.action_confirm()
self.assertEqual(rma.state, "refunded")
self.assertTrue(rma.refund_id)
self.assertFalse(rma.can_be_refunded)
self.assertFalse(rma.show_create_refund)
def test_11(self):
"""test refund, automatic after confirm"""
self.operation.action_create_refund = "automatic_after_receipt"
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
rma.action_confirm()
self.assertEqual(rma.state, "confirmed")
rma.reception_move_id.quantity_done = rma.product_uom_qty
rma.reception_move_id.picking_id._action_done()
self.assertEqual(rma.state, "refunded")
self.assertTrue(rma.refund_id)
self.assertFalse(rma.can_be_refunded)
self.assertFalse(rma.show_create_refund)
def test_12(self):
"""
Refund without product return
Some companies may offer refunds without requiring the return of the product,
often in cases of low-value items or when the cost of return shipping is
prohibitive.
- no receipt
- no return
- automatically refund on confirm
"""
self.operation.action_create_receipt = False
self.operation.action_create_refund = "automatic_on_confirm"
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
rma.action_confirm()
self.assertEqual(rma.state, "refunded")
self.assertFalse(rma.reception_move_id)
self.assertTrue(rma.refund_id)
def test_13(self):
"""
Return of non-ordered product
Occasionally, customers receive items they did not order and need a process for
returning these products. The delivered product don't figure on the sale order
- receipt
- no return
- no refund
"""
self.operation.action_create_receipt = "automatic_on_confirm"
self.operation.action_create_delivery = False
self.operation.action_create_refund = False
rma = self._create_rma(self.partner, self.product, 10, self.rma_loc)
rma.action_confirm()
rma.reception_move_id.quantity_done = rma.product_uom_qty
rma.reception_move_id.picking_id._action_done()
self.assertEqual(rma.state, "received")
self.assertFalse(rma.delivery_move_ids)
def test_14(self):
"""if the refund action is not ment to update quantity, return picking line
to_refund field should be False"""
self.operation.action_create_refund = "manual_after_receipt"
origin_delivery = self._create_delivery()
stock_return_picking_form = Form(
self.env["stock.return.picking"].with_context(
active_ids=origin_delivery.ids,
active_id=origin_delivery.id,
active_model="stock.picking",
)
)
stock_return_picking_form.create_rma = True
stock_return_picking_form.rma_operation_id = self.operation
return_wizard = stock_return_picking_form.save()
return_line = return_wizard.product_return_moves.filtered(
lambda m, p=self.product: m.product_id == p
)
self.assertEqual(return_line.rma_operation_id, self.operation)
picking_action = return_wizard.create_returns()
reception = self.env["stock.picking"].browse(picking_action["res_id"])
move = reception.move_ids.filtered(lambda m, p=self.product: m.product_id == p)
self.assertFalse(move.to_refund)
def test_15(self):
"""if the refund action is ment to update quantity, return picking line
to_refund field should be True"""
self.operation.action_create_refund = "update_quantity"
origin_delivery = self._create_delivery()
stock_return_picking_form = Form(
self.env["stock.return.picking"].with_context(
active_ids=origin_delivery.ids,
active_id=origin_delivery.id,
active_model="stock.picking",
)
)
stock_return_picking_form.create_rma = True
stock_return_picking_form.rma_operation_id = self.operation
return_wizard = stock_return_picking_form.save()
return_line = return_wizard.product_return_moves.filtered(
lambda m, p=self.product: m.product_id == p
)
self.assertEqual(return_line.rma_operation_id, self.operation)
picking_action = return_wizard.create_returns()
reception = self.env["stock.picking"].browse(picking_action["res_id"])
move = reception.move_ids.filtered(lambda m, p=self.product: m.product_id == p)
self.assertTrue(move.to_refund)
def test_rma_replace_pick_ship(self):
self.operation.action_create_delivery = "automatic_on_confirm"
self.warehouse.write({"delivery_steps": "pick_ship"})
rma = self._create_rma(self.partner, self.product, 1, self.rma_loc)
rma.action_confirm()
self.assertEqual(rma.state, "waiting_replacement")
out_pickings = rma.mapped("delivery_move_ids.picking_id")
self.assertEqual(rma.delivery_picking_count, 2)
self.assertIn(
self.warehouse.pick_type_id, out_pickings.mapped("picking_type_id")
)
self.assertIn(
self.warehouse.out_type_id, out_pickings.mapped("picking_type_id")
)
def test_16(self):
rma = self._create_rma(self.partner, self.product, 1, self.rma_loc)
rma.action_confirm()
self.assertEqual(rma.reception_move_id.state, "assigned")
self.assertEqual(rma.reception_move_id.picking_id.state, "assigned")
def test_17(self):
self.operation.auto_confirm_reception = True
rma = self._create_rma(self.partner, self.product, 1, self.rma_loc)
rma.action_confirm()
self.assertEqual(rma.reception_move_id.state, "done")
self.assertEqual(rma.reception_move_id.picking_id.state, "done")
def test_manual_finish_if_no_required_action_flag(self):
self.operation.action_create_receipt = False
self.operation.action_create_delivery = False
self.operation.action_create_refund = False
rma = self._create_rma(self.partner, self.product, 1, self.rma_loc)
rma.action_confirm()
self.assertFalse(rma.requires_action)
self.assertEqual(rma.state, "confirmed")
rma.action_finish()
self.assertEqual(rma.state, "finished")
self.operation.action_create_receipt = "manual_on_confirm"
rma2 = self._create_rma(self.partner, self.product, 1, self.rma_loc)
rma2.action_confirm()
self.assertTrue(rma2.requires_action)
self.assertEqual(rma2.state, "confirmed")
with self.assertRaises(ValidationError):
rma2.action_finish()