Un projet complet de gestion des entrées/sorties en milieu industriel avec analyse des données grâce à des outils opensource et entièrement développée en interne, sans recours à du matériel spécifique.
graph TD
A[Système de Suivi] --> B[Frontend]
A --> C[Backend]
A --> D[Base de Données]
A --> E[Services Externes]
%% Frontend
B --> B1[Interface Admin]
B1 --> B1a[Tableau de Bord]
B1a --> B1a1[Chart.js - Graphiques Temps Réel]
B1a --> B1a2[DataTables - Affichage Tabulaire]
B1 --> B1b[Gestion Ouvriers]
B1b --> B1b1[CRUD Complet]
B1 --> B1c[Export Excel]
B --> B2[Application Mobile]
B2 --> B2a[Instascan.js]
B2a --> B2a1[Optimisation Caméra]
B2a --> B2a2[Gestion Lumière Faible]
B2 --> B2b[Mode Hors-Ligne]
B2b --> B2b1[localStorage]
B2b --> B2b2[IndexedDB]
B2 --> B2c[Synchronisation]
B2c --> B2c1[Exponential Backoff]
%% Backend
C --> C1[API PHP]
C1 --> C1a[Routing Personnalisé]
C1a --> C1a1[scan.php]
C1a --> C1a2[report.php]
C1 --> C1b[Authentification]
C1b --> C1b1[Sessions PHP]
C1b --> C1b2[JWT pour Mobile]
C --> C2[PhpSpreadsheet]
C2 --> C2a[Génération Excel]
C2a --> C2a1[Formules Dynamiques]
C2a --> C2a2[Styles Conditionnels]
C2 --> C2b[Export PDF]
C --> C3[Middleware]
C3 --> C3a[Validation Données]
C3 --> C3b[Logging]
C3 --> C3c[Limite Requêtes]
%% Base de Données
D --> D1[MySQL]
D1 --> D1a[Structure Optimisée]
D1a --> D1a1[Index Composite]
D1a --> D1a2[Foreign Keys]
D1 --> D1b[Procédures Stockées]
D1b --> D1b1[Calcul Stats Mensuelles]
D1 --> D1c[Sauvegarde Auto]
%% Services
E --> E1[ngrok]
E --> E2[GitHub]
E --> E3[phpMyAdmin]
Catégorie | Technologies |
---|---|
Frontend | HTML5, CSS3, JavaScript Vanilla, Chart.js |
Backend | PHP 8+, MySQL |
Bibliothèques | Instascan.js (Lecture QR), PhpSpreadsheet (Export Excel) |
Outils | XAMPP, phpMyAdmin, VS Code, NGROK |
- 🚪 Système de badge QR avec historique
- 📈 Tableau de bord analytique
- 📊 Génération de rapports Excel avancés
- 📱 Mode hors-ligne (localStorage)
- 🔐 Interface admin sécurisée
badge-system/
├── admin/
│ ├── index.php # Dashboard analytique
│ ├── functions.php # Fonctions utilitaires
│ ├── style.css # Styles CSS
│ └── script.js # Logique frontend
├── mobile/
│ ├── index.html # Interface de scan
│ └── script.js # Gestion du QR et offline
├── api/
│ ├── get-report.php # Endpoint des données
│ └── export-excel.php # Génération Excel
└── vendor/ # Dependencies PHP
- PHP 8.0+
- MySQL 5.7+
- Ngrok
- Composer (pour PhpSpreadsheet)
# Cloner le dépôt
git clone https://github.com/votre-utilisateur/badge-system.git
cd badge-system
# Installer les dépendances
composer install
# Importer la base de données
mysql -u username -p badge_scan_db < database.sql
sequenceDiagram
participant U as Utilisateur
participant M as Mobile
participant API as Backend PHP
participant DB as MySQL
participant A as Interface Admin
participant E as Excel
U->>M: Scan du QR Code
M->>API: POST /scan (QR data)
alt Mode Connecté
API->>DB: INSERT scan (timestamp, type_scan)
API-->>M: {"status": "success", "nom": "Jean Dupont"}
M->>U: Affiche confirmation
API->>DB: Mise à jour des stats
else Mode Hors-Ligne
M->>localStorage: Stockage en JSON {qr_data, timestamp}
M->>U: "Scan enregistré (hors-ligne)"
end
loop Synchronisation
M->>API: Envoi des scans en attente
API->>DB: Bulk INSERT
end
A->>API: GET /report?date=2025-06-01
API->>DB: Requête analytique
DB-->>API: Stats brutes
API-->>A: Formatage JSON
A->>API: GET /export-excel
API->>DB: Requête complète
DB-->>API: Données brutes
API->>E: Génération XLSX via PhpSpreadsheet
E-->>A: Téléchargement automatique
Utilisation d'Instascan.js avec optimisation pour mobiles low-end
// Structure du localStorage
{
"pending_scans": [
{
"qr_data": "JEAN123",
"timestamp": "2025-06-05T08:30:00Z",
"sync_attempts": 0
}
]
}
Exponential backoff pour les réessais (1min, 5min, 15min)
// scan.php
$data = json_decode(file_get_contents('php://input'));
$stmt = $conn->prepare("INSERT INTO scans (...) VALUES (?, ?, ?)");
$stmt->bind_param("iss", $data->ouvrier_id, $data->timestamp, $data->type);
/* Requête pour détection des retards */
SELECT
COUNT(CASE WHEN TIME(arrival) > heure_debut THEN 1 END) as retards,
COUNT(CASE WHEN arrival IS NULL THEN 1 END) as absents
FROM scans
WHERE DATE(timestamp) = CURDATE()
// Formatage conditionnel Excel
$sheet->getStyle('D2:D100')
->getNumberFormat()
->setFormatCode(
'[Vert]#,##0.00;[Rouge]-#,##0.00;[Jaune]"Retard"'
);
Session PHP avec token JWT côté client
$_SESSION['admin'] = [
'last_activity' => time(),
'ip' => $_SERVER['REMOTE_ADDR']
];
Calcul des KPI en temps réel :
/* Taux de présence */
SELECT
(COUNT(DISTINCT CASE WHEN s.id IS NOT NULL THEN o.id END) /
COUNT(DISTINCT o.id)) * 100 as taux_presence
FROM ouvriers o
LEFT JOIN scans s ON o.id = s.ouvrier_id AND DATE(s.timestamp) = ?
Algorithme de repérage des motifs récurrents :
// Détection des retardataires fréquents
$frequent_lates = $conn->query("
SELECT ouvrier_id, COUNT(*) as lates
FROM scans
WHERE TIME(timestamp) > heure_debut
GROUP BY ouvrier_id
HAVING lates > 3
");
Classe Excel dédiée avec :
- Onglets multiples
- Formules intégrées (SOMME.SI, MOYENNE)
- Mise en forme conditionnelle
CREATE INDEX idx_scans_composite ON scans(ouvrier_id, DATE(timestamp));
// Service Worker pour pré-cache des assets admin
workbox.routing.registerRoute(
new RegExp('/admin/.*\\.(js|css)'),
new workbox.strategies.CacheFirst()
);
- Calcul automatique des retards (seuil configurable)
- Détection des absences
- Statistiques journalières/mensuelles
// Exemple de code PhpSpreadsheet
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Rapport des Présences');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
Domaine | Implémentation |
---|---|
Sécurité | Protection admin par session PHP, Validation des entrées SQL |
Performance | Requêtes SQL optimisées, Cache localStorage |
UX | Interface responsive, Feedback visuel immédiat |
Code Quality | Separation of Concerns, Fonctions modulaires |
Ce système répond efficacement aux besoins des cas d'utilisation suivants. :
-
Gestion des présences en entreprise
-
Suivi des élèves / étudiants
-
Suivi des heures de travail
-
Traçabilité du personnel
-
Registre d’émargement numérique
-
Historique de présence
-
Tableau de bord RH
-
Journal des présences |
Les contributions sont les bienvenues ! Voici comment participer :
- Forkez le projet
- Créez une branche (
git checkout -b feature/AmazingFeature
) - Committez vos changements (
git commit -m 'Add some AmazingFeature'
) - Pushez (
git push origin feature/AmazingFeature
) - Ouvrez une Pull Request
MIT © [Collins HAYA] - Utilisation libre pour projets éducatifs et professionnels
pie
title Répartition des Technologies
"PHP" : 35
"JavaScript" : 30
"HTML/CSS" : 20
"MySQL" : 15
⭐ Si ce projet vous a plu, n'hésitez pas à laisser une star ! ⭐
"Une solution complète pour la gestion moderne des présences en environnement industriel. Pas besoin de badgeuse, de lecteur RFID, ni de tablette dédiée : un simple navigateur web suffit. La solution a été pensée pour être autonome, portable et rentable dès le premier jour.