184 lines
7.0 KiB
Python
184 lines
7.0 KiB
Python
import os
|
|
import uuid
|
|
import tigerbeetle as tb
|
|
from django.contrib.auth import get_user_model
|
|
from django.conf import settings
|
|
from billing_app.models import Account as AccountModel
|
|
from billing_app.tigerbeetle_client import tigerbeetle_client
|
|
|
|
# Ensure Django settings are configured if not already
|
|
if not settings.configured:
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'billing.settings')
|
|
import django
|
|
django.setup()
|
|
|
|
# Define Ledger and Code (these are example values, adjust as needed)
|
|
LEDGER = 700
|
|
CODE = 10
|
|
|
|
print("--- Starting Raw Data Display for Multiple Transactions ---")
|
|
|
|
# 1. Create source, destination, and bank accounts
|
|
print("Creating source, destination, and bank accounts...")
|
|
source_account_id = uuid.uuid4()
|
|
destination_account_id = uuid.uuid4()
|
|
bank_account_id = uuid.uuid4() # Bank account for initial funding
|
|
|
|
# Create in local DB
|
|
source_local_account = AccountModel.objects.create(uuid=source_account_id)
|
|
destination_local_account = AccountModel.objects.create(uuid=destination_account_id)
|
|
bank_local_account = AccountModel.objects.create(uuid=bank_account_id)
|
|
|
|
# Prepare for TigerBeetle
|
|
accounts_to_create_details = [
|
|
{
|
|
"id": source_account_id.int,
|
|
"ledger": LEDGER,
|
|
"code": CODE,
|
|
"flags": tb.AccountFlags.NONE # All flags set to NONE for simplicity
|
|
},
|
|
{
|
|
"id": destination_account_id.int,
|
|
"ledger": LEDGER,
|
|
"code": CODE,
|
|
"flags": tb.AccountFlags.NONE # All flags set to NONE for simplicity
|
|
},
|
|
{
|
|
"id": bank_account_id.int,
|
|
"ledger": LEDGER,
|
|
"code": CODE,
|
|
"flags": tb.AccountFlags.NONE # Changed: Removed CREDIT_RESERVED, set to NONE
|
|
},
|
|
]
|
|
|
|
# Create accounts in TigerBeetle using create_account (singular) for each
|
|
account_creation_results = []
|
|
for acc_details in accounts_to_create_details:
|
|
flags = acc_details.get("flags", tb.AccountFlags.NONE)
|
|
results = tigerbeetle_client.create_account(
|
|
acc_details["id"],
|
|
acc_details["ledger"],
|
|
acc_details["code"],
|
|
flags
|
|
)
|
|
if results: # If non-empty, it means there are errors
|
|
account_creation_results.extend(results)
|
|
|
|
if account_creation_results:
|
|
print(f"Failed to create accounts in TigerBeetle. Raw results: {account_creation_results}") # Print raw results
|
|
import sys
|
|
sys.exit(1)
|
|
else:
|
|
print(f"Source account created: {source_account_id}")
|
|
print(f"Destination account created: {destination_account_id}")
|
|
print(f"Bank account created: {bank_account_id}")
|
|
|
|
# Store all transfer IDs for later lookup
|
|
all_transfer_ids = []
|
|
|
|
# 2. Fund the source account (initial balance)
|
|
print("Funding source account with initial balance...")
|
|
initial_fund_id = uuid.uuid4()
|
|
initial_fund_transfer = tb.Transfer(
|
|
id=initial_fund_id.int,
|
|
debit_account_id=bank_account_id.int, # Use real bank account ID
|
|
credit_account_id=source_account_id.int,
|
|
amount=1000, # Initial amount
|
|
ledger=LEDGER,
|
|
code=CODE,
|
|
)
|
|
fund_results = tigerbeetle_client.create_transfer(
|
|
initial_fund_transfer.id,
|
|
initial_fund_transfer.debit_account_id,
|
|
initial_fund_transfer.credit_account_id,
|
|
initial_fund_transfer.amount,
|
|
initial_fund_transfer.ledger,
|
|
initial_fund_transfer.code,
|
|
initial_fund_transfer.flags
|
|
)
|
|
if fund_results: # If non-empty, it means there are errors
|
|
print(f"Failed to fund source account. Raw results: {fund_results}")
|
|
import sys
|
|
sys.exit(1)
|
|
else:
|
|
print(f"Source account funded with 1000. Transfer ID: {initial_fund_id}")
|
|
all_transfer_ids.append(initial_fund_id.int) # Store ID
|
|
|
|
# 3. Perform 5 transactions from source to destination
|
|
print("Performing 5 transactions from source to destination...")
|
|
for i in range(1, 6):
|
|
transfer_id = uuid.uuid4()
|
|
transfer_amount = 100 # Example amount for each transfer
|
|
|
|
transfer = tb.Transfer( # tb.Transfer object
|
|
id=transfer_id.int,
|
|
debit_account_id=source_account_id.int,
|
|
credit_account_id=destination_account_id.int,
|
|
amount=transfer_amount,
|
|
ledger=LEDGER,
|
|
code=CODE,
|
|
)
|
|
transfer_results = tigerbeetle_client.create_transfer(
|
|
transfer.id,
|
|
transfer.debit_account_id,
|
|
transfer.credit_account_id,
|
|
transfer.amount,
|
|
transfer.ledger,
|
|
transfer.code,
|
|
transfer.flags
|
|
)
|
|
if transfer_results:
|
|
print(f"Transaction {i} failed. Raw results: {transfer_results}")
|
|
else:
|
|
print(f"Transaction {i} (Amount: {transfer_amount}) completed. Transfer ID: {transfer.id}")
|
|
all_transfer_ids.append(transfer_id.int) # Store ID
|
|
|
|
# 4. Query detailed account information from TigerBeetle
|
|
print("\n--- Raw Account Details (from TigerBeetle) ---")
|
|
account_ids_to_lookup = [source_account_id.int, destination_account_id.int, bank_account_id.int]
|
|
detailed_accounts = tigerbeetle_client.lookup_accounts(account_ids_to_lookup)
|
|
|
|
for account in detailed_accounts:
|
|
if isinstance(account, tb.Account):
|
|
print(f"Account ID: {uuid.UUID(int=account.id)}")
|
|
print(f" User Data 128: {account.user_data_128}")
|
|
print(f" User Data 64: {account.user_data_64}")
|
|
print(f" User Data 32: {account.user_data_32}")
|
|
print(f" Ledger: {account.ledger}")
|
|
print(f" Code: {account.code}")
|
|
print(f" Flags: {account.flags}")
|
|
print(f" Timestamp: {account.timestamp}")
|
|
print(f" Debits Posted: {account.debits_posted}")
|
|
print(f" Credits Posted: {account.credits_posted}")
|
|
print(f" Debits Pending: {account.debits_pending}")
|
|
print(f" Credits Pending: {account.credits_pending}")
|
|
print(f" Net Balance: {account.credits_posted - account.debits_posted}")
|
|
print("-" * 30)
|
|
else:
|
|
print(f"Could not retrieve details for account ID: {account.id if hasattr(account, 'id') else 'Unknown'}")
|
|
|
|
# 5. Query ALL transfer information
|
|
print("\n--- Raw Transfer Details (from TigerBeetle) ---")
|
|
detailed_transfers = tigerbeetle_client._client.lookup_transfers(all_transfer_ids)
|
|
|
|
for transfer_detail in detailed_transfers:
|
|
if isinstance(transfer_detail, tb.Transfer):
|
|
print(f"Transfer ID: {uuid.UUID(int=transfer_detail.id)}")
|
|
print(f" Debit Account ID: {uuid.UUID(int=transfer_detail.debit_account_id)}")
|
|
print(f" Credit Account ID: {uuid.UUID(int=transfer_detail.credit_account_id)}")
|
|
print(f" Amount: {transfer_detail.amount}")
|
|
print(f" Pending ID: {transfer_detail.pending_id}")
|
|
print(f" User Data 128: {transfer_detail.user_data_128}")
|
|
print(f" User Data 64: {transfer_detail.user_data_64}")
|
|
print(f" User Data 32: {transfer_detail.user_data_32}")
|
|
print(f" Timeout: {transfer_detail.timeout}")
|
|
print(f" Ledger: {transfer_detail.ledger}")
|
|
print(f" Code: {transfer_detail.code}")
|
|
print(f" Flags: {transfer_detail.flags}")
|
|
print(f" Timestamp: {transfer_detail.timestamp}")
|
|
print("-" * 30)
|
|
else:
|
|
print(f"Could not retrieve details for transfer ID: {transfer_detail.id if hasattr(transfer_detail, 'id') else 'Unknown'}")
|
|
|
|
print("\n--- Raw Data Display Complete ---")
|