Skip to content

← Back to DWS Receipts

Admins access three main areas:

  • Dashboard (/dashboard) - Receipt management
  • Batch Review (/batch-review) - Rapid approval workflow
  • Users (/users) - User management

Route: /dashboard

Auth: Admin role required (redirects employees to /employee)

Admin Dashboard
FeatureDescription
View All ReceiptsSee receipts from all employees
Filter by StatusTabs: All, Pending, Approved, Reimbursed, Rejected
Date Range FilterFilter by receipt date
SearchSearch employee name or description
Edit Any ReceiptChange date, amount, category, notes, status
Delete Any ReceiptRemove receipt and image
Bulk ReimburseMark all approved as reimbursed
Export CSVDownload payroll totals

Dashboard shows 4 stat cards:

  • Total Receipts: Count and total amount
  • Pending Review: Count and percentage
  • Approved: Count and percentage
  • Reimbursed: Count and percentage
1. Click "Reimburse" button
2. System counts all approved receipts
3. Confirmation dialog shows count
4. Confirm → PUT /api/receipts/bulk-update
5. All approved → reimbursed

Important: Affects ALL approved receipts globally, not just filtered ones.

Exports payroll-ready totals grouped by employee:

LastName,FirstName,EmployeeNumber,TotalAmount
Doe,John,EMP123,150.00
Smith,Jane,EMP456,275.50
  • Uses filteredReceipts (respects current filters)
  • Groups by employee_id_internal
  • Sums amounts per employee
FilePurpose
app/dashboard/page.tsxAuth protection
components/receipt-dashboard.tsxDashboard UI
components/receipt-table.tsxReceipt table
hooks/use-admin-receipts.tsData fetching

Route: /batch-review

Auth: Admin role required

Batch Review

Rapid approval workflow for reviewing pending receipts one at a time.

1. Load all pending receipts
2. Display one receipt at a time
3. Admin clicks Approve or Reject
4. Navigate to next receipt
5. After all reviewed, submit decisions
PanelContent
LeftReceipt details (date, amount, category, employee)
RightReceipt image
BottomNavigation dots showing progress
  • Previous/Next: Move between receipts
  • Dots: Click to jump to any receipt
  • Color coding: Blue (current), Green (decided), Gray (undecided)

Decisions stored locally until submission:

{
"receipt-id-1": "approved",
"receipt-id-2": "rejected",
// ...
}

After reviewing all receipts:

  • Shows summary (X approved, Y rejected)
  • “Review My Decisions” - go back and change
  • “Submit X Decisions” - finalize

Submits all decisions in parallel:

await Promise.all(
Object.entries(decisions).map(([id, status]) =>
supabase.from('receipts').update({ status }).eq('id', id)
)
);
FilePurpose
app/batch-review/page.tsxAuth protection
components/batch-review-dashboard.tsxBatch review UI

Route: /users

Auth: Admin role required

User Management
FeatureDescription
List UsersPaginated user list with search
Create UserAdd new employee or admin
Edit UserUpdate name, phone, role
Ban UserSoft delete (100-year ban)

Required fields:

  • Phone number (10-digit US)
  • Full name

Optional fields:

  • Preferred name
  • Employee ID
  • Role (defaults to employee)

Can change:

  • Phone number (triggers global sign out)
  • Full name / Preferred name
  • Employee ID
  • Role (employee ↔ admin)
  • Sets banned_until to ~100 years
  • Sets deleted_at in user_profiles
  • Signs out user globally
  • Cannot ban yourself
FilePurpose
app/users/page.tsxAuth protection
components/user-management-dashboard.tsxUser management UI
components/user-table.tsxUser list
components/user-form-modal.tsxCreate/edit form
components/ban-user-dialog.tsxBan confirmation

EndpointMethodPurpose
/api/admin/receiptsGETAll receipts with phone
/api/admin/usersGETUser list
/api/admin/usersPOSTCreate user
/api/admin/users/[id]GETSingle user
/api/admin/users/[id]PATCHUpdate user
/api/admin/users/[id]DELETEBan user
/api/receipts/bulk-updatePUTBulk reimburse

All admin endpoints verify:

  1. Valid session exists
  2. User role is admin