This commit is contained in:
gsinghpal
2026-04-03 15:45:18 -04:00
parent 4cd7357aa0
commit c66bdf5089
71 changed files with 6721 additions and 118 deletions

77
run_transfer_reconcile.py Normal file
View File

@@ -0,0 +1,77 @@
import logging
AML = env['account.move.line'].sudo()
BSL = env['account.bank.statement.line'].sudo()
company_partner_id = env.company.partner_id.id
# No date limit this time — match oldest outstanding first
TRANSFER_PAIRS = [
(50, 51, 493), # Scotia Current -> Passport Visa
(53, 28, 493), # RBC Chequing -> RBC Visa
]
total_reconciled = 0
for source_jid, cc_jid, outstanding_acct_id in TRANSFER_PAIRS:
cc_lines = BSL.search([
('journal_id', '=', cc_jid),
('is_reconciled', '=', False),
('amount', '>', 0),
('company_id', '=', env.company.id),
])
# Filter to only transfer-like patterns (round amounts, payment from)
transfer_lines = cc_lines.filtered(
lambda l: (l.payment_ref or '').lower().startswith(('payment from', 'from'))
)
if not transfer_lines:
print(f'Journal {cc_jid}: no transfer lines found', flush=True)
continue
journal_name = transfer_lines[0].journal_id.name
print(f'Processing {journal_name}: {len(transfer_lines)} transfer lines (no date limit)', flush=True)
# Pre-load all outstanding entries for this account/partner, sorted by date
all_outstanding = AML.search([
('account_id', '=', outstanding_acct_id),
('partner_id', '=', company_partner_id),
('reconciled', '=', False),
('amount_residual', '>', 0),
], order='date asc')
# Index by amount for fast lookup
by_amount = {}
for o in all_outstanding:
by_amount.setdefault(o.amount_residual, []).append(o)
reconciled = 0
no_match = 0
used_ids = set()
# Sort lines by date (oldest first)
for line in sorted(transfer_lines, key=lambda l: l.move_id.date):
amount = line.amount
candidates = [c for c in by_amount.get(amount, []) if c.id not in used_ids]
if not candidates:
no_match += 1
continue
# Take the first (oldest) candidate
best = candidates[0]
try:
line.partner_id = company_partner_id
line.set_line_bank_statement_line(best.ids)
used_ids.add(best.id)
reconciled += 1
except Exception as e:
print(f' Error: line {line.id} (${amount}): {e}', flush=True)
if reconciled % 50 == 0 and reconciled > 0:
env.cr.commit()
env.cr.commit()
total_reconciled += reconciled
print(f'DONE {journal_name}: reconciled={reconciled}, no_match={no_match}', flush=True)
print(f'TOTAL: {total_reconciled} transfer lines reconciled', flush=True)