From 104074d1894d6547f3f8fd92d43420558d8400d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Tue, 1 Feb 2022 13:32:00 +0100 Subject: [PATCH] [14.0] fix migration and interate code review remarks --- .../models/sale_order.py | 14 ++--- .../test_sale_cancel_existing_invoice.py | 63 ++++++++++++++++++- 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/sale_order_restrict_cancel_existing_invoice/models/sale_order.py b/sale_order_restrict_cancel_existing_invoice/models/sale_order.py index e7c866209c5..34a4bba68be 100644 --- a/sale_order_restrict_cancel_existing_invoice/models/sale_order.py +++ b/sale_order_restrict_cancel_existing_invoice/models/sale_order.py @@ -9,29 +9,29 @@ class SaleOrder(models.Model): _inherit = "sale.order" - confirmed_invoice_ids = fields.Many2many( + unpaid_invoice_ids = fields.Many2many( comodel_name="account.move", compute="_compute_confirmed_invoice_ids", help="Technical field in order to retrieve confirmed invoices", ) - def _get_confirmed_invoice_states(self): + def _get_paid_invoice_states(self): """ Return the invoice move_type that should avoid order cancel :return: """ - return ["out_invoice"] + return ["paid", "reversed"] @api.depends("invoice_ids") def _compute_confirmed_invoice_ids(self): for sale in self: - sale.confirmed_invoice_ids = sale.invoice_ids.filtered( - lambda i, move_types=self._get_confirmed_invoice_states(): i.move_type - in move_types + sale.unpaid_invoice_ids = sale.invoice_ids.filtered( + lambda i, payment_states=self._get_paid_invoice_states(): i.payment_state + not in payment_states ) def action_cancel(self): - if any(sale.confirmed_invoice_ids for sale in self): + if any(sale.unpaid_invoice_ids for sale in self): raise UserError( _( "You cannot cancel a Sale Order for which a confirmed " diff --git a/sale_order_restrict_cancel_existing_invoice/tests/test_sale_cancel_existing_invoice.py b/sale_order_restrict_cancel_existing_invoice/tests/test_sale_cancel_existing_invoice.py index bc7b2fe4cb2..5861c5bf7d0 100644 --- a/sale_order_restrict_cancel_existing_invoice/tests/test_sale_cancel_existing_invoice.py +++ b/sale_order_restrict_cancel_existing_invoice/tests/test_sale_cancel_existing_invoice.py @@ -37,7 +37,7 @@ def _create_invoice_advance(self): } self.advance = self.advance_obj.create(vals) - def test_cancel(self): + def test_cancel_refused(self): self._create_sale() self._create_invoice_advance() @@ -46,3 +46,64 @@ def test_cancel(self): with self.assertRaises(UserError): self.sale.action_cancel() + + def test_cancel_invoice_reversed(self): + self._create_sale() + self._create_invoice_advance() + + self.advance.with_context(active_ids=[self.sale.id]).create_invoices() + invoice_id = self.sale.invoice_ids + invoice_id.action_post() + + ctx = { + "active_model": invoice_id._name, + "active_ids": invoice_id.ids, + "active_id": invoice_id.id, + } + wizard_obj = self.env["account.move.reversal"].with_context(**ctx) + wizard = wizard_obj.create( + { + "refund_method": 'cancel', + "reason": "reason test create", + } + ) + wizard.reverse_moves() + self.assertEqual(invoice_id.payment_state, 'reversed') + self.sale.action_cancel() + self.assertEqual(self.sale.state, 'cancel') + + def test_cancel_invoice_paid(self): + journal_id = self.env['account.journal'].create( + { + "name": "Bank", + "type": "bank", + "code": "BNK67", + } + ) + self._create_sale() + self._create_invoice_advance() + + self.advance.with_context(active_ids=[self.sale.id]).create_invoices() + invoice_id = self.sale.invoice_ids + invoice_id.action_post() + + ctx = { + "active_model": invoice_id._name, + "active_ids": invoice_id.ids, + "active_id": invoice_id.id, + } + wizard_obj = self.env["account.payment.register"].with_context(**ctx) + wizard = wizard_obj.create( + { + "amount": invoice_id.amount_total, + "journal_id": journal_id.id, + "payment_method_id": self.env.ref( + "account.account_payment_method_manual_in" + ).id, + } + ) + wizard._create_payments() + + self.assertEqual(invoice_id.payment_state, 'paid') + self.sale.action_cancel() + self.assertEqual(self.sale.state, 'cancel')