getConnection(); $sql = "SELECT id, nom, prenoms, numero_carte, email, telephone, photo_reference_path FROM assures WHERE id = ? AND statut = 'actif'"; $stmt = $conn->prepare($sql); $stmt->execute([$assureId]); $assure = $stmt->fetch(PDO::FETCH_ASSOC); if (!$assure) { return [ 'success' => false, 'message' => 'Assuré non trouvé ou inactif' ]; } // 3. Vérifier si une photo de référence existe if (empty($assure['photo_reference_path'])) { // Pas de photo de référence = accès sans vérification faciale // Loguer cette tentative pour sécurité logAction("Accès sans vérification faciale - Assuré #{$assureId} - Aucune photo de référence", 'WARNING'); return [ 'success' => true, 'require_facial_verification' => false, 'message' => 'Accès autorisé (pas de photo de référence)', 'assure' => $assure ]; } // 4. Envoyer le lien de vérification faciale $verifier = new FacialVerificationLink($conn); // Choisir le canal d'envoi selon les préférences $method = 'both'; // 'email', 'whatsapp', ou 'both' $result = $verifier->sendVerificationLink($assureId, $method); if ($result['success']) { return [ 'success' => true, 'require_facial_verification' => true, 'message' => 'Lien de vérification envoyé', 'email_sent' => $result['email_sent'], 'whatsapp_sent' => $result['whatsapp_sent'], 'assure' => $assure ]; } else { return [ 'success' => false, 'message' => $result['message'] ]; } } // ==================================================================== // SCÉNARIO 2: Vérification de session avant saisie des prestations // ==================================================================== /** * Vérifie si l'utilisateur a une session d'autorisation valide * À appeler au début de saisie_prestations.php */ function checkAuthorizationSession() { $sessionToken = $_GET['token'] ?? $_SESSION['authorization_token'] ?? null; if (!$sessionToken) { return [ 'authorized' => false, 'message' => 'Aucune session d\'autorisation' ]; } $db = new Database(); $conn = $db->getConnection(); $sql = "SELECT pas.*, a.id as assure_id, a.nom, a.prenoms, a.numero_carte FROM prestation_authorization_sessions pas JOIN assures a ON pas.assure_id = a.id WHERE pas.session_token = ? AND pas.status = 'active' AND pas.expires_at > NOW()"; $stmt = $conn->prepare($sql); $stmt->execute([$sessionToken]); $session = $stmt->fetch(PDO::FETCH_ASSOC); if (!$session) { return [ 'authorized' => false, 'message' => 'Session invalide ou expirée' ]; } // Stocker en session PHP pour les requêtes suivantes $_SESSION['authorization_token'] = $sessionToken; $_SESSION['authorized_assure_id'] = $session['assure_id']; return [ 'authorized' => true, 'assure' => [ 'id' => $session['assure_id'], 'nom' => $session['nom'], 'prenoms' => $session['prenoms'], 'numero_carte' => $session['numero_carte'] ], 'session' => $session ]; } /** * Marque une session comme utilisée après saisie d'une prestation */ function markSessionAsUsed($sessionToken) { $db = new Database(); $conn = $db->getConnection(); $sql = "UPDATE prestation_authorization_sessions SET prestations_saisies = prestations_saisies + 1, used_at = NOW() WHERE session_token = ?"; $stmt = $conn->prepare($sql); return $stmt->execute([$sessionToken]); } // ==================================================================== // SCÉNARIO 3: Interface utilisateur pour le prestataire // ==================================================================== /** * Génère l'interface HTML pour le prestataire après scan NFC/QR */ function renderVerificationWaitingScreen($assure, $verificationSent) { ?> Vérification en attente - INTER-SANTÉ

🏥 INTER-SANTÉ

Vérification d'identité en cours

Carte N°

Un lien de vérification a été envoyé à l'assuré.
En attente de la vérification faciale...

✓ Email envoyé
✗ Email non envoyé
✓ WhatsApp envoyé
✗ WhatsApp non envoyé

Le lien de vérification est valable pendant 15 minutes

false, 'message' => 'Données manquantes']); exit; } // Traiter le scan $result = handleNFCOrQRCodeScan($tagData); if ($result['success'] && $result['require_facial_verification']) { // Afficher l'écran d'attente renderVerificationWaitingScreen($result['assure'], $result); } elseif ($result['success'] && !$result['require_facial_verification']) { // Accès direct (pas de photo de référence) header('Location: saisie_prestations.php?assure_id=' . $result['assure']['id']); } else { // Erreur echo json_encode($result); } } // Dans votre fichier saisie_prestations.php session_start(); // Vérifier l'autorisation $auth = checkAuthorizationSession(); if (!$auth['authorized']) { die('Accès non autorisé. Veuillez scanner la carte de l\'assuré.'); } // L'utilisateur est autorisé, afficher le formulaire de saisie $assure = $auth['assure']; // ... Votre code de saisie de prestations ... // Après enregistrement d'une prestation if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_prestation'])) { // Enregistrer la prestation // ... // Marquer la session comme utilisée markSessionAsUsed($_SESSION['authorization_token']); }