setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $e) { die('
Erreur de connexion : '.$e->getMessage().'
'); } /** * RÉCUPÉRATION DE L'ID ET DU MOT DE PASSE DEPUIS L'URL */ $error = null; $id = null; $mdp_attendu = null; $is_authenticated = false; if (isset($_GET['suivi']) && !empty($_GET['suivi'])) { $suivi_param = base64_decode($_GET['suivi']); if ($suivi_param) { $parts = explode('_', $suivi_param); if (count($parts) >= 2) { $id = $parts[0]; $mdp_attendu = $parts[1]; } else { $error = "Le format du lien de suivi est incomplet."; } } else { $error = "Le lien de suivi est invalide."; } } else { $error = "Aucun identifiant de suivi n'a été détecté."; } /** * TRAITEMENT DU FORMULAIRE DE CONNEXION (POST) */ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['mdp_client']) && $id) { $mdp_saisi = $_POST['mdp_client']; if ($mdp_saisi === $mdp_attendu) { $_SESSION['auth_suivi_' . $id] = true; $error = null; } else { $error = "Le code saisi est incorrect."; } } /** * VÉRIFICATION DE L'AUTHENTIFICATION EN SESSION */ if ($id && isset($_SESSION['auth_suivi_' . $id]) && $_SESSION['auth_suivi_' . $id] === true) { $is_authenticated = true; } /** * RÉCUPÉRATION DES DONNÉES SI AUTHENTIFIÉ */ $data = null; $devis = null; $total_ttc_calcule = 0; $etat_val = 0; // État par défaut $agence = "Non spécifiée"; if ($is_authenticated && $id) { try { // 1. Récupération de la fiche atelier $stmt = $bd->prepare("SELECT client, materiel, descriptif, chantier, entree, avance, delai, montant, etat, agence FROM microtiq_entree_atelier WHERE id = :id LIMIT 1"); $stmt->execute(['id' => $id]); $data = $stmt->fetch(PDO::FETCH_ASSOC); if (!$data) { $error = "Dossier introuvable dans la base de données."; $is_authenticated = false; } else { // Récupération de l'état et de l'agence $etat_val = isset($data['etat']) ? (int)$data['etat'] : 0; $agence = !empty($data['agence']) ? htmlspecialchars($data['agence']) : 'Non spécifiée'; // 2. Récupération du devis $stmtDevis = $bd->prepare("SELECT id, date, corps FROM microtiq_devis WHERE idfiche = :id ORDER BY id DESC LIMIT 1"); $stmtDevis->execute(['id' => $id]); $devis = $stmtDevis->fetch(PDO::FETCH_ASSOC); // 3. Calcul du Total if ($devis && !empty($devis['corps'])) { $lignes = json_decode($devis['corps'], true); if (json_last_error() !== JSON_ERROR_NONE || !is_array($lignes)) { $lignes = @unserialize($devis['corps']); } $total_calcule = 0; if (is_array($lignes)) { foreach ($lignes as $ligne) { if (is_array($ligne)) { $pu = isset($ligne['pu']) ? $ligne['pu'] : (isset($ligne['prix']) ? $ligne['prix'] : 0); $pu = (float)str_replace(',', '.', (string)$pu); $qte = isset($ligne['qte']) ? $ligne['qte'] : (isset($ligne['quantite']) ? $ligne['quantite'] : 1); $qte = (float)str_replace(',', '.', (string)$qte); $total_calcule += ($pu * $qte); } } $total_ttc_calcule = $total_calcule; } } if ($total_ttc_calcule <= 0 && !empty($data['montant'])) { $total_ttc_calcule = (float)str_replace(',', '.', (string)$data['montant']); } } } catch (Exception $e) { $error = "Erreur lors de la lecture : " . $e->getMessage(); $is_authenticated = false; } } // Configuration des 3 états possibles pour la barre de progression $etats_suivi = [ 0 => [ 'icon' => 'bi-hourglass-split', 'label_short' => 'En attente', 'label_long' => 'En attente', 'active_cls' => 'bg-gradient-to-b from-white to-slate-50 text-slate-800 border-slate-300 shadow-sm ring-2 ring-slate-100 transform scale-[1.02]', 'inactive_cls' => 'bg-slate-50/50 text-slate-400 border-slate-200 opacity-60 grayscale' ], 1 => [ 'icon' => 'bi-tools', 'label_short' => 'En cours', 'label_long' => 'En cours', 'active_cls' => 'bg-gradient-to-b from-white to-blue-50 text-blue-700 border-blue-300 shadow-sm ring-2 ring-blue-100 transform scale-[1.02]', 'inactive_cls' => 'bg-slate-50/50 text-slate-400 border-slate-200 opacity-60 grayscale' ], 2 => [ 'icon' => 'bi-check-circle-fill', 'label_short' => 'Terminé', 'label_long' => 'Terminé', 'active_cls' => 'bg-gradient-to-b from-white to-emerald-50 text-emerald-700 border-emerald-300 shadow-sm ring-2 ring-emerald-100 transform scale-[1.02]', 'inactive_cls' => 'bg-slate-50/50 text-slate-400 border-slate-200 opacity-60 grayscale' ] ]; /** * AFFICHAGE SI ERREUR CRITIQUE */ if ($error && !$id): ?>

Lien Invalide

Accès au Suivi

Dossier de réparation #

Votre code secret figure sur votre fiche.

Dossier Atelier

Suivi d'intervention #

Agence de
Dépôt le
$etat): $isActive = ($index === $etat_val); $classes = $isActive ? $etat['active_cls'] : $etat['inactive_cls']; ?>

Matériel prêt !

À récupérer dans votre boutique de .

Client

Matériel

Interventions

Délai estimé

Journal de suivi

', $entry); $date_log = isset($l_parts[0]) ? trim(ltrim($l_parts[0], '|')) : '-'; $comment_log = isset($l_parts[1]) ? trim($l_parts[1]) : 'Mise à jour en cours'; ?>

0): ?>

Devis / Facture

Réf. # |" . (is_numeric($date_devis) ? date('d/m/Y', $date_devis) : htmlspecialchars($date_devis)); ?>

Montant TTC estimé
€