From c4f42b813ed9ea78f01e22227c514b6824c4b881 Mon Sep 17 00:00:00 2001 From: Quang Nguyen Date: Mon, 23 Oct 2023 11:05:17 -0700 Subject: [PATCH] [FIX] stock_account: Correctly pass ID rather than record When trying to prepare account move line, we are unexpectedly browsing a record instead of the record's ID. This causes psycopg2.ProgrammingError: can't adapt type 'stock.valuation.layer' Step to reproduce: 1. Set up product storable Average cost Automated Inventory Valuation set a standard price e.g $27 2. Create a purchase order for 1 unit in another currency E.g Eur 3. Confirm the purchase order and validate the transfer. 4. Go on the transfer and create a return. Change the return quantity to be more than what received E.g 100 5. Process the return. 6. Go back to the purchase order and create a vendor bill 7. Now try to create a new purchase order and receive the item. Fix: pass in vacuum_svl.id instead of just vacuum_svl into _prepare_account_move_line opw-3555146 closes odoo/odoo#142798 X-original-commit: a5cdbbc3c0a8b617cb6efe151621ad06216e812c Signed-off-by: William Henrotin (whe) --- ...st_anglo_saxon_valuation_reconciliation.py | 70 +++++++++++++++++++ addons/stock_account/models/product.py | 2 +- 2 files changed, 71 insertions(+), 1 deletion(-) 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 be3b2e513e2..bfa4913f9d8 100644 --- a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py +++ b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py @@ -444,3 +444,73 @@ class TestValuationReconciliation(ValuationReconciliationTestCommon): 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]) + + def test_create_fifo_vacuum_anglo_saxon_expense_entry(self): + + # create purchase + self.product_a.write({ + 'standard_price': 27.0, + 'categ_id': self.stock_account_product_categ, + 'detailed_type': 'product', + }) + + self.stock_account_product_categ['property_cost_method'] = 'average' + + #create purchase + date_po_and_delivery = '2018-01-01' + purchase_order = self._create_purchase(self.product_a, date_po_and_delivery, 1, price_unit=27) + + # proccess picking + self._process_pickings(purchase_order.picking_ids, date=date_po_and_delivery) + + # create return + picking = purchase_order.picking_ids[0] + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking.ids, active_id=picking.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() + stock_return_picking.product_return_moves.write({'quantity': 1000.0}) + stock_return_picking_action = stock_return_picking.create_returns() + return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) + return_pick.move_line_ids.write({'quantity': 1000}) + return_pick.button_validate() + + # create vendor bill + move_form = Form(self.env['account.move'].with_context(default_move_type='in_refund')) + move_form._view['modifiers']['purchase_id']['invisible'] = False + move_form.partner_id = purchase_order.partner_id + move_form.invoice_date = date_po_and_delivery + move_form.purchase_id = purchase_order + with move_form.invoice_line_ids.edit(0) as line_form: + line_form.quantity = 999.0 + invoice = move_form.save() + invoice.action_post() + + # register payment + self.env['account.payment.register']\ + .with_context(active_ids=invoice.ids, active_model='account.move')\ + .create({})\ + ._create_payments() + + # create another purchase + purchase_order2 = self.env['purchase.order'].create({ + 'partner_id': self.partner_a.id, + 'currency_id': self.env.company.currency_id.id, + 'order_line': [ + (0, 0, { + 'name': self.product_a.name, + 'product_id': self.product_a.id, + 'product_qty': 1, + 'product_uom': self.product_a.uom_po_id.id, + 'price_unit': 29, + 'date_planned': date_po_and_delivery, + })], + 'date_order': date_po_and_delivery, + }) + # confirm PO + purchase_order2.button_confirm() + # process pickings + self._process_pickings(purchase_order2.picking_ids, date_po_and_delivery) + + picking2 = purchase_order2.picking_ids[0] + self.assertEqual(picking2.state, 'done') diff --git a/addons/stock_account/models/product.py b/addons/stock_account/models/product.py index c373dce26d2..eb8f75a8e5b 100644 --- a/addons/stock_account/models/product.py +++ b/addons/stock_account/models/product.py @@ -533,7 +533,7 @@ class ProductProduct(models.Model): move_lines = vacuum_svl.stock_move_id._prepare_account_move_line( vacuum_svl.quantity, vacuum_svl.value * -1, accounts['stock_output'].id, accounts['expense'].id, - vacuum_svl, description) + vacuum_svl.id, description) new_account_move = AccountMove.sudo().create({ 'journal_id': accounts['stock_journal'].id, 'line_ids': move_lines,