Skip to content

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.

Notifications You must be signed in to change notification settings

Collins-Webdev/Rapport_d_assiduite_par_validation_biometrique

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📊 Système inteligent de contrôle d’assiduité via validation biométrique

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]
Loading

🛠️ Stack Technologique

Core Stack

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

Fonctionnalités Clés

  • 🚪 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

🌐 Architecture du Projet

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

🔧 Installation Locale

Prérequis

  • 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

🚀 Fonctionnalités Avancées

1. Système de Scan Intelligent

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
Loading

2. Analyse des Données

Côté Mobile

Lecture QR

Utilisation d'Instascan.js avec optimisation pour mobiles low-end

Gestion offline

// Structure du localStorage
{
  "pending_scans": [
    {
      "qr_data": "JEAN123",
      "timestamp": "2025-06-05T08:30:00Z",
      "sync_attempts": 0
    }
  ]
}

Synchronisation

Exponential backoff pour les réessais (1min, 5min, 15min)

Côté Backend

Endpoints API

// 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);

Côté Admin

Analyse en temps réel

/* 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()

PhpSpreadsheet

// Formatage conditionnel Excel
$sheet->getStyle('D2:D100')
  ->getNumberFormat()
  ->setFormatCode(
    '[Vert]#,##0.00;[Rouge]-#,##0.00;[Jaune]"Retard"'
  );

Workflow Complet Admin

1. Authentification

Session PHP avec token JWT côté client

$_SESSION['admin'] = [
  'last_activity' => time(),
  'ip' => $_SERVER['REMOTE_ADDR']
];

2. Dashboard

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) = ?

3. Détection d'Anomalies

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
");

4. Export Avancé

Classe Excel dédiée avec :

  • Onglets multiples
  • Formules intégrées (SOMME.SI, MOYENNE)
  • Mise en forme conditionnelle

Optimisations Notables

Indexation MySQL

CREATE INDEX idx_scans_composite ON scans(ouvrier_id, DATE(timestamp));

Cache navigateur

// 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

3. Export Excel

// 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');

📚 Bonnes Pratiques Implémentées

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

🧑‍💼 Cas d'utilisation

Ce système répond efficacement aux besoins des cas d'utilisation suivants. :

  1. Gestion des présences en entreprise

  2. Suivi des élèves / étudiants

  3. Suivi des heures de travail

  4. Traçabilité du personnel

  5. Registre d’émargement numérique

  6. Historique de présence

  7. Tableau de bord RH

  8. Journal des présences |

🤝 Contribution

Les contributions sont les bienvenues ! Voici comment participer :

  1. Forkez le projet
  2. Créez une branche (git checkout -b feature/AmazingFeature)
  3. Committez vos changements (git commit -m 'Add some AmazingFeature')
  4. Pushez (git push origin feature/AmazingFeature)
  5. Ouvrez une Pull Request

📜 License

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
Loading

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.

About

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.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published