No description
  • JavaScript 65.5%
  • EJS 20.5%
  • CSS 11.8%
  • PowerShell 2%
  • Dockerfile 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-11-11 23:31:29 +01:00
public Show Pocket ID markers on employee list 2026-11-11 23:31:29 +01:00
scripts Add weekly personnel schedules and compact employee management 2026-10-08 00:38:33 +02:00
src Show Pocket ID markers on employee list 2026-11-11 23:31:29 +01:00
test Show Pocket ID markers on employee list 2026-11-11 23:31:29 +01:00
views Show Pocket ID markers on employee list 2026-11-11 23:31:29 +01:00
.dockerignore feat: start Lokma urenregistratie v1.1 2026-08-19 10:21:42 +02:00
.env.example Restrict Pocket ID access to lokma_beheer 2026-10-07 14:46:29 +02:00
.gitignore feat: start Lokma urenregistratie v1.1 2026-08-19 10:21:42 +02:00
docker-compose.yml Restrict Pocket ID access to lokma_beheer 2026-10-07 14:46:29 +02:00
Dockerfile fix: use bundled SQLite binary in Docker build 2026-08-19 11:07:13 +02:00
package-lock.json Add weekly personnel schedules and compact employee management 2026-10-08 00:38:33 +02:00
package.json Add weekly personnel schedules and compact employee management 2026-10-08 00:38:33 +02:00
README.md Show Pocket ID markers on employee list 2026-11-11 23:31:29 +01:00

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_beheer melden 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

  1. 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
  2. Geef de Pocket ID-client uitsluitend toegang aan de groep lokma_beheer en controleer dat minstens één beheerder lid is vóór de uitrol. Stel daarna in Dockhand de variabelen uit .env.example in. Gebruik een lange willekeurige SESSION_SECRET en plaats het Pocket ID-client secret uitsluitend in OIDC_CLIENT_SECRET.
  3. Start:
docker compose up -d --build
  1. 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:

  1. Kies een unieke inlogcode van minimaal 3 tekens.
  2. Stel een pincode van 4–8 cijfers of een wachtwoord van minimaal 8 tekens in. Vermijd voor de hand liggende codes zoals 1234.
  3. 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.

  1. Maak in n8n een workflow met een Webhook-node: POST /webhook/lokma-uren-doorgegeven.
  2. Beveilig de webhook met een lange, willekeurige waarde en controleer de header Authorization: Bearer <geheim>.
  3. Voeg daarna een HTTP Request-node toe die de melding naar de gewenste Gotify-app stuurt.
  4. Publiceer de workflow en gebruik uitsluitend de Production URL.
  5. Stel in Dockhand N8N_HOURS_WEBHOOK_URL en hetzelfde N8N_HOURS_WEBHOOK_SECRET in. Optioneel kan N8N_HOURS_WEBHOOK_TIMEOUT_MS worden 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.