wiki:App

Version 4 (modified by 163080, 4 days ago) ( diff )

--

Transactions

The application uses database transactions in several key operations:

  • Invoice creation: When creating a new invoice, a transaction ensures that both the invoice and its items are created atomically
  • Status updates: Invoice status changes are handled within transactions to maintain data consistency
  • Client updates: When updating client information, related operations are wrapped in transactions

Transactions are implemented in the following files:

  • src/app/api/invoices/[id]/route.ts: For updating and deleting invoices
  • src/app/api/invoices/route.ts: For creating new invoices

Triggers

The system implements a sophisticated trigger system for invoice management:

  • invoice_status_update_trigger: Automatically fires when an invoice status changes
    • Logs status changes in InvoiceStatusHistory
    • Creates notifications in InvoiceNotifications
    • Updates client status based on payment history
    • Automatically extends due dates when needed
    • Calculates and updates financial metrics

The trigger is implemented in sql/01_invoice_status_trigger.sql.

Indexes

Several optimized indexes are implemented for better query performance:

  • Client email lookups:
    • idx_client_email: Basic email search optimization
    • idx_client_email_tenant: Composite index for tenant-specific email searches
    • idx_client_email_lower: Case-insensitive email searches
  • Invoice management:
    • idx_invoice_status_history_invoice_id: Optimizes status history lookups
    • idx_invoice_status_history_changed_at: Improves date-based queries
    • idx_invoice_notifications_invoice_id: Speeds up notification retrieval
    • idx_invoice_notifications_processed: Partial index for unprocessed notifications

Using EXPLAIN on the Client table

  • Before creating the index:
EXPLAIN ANALYZE SELECT * FROM "Client" WHERE email = 'client12@example.com';
  • After adding index and creating 1000 rows:
    EXPLAIN ANALYZE SELECT * FROM "Client" WHERE email = 'client12@example.com';
    
Index Scan using idx_client_email on "Client"  (cost=0.28..8.29 rows=1 width=303)
  Index Cond: (email = 'client12@example.com'::text)

Attachments (2)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.