Back to Projects

Experimental Sequence 02

VyExpense
Platform Documentation

This page is built from Expense_Tracker_Complete_Documentation.md and the supporting diagrams/screenshots. It covers architecture, approval lifecycle, relational schema, endpoint inventory, quality checks, and operations flow.

Node.jsExpressPostgreSQLVue 3PiniaVue RouterChart.jsSession Auth
Approval EngineLive
Role model verified

Scope and Goals

Authentication and role-based access (submitter, approver, admin)

Trip planning with itinerary segments

Expense submission with receipt storage

Advance request and approval cycles

Admin approval/rejection workflows

Analytics dashboards from live transactional data

High-Level Architecture Notes

Vue SPA is served from backend static output and consumes /api/* endpoints using session cookies.

Express middleware handles auth checks and role restrictions before delegating to controllers.

Model layer executes parameterized SQL with a shared PostgreSQL pool.

Session state is persisted in PostgreSQL sessions table using connect-pg-simple.

Approval and Runtime Lifecycle

Step 1

User logs in via /api/auth/login and receives persisted session state.

Step 2

Submitter creates trip requests; new records begin in pending status.

Step 3

Admin approves/rejects trips using status transition actions.

Step 4

Expenses and advances are only accepted for approved trips.

Step 5

Admin reviews and approves/rejects expense and advance submissions.

Step 6

Completed trips move to finished status and analytics aggregates refresh.

Database Tables

users

Identity, department, designation, and role metadata

trips

Trip requests, itinerary metadata, and approval status

trip_users

Many-to-many mapping between trips and users

expenses

Expense records with category, approval status, and audit fields

receipts

BYTEA receipt storage linked to expense entries

advances

Advance payments and approval lifecycle metadata

sessions

Express session persistence for authenticated runtime

Important Relationships

trip_users.trip_id -> trips.id
trip_users.user_id -> users.id
expenses.user_id -> users.id
expenses.trip_id -> trips.id
expenses.category_id -> categories.id
receipts.expense_id -> expenses.id
advances.user_id -> users.id
advances.trip_id -> trips.id

API Endpoint Summary

AreaMethodEndpointPurpose
AuthPOST/api/auth/loginLogin and session creation
AuthPOST/api/auth/logoutDestroy session
AuthGET/api/auth/meCurrent session user
TripsGET/api/tripsList trips by role/filter
TripsPOST/api/tripsCreate trip with itinerary
TripsPOST/api/trips/:id/statusApprove or reject trip
TripsPOST/api/trips/:id/finishMark trip finished
ExpensesGET/api/expensesList expenses
ExpensesPOST/api/expensesCreate expense
ExpensesPOST/api/expenses/approveBulk approve
ExpensesPOST/api/expenses/:id/rejectReject with reason
AdvancesGET/api/advancesList advances
AdvancesPOST/api/advancesCreate advance
AdvancesPOST/api/advances/approveBulk approve
AdvancesPOST/api/advances/:id/rejectReject with reason
AnalyticsGET/api/analytics/dataChart and aggregation payload

Architecture Diagrams

Visual Walkthrough (01-12)

Testing and Quality

Login/logout session behavior

Role guard behavior for submitter vs admin

Trip status transition rules

Approved-trip-only creation for expenses and advances

Analytics data consistency after approvals

Suggested Enhancements

Add audit-history table for lifecycle transitions.

Introduce object storage option for receipt binaries.

Add E2E tests for major user journeys.

Generate OpenAPI contracts for endpoint governance.

Add structured logging with request IDs.