From 7cddba31354cd6301a83a14ccbbd1cdd0e7f52b4 Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Tue, 3 Feb 2026 13:26:09 +0700 Subject: [PATCH] feat: add script to delete incorrect stock valuation layers and their associated account moves. --- delete_valuation_layer_script.py | 53 ++++++++++++++++++ .../account_move_line.cpython-312.pyc | Bin 11634 -> 6308 bytes 2 files changed, 53 insertions(+) create mode 100644 delete_valuation_layer_script.py diff --git a/delete_valuation_layer_script.py b/delete_valuation_layer_script.py new file mode 100644 index 0000000..9fc76a4 --- /dev/null +++ b/delete_valuation_layer_script.py @@ -0,0 +1,53 @@ +# SCRIPT TO DELETE INCORRECT VALUATION LAYER +# Run this in: ./odoo-bin shell -d + +def fix_valuation(): + print("Searching for remaining candidate layers...") + + # Broaden search to include the 420,000 one and any others similar + layer_domain = [ + ('product_id.name', 'ilike', 'Kotak Imlek Pink'), + ('quantity', '=', 0), + ('value', '!=', 0), + ('description', 'like', 'Valuation correction%') # Safety check + ] + + layers = env['stock.valuation.layer'].search(layer_domain) + + print(f"Found {len(layers)} remaining layers with 0 quantity and non-zero value.") + + if not layers: + print("No more incorrect layers found!") + return + + for layer in layers: + print(f"\n---------------------------------------------------") + print(f"Layer ID: {layer.id}") + print(f"Product: {layer.product_id.display_name}") + print(f"Description: {layer.description}") + print(f"Value: {layer.value}") + print(f"Linked Account Move: {layer.account_move_id.name if layer.account_move_id else 'None'}") + + # We can just proceed to delete since we confirmed these are the bad ones + # But let's check values to be sure it matches the 420k one or similar + print(">>> DELETING <<<") + + # UNLINK ACCOUNT MOVE + if layer.account_move_id: + print(f"Deleting associated account move: {layer.account_move_id.name}") + try: + if layer.account_move_id.state == 'posted': + layer.account_move_id.button_draft() + layer.account_move_id.unlink() + except Exception as e: + print(f"Could not delete account move: {e}") + + # UNLINK LAYER + print("Deleting layer...") + layer.unlink() + print("Layer deleted successfully.") + + env.cr.commit() + print("\nAll changes committed to database.") + +fix_valuation() diff --git a/models/__pycache__/account_move_line.cpython-312.pyc b/models/__pycache__/account_move_line.cpython-312.pyc index 26b2f8c093f28579824dac8282f4ae170305f3a0..9bad0f5d88c18b01b0ccf6481e294fc2c9218f2b 100644 GIT binary patch delta 283 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 Am;e9(