A multi-tenant Point-of-Sale and Inventory Management SaaS for supermarkets in Kenya. Billing is pay-per-session: each cashier gets a session of 20 sales, and once exhausted, the supermarket pays KES 100 via M-Pesa STK Push to unlock the next session. Receipts include an auto-generated QR code, and the till supports barcode scanning for fast checko
# Friends POS — Supermarket POS & Inventory SaaS
**Friends POS** (`www.friendspos.com`) is a cloud-based Point-of-Sale and Inventory
Management SaaS built for supermarkets and retail shops in Kenya. Billing is
**pay-per-sales-quota** — each cashier gets a free daily sales allowance (e.g. 20
sales), then pays a small fee via M-Pesa STK Push to unlock a new session.
This README covers:
1. Project Structure
2. Backend Setup
3. Frontend Setup
4. Connecting Hardware
5. Going Live on friendspos.com
6. Troubleshooting
---
## 1. Project Structure
```
friends-supermarket-pos/
│
├── backend/
│ ├── manage.py
│ ├── requirements.txt
│ ├── .env
│ ├── .gitignore
│ │
│ ├── friends_pos/ # Django project (settings)
│ │ ├── __init__.py
│ │ ├── settings.py
│ │ ├── urls.py # MAIN urls.py -> includes core.urls
│ │ ├── wsgi.py
│ │ └── asgi.py
│ │
│ └── core/ # the one core application
│ ├── __init__.py
│ ├── apps.py
│ ├── admin.py
│ ├── models.py # Supermarket, User, Package, Subscription,
│ │ # SalesSession, Payment, Category, Supplier,
│ │ # Product, StockMovement, Sale, SaleItem
│ ├── serializers.py
│ ├── views.py
│ ├── urls.py # app-level urls (/api/...)
│ ├── permissions.py
│ ├── signals.py
│ ├── tests.py
│ │
│ ├── management/
│ │ └── commands/
│ │ └── seed_data.py # generates ~6 months of demo data
│ │
│ ├── services/
│ │ ├── __init__.py
│ │ ├── mpesa.py # Daraja: access token + STK Push + callback
│ │ ├── qrcode_service.py # receipt QR code generation (qrcode + Pillow)
│ │ └── billing.py # sales quota / session lock-unlock logic
│ │
│ └── migrations/
│ └── __init__.py
│
├── front …