School fee management for schools in Ghana — track tuition, feeding and uniform fees, take online payments in installments, and see who owes what. FastAPI + React + Postgres + Stripe.
# Sukuu — School Fee Management System
> A school management platform that lets administrators track student fees (tuition, feeding, uniforms), lets parents pay online and in installments, and gives staff a clean view of who owes what.
**Sukuu** means "school" in Twi. This was built after teaching in Ghana, where fee and feeding-payment tracking was largely manual and error-prone — spreadsheets, paper receipt books, and a bursar reconciling by hand.
> **Status:** In development. See docs/spec.md for the full specification and Roadmap for what is deliberately out of scope.
---
## What this project is about
Three things, deliberately:
1. **Full-stack with real payments** — React frontend, FastAPI backend, Postgres, Stripe integration with webhook-driven reconciliation.
2. **Access control that is actually enforced** — three roles with real permission boundaries in backend middleware, JWT auth, and an audit log. Not UI-only guards.
3. **Financial correctness** — partial payments, installments, overpayment rejection under concurrency, and money stored as exact decimals rather than floats.
## Core loop
```
Admin sets up school (students, classes, fee types)
→ assigns fees to students
→ parents/staff see what's owed
→ payments recorded (online via Stripe, or cash by staff)
→ dashboard shows paid vs. outstanding
```
## Roles & permissions
| Capability | Admin | Staff/Bursar | Parent |
|---|:---:|:---:|:---:|
| Manage students & classes | ✅ | ❌ | ❌ |
| Define/edit fee structures | ✅ | ❌ | ❌ |
| Assign fees to students/classes | ✅ | ❌ | ❌ |
| Record offline (cash) payments | ✅ | ✅ | ❌ |
| View all payments & reports | ✅ | ✅ | ❌ |
| View own child's fees only | — | — | ✅ |
| Pay fees online (Stripe) | — | — | ✅ |
| View own payment history | — | — | ✅ |
Every boundary above is enforced server-side. The UI hides what a role cannot do; the API refuses it.
## Tech stack
| Layer | Choice |
|---|---|
| Backend | FastAPI (Python 3.14) |
| Database | PostgreSQL |
| O …