odoo_utility_scripts/force_update_bills_to_paid.py

75 lines
2.5 KiB
Python

# 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")