From 5bcc1ccd6ab0fb4060befed29bc02c2dcd9d8bf1 Mon Sep 17 00:00:00 2001 From: adrip-s73 Date: Tue, 6 Feb 2024 17:49:17 +0100 Subject: [PATCH 1/3] [16.0][IMP] sale_advance_payment: conciliation payment --- sale_advance_payment/models/account_move.py | 27 +++++++++++++-------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/sale_advance_payment/models/account_move.py b/sale_advance_payment/models/account_move.py index 72d484fb6c3..65f37cdfc07 100644 --- a/sale_advance_payment/models/account_move.py +++ b/sale_advance_payment/models/account_move.py @@ -7,15 +7,22 @@ class AccountMove(models.Model): _inherit = "account.move" - def action_post(self): + def _post(self, soft=True): # Automatic reconciliation of payment when invoice confirmed. - res = super(AccountMove, self).action_post() - sale_order = self.mapped("line_ids.sale_line_ids.order_id") - if sale_order and self.invoice_outstanding_credits_debits_widget is not False: - json_invoice_outstanding_data = ( - self.invoice_outstanding_credits_debits_widget.get("content", []) - ) - for data in json_invoice_outstanding_data: - if data.get("move_id") in sale_order.account_payment_ids.move_id.ids: - self.js_assign_outstanding_line(line_id=data.get("id")) + res = super(AccountMove, self)._post(soft=soft) + for move in self: + sale_order = move.mapped("line_ids.sale_line_ids.order_id") + if ( + sale_order + and move.invoice_outstanding_credits_debits_widget is not False + ): + json_invoice_outstanding_data = ( + move.invoice_outstanding_credits_debits_widget.get("content", []) + ) + for data in json_invoice_outstanding_data: + if ( + data.get("move_id") + in sale_order.account_payment_ids.move_id.ids + ): + move.js_assign_outstanding_line(line_id=data.get("id")) return res From 02cf640a0c0d39f4522174be379d0f6c14c69f29 Mon Sep 17 00:00:00 2001 From: Aritz Olea Date: Tue, 4 Feb 2025 09:52:53 +0100 Subject: [PATCH 2/3] [IMP] sale_advance_payment: Refactor _post code --- sale_advance_payment/models/account_move.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/sale_advance_payment/models/account_move.py b/sale_advance_payment/models/account_move.py index 65f37cdfc07..591ecd2f9e3 100644 --- a/sale_advance_payment/models/account_move.py +++ b/sale_advance_payment/models/account_move.py @@ -13,16 +13,14 @@ def _post(self, soft=True): for move in self: sale_order = move.mapped("line_ids.sale_line_ids.order_id") if ( - sale_order - and move.invoice_outstanding_credits_debits_widget is not False + not sale_order + or move.invoice_outstanding_credits_debits_widget is False ): - json_invoice_outstanding_data = ( - move.invoice_outstanding_credits_debits_widget.get("content", []) - ) - for data in json_invoice_outstanding_data: - if ( - data.get("move_id") - in sale_order.account_payment_ids.move_id.ids - ): - move.js_assign_outstanding_line(line_id=data.get("id")) + continue + json_invoice_outstanding_data = ( + move.invoice_outstanding_credits_debits_widget.get("content", []) + ) + for data in json_invoice_outstanding_data: + if data.get("move_id") in sale_order.account_payment_ids.move_id.ids: + move.js_assign_outstanding_line(line_id=data.get("id")) return res From 16057c3bb9845c9b2122a12245b403b071bfc0ad Mon Sep 17 00:00:00 2001 From: Aritz Olea Date: Tue, 4 Feb 2025 09:53:28 +0100 Subject: [PATCH 3/3] [IMP] sale_advance_payment: Add test for invoice multi-validate wizard --- .../tests/test_sale_advance_payment.py | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/sale_advance_payment/tests/test_sale_advance_payment.py b/sale_advance_payment/tests/test_sale_advance_payment.py index f418dcc3349..d914f6069dd 100644 --- a/sale_advance_payment/tests/test_sale_advance_payment.py +++ b/sale_advance_payment/tests/test_sale_advance_payment.py @@ -375,3 +375,110 @@ def test_03_residual_amount_big_pre_payment(self): self.assertEqual(invoice.amount_residual, 0.0) self.assertEqual(self.sale_order_1.amount_residual, 1600) self.assertEqual(invoice.amount_residual, 0) + + def test_04_sale_advance_payment_multi_inv_validate_wiz(self): + self.assertEqual( + self.sale_order_1.amount_residual, + 3600, + ) + self.assertEqual( + self.sale_order_1.amount_residual, + self.sale_order_1.amount_total, + "Amounts should match", + ) + + context_payment = { + "active_ids": [self.sale_order_1.id], + "active_id": self.sale_order_1.id, + } + + # Create Advance Payment 1 - EUR - bank + advance_payment_1 = ( + self.env["account.voucher.wizard"] + .with_context(**context_payment) + .create( + { + "journal_id": self.journal_eur_bank.id, + "payment_type": "inbound", + "amount_advance": 100, + "order_id": self.sale_order_1.id, + } + ) + ) + advance_payment_1.make_advance_payment() + + self.assertEqual(self.sale_order_1.amount_residual, 3480) + + # Create Advance Payment 2 - USD - cash + advance_payment_2 = ( + self.env["account.voucher.wizard"] + .with_context(**context_payment) + .create( + { + "journal_id": self.journal_usd_cash.id, + "payment_type": "inbound", + "amount_advance": 200, + "order_id": self.sale_order_1.id, + } + ) + ) + advance_payment_2.make_advance_payment() + + self.assertEqual(self.sale_order_1.amount_residual, 3280) + + # Confirm Sale Order + self.sale_order_1.action_confirm() + + # Create Advance Payment 3 - EUR - cash + advance_payment_3 = ( + self.env["account.voucher.wizard"] + .with_context(**context_payment) + .create( + { + "journal_id": self.journal_eur_cash.id, + "payment_type": "inbound", + "amount_advance": 250, + "order_id": self.sale_order_1.id, + } + ) + ) + advance_payment_3.make_advance_payment() + self.assertEqual(self.sale_order_1.amount_residual, 2980) + + # Create Advance Payment 4 - USD - bank + advance_payment_4 = ( + self.env["account.voucher.wizard"] + .with_context(**context_payment) + .create( + { + "journal_id": self.journal_usd_bank.id, + "payment_type": "inbound", + "amount_advance": 400, + "order_id": self.sale_order_1.id, + } + ) + ) + advance_payment_4.make_advance_payment() + self.assertEqual(self.sale_order_1.amount_residual, 2580) + + # Confirm Sale Order + self.sale_order_1.action_confirm() + + # Create Invoice + invoice = self.sale_order_1._create_invoices() + self.assertEqual(invoice.state, "draft") + validate_wiz = ( + self.env["validate.account.move"] + .with_context(active_model="account.move", active_ids=invoice.ids) + .create({}) + ) + validate_wiz.validate_move() + self.assertEqual(invoice.state, "posted") + self.assertEqual(invoice.payment_state, "partial") + + # Compare payments + rate = self.currency_rate.rate + payment_list = [100 * rate, 200, 250 * rate, 400] + payments = invoice.invoice_outstanding_credits_debits_widget + result = [d["amount"] for d in payments["content"]] + self.assertEqual(set(payment_list), set(result))