From c823f477aa2a277070567b3d82c9d26bf7f03532 Mon Sep 17 00:00:00 2001 From: Yolann Sabaux Date: Thu, 2 Mar 2023 14:09:26 +0000 Subject: [PATCH] [FIX] stock_account: prevent reconcile move_lines in draft Steps to reproduce: - create two storable products (Great Product - Super Product) - automated avco - create rfq with the two products - confirm -receive products - create Bill - set qty of one Great Product to 0 -> save - create bill for the Great Product - confirm Issue: User Error You can only reconcile posted entries Cause: `_get_all_related_aml()` fetches all aml related to the `stock_moves` with the product in the bill we want to post. It retrieves the aml of the bill in which we have put the product quantity to 0 but that it is still in draft. And we try to reconcile this draft move_line in https://github.com/odoo/odoo/blob/d0fdc38385f5f259da259d21e9137494e6d7c17d/addons/account/models/account_move_line.py#L2308 Solution: filter the `product_account_moves(_lines)` so we don't take into account moves that are still in draft opw-3180209 closes odoo/odoo#114328 X-original-commit: b1a74a1841c05e4e37643e17f6b97dfff11555cd Signed-off-by: Adrien Widart --- ...st_anglo_saxon_valuation_reconciliation.py | 53 ++++++++++++++++++- addons/stock_account/models/account_move.py | 2 +- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py index fbc78b466c1..d2d0a7f89b1 100644 --- a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py +++ b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py @@ -5,7 +5,7 @@ from freezegun import freeze_time from odoo.addons.stock_account.tests.test_anglo_saxon_valuation_reconciliation_common import ValuationReconciliationTestCommon from odoo.tests.common import Form, tagged -from odoo import fields +from odoo import Command, fields @@ -391,3 +391,54 @@ class TestValuationReconciliation(ValuationReconciliationTestCommon): {'debit': 0.0, 'credit': 50.0, 'amount_currency': -100.0, 'account_id': cash_basis_transfer_account.id}, {'debit': 50.0, 'credit': 0.0, 'amount_currency': 100.0, 'account_id': tax_account_1.id}, ]) + + def test_reconciliation_differed_billing(self): + """ + Test whether products received billed at different time will be correctly reconciled + valuation: automated + - create a rfq + - receive products + - create bill - set quantity of product A = 0 - save + - create bill - confirm + -> the reconciliation should not take into account the lines of the first bill + """ + date_po_and_delivery = '2022-03-02' + self.product_a.write({ + 'categ_id': self.stock_account_product_categ, + 'detailed_type': 'product', + }) + self.product_b.write({ + 'categ_id': self.stock_account_product_categ, + 'detailed_type': 'product', + }) + purchase_order = self.env['purchase.order'].create({ + 'currency_id': self.currency_data['currency'].id, + 'order_line': [ + Command.create({ + 'name': self.product_a.name, + 'product_id': self.product_a.id, + 'product_qty': 1, + }), + Command.create({ + 'name': self.product_b.name, + 'product_id': self.product_b.id, + 'product_qty': 1, + }), + ], + 'partner_id': self.partner_a.id, + }) + purchase_order.button_confirm() + self._process_pickings(purchase_order.picking_ids, date=date_po_and_delivery) + + bill_1 = self._create_invoice_for_po(purchase_order, date_po_and_delivery) + move_form = Form(bill_1) + with move_form.invoice_line_ids.edit(0) as line_form: + line_form.quantity = 0 + move_form.save() + + bill_2 = self._create_invoice_for_po(purchase_order, date=date_po_and_delivery) + bill_2.action_post() + aml = bill_2.line_ids.filtered(lambda line: line.display_type == "product") + pol = purchase_order.order_line + self.assertRecordValues(pol, [{'qty_invoiced': line.qty_received} for line in pol]) + self.assertRecordValues(aml, [{'reconciled': True} for line in aml]) diff --git a/addons/stock_account/models/account_move.py b/addons/stock_account/models/account_move.py index 0a84779d207..23cdf1f7f7e 100644 --- a/addons/stock_account/models/account_move.py +++ b/addons/stock_account/models/account_move.py @@ -233,7 +233,7 @@ class AccountMove(models.Model): # Search for anglo-saxon lines linked to the product in the stock moves. product_stock_moves = stock_moves.filtered(lambda stock_move: stock_move.product_id == prod) product_account_moves |= product_stock_moves._get_all_related_aml().filtered( - lambda line: line.account_id == product_interim_account and not line.reconciled + lambda line: line.account_id == product_interim_account and not line.reconciled and line.move_id.state == "posted" ) # Reconcile.