'; echo ''.$title.''; echo '
'; // Icône echo '
'; if ($type === 'success') { echo '
'; } elseif ($type === 'info') { echo '
'; } else { // error echo '
'; } echo '
'; echo '

'.$title.'

'; echo '

'.$message.'

'; if ($cta_href) { echo '
'.$cta_label.'
'; } echo '
'; exit; } // ===================== // Sécurité de base // ===================== if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') { ui_exit( $translations['err_acces_incorrect_titre'] ?? 'Accès incorrect', $translations['err_acces_incorrect_msg'] ?? "Cette page doit être appelée depuis le formulaire d'inscription.", 405, 'info', 'inscription_praticien.php', $translations['retour_formulaire'] ?? 'Retour au formulaire' ); } // ===================== // Récupération & checks // ===================== $nom = trim($_POST['nom'] ?? ''); $prenom = trim($_POST['prenom'] ?? ''); $email = trim($_POST['email'] ?? ''); $mdp = $_POST['mot_de_passe'] ?? ''; $siret = preg_replace('/\D/', '', $_POST['siret'] ?? ''); // Champs obligatoires if ($nom === '' || $prenom === '' || $email === '' || $mdp === '') { ui_exit( $translations['err_titre'] ?? 'Un problème est survenu', $translations['err_champs_obligatoires'] ?? 'Merci de remplir tous les champs obligatoires.', 400, 'error', 'inscription_praticien.php', $translations['retour_formulaire'] ?? 'Retour au formulaire' ); } // Email valide + pas d'injection d'entêtes if (!filter_var($email, FILTER_VALIDATE_EMAIL) || preg_match('/[\r\n]/', $email)) { ui_exit( $translations['err_titre'] ?? 'Un problème est survenu', $translations['err_email_non_valide'] ?? 'Email invalide.', 400, 'error', 'inscription_praticien.php' ); } // SIRET longueur if (strlen($siret) !== 14) { ui_exit( $translations['err_titre'] ?? 'Un problème est survenu', $translations['err_siret_invalide'] ?? 'Numéro SIRET invalide (14 chiffres requis).', 400, 'error', 'inscription_praticien.php' ); } // Luhn function luhnCheck($num) { $arr = str_split(strrev($num)); $sum = 0; foreach ($arr as $i => $n) { $n = (int)$n; if ($i % 2) { $n *= 2; if ($n > 9) $n -= 9; } $sum += $n; } return $sum % 10 === 0; } if (!luhnCheck($siret)) { ui_exit( $translations['err_titre'] ?? 'Un problème est survenu', $translations['err_siret_invalide'] ?? 'Numéro SIRET invalide (échec vérification).', 400, 'error', 'inscription_praticien.php' ); } // ===================== // Transaction // ===================== try { $pdo->beginTransaction(); // Email déjà utilisé ? $stmt = $pdo->prepare("SELECT id FROM compte WHERE email = :email LIMIT 1"); $stmt->execute(['email' => $email]); if ($stmt->fetch()) { $pdo->rollBack(); ui_exit( $translations['err_titre'] ?? 'Un problème est survenu', $translations['err_email_deja_utilise'] ?? 'Cet email est déjà utilisé.', 409, 'error', 'inscription_praticien.php' ); } // SIRET déjà utilisé ? $stmt = $pdo->prepare("SELECT id FROM praticien WHERE siret = :siret LIMIT 1"); $stmt->execute(['siret' => $siret]); if ($stmt->fetch()) { $pdo->rollBack(); ui_exit( $translations['err_titre'] ?? 'Un problème est survenu', $translations['err_siret_deja_utilise'] ?? 'Ce numéro SIRET est déjà enregistré.', 409, 'error', 'inscription_praticien.php' ); } // Acceptation CGU $accept_cgu = isset($_POST['accept_cgu']) ? 1 : 0; if ($accept_cgu !== 1) { $pdo->rollBack(); ui_exit( $translations['err_titre'] ?? 'Un problème est survenu', $translations['cgu_obligatoire'] ?? 'Vous devez accepter les CGU.', 400, 'info', 'inscription_praticien.php' ); } // 1) Préparer la date d'hier pour forcer l'expiration immédiate $hier = date('Y-m-d', strtotime('-1 day')); // 2) Créer le praticien avec les champs d'abonnement initialisés $stmt = $pdo->prepare(" INSERT INTO praticien ( nom, prenom, email, siret, accepted_cgu, abonnement_id, date_expiration ) VALUES ( :nom, :prenom, :email, :siret, :accepted_cgu, NULL, :date_exp ) "); $stmt->execute([ 'nom' => $nom, 'prenom' => $prenom, 'email' => $email, 'siret' => $siret, 'accepted_cgu' => $accept_cgu, 'date_exp' => $hier // On met hier pour que le script de vérification dise "C'est expiré !" ]); $praticien_id = (int)$pdo->lastInsertId(); // 2) Créer le compte $mot_de_passe_hash = password_hash($mdp, PASSWORD_DEFAULT); $token = bin2hex(random_bytes(32)); $token_autologin = bin2hex(random_bytes(32)); $token_autologin_expire = (new DateTime('+60 minutes'))->format('Y-m-d H:i:s'); $stmt = $pdo->prepare(" INSERT INTO compte (email, mot_de_passe, role, reference_id, token_validation, email_valide, token_autologin, token_autologin_expire) VALUES (:email, :mdp, 'praticien', :ref_id, :token, 0, :al, :al_exp) "); $stmt->execute([ 'email' => $email, 'mdp' => $mot_de_passe_hash, 'ref_id' => $praticien_id, 'token' => $token, 'al' => $token_autologin, 'al_exp' => $token_autologin_expire, ]); // Commit avant envoi mail $pdo->commit(); } catch (Throwable $e) { if ($pdo->inTransaction()) $pdo->rollBack(); error_log('Inscription praticien - DB error: '.$e->getMessage()); ui_exit( $translations['err_titre'] ?? 'Un problème est survenu', $translations['err_serveur'] ?? 'Erreur serveur.', 500, 'error', '/' ); } // ===================== // Email de validation // ===================== $validation_url = "https://uslugi.fr/validation.php?token=" . urlencode($token) . "&al=" . urlencode($token_autologin); $validation_url_html = htmlspecialchars($validation_url, ENT_QUOTES, 'UTF-8'); $prenom_nom = htmlspecialchars("$prenom $nom", ENT_QUOTES, 'UTF-8'); $sujet = $translations['mail_valid_sujet']; // Corps HTML mail $html = "
".sprintf($translations['mail_valid_bonjour_nom'], $prenom_nom)."

