# BadgeIn — Pointage RFID

Application de pointage pour borne plein écran avec lecteur RFID (émulation clavier).

## Démarrage

```bash
npm install
npm start
```

- **Borne de pointage** : http://localhost:3000/borne/ (la racine `/` y redirige) — à ouvrir en plein écran (F11) sur l'écran de la borne.
- **Administration** : http://localhost:3000/admin/ — mot de passe par défaut : `admin`.

## Configuration (variables d'environnement)

| Variable | Défaut | Rôle |
|---|---|---|
| `PORT` | `3000` | Port HTTP |
| `ADMIN_PASSWORD` | `admin` | Mot de passe de l'interface admin — **à changer en production** |
| `SESSION_SECRET` | (dev) | Secret des sessions — à changer en production |
| `DATA_DIR` | `./data` | Dossier de la base SQLite et des clés VAPID |
| `DAILY_REPORT_TIME` | `20:00` | Heure d'envoi du récap quotidien par notification |
| `VAPID_SUBJECT` | (mailto) | Contact transmis aux services de push |

Exemple : `ADMIN_PASSWORD=monmotdepasse PORT=8080 npm start` (voir `.env.example`)

## Fonctionnement

### Borne (`/borne/`)
La page écoute le clavier au niveau du document : le lecteur RFID « tape » le
numéro du badge puis Entrée. Un scan valide affiche « Bonjour {prénom} » (arrivée)
ou « Au revoir {prénom} » (départ) selon la parité des pointages du jour.
Un double bip dans les 30 secondes est ignoré (anti-rebond).

### Calcul des heures
Les pointages d'une journée sont appariés deux à deux : (1ᵉʳ, 2ᵉ) = première
plage travaillée, (3ᵉ, 4ᵉ) = deuxième, etc. Un nombre impair de pointages
signale un oubli de badge (marqué ⚠ dans les rapports, plage non comptée) —
corrigeable dans l'admin via l'ajout manuel de pointage.

### Admin (`/admin/`)
- Création / désactivation / suppression d'employés.
- **Association de badge** : bouton « Badge » sur l'employé → bipper le badge → associé.
- Détail des pointages par employé, ajout manuel (correction d'oubli) et suppression.
- Rapports par **jour / semaine / mois**, filtrables par employé, avec **export CSV**
  (compatible Excel).

## Données

SQLite via `better-sqlite3`, fichier `data/badgein.sqlite` (créé au premier
lancement). Deux tables : `employees` et `punches` (un enregistrement par bip,
horodaté en heure locale).

## Notifications push & PWA

- Bouton **« 🔔 Activer les notifications »** dans l'en-tête de l'admin : abonne
  l'appareil courant (Web Push/VAPID). Une notification de test est envoyée
  immédiatement.
- **Fin de session** : à chaque pointage de départ, les admins abonnés reçoivent
  début → fin et durée de la session.
- **Récap quotidien** : envoyé à `DAILY_REPORT_TIME` ; le clic ouvre l'admin sur
  le rapport du jour. Envoi manuel possible : `POST /api/admin/push/daily-summary`.
- Les deux pages sont des **PWA installables** (manifests + service worker) :
  la borne en plein écran (icône horloge bleue), l'admin en standalone (icône
  engrenage violette).

⚠️ Hors `localhost`, service worker et push exigent **HTTPS** — mettre le VPS
derrière un reverse proxy TLS (nginx + certbot).

## Déploiement VPS (PM2)

```bash
# Première fois : préparer le VPS
ssh vps 'mkdir -p /var/www/badgein/shared/data && cp .env.example /var/www/badgein/shared/.env'  # puis éditer le .env
pm2 deploy production setup

# À chaque déploiement
pm2 deploy production
```

La base SQLite vit dans `shared/data` (via `DATA_DIR`), elle survit aux releases.

## Lancement en borne (kiosque)

Sur la machine de la borne, lancer Chrome/Chromium en mode kiosque :

```bash
chromium --kiosk --noerrdialogs --disable-session-crashed-bubble http://localhost:3000/
```
