# Beheerdershandleiding ## Architectuuroverzicht ``` Browser (vanilla JS + i18n-runtime) | v Axum webserver (ledgerix) ─── Static files (HTML/CSS/JS) | Auth middleware (sessie + groep + per-endpoint permissie + company check) | v REST API (ledgerix-api) ─── 30+ route modules | v SQLite database (embedded, enkel bestand) ``` De applicatie is een single binary die een webserver draait. Geen externe dependencies. ## Distributie-modellen — Windows, Linux of Docker Ledgerix biedt geen managed cloud-SaaS. Drie ondersteunde install-paden: | Doelplatform | Aanbevolen install | Documentatie | |--------------|-------------------|--------------| | Windows-PC of -server | `Ledgerix-Setup-X.Y.Z.exe` installer | Onderstaande sectie | | Linux-cloud-VPS / Kubernetes | Docker + reverse-proxy | [`docs/deployment.md`](deployment.md) | | Linux bare-metal zonder Docker | systemd-unit + handmatige binary | [`docs/deployment.md`](deployment.md) | Voor de twee Linux-paden zit een complete set deployment-templates in [`deploy/`](../deploy/) (Caddy / Traefik / nginx / systemd). De rest van deze handleiding gaat over de Windows-installer. ## Installer (Windows) `Ledgerix-Setup-X.Y.Z.exe` doorloopt: 1. **Installatiemap** (default `C:\Program Files\Ledgerix`) 2. **Poort** (default 8080, automatische detectie van vrije poort als 8080 bezet is) 3. **Data-map** (default `%AppData%\Ledgerix\data`) 4. **Admin-wachtwoord** (minimaal 6 tekens) 5. **Browser-keuze** (v0.39+) — radio-keuze tussen "Standaard browser van Windows" en alle gedetecteerde browsers (Chrome, Edge, Firefox, Brave, etc.). Detectie via `HKLM\SOFTWARE\Clients\StartMenuInternet`. De keuze wordt opgeslagen als `BROWSER_PATH=...` in `config.env`. Tasks (checkboxes onderaan): - **Desktopicoon** (uitgevinkt) - **Automatisch starten bij Windows aanmelden** (aangevinkt) - **Single-user modus** (uitgevinkt) — `LEDGERIX_SINGLE_USER=1` voor lokaal eenpersoonsgebruik zonder login Na install wordt `start.vbs` aangeroepen die `ledgerix.exe` headless start en (afhankelijk van `BROWSER_PATH`) de gekozen browser opent met `http://localhost:`. ### Browser-keuze achteraf wijzigen (v0.39+) In Ledgerix → **Instellingen → Opstart → Browser-pad** kun je achteraf het volledige pad van de gewenste browser invoeren (bv. `C:\Program Files\Mozilla Firefox\firefox.exe`). Lege waarde = ShellExecute (Windows-default-browser). De server schrijft de wijziging direct terug naar `config.env` via een safe in-place update. Om de wijziging actief te krijgen moet de Ledgerix-snelkoppeling opnieuw gestart worden — `start.vbs` leest `config.env` alleen bij boot. ## Setup wizard (eerste login) Bij een schone installatie (lege database) wordt de **setup wizard** automatisch getoond. Deze begeleidt de beheerder door: 1. **Wie ben je?** — bedrijfsmodus (zzp/mkb/accountant) bepaalt welke menu-items in de zijbalk verschijnen 2. **Bedrijfsgegevens**: naam, adres, KvK-nummer, BTW-nummer 3. **Rekeningschema**: standaard Nederlands rekeningschema wordt aangemaakt (of importeer een eigen schema) 4. **Dagboeken**: standaard dagboeken (Verkoop, Inkoop, Bank, Kas, Memoriaal, Beginbalans) 5. **Boekjaar**: eerste boekjaar en startmaand instellen Na afronding wordt de gebruiker doorgestuurd naar het dashboard. Een setup-banner verschijnt als herinnering zolang de wizard nog niet is doorlopen. ## UI-modi (v0.39+) Twee onafhankelijke instellingen, beide instelbaar als key in de kaart **Instellingen → Applicatie-instellingen**: | Instelling | Waarden | Effect | |---|---|---| | `company_mode` | zzp / mkb / accountant | Filtert de zijbalk-items: zzp = kern, mkb = volledig, accountant = + jaarrekening-config + multi-client overzicht. Hiërarchisch (zzp ⊂ mkb ⊂ accountant). | | `ui_complexity` | eenvoudig / standaard / advanced | Bepaalt de complexiteit van de presentatie. `eenvoudig` toont een term-vrije homescreen (`/eenvoudig.html`) met 4 grote knoppen i.p.v. de zijbalk. `standaard` is het reguliere gedrag. `advanced` is gereserveerd voor toekomstige power-features. | Beide zijn los te kiezen. Een MKB-er met weinig boekhoud-ervaring kan "MKB + eenvoudig" kiezen; een power-user met een ZZP-administratie kan "ZZP + advanced". Wijziging werkt direct door zonder herstart van de server. ## Gebruikersbeheer ### Groepen (v0.69+, herziening van het oude rollen-concept) Toegang wordt sinds v0.72 georganiseerd via **groepen** in plaats van vaste rollen. Er zijn vier ingebouwde **system-groups** die niet verwijderd kunnen worden: | System-group | Bedoeld voor | Standaard-permissies | |--------------|--------------|----------------------| | **Admin** | Beheerders | Alle endpoints, inclusief gebruikers/bedrijven/instellingen | | **Boekhouder** | Reguliere boekhouders | Boekingen, relaties, rekeningen, BTW, import/export — geen beheer | | **Klant** | Klant-portal (v0.78) | Beperkte read-only toegang tot eigen administratie + de vragen-thread | | **Api** | API-keys | Via Bearer-token; permissies afhankelijk van de gekoppelde gebruiker | Daarnaast kun je **eigen groepen** aanmaken (bijvoorbeeld "Junior boekhouder") en daar zelf een set van **fijnmazige permissies per endpoint** aan toekennen (v0.70+). Zo kan een junior wél boekingen invoeren maar geen rapporten of masterdata muteren. > De oude vaste rol-set (Admin / Boekhouder / Readonly / Api) is sinds v0.72 > volledig vervangen. Bestaande gebruikers zijn automatisch gemapt naar de > system-group met dezelfde naam. ### Gebruikers beheren (Admin → Gebruikers) - **Aanmaken**: gebruikersnaam, wachtwoord (min. 6 tekens), naam, groep(en) - **Bedrijven toewijzen**: vink aan welke bedrijven de gebruiker mag benaderen (leeg = alle) - **Wachtwoord wijzigen**: apart formulier per gebruiker - **Activeren/Deactiveren**: gedeactiveerde gebruikers kunnen niet meer inloggen - **Laatste admin beschermd**: de laatste actieve admin kan niet gedeactiveerd of verwijderd worden - **E-mail veld**: per gebruiker instelbaar (nodig voor wachtwoord-vergeten functie) - **2FA status**: kolom toont of tweestapsverificatie actief is per gebruiker ### API Keys (Admin → API Keys) - Voor webshop-koppelingen en externe integraties - Elke key is gekoppeld aan een bedrijf en een gebruiker - Key wordt eenmalig getoond bij aanmaken (kopieer hem!) - Gebruik: `Authorization: Bearer ` header - Intrekken: key stopt direct met werken ## Authenticatie & Beveiliging ### Server-side middleware Elke API-request wordt gecontroleerd: 1. **Sessie validatie**: X-Session-Id header of Authorization: Bearer (API key) 2. **Sessie verlopen**: na 24 uur (configureerbaar) 3. **Rol controle**: Readonly gebruikers worden geblokkeerd bij POST/PUT/DELETE 4. **Company controle**: niet-admin gebruikers met bedrijfstoewijzing worden geblokkeerd bij andere bedrijven 5. **Login endpoint**: uitgezonderd van auth check 6. **Security headers (v0.40.11)**: elke response bevat: - `Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; media-src 'self' blob:; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; form-action 'self'` - `X-Frame-Options: DENY` - `X-Content-Type-Options: nosniff` - `Referrer-Policy: strict-origin-when-cross-origin` - `Permissions-Policy: camera=(self), microphone=(), geolocation=(), payment=()` — camera mag voor de webcam-scan-flow op /eenvoudig.html, rest expliciet uit. - `'unsafe-inline'` is helaas vereist omdat alle pagina's inline `