From 0f24833e0266f84e35e7c3473cfc2e45de6d7167 Mon Sep 17 00:00:00 2001 From: padreug Date: Mon, 10 Nov 2025 01:26:59 +0100 Subject: [PATCH] Adds unique IDs to receivable and revenue entries Ensures unique identification for receivable and revenue entries by generating a UUID and incorporating it into a castle reference. This enhances tracking and linking capabilities by providing a consistent and easily identifiable reference across the system. --- views_api.py | 50 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/views_api.py b/views_api.py index cb79ed1..4ce31c3 100644 --- a/views_api.py +++ b/views_api.py @@ -915,6 +915,15 @@ async def api_create_receivable_entry( fiat_currency = metadata.get("fiat_currency") if metadata else None fiat_amount = Decimal(metadata.get("fiat_amount")) if metadata and metadata.get("fiat_amount") else None + # Generate unique entry ID for tracking + import uuid + entry_id = str(uuid.uuid4()).replace("-", "")[:16] + + # Add castle ID as reference/link + castle_reference = f"castle-{entry_id}" + if data.reference: + castle_reference = f"{data.reference}-{entry_id}" + # Format Beancount entry entry = format_receivable_entry( user_id=data.user_id, @@ -925,7 +934,7 @@ async def api_create_receivable_entry( entry_date=datetime.now().date(), fiat_currency=fiat_currency, fiat_amount=fiat_amount, - reference=data.reference + reference=castle_reference # Use castle reference with unique ID ) # Submit to Fava @@ -934,26 +943,26 @@ async def api_create_receivable_entry( # Return a JournalEntry-like response for compatibility from .models import EntryLine return JournalEntry( - id=f"fava-{datetime.now().timestamp()}", + id=entry_id, # Use the generated castle entry ID description=data.description + description_suffix, entry_date=datetime.now(), created_by=wallet.wallet.id, created_at=datetime.now(), - reference=data.reference, + reference=castle_reference, # Use castle reference with unique ID flag=JournalEntryFlag.PENDING, meta=entry_meta, lines=[ EntryLine( - id=f"line-1-{datetime.now().timestamp()}", - journal_entry_id=f"fava-{datetime.now().timestamp()}", + id=f"line-1-{entry_id}", + journal_entry_id=entry_id, account_id=user_receivable.id, amount=amount_sats, description=f"Amount owed by user {data.user_id[:8]}", metadata=metadata or {} ), EntryLine( - id=f"line-2-{datetime.now().timestamp()}", - journal_entry_id=f"fava-{datetime.now().timestamp()}", + id=f"line-2-{entry_id}", + journal_entry_id=entry_id, account_id=revenue_account.id, amount=-amount_sats, description="Revenue earned", @@ -1021,6 +1030,15 @@ async def api_create_revenue_entry( # Format as Beancount entry and submit to Fava fava = get_fava_client() + # Generate unique entry ID for tracking + import uuid + entry_id = str(uuid.uuid4()).replace("-", "")[:16] + + # Add castle ID as reference/link + castle_reference = f"castle-{entry_id}" + if data.reference: + castle_reference = f"{data.reference}-{entry_id}" + entry = format_revenue_entry( payment_account=payment_account.name, revenue_account=revenue_account.name, @@ -1029,36 +1047,34 @@ async def api_create_revenue_entry( entry_date=datetime.now().date(), fiat_currency=fiat_currency, fiat_amount=fiat_amount, - reference=data.reference + reference=castle_reference # Use castle reference with unique ID ) # Submit to Fava result = await fava.add_entry(entry) logger.info(f"Revenue entry submitted to Fava: {result.get('data', 'Unknown')}") - # Return mock JournalEntry for API compatibility - # TODO: Query Fava to get the actual entry back with its hash - timestamp = datetime.now().timestamp() + # Return JournalEntry for API compatibility return JournalEntry( - id=f"fava-{timestamp}", + id=entry_id, # Use the generated castle entry ID description=data.description, entry_date=datetime.now(), created_by=wallet.wallet.id, created_at=datetime.now(), - reference=data.reference, + reference=castle_reference, # Use castle reference with unique ID flag=JournalEntryFlag.CLEARED, # Revenue entries are cleared lines=[ EntryLine( - id=f"fava-{timestamp}-1", - journal_entry_id=f"fava-{timestamp}", + id=f"line-1-{entry_id}", + journal_entry_id=entry_id, account_id=payment_account.id, amount=amount_sats, description="Payment received", metadata={"fiat_currency": fiat_currency, "fiat_amount": str(fiat_amount)} if fiat_currency else {} ), EntryLine( - id=f"fava-{timestamp}-2", - journal_entry_id=f"fava-{timestamp}", + id=f"line-2-{entry_id}", + journal_entry_id=entry_id, account_id=revenue_account.id, amount=-amount_sats, description="Revenue earned",