Pickers are populated from GL's own chart of accounts, postable and active accounts only, so a user can only choose a code the server will accept. A stored code GL does not have is shown flagged and still selected rather than appearing blank, which is the state 11 of the 12 mappings are in until GL's chart is seeded - the broken mapping stays visible instead of looking merely unset. Options come from /gl-account-config rather than the GL proxy: that proxy is gated on the `ledgers` nav permission while this screen is on `settings`, and one endpoint keeps the picker and the server-side validation working from the same list. Gated on the existing `settings` key so no role_permissions edit is needed. Saving is disabled outright while GL is unreachable, matching the server, which refuses to store a mapping it could not verify. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ERP System — Inventory & Supply Chain (Phase 1)
A modular ERP built in phases. Phase 1 delivers Inventory & Supply Chain: master data, procurement, goods receipt, and stock management with FIFO costing, multi-warehouse, single-tenant.
Monorepo: a .NET 10 REST API backend and a Next.js frontend, with all documentation under docs/.
Repository layout
erp-monorepo/
├── Backend/ # ASP.NET Core Web API (.NET 10, PostgreSQL) + PROGRESS.md
├── Frontend/ # Next.js (App Router, TypeScript) + PROGRESS.md
└── docs/ # all documentation — START AT docs/00-CORE.md
Start here
All work begins at docs/00-CORE.md — the hub. It defines structure, tech stack, backend setup, and routes you to the right doc.
| Doc | Purpose |
|---|---|
docs/00-CORE.md |
Hub: structure, stack, backend init, routing |
docs/01-DOC-GUIDE.md |
Doc map, reading order, tracking conventions |
docs/10-BACKEND-PHASE1.md |
Backend spec: SRS + ER model + architecture |
docs/11-BACKEND-PHASE1.md |
Backend API reference (complete req/res) |
docs/20-FRONTEND.md |
Frontend user-flows + rules + validation posture |
Backend/PROGRESS.md, Frontend/PROGRESS.md |
Change checklists (git-shared) |
Prerequisites
- .NET 10 SDK (
dotnet --version→10.0.x) - PostgreSQL running on localhost
dotnet-eftool (dotnet tool install --global dotnet-ef)- Node.js (for the frontend)
Run the backend
# create the database in your local Postgres first, e.g.:
# createdb -U postgres ERPCore (or: CREATE DATABASE "ERPCore"; in psql)
cd Backend/ERPCore
# set Username/Password in appsettings.Development.json to your local Postgres login
dotnet ef database update
dotnet run
- Swagger UI:
https://localhost:<port>/swagger - Health:
https://localhost:<port>/health→Healthy
Full setup (packages, folder scaffold, Program.cs wiring) is in docs/00-CORE.md §5.
Run the frontend
cd Frontend
cp .env.local.example .env.local # set NEXT_PUBLIC_API_BASE_URL=https://localhost:<port>
npm install
npm run dev
Configuration & secrets
- Three appsettings files: base (
appsettings.json, placeholders only),Development(localhost),Production(env vars). - Local dev only currently. Before any shared/staging/production use, move secrets to User Secrets (dev) and environment variables (prod), keep
appsettings.Development.json/appsettings.Production.jsonout of git, and rotate any credential ever committed.
Tech stack
Backend: .NET 10, ASP.NET Core Web API, EF Core 10, PostgreSQL (Npgsql), JWT bearer auth, Serilog, Swashbuckle/Swagger, HealthChecks. Layering: Controller → Service → Repository → UnitOfWork, DTOs at the controller boundary, FIFO in a domain service. Frontend: Next.js (App Router) + TypeScript, plain React hooks, dependency-free validation (client for UX; server is authoritative).
Conventions
- Documentation: one source of truth per topic; edit in place; navigate from
docs/00-CORE.md. - Progress: update the relevant
PROGRESS.mdin the same commit as the code (docs/01-DOC-GUIDE.md §6).
Roadmap (future phases)
Sales & CRM · Manufacturing & Production · QC/QA · Accounting · HRM. Phase 1 reserves the integration seams (GL-ready journal entries, reservation status, goods-issue movement, inspection hold, user identity) so later phases integrate without a schema migration.