- JavaScript 65.5%
- EJS 20.5%
- CSS 11.8%
- PowerShell 2%
- Dockerfile 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| public | ||
| scripts | ||
| src | ||
| test | ||
| views | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
Lokma Urenregistratie
Eenvoudige interne webapp om gewerkte uren van medewerkers vast te leggen.
Functies in versie 1.8
- medewerkers toevoegen en inactief zetten
- datum, begin- en eindtijd en pauze invoeren
- gewerkte uren automatisch berekenen
- registraties wijzigen en verwijderen
- maandtotalen per medewerker
- apart urenoverzicht met medewerker- en maandselectie
- CSV-export voor salarisadministratie
- uitsluitend leden van Pocket ID-groep
lokma_beheermelden zich aan als beheerder - persoonlijke werknemerslogin met inlogcode en wachtwoord
- werknemers kunnen alleen nieuwe uren voor zichzelf indienen
- beheerders maken, resetten en verwijderen werknemerslogins
- bijhouden wie een registratie heeft ingevuld en voor het laatst gewijzigd
- responsive voor telefoon en pc, met mobiel hamburgermenu
- diensten die na middernacht eindigen
- healthcheck voor Docker en automatische tests voor tijdberekening
- beveiligde n8n-webhook wanneer een werknemer zelf uren indient, bijvoorbeeld voor een Gotify-melding
Rooster
Het onderdeel /rooster gebruikt dezelfde login en medewerkerslijst als Uren. Geplande diensten staan in aparte tabellen en worden niet automatisch als gewerkte uren geregistreerd.
- Beheerders kiezen een ISO-week en voeren per medewerker per dag start- en eindtijd in. Datums worden automatisch berekend, ook rond de jaarwisseling.
- Klik op Rooster opslaan voordat je van week wisselt. Bij niet-opgeslagen wijzigingen waarschuwt de browser. Eerder opgeslagen weken blijven behouden.
- Nieuwe weken zijn concepten. Publiceren voor medewerkers wordt bij opslaan toegepast; uitvinken en opslaan verbergt die week weer.
- Werknemers zien via Mijn rooster uitsluitend hun eigen diensten in gepubliceerde weken. Andere medewerkers en conceptdiensten worden niet naar hun browser verstuurd.
- Wijzigingen in een gepubliceerde week worden na opslaan direct zichtbaar. Haal het vinkje weg als je eerst verder aan een concept wilt werken.
- Beide tijden leeg betekent geen dienst. Een eindtijd vóór de starttijd betekent de volgende dag. Per medewerker is één dienst per dag mogelijk.
- Medewerkers worden beheerd op de bestaande pagina Medewerkers. Inactieve medewerkers blijven zichtbaar in weken waarin ze al zijn ingepland.
- Gelijktijdig gewijzigde weken geven een conflict in plaats van stilzwijgend te overschrijven.
Eenmalige import van een gecontroleerd JSON-bestand (geen automatische import bij opstarten):
node scripts/import-schedule.js /pad/rooster.json
node scripts/import-schedule.js /pad/rooster.json --apply
Het bestand bevat year, week, employees: [{name}] en shifts: [{name,date,start,end}], met datums als YYYY-MM-DD en tijden als HH:MM. De eerste opdracht doet een voorcontrole en draait de gegevenswijzigingen terug. De tweede importeert uitsluitend als concept. De import koppelt unieke bestaande namen zonder hoofdletterverschil, maakt ontbrekende medewerkers zonder login aan en weigert bestaande roosterweken, dubbele namen en inactieve naamgenoten. Controleer de namen vóór een productie-import en maak vooraf een back-up van de database. Het bestaande Docker-volume bevat ook de roostertabellen.
Starten met Docker
- Maak in Pocket ID een vertrouwelijke OIDC-client met:
- callback-URL
https://uren.lokmaborne.nl/auth/callback - logout callback-URL
https://uren.lokmaborne.nl - PKCE ingeschakeld
- callback-URL
- Geef de Pocket ID-client uitsluitend toegang aan de groep
lokma_beheeren controleer dat minstens één beheerder lid is vóór de uitrol. Stel daarna in Dockhand de variabelen uit.env.examplein. Gebruik een lange willekeurigeSESSION_SECRETen plaats het Pocket ID-client secret uitsluitend inOIDC_CLIENT_SECRET. - Start:
docker compose up -d --build
- Open
https://uren.lokmaborne.nl.
Beheerder en werknemer
Alleen Pocket ID-gebruikers in de groep lokma_beheer krijgen de beheerrol. De groepen admin en lokma_medewerkers geven op zichzelf geen toegang tot de urenapp. Beheerders kunnen medewerkers, werknemerslogins en alle uren beheren. Alleen beheerders kunnen bestaande registraties aanpassen of verwijderen en opmerkingen toevoegen. Bestaande sessies zonder lokma_beheer worden bij de eerstvolgende aanvraag beëindigd. Latere groepswijzigingen werken door na opnieuw inloggen of uiterlijk na het verlopen van de sessie (12 uur).
Een beheerder maakt een werknemerslogin aan via Medewerkers → Inloggegevens beheren:
- Kies een unieke inlogcode van minimaal 3 tekens.
- Stel een pincode van 4–8 cijfers of een wachtwoord van minimaal 8 tekens in. Vermijd voor de hand liggende codes zoals 1234.
- Deel beide gegevens persoonlijk met de werknemer.
Werknemers kunnen alleen voor zichzelf datum, begin- en eindtijd en pauze indienen. Een medewerker-ID of opmerking die handmatig wordt meegestuurd, wordt door de server genegeerd. Na het indienen ziet de werknemer de eigen laatste registraties alleen ter controle; wijzigen en verwijderen kan uitsluitend een beheerder.
Pincodes en wachtwoorden worden gezouten en gehasht opgeslagen en kunnen niet worden teruggelezen. Bestaande wachtwoorden blijven werken. Een beheerder kan alleen een nieuwe pincode of een nieuw wachtwoord instellen. Na vijf mislukte inlogpogingen vanaf hetzelfde adres wordt de werknemerslogin vijftien minuten geblokkeerd.
Werknemers loggen uitsluitend in met hun persoonlijke inlogcode en pincode of wachtwoord. Oude Pocket ID-koppelgegevens blijven in de database bewaard, maar worden niet meer gebruikt voor aanmelden als werknemer.
Op Medewerkers toont een Pocket ID-badge bij een medewerker van wie het Pocket ID-e-mailadres bekend is. Beheerders kunnen die markering onder Naam / Pocket ID invullen of verwijderen. De markering verandert geen inlogrechten; beheerrechten volgen uitsluitend uit de Pocket ID-groep lokma_beheer.
De SQLite-database staat in ./data/uren.sqlite en blijft bestaan bij een nieuwe container.
Controleren
npm test
De route /health geeft de status en appversie terug voor Docker-monitoring.
Gotify-melding via n8n
Wanneer een werknemer via de eigen login uren indient, kan de app een beveiligde webhook naar n8n sturen. Registraties die een beheerder invoert geven geen melding. De uren worden ook opgeslagen als n8n tijdelijk niet bereikbaar is.
- Maak in n8n een workflow met een Webhook-node:
POST /webhook/lokma-uren-doorgegeven. - Beveilig de webhook met een lange, willekeurige waarde en controleer de header
Authorization: Bearer <geheim>. - Voeg daarna een HTTP Request-node toe die de melding naar de gewenste Gotify-app stuurt.
- Publiceer de workflow en gebruik uitsluitend de Production URL.
- Stel in Dockhand
N8N_HOURS_WEBHOOK_URLen hetzelfdeN8N_HOURS_WEBHOOK_SECRETin. Optioneel kanN8N_HOURS_WEBHOOK_TIMEOUT_MSworden aangepast; standaard is dit 4000 ms.
De JSON bevat het event hours.submitted, de naam en ID van de medewerker, registratiedatum, begin- en eindtijd, pauze, totaal in minuten en leesbaar als uren, en dat de werknemer via de lokale login was aangemeld. Er worden geen wachtwoorden, tokens of e-mailadressen meegestuurd.
Bestaande uren van vóór de Pocket ID-koppeling blijven behouden en worden getoond met Invoerder onbekend.
Beveiliging
Commit nooit een .env-bestand of client secret. Als een geheim eerder in Git heeft gestaan, verwijder het niet alleen uit het bestand maar roteer het ook in Pocket ID.