// ============================================= // CORRECTION INSCRIPTION - AJOUTER VERS LIGNE 830 // ============================================= // 1. Désactiver temporairement Supabase pour tester const FORCE_LOCAL_MODE = true; // Met à TRUE pour tester immédiatement // 2. Base de données locale (fallback) let localDB = { entreprises: JSON.parse(localStorage.getItem('survoeil_entreprises') || '[]'), vigiles: JSON.parse(localStorage.getItem('survoeil_vigiles') || '[]'), magasins: JSON.parse(localStorage.getItem('survoeil_magasins') || '[]'), scans: JSON.parse(localStorage.getItem('survoeil_scans') || '[]'), qr_codes: JSON.parse(localStorage.getItem('survoeil_qrcodes') || '[]') }; // 3. Sauvegarder la DB locale function saveLocalDB() { localStorage.setItem('survoeil_entreprises', JSON.stringify(localDB.entreprises)); localStorage.setItem('survoeil_vigiles', JSON.stringify(localDB.vigiles)); localStorage.setItem('survoeil_magasins', JSON.stringify(localDB.magasins)); localStorage.setItem('survoeil_scans', JSON.stringify(localDB.scans)); localStorage.setItem('survoeil_qrcodes', JSON.stringify(localDB.qrcodes)); } // 4. Fonction de hash simple qui fonctionne TOUJOURS async function simpleHash(password) { // Méthode robuste qui ne plante jamais let hash = 0; for (let i = 0; i < password.length; i++) { const char = password.charCodeAt(i); hash = ((hash << 5) - hash) + char; hash = hash & hash; // Convertir en 32-bit } return 'hash_' + Math.abs(hash).toString(16) + '_' + password.length; } // 5. Remplacer la fonction d'inscription Entreprise window.registerEntreprise = async function() { const nom = document.getElementById('ent-reg-nom').value.trim(); const email = document.getElementById('ent-reg-email').value.trim().toLowerCase(); const pass = document.getElementById('ent-reg-pass').value; const ville = document.getElementById('ent-reg-ville').value; // Validation if (!nom || !email || !pass || !ville) { showToast('❌ Tous les champs sont requis', 'warning'); return; } if (pass.length < 8) { showToast('❌ Le mot de passe doit avoir au moins 8 caractères', 'warning'); return; } showLoading(true); try { // Vérifier si l'email existe déjà const existing = localDB.entreprises.find(e => e.email === email); if (existing) { showToast('❌ Cet email est déjà utilisé', 'error'); showLoading(false); return; } // Créer l'entreprise const newEnterprise = { id: 'ent_' + Date.now() + '_' + Math.random().toString(36).substr(2, 6), nom: nom, email: email, password_hash: await simpleHash(pass), ville: ville, pays: "Côte d'Ivoire", code_invitation: 'ENT-' + Math.random().toString(36).substr(2, 8).toUpperCase(), role: 'entreprise', created_at: new Date().toISOString() }; localDB.entreprises.push(newEnterprise); saveLocalDB(); // Stocker la session const sessionUser = { ...newEnterprise, role: 'entreprise' }; localStorage.setItem('survoeil_user', JSON.stringify(sessionUser)); localStorage.setItem('survoeil_user_ts', Date.now().toString()); showToast('✅ Compte créé avec succès !', 'success'); // Rediriger vers le dashboard setTimeout(() => { showPage('page-dashboard-entreprise'); if (typeof initEntDashboard === 'function') initEntDashboard(); }, 500); } catch (error) { console.error(error); showToast('❌ Erreur: ' + error.message, 'error'); } finally { showLoading(false); } }; // 6. Remplacer la fonction de connexion Entreprise window.loginEntreprise = async function() { const email = document.getElementById('ent-login-email').value.trim().toLowerCase(); const pass = document.getElementById('ent-login-pass').value; if (!email || !pass) { showToast('❌ Email et mot de passe requis', 'warning'); return; } showLoading(true); try { const hash = await simpleHash(pass); const user = localDB.entreprises.find(e => e.email === email && e.password_hash === hash); if (!user) { showToast('❌ Email ou mot de passe incorrect', 'error'); showLoading(false); return; } localStorage.setItem('survoeil_user', JSON.stringify({ ...user, role: 'entreprise' })); localStorage.setItem('survoeil_user_ts', Date.now().toString()); showToast('✅ Connexion réussie !', 'success'); setTimeout(() => { showPage('page-dashboard-entreprise'); if (typeof initEntDashboard === 'function') initEntDashboard(); }, 500); } catch (error) { showToast('❌ Erreur: ' + error.message, 'error'); } finally { showLoading(false); } }; // 7. Remplacer l'inscription Vigile window.registerVigile = async function() { const nom = document.getElementById('vig-reg-nom').value.trim(); const email = document.getElementById('vig-reg-email').value.trim().toLowerCase(); const pass = document.getElementById('vig-reg-pass').value; const tel = document.getElementById('vig-reg-tel').value.trim(); const code = document.getElementById('vig-reg-code').value.trim().toUpperCase(); if (!nom || !email || !pass || !tel || !code) { showToast('❌ Tous les champs sont requis', 'warning'); return; } if (pass.length < 8) { showToast('❌ Le mot de passe doit avoir au moins 8 caractères', 'warning'); return; } showLoading(true); try { // Trouver l'entreprise par code d'invitation const entreprise = localDB.entreprises.find(e => e.code_invitation === code); if (!entreprise) { showToast('❌ Code entreprise invalide', 'error'); showLoading(false); return; } // Vérifier si l'email existe déjà const existing = localDB.vigiles.find(v => v.email === email); if (existing) { showToast('❌ Cet email est déjà utilisé', 'error'); showLoading(false); return; } // Créer le vigile const newVigile = { id: 'vig_' + Date.now() + '_' + Math.random().toString(36).substr(2, 6), nom: nom, email: email, password_hash: await simpleHash(pass), telephone: tel, entreprise_id: entreprise.id, entreprise_nom: entreprise.nom, role: 'vigile', created_at: new Date().toISOString() }; localDB.vigiles.push(newVigile); saveLocalDB(); localStorage.setItem('survoeil_user', JSON.stringify({ ...newVigile, role: 'vigile' })); localStorage.setItem('survoeil_user_ts', Date.now().toString()); showToast('✅ Compte vigile créé avec succès !', 'success'); setTimeout(() => { showPage('page-dashboard-vigile'); if (typeof initVigDashboard === 'function') initVigDashboard(); }, 500); } catch (error) { showToast('❌ Erreur: ' + error.message, 'error'); } finally { showLoading(false); } }; // 8. Remplacer la connexion Vigile window.loginVigile = async function() { const email = document.getElementById('vig-login-email').value.trim().toLowerCase(); const pass = document.getElementById('vig-login-pass').value; if (!email || !pass) { showToast('❌ Email et mot de passe requis', 'warning'); return; } showLoading(true); try { const hash = await simpleHash(pass); const user = localDB.vigiles.find(v => v.email === email && v.password_hash === hash); if (!user) { showToast('❌ Email ou mot de passe incorrect', 'error'); showLoading(false); return; } localStorage.setItem('survoeil_user', JSON.stringify({ ...user, role: 'vigile' })); localStorage.setItem('survoeil_user_ts', Date.now().toString()); showToast('✅ Connexion réussie !', 'success'); setTimeout(() => { showPage('page-dashboard-vigile'); if (typeof initVigDashboard === 'function') initVigDashboard(); }, 500); } catch (error) { showToast('❌ Erreur: ' + error.message, 'error'); } finally { showLoading(false); } }; // 9. Initialiser les données de démo s'il n'y en a pas if (localDB.entreprises.length === 0) { // Créer une entreprise de démo const demoEnterprise = { id: 'ent_demo_001', nom: 'Démo Entreprise', email: 'demo@entreprise.com', password_hash: await simpleHash('demo1234'), ville: 'Abidjan', pays: "Côte d'Ivoire", code_invitation: 'ENT-DEMO-2024', role: 'entreprise', created_at: new Date().toISOString() }; localDB.entreprises.push(demoEnterprise); saveLocalDB(); console.log('📀 Entreprise démo créée - Email: demo@entreprise.com, Mot de passe: demo1234'); } console.log('✅ Système d\'inscription local activé !');
SURVOEIL
Initialisation sécurisée de la plateforme…
SURVOEIL Logo
SURVOEIL
Traçabilité & Localisation
Plateforme sécurisée · PWA installable · Côte d'Ivoire

Gérez, tracez et localisez vos vigiles en temps réel grâce à une interface modernisée, des scans QR plus fluides et une expérience mobile prête à être installée.

Scan caméra · mode application · accès terrain instantané · interface premium

Entreprise

Gérez vos magasins, vigiles et consultez les statistiques de surveillance.

  • Gestion multi-magasins
  • QR codes par point de contrôle
  • Google Maps & Heatmap
  • Statistiques & export CSV

Vigile

Scannez vos points de contrôle et enregistrez vos rondes en temps réel.

  • Scanner QR code par caméra
  • Géolocalisation GPS réelle
  • Reçu de scan instantané
  • Historique personnel

Administrateur

Supervision globale de toutes les entreprises, vigiles et activités.

  • Vue globale en temps réel
  • Gestion toutes entreprises
  • Tous les vigiles & scans
  • Statistiques nationales
Entreprises
Vigiles
Scans effectués
Magasins
⚙️ CONFIGURATION REQUISE
Configuration avancée facultative : les clés Supabase sont déjà intégrées, vous pouvez seulement surcharger la configuration si besoin.