true, CURLOPT_TIMEOUT=>5, CURLOPT_HTTPHEADER=>['User-Agent: portail.alpinux.org']]); $r = json_decode(curl_exec($ch), true) ?? []; curl_close($ch); return $r ? ['lat' => (float)$r[0]['lat'], 'lon' => (float)$r[0]['lon']] : null; } function save_gps(string $member_id, ?array $gps): void { $file = preg_replace('/[^\/]+$/', 'member_gps.json', SERVICES_FILE); $data = is_file($file) ? (json_decode(file_get_contents($file), true) ?? []) : []; if ($gps) $data[$member_id] = $gps + ['updated' => date('Y-m-d')]; else unset($data[$member_id]); file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT)); } // ── Traitement adresse ──────────────────────────────────────────────── if ($section === 'address' && $membership) { $address = trim($_POST['address'] ?? ''); $zip = trim($_POST['zip'] ?? ''); $town = trim($_POST['town'] ?? ''); if (!$address) $errors[] = 'L\'adresse est obligatoire.'; if (!$zip) $errors[] = 'Le code postal est obligatoire.'; if (!$town) $errors[] = 'La ville est obligatoire.'; if (!$errors) { try { doli_update_member($membership['id'], ['address'=>$address,'zip'=>$zip,'town'=>$town]); $gps = geocode($address, $zip, $town, $membership['country_code'] ?? 'FR'); save_gps($membership['id'], $gps); $membership['address'] = $address; $membership['zip'] = $zip; $membership['town'] = $town; set_flash('success', 'Adresse mise à jour' . ($gps ? ' (GPS enregistré).' : '.')); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); $edit = 'address'; } } else { $edit = 'address'; } } // ── Traitement identité ─────────────────────────────────────────────── if ($section === 'identity') { $new_first = trim($_POST['first_name'] ?? ''); $new_last = trim($_POST['last_name'] ?? ''); if (!$new_first) $errors[] = 'Le prénom est obligatoire.'; if (!$new_last) $errors[] = 'Le nom est obligatoire.'; if (!$errors) { try { kc_update_name($user['sub'], $new_first, $new_last); if ($membership) doli_update_member($membership['id'], ['firstname' => $new_first, 'lastname' => $new_last]); $_SESSION['user']['first_name'] = $new_first; $_SESSION['user']['last_name'] = $new_last; $_SESSION['user']['name'] = $new_first . ' ' . $new_last; $user['first_name'] = $new_first; $user['last_name'] = $new_last; $user['name'] = $new_first . ' ' . $new_last; set_flash('success', 'Identité mise à jour.'); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); $edit = 'identity'; } } else { $edit = 'identity'; } } // ── Traitement email ────────────────────────────────────────────────── if ($section === 'email') { $new_email = trim($_POST['email'] ?? ''); $new_email2 = trim($_POST['email_confirm'] ?? ''); if (!filter_var($new_email, FILTER_VALIDATE_EMAIL)) $errors[] = 'Email invalide.'; elseif ($new_email !== $new_email2) $errors[] = 'Les deux emails ne correspondent pas.'; elseif ($new_email === $user['email']) $errors[] = 'C\'est déjà votre email actuel.'; if (!$errors) { try { kc_update_email($user['sub'], $new_email); if ($membership) doli_update_member($membership['id'], ['email' => $new_email]); $_SESSION['user']['email'] = $new_email; $user['email'] = $new_email; set_flash('success', 'Email mis à jour.'); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); $edit = 'email'; } } else { $edit = 'email'; } } // ── Traitement mot de passe ─────────────────────────────────────────── if ($section === 'password') { $pw = $_POST['password'] ?? ''; $pw2 = $_POST['password2'] ?? ''; if (!$pw) $errors[] = 'Le mot de passe ne peut pas être vide.'; elseif ($pw !== $pw2) $errors[] = 'Les mots de passe ne correspondent pas.'; elseif (strlen($pw) < 8) $errors[] = 'Le mot de passe doit contenir au moins 8 caractères.'; if (!$errors) { try { kc_set_password($user['sub'], $pw); set_flash('success', 'Mot de passe modifié.'); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); $edit = 'password'; } } else { $edit = 'password'; } } // ── Traitement OTP ──────────────────────────────────────────────────── if ($section === 'otp_delete') { $cred_id = $_POST['credential_id'] ?? ''; if ($cred_id) { try { kc_delete_credential($user['sub'], $cred_id); set_flash('success', 'OTP supprimé.'); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); } } } // ── Données annexes ─────────────────────────────────────────────────── $gps_file = preg_replace('/[^\/]+$/', 'member_gps.json', SERVICES_FILE); $gps = ($membership && is_file($gps_file)) ? (json_decode(file_get_contents($gps_file), true)[$membership['id']] ?? null) : null; $otp = kc_get_otp_credential($user['sub']); $is_adherent = $user['is_adherent'] || ($membership && $membership['status']===1 && $membership['date_fin_ts']>time()); $title = 'Mon profil'; require __DIR__ . '/views/layout.php'; ?>
Aucune fiche Dolibarr trouvée.
= htmlspecialchars($membership['address']) ?>
= htmlspecialchars($membership['zip'].' '.$membership['town']) ?>
Cliquez sur Modifier pour renseigner votre adresse.
Configurée le = date('d/m/Y', (int)($otp['createdDate'] / 1000)) ?>