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): ?>
Accès au Suivi
Dossier de réparation #
Votre code secret figure sur votre fiche.
Suivi d'intervention #
Agence de
Dépôt le
$etat):
$isActive = ($index === $etat_val);
$classes = $isActive ? $etat['active_cls'] : $etat['inactive_cls'];
?>
Plateforme sécurisée
Microtiq - Solutions Informatiques