TonerManager ist eine lokale Web‑App zur Tonerverwaltung mit Node.js‑Backend und SQLite.
- Abhängigkeiten installieren:
npm install
- (Optional)
.env.localerstellen:
VITE_API_BASE_URL=http://localhost:3000
- Backend starten (Terminal 1):
npm run server
- Frontend starten (Terminal 2):
npm run dev
Frontend: http://localhost:5173
Backend: http://localhost:3000
Beim ersten Start seeden wir automatisch, wenn die DB leer ist
und der Ordner sampleDataDB existiert. Alternativ:
SEED_DIR=/pfad/zu/sampleDataDB npm run server
Die CSVs werden nach SQLite übernommen (data/toner.db).
Hinweis zu Standorten:
- Wenn keine
Location.csvvorhanden ist, wird automatisch „Standort A“ angelegt. - Optional kannst du
Location.csvhinzufügen und inPrinter.csv/Cabinet.csvlocation_idsetzen.
Auth ist nur für die Verwaltung aktiv. Alle anderen Seiten bleiben öffentlich.
- Azure Portal → Entra ID → App registrations → New registration
- Name z. B.
TonerManager - Supported account types: Single tenant
- Redirect URI (Web):
http://localhost:3000/api/auth/callback
- Nach dem Anlegen die Application (client) ID kopieren
App roles (Tab App roles):
adminuser
Danach Benutzer/Gruppen zuweisen: Entra ID → Enterprise applications → deine App → Users and groups.
Unter Certificates & secrets ein Client Secret erstellen und notieren.
Das Backend liest die Entra-Einstellungen aus der Umgebung:
AAD_TENANT_ID=da9f3a3f-cdc0-436e-9bf9-80f913676d42
AAD_CLIENT_ID=your_client_id
AAD_CLIENT_SECRET=your_client_secret
AAD_REDIRECT_URI=http://localhost:3000/api/auth/callback
Lokales Login ist immer verfügbar (auch wenn Entra aktiviert ist). Zugangsdaten werden in SQLite gespeichert.
Default Admin:
- E-Mail:
admin@local - Passwort:
admin
Login erfolgt über die Verwaltung (/Admin) → Login-Formular.
benutzernameoderbenutzername@local→ lokales Passwort- alles andere → Microsoft Entra (Redirect,
login_hint)
In der Verwaltung gibt es einen Tab Benutzer, um User anzulegen und zu löschen.
npm run user:add -- --email user@example.com --password secret --role user
npm run build
npm run start
Dann läuft alles unter http://localhost:3000 (Backend + statisches Frontend aus dist).
docker compose up --build
Danach: http://localhost:3000
Die Datenbank + Uploads werden nach ./data gemountet.
Für Entra ID im Docker:
- Runtime env (Backend):
AAD_*in.env
Für den Seed im Docker wird sampleDataDB als /seed gemountet (oder per SEED_DIR setzen).
- Öffne Toner finden in der Sidebar.
- Suche nach Druckername, Standort oder Modell.
- Wähle einen Drucker, um die passenden Toner zu sehen.
- Ein Klick auf eine Position hebt die Schrank‑Position hervor (blinkend).
- Öffne Schränke.
- Klicke ein freies Fach, um einen Toner zu belegen.
- Klicke ein belegtes Fach, um einen Toner zu entnehmen.
- Ob Entnahme/Ablage eine Anmeldung erfordert, stellst du im Admin‑Bereich ein.
- Unter Toner‑Übersicht siehst du alle Toner inkl. Bestand, Minimalbestand und Fehlmenge.
- Filter: Bestand 0, Über Minimum, Unter Minimum.
- Über den Drucken‑Button kannst du die Liste kompakt ausgeben.
Im Verwaltung‑Bereich kannst du:
- Standorte, Schränke, Hersteller, Modelle, Toner und Drucker pflegen
- Benutzer anlegen und Rollen vergeben
- Standard‑Sprache und Auth‑Pflicht für Entnahme/Ablage setzen