f865837b27
The initial test report (run before the pilot-readiness changes) raised seven findings and a retest plan. This closes the ones still open. - F-01: a business on its free trial may run 2 active branches whatever its tier, so an owner can try transfers and per-branch stock. Only active branches count towards any limit. - F-06: owners can rename branches and deactivate/reactivate them from the Branches page. A branch can only be deactivated once it holds no stock and no active staff; its history stays in every report, and it leaves every picker. - F-04: the Products page lists deactivated products under a toggle with Reactivate. Deactivating warns about stock still on hand, which stays on the Stock page so it can be transferred or counted out. - F-05: products carry a unit (L, ml, kg, g, pcs, tray, pack) instead of everything being litres. - CAT-12: product prices must be above zero and names are unique per business, ignoring case. - F-03: a reversed report period is refused by the page and the API, and the page labels which period the cards show. Report dates are Nairobi business days. - F-07: cost of goods sold is units sold x average buying price. Stock bought in the period is reported separately, with a cash surplus line, so unsold stock no longer shows as a loss. - STA-04: staff and new branch managers can be invited with a one-time, 7-day link; the person sets their own password. Managers can issue a new link for their own cashiers. - OFF-02 / POS-02: the till shows each product's stock and deducts every sale immediately, online or offline; it warns before selling more than the recorded stock, and has a Clear sale button. - npm run backfill:stock turns purchases recorded before the stock ledger into stock, so existing tenants (and the report's ZERRO fixtures) start from what they bought. tests/retest-plan.test.ts runs the report's completion and retest plan and checks every balance and total it predicts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
1.8 KiB
Bash
47 lines
1.8 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=
|
|
|
|
# ---- Invite links ----
|
|
# Public base URL used in staff invite links. Optional: defaults to the
|
|
# address the request came in on.
|
|
APP_URL=
|
|
|
|
# ---- 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
|