Data Layer medium complexity backend
0
Dependencies
2
Dependents
11
Entities
0
Integrations

Description

Data access layer managing queries and mutations against the expense_approvals, expenses, expense_receipts, and audit_logs PostgreSQL tables. Provides optimized queries with joins across users, activities, and expense_receipts for queue rendering, supports server-side pagination and multi-column filtering, and ensures transactional integrity when writing approval decisions alongside audit log entries.

Feature: Expense Approval Queue

expense-approval-store

Responsibilities

  • Query pending expenses with joins to users, activities, expense_types, and expense_receipts
  • Persist approval and rejection decisions to the expense_approvals table
  • Support server-side pagination and filtering by status, date range, expense type, and user
  • Write audit log entries within the same transaction as approval state changes
  • Fetch receipt metadata and storage URLs for inline preview rendering

Interfaces

findPendingExpenses(orgId: string, filters: ExpenseQueueFilters, pagination: PaginationParams): Promise<PaginatedResult<ExpenseRow>>
findExpenseById(expenseId: string): Promise<ExpenseRow | null>
createApproval(approval: ExpenseApprovalRecord): Promise<ExpenseApprovalRecord>
updateExpenseStatus(expenseId: string, status: string): Promise<void>
createAuditEntry(entry: AuditLogRecord): Promise<void>
getReceiptsForExpense(expenseId: string): Promise<ExpenseReceiptRow[]>
countPendingByOrganization(orgId: string): Promise<number>
batchUpdateStatus(expenseIds: string[], status: string): Promise<number>

Relationships

Dependents (2)

Components that depend on this component