".$translations['mail_valid_merci_praticien']."

".$translations['mail_valid_action']."

".$translations['mail_valid_btn']."
"; // Texte alternative $text = strip_tags( sprintf($translations['mail_valid_bonjour_nom'], "$prenom $nom")."\n\n". $translations['mail_valid_merci_praticien']."\n". $translations['mail_valid_action']."\n". ($translations['mail_valid_fallback'] ?? 'Si le bouton ne fonctionne pas, utilisez ce lien :')."\n". $validation_url."\n\n". $translations['mail_valid_expire']."\n". $translations['mail_valid_ignore']."\n". ($translations['mail_valid_signature'] ?? 'USLUGI.FR') ); // Envoi list($sent, $err) = uslugi_mail( $email, $sujet, $html, $text, [ 'to_name' => "$prenom $nom", ] ); if (!$sent) { error_log("Validation mail NOT sent to $email : $err"); // On ne bloque pas l’utilisateur : il pourra redemander un mail. } // ===================== // Écran final succès // ===================== echo ' '.htmlspecialchars($translations['insc_merci_titre'] ?? 'Merci !', ENT_QUOTES, 'UTF-8').'

'.htmlspecialchars($translations['insc_merci_titre'] ?? 'Merci !', ENT_QUOTES, 'UTF-8').'

'.htmlspecialchars($translations['insc_merci_ligne1'] ?? 'Votre compte a bien été créé.', ENT_QUOTES, 'UTF-8').'

'.htmlspecialchars($translations['insc_merci_ligne2'] ?? 'Vérifiez vos emails pour valider votre adresse.', ENT_QUOTES, 'UTF-8').'

'.htmlspecialchars($translations['retour_acceuil'] ?? 'Retour à l’accueil', ENT_QUOTES, 'UTF-8').'
';