Documentation Technique Complète
Version: 2.0 - Production Ready
Plateforme: Electron Desktop (Local)
Date de génération: Mars 2026
Destinataires: Collèges & Établissements Scolaires
Vue d'ensemble complète de l'application OK Cuisine
OK Cuisine est une application de gestion HACCP complète destinée aux établissements de restauration collective scolaire. Développée en JavaScript vanilla, elle fonctionne en mode 100% local via Electron Desktop, garantissant la sécurité des données sensibles (PAI, données de santé) sans connexion internet.
| Réglementation | Description | Module(s) concerné(s) |
|---|---|---|
| CE 852/2004 | Hygiène des denrées alimentaires (Paquet Hygiène) | temperatures.js, nettoyage.js, protocoles.js |
| CE 178/2002 | Traçabilité des denrées alimentaires | tracabilite.js, receptions.js, inventaire.js |
| INCO 1169/2011 | Information des consommateurs (allergènes) | allergenes.js, pai.js, menus.js |
| Loi AGEC 2020-105 | Lutte contre le gaspillage alimentaire | agec-avance.js, gaspillage.js |
| RGPD 2016/679 | Protection des données personnelles | rgpd.js, crypto.js, security.js |
| Arrêté du 21/12/2009 | Températures de conservation | temperatures.js, protocoles.js |
| GEMRCN | Nutrition en restauration collective | gemrcn-check.js, menus.js |
Cœur de l'application et gestion HACCP
Point d'entrée principal de l'application. Gère l'initialisation, l'authentification, la navigation et le cycle de vie.
| # | Fonction | Description | Retour |
|---|---|---|---|
| 1 | App.init() | Initialise l'application : keyboard, modules Voice/Temperatures/Nettoyage, config, idle tracking, service worker | void |
| 2 | App._ensureAdminExists() | Vérifie qu'au moins un administrateur existe dans la configuration | void |
| 3 | App._renderLoginUsers() | Affiche la liste des utilisateurs disponibles avec avatars et rôles | void |
| 4 | App.selectUser(userId) | Sélectionne un utilisateur et affiche l'écran de saisie PIN | void |
| 5 | App.backToUsers() | Retour à la sélection d'utilisateurs depuis l'écran PIN | void |
| 6 | App.pinInput(digit) | Ajoute un chiffre au buffer PIN (max 4), auto-submit à 4 chiffres | void |
| 7 | App.pinClear() | Supprime le dernier chiffre du buffer PIN | void |
| 8 | App.pinSubmit() | Valide le PIN (hash + comparaison), verrouillage après 3 échecs (5min) | boolean |
| 9 | App._registerFailedPin(userId) | Enregistre un échec PIN, verrouille le compte si ≥3 tentatives | void |
| 10 | App._login() | Finalise la connexion : journal, dashboard, voice, briefing auto | void |
| 11 | App.logout() | Déconnexion : désactive voice, stop idle timer, efface crypto, backup | void |
| 12 | App.navigate(page) | Navigation vers une page : mise à jour sidebar, render module | void |
| 13 | App._renderPage(page) | Router central appelant le render() du module correspondant | void |
| 14 | App.showSetup() | Modal de configuration initiale (nom établissement, admin, PIN) | void |
| 15 | App.saveSetup() | Sauvegarde la configuration initiale avec validation | boolean |
| 16 | App._roleLabel(role) | Convertit le code rôle en libellé français | string |
| 17 | App._startIdleTimer() | Démarre le timer d'inactivité (déconnexion auto) | void |
| 18 | App._resetIdleTimer() | Réinitialise le timer d'inactivité sur action utilisateur | void |
Couche d'abstraction pour localStorage avec chiffrement transparent des données sensibles. 124 fonctions couvrant toutes les entités métier.
| Fonction | Paramètres | Description |
|---|---|---|
| hashPin(pin) | pin: string | Hash irréversible du PIN avec salt constant (préfixe 'h') |
| save(name, data) | name: string, data: any | Sauvegarde avec chiffrement automatique si données sensibles |
| load(name, defaultValue) | name: string, default: any | Chargement avec déchiffrement automatique si nécessaire |
| today() | - | Retourne la date du jour au format YYYY-MM-DD |
| uid() | - | Génère un ID unique (timestamp base36 + random) |
| formatDate(dateStr) | dateStr: string | Formate en "Lundi 15 janvier 2026" (français) |
| formatTime(isoString) | isoString: string | Formate en "HH:MM" |
| addDays(dateString, days) | dateString: string, days: number | Ajoute N jours à une date |
getTemperatures(date)addTemperature(entry)getCCPRecords(date)addCCPRecord(entry)getNettoyages(date)addNettoyage(entry)getValidationNettoyages()saveValidationNettoyage(v)getReceptions(date)addReception(entry)getInventaire()addInventaireItem(item)updateInventaireItem(id, u)removeInventaireItem(id)getEtiquettes()addEtiquette(etiq)getPlatsTemoins()addPlatTemoin(temoin)getControlesHuiles()addControleHuile(ctrl)getAlertes()addAlerte(alerte)resolveAlerte(id, comment)checkDLCAlerts()getAllergenePlats()addAllergenePlat(plat)getPAIEnfants()savePAIEnfant(enfant)getPAIAlertes()Gestion complète des relevés de températures : stockage froid, CCP cuisson/refroidissement, alertes automatiques, historiques graphiques.
| Fonction | Description |
|---|---|
| render() | Affiche la page avec onglets Stockage/CCP, cartes de zones, tableau historique |
| switchTab(tab) | Bascule entre onglets 'stockage' et 'ccp' |
| showAddModal(zoneId) | Modal d'ajout de relevé avec pré-sélection de zone optionnelle |
| saveFromModal() | Valide et sauvegarde le relevé, crée alerte si hors limites |
| showCCPModal(type) | Modal CCP : cuisson (≥63°C), refroidissement (<10°C en 2h), remise (≥63°C en 1h) |
| saveCCP() | Sauvegarde CCP avec création d'alerte critique si non-conforme |
| getZoneHistory(zoneId, days) | Récupère l'historique d'une zone sur N jours |
| renderHistoryChart(records, zone) | Génère un graphique SVG avec courbe, zone de conformité, points colorés |
| showHistoryModal(zoneId, period) | Modal complet avec stats (moy/min/max), graphique, tableau détaillé |
| renderSparkline(zoneId) | Mini-graphique SVG (200x50) pour les alertes et dashboard |
Suivi du plan de nettoyage conforme CE 852/2004 avec checklist quotidienne, produits utilisés et validation.
| Fonction | Description |
|---|---|
| render() | Page complète avec stats, checklist zones, tableau historique |
| _renderCommis() | Vue simplifiée pour les commis (uniquement checklist du jour) |
| quickClean(zoneName) | Modal rapide pour marquer une zone comme nettoyée |
| saveQuickClean(zoneName) | Enregistre le nettoyage d'une zone avec produit utilisé |
| showAddModal() | Modal complet avec multi-sélection de zones et produit |
| saveFromModal() | Sauvegarde le nettoyage de plusieurs zones simultanément |
Contrôle à réception des marchandises avec vérification visuelle, température, conformité et intégration automatique à l'inventaire.
| Fonction | Description |
|---|---|
| render() | Page avec stats conformité, rappel HACCP, tableau des réceptions du jour |
| showAddModal() | Modal : fournisseur, produit, température, contrôles visuels, N° lot, DLC |
| saveFromModal() | Sauvegarde réception, crée alerte si NC, met à jour inventaire automatiquement |
| _updateInventaireFromReception(...) | Ajoute/met à jour le produit en stock, détecte catégorie auto, marque reçu dans commandes |
| _detectCategorie(produit) | Détection automatique de catégorie par mots-clés (Fruits, Viandes, Poissons...) |
| showDetail(id) | Modal détaillé d'une réception avec tous les contrôles |
| Fonction | Description |
|---|---|
| render() | Affiche inventaire groupé par catégorie avec alertes DLC, filtres |
| adjustQty(id, delta) | Ajuste la quantité d'un produit (+1/-1) |
| showAddModal() | Modal d'ajout produit avec toutes les métadonnées |
| editItem(id) | Modal d'édition d'un produit existant |
| deleteItem(id) | Suppression avec confirmation |
| _getDLCStats(items) | Calcule les DLC critiques et proches |
Conformité CE 178/2002 avec étiquettes déconditionnement (J+3), plats témoins (5 jours), fournisseurs agréés.
| Fonction | Description |
|---|---|
| render() | Page avec 3 onglets : Étiquettes J+3, Fournisseurs agréés, Plats témoins |
| showAddEtiquetteModal() | Modal étiquette : produit, origine, lot, DLC secondaire (max J+3) |
| saveEtiquette() | Sauvegarde avec avertissement si DLC > J+3 |
| _renderPlatsTemoins() | Affiche plats témoins actifs (< 5 jours) et archives |
| showAddFournisseurModal() | Ajoute un fournisseur agréé avec N° agrément sanitaire |
Plan d'Accueil Individualisé pour les enfants allergiques. Données chiffrées AES-256-GCM (données de santé).
| Fonction | Description |
|---|---|
| render() | Liste des enfants PAI, alertes adrénaline, statistiques allergènes |
| showAddEnfantModal() | Modal enfant : nom, allergies, PAI numérisé, adrénaline (expiration) |
| _checkAdrenalineAlerts() | Vérifie expiration adrénaline (alerte si < 30 jours) |
| showEnfantDetail(id) | Fiche détaillée enfant avec protocole d'urgence |
| Fonction | Description |
|---|---|
| Allergenes.render() | Matrice allergènes INCO 1169/2011 (14 allergènes) |
| MenuPAICrosscheck.check(date) | Cross-référence menus/PAI, retourne les conflits détectés |
| MenuPAICrosscheck.renderDashboardAlert() | Alerte dashboard si menu contient allergènes d'enfants PAI |
Gestion des incidents alimentaires avec déclaration DDPP, enquête interne et mesures correctives.
| Fonction | Description |
|---|---|
| render() | Liste incidents avec filtres (actifs/clos), badges gravité |
| showAddModal() | Déclaration : type (TIAC, suspicion, allergie...), gravité, personnes atteintes |
| showEnquete(incidentId) | Formulaire enquête : origine présumée, conclusions, actions correctives |
| saveEnquete(incidentId) | Sauvegarde enquête avec notification DDPP optionnelle |
| closeIncident(incidentId) | Clôture incident après confirmation |
| exportDDPP() | Export PDF format déclaration DDPP |
| Fonction | Description |
|---|---|
| render() | Dashboard formations avec alertes expirations (< 30 jours) |
| showAddModal() | Enregistrement : utilisateur, type (HACCP, Hygiène...), dates, attestation |
| _getStatus(dateExpiration) | Retourne 'valide', 'expirant', 'expiré' selon date |
Plateforme e-learning complète avec 13 modules, timer anti-triche, quiz validants et attestations.
| Fonction | Description |
|---|---|
| render() | Catalogue 13 modules avec progression, badges, déblocage séquentiel |
| openModule(moduleId) | Ouvre module avec liste leçons, objectifs, progression |
| openLesson(moduleId, lessonId) | Affiche leçon avec timer pause réelle (ignore temps tab caché) |
| _startLessonTimer(minMs, done) | Timer anti-triche : compte uniquement temps tab visible |
| validateLesson(moduleId, lessonId) | Valide leçon après temps minimum, track switches tabs |
| openQuiz(moduleId) | Quiz randomisé avec options mélangées |
| submitQuiz(e, moduleId) | Corrige quiz (seuil 75%), affiche résultat/attestation |
| openAttestation(moduleId) | Certificat imprimable avec N° unique, date, validité |
| renderSuperviseur() | Dashboard superviseur : progression tous agents, validation |
Préparation aux contrôles sanitaires avec ~90 questions réglementaires, 13 sections, notation A-D et plan d'action.
| Fonction | Description |
|---|---|
| render() | Écran démarrage ou audit en cours selon état |
| startAudit(mode) | Démarre audit 'manuel' ou 'simulation' (pré-rempli auto) |
| _autoCheckQuestion(type) | Vérifie données Storage pour pré-répondre (temp, nettoyage...) |
| _calculateScores() | Calcule score pondéré, compte NC par criticité, note A-D |
| _renderSection(sec) | Section collapsible avec icône, score, questions |
| finalizeAudit() | Valide (min 50% réponses), sauvegarde historique, génère actions |
| exportPDF() | Export rapport audit PDF complet |
Sécurité, chiffrement, sauvegarde et interface
Chiffrement bout-en-bout des données sensibles via Web Crypto API. PBKDF2 (100k itérations) pour dérivation de clé.
| Fonction | Description |
|---|---|
| isAvailable() | Vérifie disponibilité Web Crypto API |
| init(pin, userId) | Initialise : dérive KEK du PIN, charge/crée DEK, déchiffre cache |
| isSensitive(name) | Identifie clés sensibles (PAI, données santé) |
| getCached(name, default) | Récupère données déchiffrées du cache mémoire |
| updateAndEncrypt(name, data) | Met à jour cache et chiffre vers localStorage (async) |
| addUserToKeyring(pin, userId) | Ajoute utilisateur au keyring avec sa KEK dérivée |
| _deriveKEK(pin, salt) | PBKDF2 : 100k itérations, SHA-256 → AES-256-GCM |
| Fonction | Description |
|---|---|
| canAccess(role, page) | Vérifie accès page selon rôle (matrice permissions) |
| filterNav() | Filtre navigation sidebar selon rôle et mode essentiel |
| isManager(role) | admin, gestionnaire, directeur |
| isChef(role) | chef, remplaçant + managers |
| canManageUsers(role) | Création/modification utilisateurs (managers) |
| canBackupRestore(role) | Sauvegarde/restauration (managers + chefs) |
Reconnaissance vocale avec wake word "OK Cuisine", 50+ commandes, flows conversationnels temps réel.
| Fonction | Description |
|---|---|
| init() | Initialise WebSpeech API, charge voix française, configure events |
| activate() | Active reconnaissance, affiche panel, démarre écoute |
| _matchWakeWord(text) | Détecte variations : "ok cuisine", "okay cuisine", "o cuisine"... |
| _parseCommand(text) | Router ~50 patterns vers flows ou navigation |
| speak(text) | Synthèse vocale française, reprend écoute après |
| _flowTemperature() | Flow : zone → température → validation/alerte |
| _flowNettoyage() | Flow : zones → produit → confirmation |
| _flowReception() | Flow : fournisseur → produit → temp → conformité |
| Fonction | Description |
|---|---|
| canHandle(text) | Détecte intent (action, navigation, analyse, aide) |
| _analyzeAlertes() | "Combien d'alertes ?" → compte et résume |
| _analyzeTemperatures() | "État des températures ?" → zones couvertes, NC |
| _analyzeDLC() | "DLC critiques ?" → liste produits à surveiller |
| _handleDailySummary() | "Bonjour" → briefing matin complet |
Sauvegarde fichier JSON via File System API, support USB, auto-save périodique, détection changements.
| Fonction | Description |
|---|---|
| chooseFile() | Sélectionne fichier/dossier, propose restauration si existant |
| saveNow(options) | Sauvegarde immédiate vers fichier + USB optionnel |
| restoreNow() | Restaure depuis dernière sauvegarde |
| toggleAuto() | Active/désactive sauvegarde auto (interval configurable) |
| chooseUsbFolder() | Configure sauvegarde USB secondaire |
| _autoLoadIfNewer() | Auto-charge si fichier plus récent que dernière lecture |
| checkAndProposeRestore() | Au démarrage, propose restauration si app vide |
Génération de rapports PDF professionnels pour tous les modules. Export DDPP complet (2000+ lignes).
| Fonction | Type Export |
|---|---|
| _exportTemperatures() | Relevés du jour avec statuts conformité |
| _exportNettoyage() | Plan de nettoyage du jour |
| _exportReceptions() | Contrôles réception avec NC highlight |
| _exportInventaire() | Inventaire groupé par catégorie |
| _exportJournal() | Journal des actions (date ou plage) |
| _exportAllergenes() | Matrice INCO 1169/2011 |
| _exportMenus() | Menus hebdomadaires avec allergènes |
| _exportRecettes() | Fiches techniques recettes |
| _exportDDPP() | Rapport complet 20 sections (audit DDPP) |
Inventaire exhaustif de toutes les fonctions
| Module | Fichier | Fonctions | Catégorie |
|---|---|---|---|
| 🚀 Application Core | app.js | 26 | Core |
| 💾 Storage | storage.js | 124 | Core |
| 🎨 UI | ui.js | 16 | Core |
| 📊 Dashboard | dashboard.js | 16 | Core |
| 🌡️ Températures | temperatures.js | 20 | HACCP |
| 🧹 Nettoyage | nettoyage.js | 9 | HACCP |
| 📦 Réceptions | receptions.js | 13 | HACCP |
| 📋 Inventaire | inventaire.js | 12 | HACCP |
| 🔍 Traçabilité | tracabilite.js | 15 | HACCP |
| 🥜 Allergènes | allergenes.js | 8 | HACCP |
| 👤 PAI | pai.js | 10 | HACCP |
| ⚠️ Alertes | alertes.js | 6 | HACCP |
| 📓 Journal | journal.js | 5 | HACCP |
| 🍽️ Menus | menus.js | 62 | Gestion |
| 📖 Recettes | recettes.js | 18 | Gestion |
| 🏢 Fournisseurs | fournisseurs.js | 13 | Gestion |
| 🎓 Formation | formation.js | 12 | RH |
| 📚 Formation Pro | formation-pro.js | 32 | RH |
| 📋 Audit | audit.js | 13 | Conformité |
| 🎯 Simulateur | simulateur.js | 30 | Conformité |
| 🚨 TIAC | tiac.js | 11 | Incidents |
| 🔒 RGPD | rgpd.js | 22 | Conformité |
| ♻️ AGEC | agec-avance.js | 15 | Conformité |
| 🔧 Maintenance | maintenance.js | 8 | Équipement |
| 📜 Protocoles | protocoles.js | 11 | Documentation |
| 🔀 Séparation Cru/Cuit | separation-cru-cuit.js | 10 | HACCP |
| ⚡ Analyse Risques | analyse-risques.js | 7 | HACCP |
| ✅ Validation Nettoyage | validation-nettoyage.js | 7 | HACCP |
| 🎤 Voice | voice.js | 55 | Interface |
| 🤖 Voice AI | voice-ai.js | 40 | Interface |
| 💾 Backup | backup.js | 38 | Infrastructure |
| ⚙️ Config | config.js | 19 | Infrastructure |
| pdf.js | 16 | Export | |
| 📅 Calendrier | calendrier.js | 21 | Gestion |
| 👥 Agents | agents.js | 16 | RH |
| ⌨️ Keyboard | keyboard.js | 6 | Interface |
| 🔐 Security | security.js | 13 | Sécurité |
| 🔑 Crypto | crypto.js | 20 | Sécurité |
| 🛂 Permissions | permissions.js | 19 | Sécurité |
| 🚿 Douches/Vestiaires | douches-vestiaires.js | 8 | Conformité |
| ⚠️ Rappels Produits | rappels-produits.js | 11 | Sécurité |
| 📢 Rappel Conso | rappel-conso.js | 5 | Sécurité |
| 🔗 Menu-PAI Crosscheck | menu-pai-crosscheck.js | 5 | HACCP |
| 🥗 GEMRCN | gemrcn-check.js | 10 | Nutrition |
| 💰 Coût Matière | cout-matiere.js | 9 | Gestion |
| 🧹 Stock Entretien | stock-entretien.js | 21 | Gestion |
| 🍽️ Couverts | couverts.js | 13 | Gestion |
| ♻️ Gaspillage | gaspillage.js | 14 | AGEC |
| 🔄 Actions Correctives | actions-correctives.js | 8 | HACCP |
| 📦 Archivage DLC | archivage-dlc.js | 5 | HACCP |
Version 2.0 | Mars 2026 | Application Electron Desktop
Conforme CE 852/2004, CE 178/2002, INCO 1169/2011, Loi AGEC 2020-105, RGPD 2016/679