Files
ERP/.env.example
T
denis_ireri d4808b3e46 Enforce roles and tenant status on the server, and use the Kenyan business day
The admin pages redirected cashiers away, but the API itself let them read
profit, expenses and purchases and record expenses and purchases. Branch
managers could also change product prices for every branch. Every gated
route now goes through authorize(), which answers 401 when signed out and
403 for the wrong role.

- Owners and managers only: profit report, expenses, purchases, users,
  morning dispatch and evening count. Owner only: create and edit products,
  rename branches.
- PATCH /api/users/:id deactivates or reactivates staff (managers: their own
  cashiers only) and revokes the user's device sessions. PATCH
  /api/branches/:id renames a branch.
- Login and token refresh refuse inactive or SUSPENDED businesses.
- Public signup refuses PLATFORM_ADMIN_EMAILS addresses, so an unregistered
  operator email can no longer be claimed.
- M-Pesa sits behind FEATURE_MPESA (off by default, out of scope for the
  pilot): its routes return 404 and the Daraja variables are optional.
  Turning it on in production requires the callback IP allowlist.
- "Today" and the default month now follow Africa/Nairobi instead of the
  server's UTC clock, so the business day no longer starts at 03:00 EAT.
- Malformed ids in query strings and bodies return 400 instead of a 500,
  the inventory routes check the product belongs to the tenant, and the
  reconciliation lookups are tenant-scoped.
- Branch-scoped staff see their branch's override price from GET /api/products.
- Adds a vitest suite against an in-memory MongoDB (npm test).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:34:35 +03:00

42 lines
1.7 KiB
Bash

# AquaFlow now runs entirely as one Next.js app (frontend + API routes),
# deployed as a single Vercel project. Every variable below is needed —
# set them all in Vercel's Project Settings -> Environment Variables.
# ---- MongoDB ----
MONGODB_URI=mongodb+srv://user:password@cluster0.mongodb.net/aquaflow?retryWrites=true&w=majority
# ---- Auth / JWT ----
JWT_ACCESS_SECRET=replace_with_a_long_random_string
JWT_REFRESH_SECRET=replace_with_a_different_long_random_string
JWT_ACCESS_TTL=15m
JWT_REFRESH_TTL=30d
DELIVERY_MAX_DEVICES=2
# ---- Platform operator ----
# Comma-separated emails with cross-tenant access to /platform. Create these
# accounts with `npm run seed`; public signup refuses these addresses.
PLATFORM_ADMIN_EMAILS=
# ---- M-Pesa (optional, off for the pilot) ----
# M-Pesa STK Push is out of scope for the pilot. While this is false every
# /api/mpesa route returns 404 and the Daraja variables below are ignored.
# If you turn it on in production, DARAJA_CALLBACK_IP_ALLOWLIST is required.
FEATURE_MPESA=false
# ---- Safaricom Daraja (only read when FEATURE_MPESA=true) ----
DARAJA_ENV=sandbox
DARAJA_CONSUMER_KEY=xxxxxxxxxxxxxxxx
DARAJA_CONSUMER_SECRET=xxxxxxxxxxxxxxxx
DARAJA_SHORTCODE=174379
DARAJA_PASSKEY=bfb279f9aa9bdbcf158e97dd71a467cd2e0c893059b10f78e6b72ada1ed2c919
DARAJA_TRANSACTION_TYPE=CustomerPayBillOnline
# Must be this deployment's own public URL + /api/mpesa/callback, set
# AFTER your first deploy once you know the real domain, e.g.
# https://your-app.vercel.app/api/mpesa/callback
DARAJA_CALLBACK_URL=https://your-app.vercel.app/api/mpesa/callback
DARAJA_CALLBACK_IP_ALLOWLIST=
# ---- Seed / bootstrap ----
SEED_SUPER_ADMIN_EMAIL=admin@aquaflow.local
SEED_SUPER_ADMIN_PASSWORD=change_me_immediately