changes
This commit is contained in:
145
fix_elavon.py
Normal file
145
fix_elavon.py
Normal file
@@ -0,0 +1,145 @@
|
||||
import logging
|
||||
_logger = logging.getLogger('fix_elavon')
|
||||
|
||||
AML = env['account.move.line'].sudo()
|
||||
BSL = env['account.bank.statement.line'].sudo()
|
||||
|
||||
# ============================================================
|
||||
# PART 1: Fix 144 incoming Elavon payments (Bank Charges -> Outstanding Receipts)
|
||||
# ============================================================
|
||||
print('=== PART 1: Fix incoming Elavon payments ===', flush=True)
|
||||
|
||||
incoming_bad_amls = AML.search([
|
||||
('account_id', '=', 499), # Bank Charges
|
||||
('statement_line_id', '!=', False),
|
||||
('statement_line_id.payment_ref', 'ilike', 'elavon'),
|
||||
('credit', '>', 0), # Credit to Bank Charges = incoming payment writeoff
|
||||
])
|
||||
|
||||
# Filter to only those where the statement line amount > 0 (incoming)
|
||||
incoming_ids = []
|
||||
for aml in incoming_bad_amls:
|
||||
if aml.statement_line_id.amount > 0:
|
||||
incoming_ids.append(aml.id)
|
||||
|
||||
print(f'Found {len(incoming_ids)} incoming Elavon writeoff lines to fix', flush=True)
|
||||
|
||||
if incoming_ids:
|
||||
# Direct SQL update - change account from 499 to 493
|
||||
env.cr.execute("""
|
||||
UPDATE account_move_line
|
||||
SET account_id = 493
|
||||
WHERE id IN %s
|
||||
""", (tuple(incoming_ids),))
|
||||
env.cr.commit()
|
||||
print(f'Changed {len(incoming_ids)} lines: Bank Charges (499) -> Outstanding Receipts (493)', flush=True)
|
||||
|
||||
# ============================================================
|
||||
# PART 2: Fix 6 round-number refund Business PADs
|
||||
# ============================================================
|
||||
print('\n=== PART 2: Fix round-number customer refunds ===', flush=True)
|
||||
|
||||
refund_bad_amls = AML.search([
|
||||
('account_id', '=', 499), # Bank Charges
|
||||
('statement_line_id', '!=', False),
|
||||
('statement_line_id.payment_ref', 'ilike', 'elavon'),
|
||||
('debit', '>', 0), # Debit to Bank Charges = outgoing writeoff
|
||||
])
|
||||
|
||||
refund_ids = []
|
||||
for aml in refund_bad_amls:
|
||||
st_line = aml.statement_line_id
|
||||
if st_line.amount < 0 and st_line.amount == round(st_line.amount, 0):
|
||||
refund_ids.append(aml.id)
|
||||
print(f' Refund: line {st_line.id}, ${st_line.amount}, {st_line.move_id.date}', flush=True)
|
||||
|
||||
print(f'Found {len(refund_ids)} round-number refund lines to fix', flush=True)
|
||||
|
||||
if refund_ids:
|
||||
env.cr.execute("""
|
||||
UPDATE account_move_line
|
||||
SET account_id = 493
|
||||
WHERE id IN %s
|
||||
""", (tuple(refund_ids),))
|
||||
env.cr.commit()
|
||||
print(f'Changed {len(refund_ids)} lines: Bank Charges (499) -> Outstanding Receipts (493)', flush=True)
|
||||
|
||||
# ============================================================
|
||||
# PART 3: Fix reconcile model 96 - should ONLY match fees (Business PAD)
|
||||
# and create new model for incoming Elavon payments
|
||||
# ============================================================
|
||||
print('\n=== PART 3: Update reconcile models ===', flush=True)
|
||||
|
||||
# Model 96 currently matches "Elavon Mrch Svc" which catches EVERYTHING
|
||||
# Change it to only match "Business PAD" (the fees)
|
||||
model96 = env['account.reconcile.model'].sudo().browse(96)
|
||||
print(f'Model 96 before: match="{model96.match_label_param}", account={model96.line_ids.account_id.name}', flush=True)
|
||||
|
||||
model96.write({'match_label_param': 'Business PAD'})
|
||||
# Keep account 499 (Bank Charges) for the fees - that's correct
|
||||
print(f'Model 96 after: match="{model96.match_label_param}" (now only matches fees)', flush=True)
|
||||
|
||||
# Model 85 matches "MRCH" which also catches Elavon payments on RBC Chequing
|
||||
# Leave it for now - those are the RBC monthly MRCH fee lines, different pattern
|
||||
|
||||
# Create new model for incoming Elavon payments -> Outstanding Receipts (493)
|
||||
existing = env['account.reconcile.model'].sudo().search([
|
||||
('match_label_param', '=', 'Elavon Mrch Svc : Miscellaneous'),
|
||||
])
|
||||
if not existing:
|
||||
new_model = env['account.reconcile.model'].sudo().create({
|
||||
'name': 'Elavon Customer Payment Deposit',
|
||||
'sequence': 55,
|
||||
'company_id': 1,
|
||||
'trigger': 'auto_reconcile',
|
||||
'match_label': 'contains',
|
||||
'match_label_param': 'Elavon Mrch Svc : Miscellaneous',
|
||||
'can_be_proposed': True,
|
||||
})
|
||||
new_line = env['account.reconcile.model.line'].sudo().create({
|
||||
'model_id': new_model.id,
|
||||
'company_id': 1,
|
||||
'sequence': 10,
|
||||
'account_id': 493, # Outstanding Receipts
|
||||
'amount_type': 'percentage',
|
||||
'amount': 100,
|
||||
'amount_string': '100',
|
||||
'label': 'Elavon Visa Terminal Customer Payment',
|
||||
'partner_id': 1, # Westin Healthcare (company)
|
||||
})
|
||||
# No tax on payment deposits
|
||||
env.cr.execute("""
|
||||
INSERT INTO account_reconcile_model_line_account_tax_rel
|
||||
(account_reconcile_model_line_id, account_tax_id) VALUES (%s, 32)
|
||||
""", (new_line.id,))
|
||||
print(f'Created new model: "Elavon Customer Payment Deposit" -> Outstanding Receipts (493)', flush=True)
|
||||
else:
|
||||
print(f'Model for Elavon incoming already exists: {existing.name}', flush=True)
|
||||
|
||||
env.cr.commit()
|
||||
|
||||
# ============================================================
|
||||
# PART 4: Verify
|
||||
# ============================================================
|
||||
print('\n=== VERIFICATION ===', flush=True)
|
||||
|
||||
# Count remaining Elavon lines posted to Bank Charges
|
||||
remaining_499 = env.cr.execute("""
|
||||
SELECT COUNT(*), ROUND(SUM(ABS(aml.balance))::numeric, 2)
|
||||
FROM account_move_line aml
|
||||
JOIN account_bank_statement_line bsl ON bsl.id = aml.statement_line_id
|
||||
WHERE aml.account_id = 499 AND bsl.payment_ref ILIKE '%%elavon%%'
|
||||
""")
|
||||
row = env.cr.fetchone()
|
||||
print(f'Elavon lines still on Bank Charges: {row[0]} lines, ${row[1]}', flush=True)
|
||||
print('(These should be the monthly processing fees only)', flush=True)
|
||||
|
||||
# Count Elavon lines now on Outstanding Receipts
|
||||
env.cr.execute("""
|
||||
SELECT COUNT(*), ROUND(SUM(ABS(aml.balance))::numeric, 2)
|
||||
FROM account_move_line aml
|
||||
JOIN account_bank_statement_line bsl ON bsl.id = aml.statement_line_id
|
||||
WHERE aml.account_id = 493 AND bsl.payment_ref ILIKE '%%elavon%%'
|
||||
""")
|
||||
row = env.cr.fetchone()
|
||||
print(f'Elavon lines now on Outstanding Receipts: {row[0]} lines, ${row[1]}', flush=True)
|
||||
Reference in New Issue
Block a user