production-evyos-systems-an.../ServicesBank/Finder/Payment/draft/debug-payment.py

189 lines
7.4 KiB
Python

#!/usr/bin/env python3
# Debug script to test payment processing functions directly
import sys
import os
from datetime import datetime
from time import perf_counter
from sqlalchemy import func
# Import directly from the draft-first-work.py file in the same directory
sys.path.insert(0, '/draft')
# Import the necessary functions and classes directly from the file
from draft_first_work import * # Import everything for simplicity
def debug_find_unpaid_debts(build_parts_id, session):
"""Find unpaid debts directly using raw SQL for debugging."""
print(f"\nDEBUG: Finding unpaid debts for build part ID: {build_parts_id}")
# Set session for the model
BuildDecisionBookPayments.set_session(session)
# Get payment types
payment_types = get_enums_from_database()
for payment_type in payment_types:
print(f"\nChecking payment type: {payment_type.key}")
# Find debits that don't have account_records_id set (unpaid)
query = session.query(BuildDecisionBookPayments).filter(
BuildDecisionBookPayments.build_parts_id == build_parts_id,
BuildDecisionBookPayments.payment_types_id == payment_type.id,
BuildDecisionBookPayments.account_is_debit == True,
BuildDecisionBookPayments.account_records_id.is_(None)
)
# Print the SQL query
print(f"SQL Query: {query}")
# Execute the query
unpaid_debts = query.all()
print(f"Found {len(unpaid_debts)} unpaid debts")
# Print details of each unpaid debt
for i, debt in enumerate(unpaid_debts[:5]): # Limit to first 5 for brevity
print(f" Debt {i+1}:")
print(f" ID: {debt.id}")
print(f" UUID: {debt.uu_id}")
print(f" Amount: {abs(debt.payment_amount):,.2f} TL")
print(f" Process Date: {debt.process_date}")
print(f" Account Records ID: {debt.account_records_id}")
# Check if any payments have been made for this debt
credit_query = session.query(
func.sum(func.abs(BuildDecisionBookPayments.payment_amount))
).filter(
BuildDecisionBookPayments.ref_id == str(debt.uu_id),
BuildDecisionBookPayments.account_is_debit == False
)
credit_amount = credit_query.scalar() or 0
print(f" Payments made: {credit_amount:,.2f} TL")
print(f" Remaining to pay: {abs(debt.payment_amount) - credit_amount:,.2f} TL")
def debug_process_payment(build_parts_id, session):
"""Process a single payment for debugging purposes."""
print(f"\nDEBUG: Processing payment for build part ID: {build_parts_id}")
# Set session for all models
AccountRecords.set_session(session)
BuildDecisionBookPayments.set_session(session)
# Get payment types in priority order
payment_type_list = get_enums_from_database()
# Get account records with positive currency_value
account_query = AccountRecords.query.filter(
AccountRecords.build_parts_id == build_parts_id,
AccountRecords.currency_value > 0,
AccountRecords.bank_date >= '2022-01-01'
).order_by(AccountRecords.id.desc()).limit(5)
print(f"Account query: {account_query}")
account_records = account_query.all()
print(f"Found {len(account_records)} account records with funds")
# Print account details
for i, account in enumerate(account_records):
available_funds = abs(account.currency_value) - abs(account.remainder_balance)
print(f" Account {i+1}: ID: {account.id}, Build Part ID: {account.build_parts_id}, Value: {account.currency_value:,.2f} TL, Available: {available_funds:,.2f} TL")
if not account_records:
print("No account records found with funds. Cannot process payments.")
return
# Use the first account with funds
account_record = account_records[0]
money_in_account = abs(account_record.currency_value) - abs(account_record.remainder_balance)
print(f"\nUsing account ID: {account_record.id} with available funds: {money_in_account:,.2f} TL")
# Get the first payment type
payment_type = payment_type_list[0]
print(f"Using payment type: {payment_type.key}")
# Find unpaid debts for this payment type
query = session.query(BuildDecisionBookPayments).filter(
BuildDecisionBookPayments.build_parts_id == build_parts_id,
BuildDecisionBookPayments.payment_types_id == payment_type.id,
BuildDecisionBookPayments.account_is_debit == True,
BuildDecisionBookPayments.account_records_id.is_(None)
).limit(1)
print(f"Unpaid debt query: {query}")
unpaid_debt = query.first()
if not unpaid_debt:
print(f"No unpaid debts found for payment type {payment_type.key}")
return
print(f"\nFound unpaid debt:")
print(f" ID: {unpaid_debt.id}")
print(f" UUID: {unpaid_debt.uu_id}")
print(f" Amount: {abs(unpaid_debt.payment_amount):,.2f} TL")
# Calculate amount to pay
debt_amount = abs(unpaid_debt.payment_amount)
payment_amount = min(debt_amount, money_in_account)
print(f"\nProcessing payment:")
print(f" Debt amount: {debt_amount:,.2f} TL")
print(f" Available funds: {money_in_account:,.2f} TL")
print(f" Will pay: {payment_amount:,.2f} TL")
# Make payment
try:
print("Creating payment record...")
before_state = session.query(BuildDecisionBookPayments).filter(
BuildDecisionBookPayments.uu_id == unpaid_debt.uu_id
).first()
print(f"Before payment - account_records_id: {before_state.account_records_id}")
new_payment = close_payment_book(unpaid_debt, account_record, payment_amount, session)
# Verify the payment was created
after_state = session.query(BuildDecisionBookPayments).filter(
BuildDecisionBookPayments.uu_id == unpaid_debt.uu_id
).first()
print(f"After payment - account_records_id: {after_state.account_records_id}")
# Check if the new payment record was created
if new_payment:
print(f"New payment record created with ID: {new_payment.id}")
print(f"New payment amount: {abs(new_payment.payment_amount):,.2f} TL")
print(f"New payment ref_id: {new_payment.ref_id}")
print(f"New payment account_is_debit: {new_payment.account_is_debit}")
else:
print("Failed to create new payment record")
# Commit the transaction
session.commit()
print("Transaction committed successfully")
except Exception as e:
session.rollback()
print(f"Error making payment: {str(e)}")
print("Transaction rolled back")
if __name__ == "__main__":
start_time = perf_counter()
print("\n===== PAYMENT PROCESSING DEBUG =====\n")
# Create a session
session_factory = get_session_factory()
session = session_factory()
# Set the build part ID to debug
build_part_id = 14 # Change this to the build part ID you want to debug
# Find unpaid debts
debug_find_unpaid_debts(build_part_id, session)
# Process a single payment
debug_process_payment(build_part_id, session)
end_time = perf_counter()
print(f"\nDebug completed in {end_time - start_time:.3f} seconds")