- Get Started
- Localhost
- Architecture
- Structure
- Pattern
- Page
- Layout
- Content
- Types
- Config
- Actions
- Queries
- Authorization
- Validation
- Form
- Table
- Detail
- Card
- Util
- Hooks
- List Params
- Views
- README.md
- ISSUE.md
- Technology Stack
- Database
- File
- CDN Assets
- Entry Points
- Dashboard
- Authentication
- Credentials
- OAuth
- Flow Diagrams
- Multi-Tenancy
- Offline
- Onboarding
- Onboarding Videos
- Add Values
- Admission
- Application
- Attendance
- Compliance
- Profile
- Exams
- Exam Wizard
- Timetable
- Classrooms
- Notifications
- Conference
- LMS (Lumos)
- Finance
- Fee Management
- Invoice
- Wallet
- Salary
- Payroll
- Timesheet
- Expenses
- Budget
- Receipt
- Accounts
- Banking
- Reports
- Dashboard
- Permissions
- Messages
- Integration Flow
- Provision
- AI Document Processing
- Document Intelligence
- Internationalization
- Translation
- Translation Guide
- Icons
- Docs Factory
- Inspiration
- Listings
- Teachers
- Students
- Catalog
- Library
- Contributing
- Code of conduct
- GitHub Workflow
- Database Seeds
- Database Safety
- Test Accounts
- Bulk import
- Playwright
- Prettier
- Block Rebound
- Transportation
Wallet gives each user a stored-value balance for cashless school transactions — top up, hold a balance, and (eventually) pay fees from it. The UI lives in content.tsx; there are no dedicated table/columns/form components yet.
Flow
Create wallet → top up (payment method) → hold balance → spend (e.g. pay fees)
Status
| Feature | Status |
|---|---|
| Wallet CRUD per user | Production |
| Top-up flow | Production |
| Balance accrual from payments | Production |
| Refund | refundWallet action exists, but no surfaced workflow — overpaid top-ups are reversed manually |
| Payment-gateway integration | Planned |
| PIN verification | Planned |
| QR-code payments | Planned |
| Low-balance alerts | Planned |
| Wallet-to-bank sweep | Planned |
Routes
| Route | Page | Status |
|---|---|---|
/{lang}/finance/wallet | Overview | Ready |
/{lang}/finance/wallet/all | All wallets list | Ready |
/{lang}/finance/wallet/new | Create wallet | Ready |
/{lang}/finance/wallet/[id] | Wallet detail | Ready |
/{lang}/finance/wallet/transactions | Transaction history | Ready |
Server actions
| Action | Purpose |
|---|---|
createWallet | Create a wallet for a user |
getWallets | List wallets (tenant-scoped) |
topupWallet | Add funds to a wallet |
refundWallet | Reverse funds (no surfaced workflow yet) |
Ledger / accounting
Does not post to the ledger. postWalletTopup exists in the engine but has zero callers, so top-ups do not create the DR Cash / CR Unearned Revenue entries the README describes. Reversing an overpaid top-up requires a manual journal entry in Accounts.
Schema
prisma/models/finance-budgets.prisma: Wallet, WalletTransaction — both schoolId-scoped. No lang field.
Stubs
- No
table.tsx/columns.tsx/form.tsx— all UI is inline incontent.tsx. validation.tsfactory not yet wired to consumers.
Tests
None.
Key files
| Component | Path |
|---|---|
| Server actions | src/components/school-dashboard/finance/wallet/actions.ts |
| Content (UI) | src/components/school-dashboard/finance/wallet/content.tsx |
| Schema | prisma/models/finance-budgets.prisma |