This is a mobile application for smart and fair fee collection in goverment car parkin areas in Tanzania
# ParkiPay
Government parking management system for Tanzania. Field attendants issue
digital parking bills against a vehicle's number plate; supervisors manage
officers, locations, and the vehicle registry.
## Stack
| Layer | Technology |
|------------|-----------------------------------------------|
| Mobile app | React Native (Expo) + TypeScript |
| Backend | Node.js + Express |
| ORM | Prisma |
| Database | PostgreSQL (Supabase) |
| Cache | Redis (Upstash) |
| SMS | Twilio (active) / Africa's Talking (legacy) |
| Email | Resend |
| Deploy | Render (backend) · EAS / Expo Go (mobile) |
## Repository layout
```
backend/ Express API, Prisma schema + migrations, seed data, tests
mobile/ Expo app (attendant + supervisor screens)
```
## Domain conventions
- **Attendant** employee IDs: `TZ-XXXX` (e.g. `TZ-0001`)
- **Supervisor** employee IDs: `SUP-XXXX` (e.g. `SUP-0001`)
- **Vehicle plates** (Tanzania format): `T` + 3 digits + 3 letters (e.g. `T123ABC`)
- **Officer roles** (`OfficerRole` enum): `ATTENDANT`, `SUPERVISOR` — these
are the only two valid values. Earlier drafts of this project used
`ADMIN` / `FIELD_OFFICER`; that enum was collapsed and those values no
longer exist anywhere in the schema, routes, or mobile client.
## Authentication
Login is **employee-ID only** — there is currently no password check on
`POST /api/auth/login/`. The officer just needs to exist, be active, and
match the employee ID sent from the app. This is a known, intentional
simplification for the current phase; see `backend/src/routes/auth.js`
for the exact contract before changing it.
## Getting started
### 1. Backend
```bash
cd backend
npm install
cp .env.example .env # fill in DATABASE_URL, SECRET_KEY, etc.
npm run d …