From 96c8b20dafeac4c4212b4fdac7822a58960ca625 Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Wed, 24 Jun 2020 13:14:08 +0000 Subject: [PATCH] [FIX] sale_stock: reconcile refunds from SO - Create a product P, valuation FIFO automated - Receive some stock - Create a SO with 1 unit, validate - Validate the picking - Create the invoice, validate => the Stock Interim Account (Delivered) entries from the invoice and the stock move are reconciled - Return the picking, choose to update the quantity on SO - Validate - From the SO, create the invoice (which is a credit note), validate The Stock Interim Account (Delivered) entries from the credit note and the returned stock move are not reconciled. Note that both entries are properly reconciled if the refund is generated directly from the original invoice. When retrieving the stock moves linked to the invoice, we always go through the `refund_invoice_id` field, which is not filled in this specific case. The solution is to search from moves directly from the credit note itself. opw-2274731 closes odoo/odoo#53610 X-original-commit: 6aa7e843f427df17bc0845c44ab2345cfa93fb77 Signed-off-by: Nicolas Martinelli (nim) --- addons/sale_stock/models/account_move.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/sale_stock/models/account_move.py b/addons/sale_stock/models/account_move.py index 8fddd3c092e..a3632af2049 100644 --- a/addons/sale_stock/models/account_move.py +++ b/addons/sale_stock/models/account_move.py @@ -18,6 +18,8 @@ class AccountMove(models.Model): rslt += invoice.mapped('invoice_line_ids.sale_line_ids.move_ids').filtered(lambda x: x.state == 'done' and x.location_dest_id.usage == 'customer') for invoice in self.filtered(lambda x: x.move_type == 'out_refund'): rslt += invoice.mapped('reversed_entry_id.invoice_line_ids.sale_line_ids.move_ids').filtered(lambda x: x.state == 'done' and x.location_id.usage == 'customer') + # Add refunds generated from the SO + rslt += invoice.mapped('invoice_line_ids.sale_line_ids.move_ids').filtered(lambda x: x.state == 'done' and x.location_id.usage == 'customer') return rslt def _get_invoiced_lot_values(self):