feat: Add script to force update specific Odoo vendor bills to a paid state using raw SQL.
This commit is contained in:
parent
b35ad10c51
commit
4cdbcb0bd7
74
force_update_bills_to_paid.py
Normal file
74
force_update_bills_to_paid.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Run this script using the Odoo shell:
|
||||||
|
# ./.venv/bin/python ./odoo/odoo-bin shell -d kipasdbclone7 -c odoo.conf < force_update_bills_to_paid.py
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# List of vendor bills to force update to Paid.
|
||||||
|
# You can add or remove bill names as needed before running.
|
||||||
|
BILL_NAMES = [
|
||||||
|
'BILL/2025/10/0138',
|
||||||
|
'BILL/2025/10/0137',
|
||||||
|
'BILL/2025/10/0129',
|
||||||
|
'BILL/2025/10/0111',
|
||||||
|
'BILL/2025/10/0105',
|
||||||
|
'BILL/2025/10/0094',
|
||||||
|
'BILL/2025/10/0093',
|
||||||
|
'BILL/2025/10/0088',
|
||||||
|
'BILL/2025/10/0174',
|
||||||
|
'BILL/2025/10/0076',
|
||||||
|
'BILL/2025/10/0065',
|
||||||
|
]
|
||||||
|
|
||||||
|
def force_paid_bills(env):
|
||||||
|
bills = env['account.move'].search([
|
||||||
|
('name', 'in', BILL_NAMES),
|
||||||
|
('move_type', '=', 'in_invoice')
|
||||||
|
])
|
||||||
|
|
||||||
|
if not bills:
|
||||||
|
print("No matching vendor bills found.")
|
||||||
|
return
|
||||||
|
|
||||||
|
print(f"Found {len(bills)} vendor bills to update.")
|
||||||
|
|
||||||
|
for bill in bills:
|
||||||
|
if bill.payment_state == 'paid':
|
||||||
|
print(f"[{bill.name}] is already Paid. Skipping.")
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(f"[{bill.name}] Updating state to 'paid'...")
|
||||||
|
|
||||||
|
# Use raw SQL to prevent Odoo ORM from overriding or triggering validations
|
||||||
|
# Updating the payment state and amount residual on the move
|
||||||
|
env.cr.execute("""
|
||||||
|
UPDATE account_move
|
||||||
|
SET payment_state = 'paid',
|
||||||
|
amount_residual = 0,
|
||||||
|
amount_residual_signed = 0
|
||||||
|
WHERE id = %s
|
||||||
|
""", (bill.id,))
|
||||||
|
|
||||||
|
# Updating the residual on the payable lines so it doesn't show "Amount Due" inside the form
|
||||||
|
payable_lines = bill.line_ids.filtered(lambda l: l.account_id.account_type in ('liability_payable', 'asset_receivable'))
|
||||||
|
if payable_lines:
|
||||||
|
env.cr.execute("""
|
||||||
|
UPDATE account_move_line
|
||||||
|
SET amount_residual = 0,
|
||||||
|
amount_residual_currency = 0
|
||||||
|
WHERE id IN %s
|
||||||
|
""", (tuple(payable_lines.ids),))
|
||||||
|
|
||||||
|
print("Committing changes to database...")
|
||||||
|
env.cr.commit()
|
||||||
|
|
||||||
|
# Invalidate cache so subsequent ORM calls in this session see the changes
|
||||||
|
env.invalidate_all()
|
||||||
|
print("Update complete!")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# When running via `odoo-bin shell`, the `env` variable is automatically available.
|
||||||
|
try:
|
||||||
|
force_paid_bills(env)
|
||||||
|
except NameError:
|
||||||
|
print("Please run this script using Odoo shell:")
|
||||||
|
print("Example: ./.venv/bin/python ./odoo/odoo-bin shell -d <database_name> -c odoo.conf < force_update_bills_to_paid.py")
|
||||||
Loading…
Reference in New Issue
Block a user