<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1">
<title>Cabinet APTEVIA – Tests psychotechniques agréés pour le permis de conduire</title>
<meta name="description" content="Cabinet agréé APTEVIA : tests psychotechniques obligatoires après suspension, annulation ou invalidation du permis de conduire.">
<link rel="canonical" href="https://www.aptevia.fr/">
<script>
window.BASE_URL = "https://aptevia.fr/";
window.RDV_ONLINE_ENABLED = true;
window.APTEVIA_PAYMENT_ENABLED = true;
</script>
<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://aptevia.fr/#organization","name":"APTEVIA","url":"https://aptevia.fr","logo":"https://aptevia.fr/assets/img/logo.png","email":"contact@aptevia.fr","address":{"@type":"PostalAddress","streetAddress":"2 rue de Mérouville","postalCode":"28310","addressLocality":"Intréville","addressCountry":"FR"},"contactPoint":[{"@type":"ContactPoint","contactType":"customer support","email":"contact@aptevia.fr","availableLanguage":["fr-FR"]}],"sameAs":[]},{"@type":"LocalBusiness","@id":"https://aptevia.fr/#localbusiness","name":"APTEVIA","url":"https://aptevia.fr","image":"https://aptevia.fr/assets/img/logo.png","logo":"https://aptevia.fr/assets/img/logo.png","email":"contact@aptevia.fr","address":{"@type":"PostalAddress","streetAddress":"2 rue de Mérouville","postalCode":"28310","addressLocality":"Intréville","addressCountry":"FR"},"parentOrganization":{"@id":"https://aptevia.fr/#organization"},"areaServed":["Essonne (91)","Eure-et-Loir (28)","Loiret (45)","Étampes","Pithiviers","Angerville","Intréville"],"availableLanguage":["fr-FR"],"knowsAbout":["Test psychotechnique","Tests psychotechniques","Tests psychotechniques pour le permis de conduire","Évaluation psychotechnique","Aptitude à la conduite","Suspension du permis","Annulation du permis","Invalidation du permis","Lettre 3F","Lettre 44","Lettre 48SI"]},{"@type":"WebSite","@id":"https://aptevia.fr/#website","url":"https://aptevia.fr","name":"APTEVIA","publisher":{"@id":"https://aptevia.fr/#organization"}},{"@type":"WebPage","@id":"https://www.aptevia.fr/#webpage","url":"https://www.aptevia.fr/","name":"Cabinet APTEVIA – Tests psychotechniques agréés pour le permis de conduire","description":"Cabinet agréé APTEVIA : tests psychotechniques obligatoires après suspension, annulation ou invalidation du permis de conduire.","inLanguage":"fr-FR","isPartOf":{"@id":"https://aptevia.fr/#website"},"publisher":{"@id":"https://aptevia.fr/#organization"}}]}</script>
<link rel="icon" href="https://aptevia.fr/favicon.ico" sizes="any">
<link rel="icon" type="image/svg+xml" href="https://aptevia.fr/favicon.svg">
<link rel="icon" type="image/png" href="https://aptevia.fr/favicon-96x96.png" sizes="96x96">
<link rel="apple-touch-icon" href="https://aptevia.fr/apple-touch-icon.png">
<link rel="manifest" href="https://aptevia.fr/site.webmanifest">
<meta name="theme-color" content="#002F3F">
<link rel="stylesheet" href="https://aptevia.fr/assets/css/theme_aptevia.css?v=1.11">
<link rel="stylesheet" href="https://aptevia.fr/assets/css/style.css?v=1.11">
<link rel="stylesheet" href="https://aptevia.fr/assets/css/aptevia.css?v=1.11">
<link rel="stylesheet" href="https://aptevia.fr/assets/css/ia.css?v=1.11">
<link rel="stylesheet" href="https://aptevia.fr/assets/css/ia_aptevia.css?v=1.11">
<link rel="stylesheet" href="https://aptevia.fr/assets/css/rdv.css?v=1.11">
<script src="https://aptevia.fr/assets/js/main.js?v=1.11" defer></script>
<script src="https://aptevia.fr/admin/assets/js/popup_login.js?v=1.1" defer></script>
</head>
<body>
<header class="site-header">
<div class="header-container">
<!-- Logo -->
<div class="logo">
<a href="https://aptevia.fr/index_site.php">
<img src="https://aptevia.fr/assets/img/logo.png" alt="Cabinet APTEVIA">
</a>
</div>
<!-- Nav desktop -->
<nav class="main-nav" id="mainNav">
<ul>
<li><a href="https://aptevia.fr/index_site.php">Accueil</a></li>
<li><a href="https://aptevia.fr/pages/a-propos.php">À propos</a></li>
<li><a href="https://aptevia.fr/pages/devis_pro.php">Offre Entreprises</a></li>
<li><a href="https://aptevia.fr/pages/methode_evaluation.php">Méthode d'évaluation</a></li>
<li><a href="https://aptevia.fr/pages/contact.php">Contact</a></li>
<li><a href="https://aptevia.fr/centres/">Centres</a></li>
<!-- <li><a href="https://aptevia.fr/pages/blog/">Blog</a></li>-->
</ul>
</nav>
<!-- Séparateur vertical -->
<div class="header-sep"></div>
<!-- Actions desktop -->
<div class="header-right">
<a href="https://aptevia.fr/pages/rendezvous/compte/connexion_client.php" class="btn-header client">
Connexion
</a>
<a href="https://aptevia.fr/admin/login.php" class="btn-header pro" id="btnEspacePro">
Espace Pro
</a>
<a href="https://aptevia.fr/pages/rendezvous/prendre_rdv.php" class="btn-header rdv">
Prendre rendez-vous
</a>
</div>
<!-- Bouton hamburger mobile -->
<button class="header-burger" id="headerBurger" aria-label="Menu" aria-expanded="false" aria-controls="mobileMenu">
<span></span>
<span></span>
<span></span>
</button>
</div>
<!-- Menu mobile -->
<div class="mobile-menu" id="mobileMenu" aria-hidden="true" style="display:none;">
<nav class="mobile-menu__nav">
<a href="https://aptevia.fr/index_site.php">Accueil</a>
<a href="https://aptevia.fr/pages/a-propos.php">À propos</a>
<a href="https://aptevia.fr/pages/devis_pro.php">Offre Entreprises</a>
<a href="https://aptevia.fr/pages/methode_evaluation.php">Méthode d'évaluation</a>
<a href="https://aptevia.fr/pages/contact.php">Contact</a>
<a href="https://aptevia.fr/centres/">Centres</a>
<a href="https://aptevia.fr/pages/blog/">Blog</a>
</nav>
<div class="mobile-menu__actions">
<a href="https://aptevia.fr/pages/rendezvous/prendre_rdv.php" class="mob-btn mob-btn--rdv">
Prendre rendez-vous
</a>
<a href="https://aptevia.fr/pages/rendezvous/compte/connexion_client.php" class="mob-btn mob-btn--ghost">
Connexion
</a>
<a href="https://aptevia.fr/admin/login.php" class="mob-btn mob-btn--dark">
Espace Pro
</a>
</div>
</div>
</header>
<script>
(function() {
var burger = document.getElementById('headerBurger');
var menu = document.getElementById('mobileMenu');
if (!burger || !menu) return;
burger.addEventListener('click', function() {
var open = menu.style.display === 'block';
menu.style.display = open ? 'none' : 'block';
burger.classList.toggle('is-open', !open);
burger.setAttribute('aria-expanded', !open);
menu.setAttribute('aria-hidden', open);
});
})();
</script>
<style>
/* ── Popup ── */
#pro-login-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.45);z-index:9999;align-items:center;justify-content:center}
.pro-popup{background:#f7f4ef;border-radius:10px;max-width:480px;width:90%;padding:25px;position:relative;box-shadow:0 10px 30px rgba(0,0,0,0.25)}
.pro-login-title{color:#002f3f;text-align:center;margin-bottom:15px}
.pro-form-group{margin-bottom:15px}
.pro-input{width:100%;padding:12px;border-radius:8px;border:1px solid #ccc;background:#fff}
.btn-container{display:flex;gap:15px;justify-content:center;margin-top:15px}
.btn-pro-main{flex:1;background:#002f3f;color:white;padding:12px;border:none;border-radius:999px;cursor:pointer}
.btn-pro-secondary{flex:1;background:#c0b8ae;color:#002f3f;padding:12px;border:none;border-radius:999px;cursor:pointer}
#pro-login-close{position:absolute;top:8px;right:12px;border:none;background:transparent;font-size:26px;cursor:pointer}
/* ── Centres ── */
.ap-centres-home{padding:60px 20px;background:#ffffff}
.ap-centres-wrap{max-width:1100px;margin:0 auto;border:1px solid #e6e2db;border-radius:18px;background:#fff;box-shadow:0 10px 25px rgba(0,0,0,0.05);padding:26px}
.ap-centres-title{color:#002f3f;font-size:1.8rem;margin:0 0 8px;text-align:center}
.ap-centres-subtitle{max-width:900px;margin:0 auto;text-align:center;color:#333;font-size:1.05rem;line-height:1.5}
.ap-centres-grid{margin-top:22px;display:grid;grid-template-columns:1fr;gap:14px}
@media(min-width:900px){.ap-centres-grid{grid-template-columns:1fr 1fr}}
.ap-centre-card{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;border:1px solid #eee;border-radius:14px;padding:16px;text-decoration:none;background:#f7f4ef;transition:all .15s ease}
.ap-centre-card:hover{border-color:#d8d2c8;transform:translateY(-1px);box-shadow:0 10px 20px rgba(0,0,0,0.06)}
.ap-centre-card h3{margin:0;color:#002f3f;font-size:1.1rem;line-height:1.35}
.ap-centre-card p{margin:6px 0 0;color:#333;font-size:0.95rem;opacity:0.9}
.ap-centre-arrow{color:#002f3f;opacity:0.5;font-size:1.3rem;margin-top:2px;flex:0 0 auto}
.ap-centres-bottom{margin-top:18px;display:flex;gap:14px;flex-direction:column;align-items:center;text-align:center}
.ap-centres-bottom p{margin:0;max-width:950px;color:#333;font-size:.95rem;line-height:1.5}
.ap-centres-btn{display:inline-block;padding:12px 18px;border-radius:999px;background:#002f3f;color:#fff;text-decoration:none;font-weight:600;transition:all .15s ease}
.ap-centres-btn:hover{background:#013a4f;transform:translateY(-1px)}
/* ── 4 cartes situations ── */
.ap-situations{padding:60px 20px;background:#ffffff}
.ap-situations-title{text-align:center;color:#002f3f;font-size:1.7rem;margin:0 0 10px}
.ap-situations-intro{text-align:center;color:#555;font-size:1rem;max-width:700px;margin:0 auto 36px;line-height:1.6}
.ap-situations-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:20px;max-width:1100px;margin:0 auto}
.ap-sit-card{display:flex;flex-direction:column;border-radius:16px;overflow:hidden;box-shadow:0 4px 16px rgba(0,0,0,.07);transition:transform .18s ease,box-shadow .18s ease;background:#fff;border:1px solid #e8e4de}
.ap-sit-card:hover{transform:translateY(-4px);box-shadow:0 10px 28px rgba(0,0,0,.12)}
.ap-sit-card-top{padding:20px 20px 16px;display:flex;align-items:center;gap:12px}
.ap-sit-card--suspension .ap-sit-card-top{background:#fde8e8}
.ap-sit-card--annulation .ap-sit-card-top{background:#e8edf5}
.ap-sit-card--invalidation .ap-sit-card-top{background:#fef3e2}
.ap-sit-card--lucie .ap-sit-card-top{background:#e6f0ee}
.ap-sit-icon{font-size:1.8rem;line-height:1;flex-shrink:0}
.ap-sit-card-label{font-size:1.1rem;font-weight:700;color:#002f3f;line-height:1.2}
.ap-sit-card-label small{display:block;font-size:.78rem;font-weight:400;color:#666;margin-top:2px}
.ap-sit-card-body{padding:16px 20px;flex:1;display:flex;flex-direction:column;gap:10px}
.ap-sit-card-body p{margin:0;color:#444;font-size:.92rem;line-height:1.6}
.ap-sit-card-body ul{margin:0;padding-left:18px;color:#444;font-size:.92rem;line-height:1.7}
.ap-sit-more{font-size:.85rem;color:#002f3f;font-style:italic;opacity:.85}
.ap-sit-card-footer{padding:0 20px 20px}
.ap-sit-btn{display:block;text-align:center;padding:11px 16px;border-radius:999px;font-weight:700;font-size:.88rem;text-decoration:none;transition:all .15s ease;width:100%;box-sizing:border-box}
.ap-sit-btn--rdv{background:#002f3f;color:#fff}
.ap-sit-btn--rdv:hover{background:#013a4f;color:#fff;text-decoration:none}
.ap-sit-btn--lucie{background:#1d9e75;color:#fff}
.ap-sit-btn--lucie:hover{background:#167a5b;color:#fff;text-decoration:none}
@media(max-width:600px){.ap-situations-grid{grid-template-columns:1fr}}
/* ── Avis ── */
.ap-avis-home{padding:48px 20px;background:#ffffff}
.ap-avis-wrap{max-width:960px;margin:0 auto;display:flex;align-items:center;gap:40px;flex-wrap:wrap}
.ap-avis-image{flex:0 0 auto}
.ap-avis-image img{width:200px;border-radius:16px;box-shadow:0 6px 18px rgba(0,0,0,.10);transition:transform .2s ease;display:block}
.ap-avis-image img:hover{transform:scale(1.03)}
.ap-avis-content{flex:1;min-width:240px}
.ap-avis-title{margin:0 0 8px;font-size:1.35rem;color:#002f3f}
.ap-avis-sub{margin:0 0 12px;color:#666;font-size:.95rem;line-height:1.55}
.ap-avis-stars{font-size:1.5rem;color:#f5a623;margin-bottom:10px;letter-spacing:2px}
.ap-avis-tags{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:18px}
.ap-avis-tags span{background:#f0f9e0;color:#3a5c00;padding:4px 12px;border-radius:999px;font-size:.85rem;font-weight:600;border:1px solid #c8e89a}
.ap-avis-btn{display:inline-block;padding:11px 26px;background:#002f3f;color:#fff;border-radius:999px;font-weight:700;font-size:.95rem;text-decoration:none;transition:background .15s}
.ap-avis-btn:hover{background:#001e29;text-decoration:none}
@media(max-width:640px){.ap-avis-wrap{flex-direction:column;align-items:center;text-align:center}.ap-avis-tags{justify-content:center}.ap-avis-image img{width:160px}}
</style>
<main class="page">
<!-- HERO -->
<section style="text-align:center;padding:80px 20px;background:#f7f4ef;">
<h1 style="color:#002f3f;font-size:2.2rem;">
Retrouvez votre capacité à conduire avec <span style="color:#A89E8F;">APTEVIA</span>
</h1>
<p style="max-width:800px;margin:20px auto;font-size:1.1rem;color:#333;">
Cabinet agréé pour les <strong>tests psychotechniques</strong> obligatoires
après suspension, annulation ou invalidation du permis de conduire.
</p>
<a href="https://aptevia.fr/pages/rendezvous/prendre_rdv.php" class="btn-header rdv">Prendre rendez-vous</a>
</section>
<!-- =========================================================
4 CARTES SITUATIONS — NOUVEAU V4.5
============================================================= -->
<section class="ap-situations">
<h2 class="ap-situations-title">Quelle est votre situation ?</h2>
<p class="ap-situations-intro">
Votre permis a été suspendu, annulé ou invalidé ?<br>
Sélectionnez votre situation pour connaître les étapes à suivre.
</p>
<div class="ap-situations-grid">
<!-- Suspension -->
<div class="ap-sit-card ap-sit-card--suspension">
<div class="ap-sit-card-top">
<span class="ap-sit-icon">🔴</span>
<div class="ap-sit-card-label">Suspension<small>Retrait temporaire du permis</small></div>
</div>
<div class="ap-sit-card-body">
<p>Votre permis a été suspendu suite à une infraction :</p>
<ul>
<li><strong>Par la préfecture</strong> — décision administrative</li>
<li><strong>Par le tribunal</strong> — décision judiciaire</li>
</ul>
<span class="ap-sit-more">Découvrez les différentes étapes pour récupérer votre permis de conduire.</span>
</div>
<div class="ap-sit-card-footer">
<a href="https://aptevia.fr/pages/situations/suspension.php" class="ap-sit-btn ap-sit-btn--rdv">En savoir plus →</a>
</div>
</div>
<!-- Annulation -->
<div class="ap-sit-card ap-sit-card--annulation">
<div class="ap-sit-card-top">
<span class="ap-sit-icon">⚫</span>
<div class="ap-sit-card-label">Annulation<small>Décision judiciaire</small></div>
</div>
<div class="ap-sit-card-body">
<p>Votre permis a été annulé par décision judiciaire.</p>
<span class="ap-sit-more">Découvrez les différentes étapes pour récupérer votre permis de conduire.</span>
</div>
<div class="ap-sit-card-footer">
<a href="https://aptevia.fr/pages/situations/annulation.php" class="ap-sit-btn ap-sit-btn--rdv">En savoir plus →</a>
</div>
</div>
<!-- Invalidation -->
<div class="ap-sit-card ap-sit-card--invalidation">
<div class="ap-sit-card-top">
<span class="ap-sit-icon">🟠</span>
<div class="ap-sit-card-label">Invalidation<small>Perte totale de points</small></div>
</div>
<div class="ap-sit-card-body">
<p>Votre permis a été invalidé par perte totale de points.</p>
<span class="ap-sit-more">Comment retrouver la possibilité de conduire.</span>
</div>
<div class="ap-sit-card-footer">
<a href="https://aptevia.fr/pages/situations/invalidation.php" class="ap-sit-btn ap-sit-btn--rdv">En savoir plus →</a>
</div>
</div>
<!-- Lucie -->
<div class="ap-sit-card ap-sit-card--lucie">
<div class="ap-sit-card-top">
<span class="ap-sit-icon">🤖</span>
<div class="ap-sit-card-label">Je ne sais pas où j'en suis<small>Laissez Lucie vous guider</small></div>
</div>
<div class="ap-sit-card-body">
<p>Vous avez reçu un courrier mais vous ne comprenez pas votre situation ?</p>
<p><strong>Lucie</strong>, notre assistante IA, analyse votre cas et vous oriente vers les bonnes démarches en quelques minutes.</p>
</div>
<div class="ap-sit-card-footer">
<a href="https://aptevia.fr/pages/auto-evaluation.php" class="ap-sit-btn ap-sit-btn--lucie">Parler à Lucie →</a>
</div>
</div>
</div>
</section>
<!-- CENTRES -->
<section class="ap-centres-home">
<div class="ap-centres-wrap">
<h2 class="ap-centres-title">Nos centres agréés</h2>
<p class="ap-centres-subtitle">Choisissez votre ville pour consulter les informations du centre et accéder aux créneaux disponibles. APTEVIA intervient actuellement à <strong>Étampes</strong>, <strong>Angerville</strong>, <strong>Intréville</strong> et <strong>Pithiviers</strong>.</p>
<div class="ap-centres-grid">
<a class="ap-centre-card" href="https://aptevia.fr//centres/etampes/"><div><h3>Centre de test psychotechnique à Étampes</h3><p>Centre agréé • Accès simple • Créneaux réguliers</p></div><div class="ap-centre-arrow">→</div></a>
<a class="ap-centre-card" href="https://aptevia.fr//centres/angerville/"><div><h3>Centre de test psychotechnique à Angerville</h3><p>Centre agréé • RDV rapides • Parcours clair</p></div><div class="ap-centre-arrow">→</div></a>
<a class="ap-centre-card" href="https://aptevia.fr//centres/intreville/"><div><h3>Centre de test psychotechnique à Intréville</h3><p>Proche de vous • Informations pratiques • Accueil sur place</p></div><div class="ap-centre-arrow">→</div></a>
<a class="ap-centre-card" href="https://aptevia.fr//centres/pithiviers/"><div><h3>Centre de test psychotechnique à Pithiviers</h3><p>Centre-ville • Facile d'accès • Créneaux disponibles</p></div><div class="ap-centre-arrow">→</div></a>
</div>
<div class="ap-centres-bottom">
<p>Chaque centre APTEVIA est agréé et permet de passer le test psychotechnique requis dans le cadre d'une <strong>suspension</strong>, d'une <strong>annulation</strong> ou d'une <strong>invalidation</strong> du permis, avant la visite médicale.</p>
<a class="ap-centres-btn" href="https://aptevia.fr//centres/">Voir tous les centres</a>
</div>
</div>
</section>
<!-- PROCESSUS -->
<section style="padding:60px 20px;background:#f7f4ef;">
<div style="max-width:1100px;margin:0 auto;text-align:center;">
<h2 style="color:#002f3f;">Comment se déroule votre démarche ?</h2>
<div class="processus-row">
<div class="consultant-card"><h3>1. Prise de rendez-vous</h3><p>Choisissez la ville, la date et l'heure selon les créneaux disponibles.</p></div>
<div class="consultant-card"><h3>2. Tests psychotechniques</h3><p>Effectués dans un centre agréé, par un psychologue habilité.</p></div>
<div class="consultant-card"><h3>3. Attestation immédiate</h3><p>Remise de l'attestation pour votre visite médicale en préfecture.</p></div>
</div>
</div>
</section>
<!-- AVIS -->
<section class="ap-avis-home">
<div class="ap-avis-wrap">
<div class="ap-avis-image">
<a href="https://aptevia.fr/pages/avis.php"><img src="https://aptevia.fr/assets/img/avis-clients.png" alt="Avis clients APTEVIA" width="220" loading="lazy"></a>
</div>
<div class="ap-avis-content">
<h2 class="ap-avis-title">Ce que disent nos clients</h2>
<p class="ap-avis-sub">Transparence et qualité de service sont au cœur de notre engagement.</p>
<div class="ap-avis-stars" aria-label="Note moyenne">★★★★★</div>
<div class="ap-avis-tags"><span>✔ Accueil</span><span>✔ Réactivité</span><span>✔ Conseils</span></div>
<a href="https://aptevia.fr/pages/avis.php" class="ap-avis-btn">Donner mon avis</a>
</div>
</div>
</section>
<!-- FAQ IA
<section class="faq-section">
<div class="faq-container">
<h2>FAQ - Vos questions fréquentes</h2>
<p class="faq-subtitle">Posez une question sur votre situation (ex : « J'ai reçu une lettre 3F, que faire ? »)</p>
<div id="faq-box">
<input type="text" id="faq-input" placeholder="Saisissez votre question...">
<button id="faq-send">Envoyer</button>
<div id="faq-status"></div>
<div id="psy-loader"><div class="psy-circle"><span>PSY</span></div></div>
<div id="faq-response"></div>
<div id="faq-progress"><div id="faq-progress-bar"></div></div>
<div id="faq-share">
<button data-type="copy">📋 Copier</button>
<button data-type="email">📧 Email</button>
<button data-type="facebook">📘 Facebook</button>
<button data-type="whatsapp">💬 WhatsApp</button>
</div>
</div>
</div>-->
</section>
</main>
<!-- <script defer src="https://aptevia.fr/assets/js/ia_aptevia_v23.js"></script> -->
<!-- POPUP PRO -->
<div id="pro-login-overlay">
<div class="pro-popup">
<button type="button" id="pro-login-close">×</button>
<div class="pro-login-box">
<h2 class="pro-login-title">Connexion espace pro</h2>
<div class="pro-login-sub">Accès réservé aux centres agréés et administrateurs APTEVIA.</div>
<div id="login-step">
<form id="pro-login-form" method="POST">
<input type="hidden" name="from_popup" value="1">
<div class="pro-form-group"><label for="pro-login-email">Adresse e-mail</label><input type="email" id="pro-login-email" name="email" class="pro-input" required></div>
<div class="pro-form-group"><label for="pro-login-password">Mot de passe</label><input type="password" id="pro-login-password" name="password" class="pro-input" required></div>
<p class="otp-info">Après validation, un code à usage unique (OTP) vous sera envoyé par e-mail.</p>
<div class="btn-container">
<button type="submit" class="btn-pro-main">Continuer</button>
<button type="button" class="btn-pro-secondary" id="pro-login-cancel">Annuler</button>
</div>
<div style="text-align:center;margin-top:12px;"><a href="#" id="pro-forgot-open" style="color:#002f3f;text-decoration:none;">Mot de passe oublié ?</a></div>
</form>
</div>
<div id="otp-step" style="display:none;">
<h3 class="pro-login-title">Vérification du code</h3>
<p id="otp-info-message">Un code à 6 chiffres vous a été envoyé.</p>
<input type="text" id="otp-code" maxlength="6" class="pro-input" style="font-size:28px;text-align:center;letter-spacing:8px;">
<div class="btn-container">
<button class="btn-pro-main" type="button" id="btnValidateOTP">Valider le code</button>
<button class="btn-pro-secondary" type="button" id="cancel-otp">Annuler</button>
</div>
</div>
<div id="forgot-step" style="display:none;">
<h3 class="pro-login-title">Réinitialisation du mot de passe</h3>
<p id="forgot-info-message">Saisissez votre adresse email.<br>Vous recevrez un lien de réinitialisation.</p>
<input type="email" id="forgot-email" class="pro-input" placeholder="Votre adresse e-mail">
<div class="btn-container">
<button class="btn-pro-main" type="button" id="btnSendForgot">Envoyer</button>
<button class="btn-pro-secondary" type="button" id="cancel-forgot">Annuler</button>
</div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded",function(){
const overlay=document.getElementById('pro-login-overlay'),btnOpen=document.getElementById('btnEspacePro'),btnClose=document.getElementById('pro-login-close'),btnCancel=document.getElementById('pro-login-cancel'),loginForm=document.getElementById('pro-login-form'),loginStep=document.getElementById('login-step'),otpStep=document.getElementById('otp-step'),forgotStep=document.getElementById('forgot-step'),otpInput=document.getElementById('otp-code'),otpBtn=document.getElementById('btnValidateOTP'),otpCancelBtn=document.getElementById('cancel-otp'),forgotOpen=document.getElementById('pro-forgot-open'),forgotInput=document.getElementById('forgot-email'),forgotSend=document.getElementById('btnSendForgot'),forgotCancel=document.getElementById('cancel-forgot');
function openPopup(){overlay.style.display="flex"}
function closePopup(){overlay.style.display="none";loginStep.style.display="block";otpStep.style.display="none";forgotStep.style.display="none"}
if(btnOpen)btnOpen.addEventListener("click",(e)=>{e.preventDefault();openPopup()});
if(btnClose)btnClose.addEventListener("click",closePopup);
if(btnCancel)btnCancel.addEventListener("click",closePopup);
overlay.addEventListener("click",(e)=>{if(e.target===overlay)closePopup()});
loginForm.addEventListener("submit",(e)=>{
e.preventDefault();const fd=new FormData(loginForm);fd.set("from_popup","1");
fetch("https://aptevia.fr/admin/auth/login_process.php",{method:"POST",body:fd}).then(r=>r.json()).then(data=>{if(!data.ok){alert(data.message||"Identifiants incorrects.");return}loginStep.style.display="none";otpStep.style.display="block";otpInput.value="";otpInput.focus()}).catch(err=>alert("Erreur : "+err));
});
if(forgotOpen)forgotOpen.addEventListener("click",(e)=>{e.preventDefault();loginStep.style.display="none";forgotStep.style.display="block";forgotInput.focus()});
forgotCancel.addEventListener("click",()=>{forgotStep.style.display="none";loginStep.style.display="block"});
forgotSend.addEventListener("click",()=>{
const email=forgotInput.value.trim();if(!email){alert("Veuillez indiquer votre email.");return}
const fd=new FormData();fd.append("email",email);fd.append("from_popup","1");
fetch("https://aptevia.fr/admin/auth/forgot_process.php",{method:"POST",body:fd}).then(r=>r.text()).then(txt=>{let data;try{data=JSON.parse(txt)}catch(e){alert("Réponse inattendue :\n\n"+txt);return}if(!data.ok){alert(data.message||"Erreur.");return}alert(data.message||"E-mail envoyé.");forgotStep.style.display="none";loginStep.style.display="block"}).catch(err=>alert("Erreur : "+err));
});
otpBtn.addEventListener("click",()=>{
const code=otpInput.value.trim();if(code.length!==6){alert("Code à 6 chiffres requis.");return}
const fd=new FormData();fd.append("otp",code);fd.append("from_popup","1");
fetch("https://aptevia.fr/admin/auth/otp_process.php",{method:"POST",body:fd}).then(r=>r.json()).then(data=>{if(!data.ok){alert(data.message||"Code incorrect.");return}window.location.href=data.redirect_url||"https://aptevia.fr/admin/index.php"}).catch(err=>alert("Erreur serveur : "+err));
});
otpCancelBtn.addEventListener("click",()=>{otpStep.style.display="none";loginStep.style.display="block"});
});
</script>
<script>
document.addEventListener("DOMContentLoaded",function(){
const url=new URL(window.location.href);
if(url.searchParams.get("reset_ok")==="1"){
const overlay=document.getElementById("pro-login-overlay");
if(overlay)overlay.style.display="flex";
setTimeout(()=>{alert("Votre mot de passe a été réinitialisé avec succès.\nVous pouvez maintenant vous connecter.")},300);
}
});
</script>
<footer>
<div class="footer-container">
<p>© 2026 APTEVIA — Tests psychotechniques agréés.</p>
<ul class="footer-links">
<li><a href="https://aptevia.fr/pages/mentions-legales.php">Mentions légales</a></li>
<li><a href="https://aptevia.fr/pages/politique-confidentialite.php">Confidentialité</a></li>
<li><a href="https://aptevia.fr/pages/cgv.php">CGV</a></li>
<li><a href="https://aptevia.fr/pages/cgu.php">CGU</a></li>
<li><a href="https://aptevia.fr/pages/contact.php">Contact</a></li>
<li><a href="https://aptevia.fr/pages/bareme-points.php">Barème des points</a></li>
</ul>
<!-- Widget statut système -->
<div class="footer-status">
<a href="/pages/statut.php" target="_blank" rel="noopener" id="status-badge">
<span id="status-indicator" class="status-dot"></span>
<span id="status-label">Statut des services</span>
</a>
</div>
</div>
</footer>
<style>
.footer-status {
margin-top: 10px;
font-size: .82rem;
}
.footer-status a {
display: inline-flex;
align-items: center;
gap: 6px;
color: inherit;
text-decoration: none;
opacity: .75;
transition: opacity .2s;
}
.footer-status a:hover { opacity: 1; }
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: #aaa;
flex-shrink: 0;
display: inline-block;
}
.status-dot.operational { background: #2ecc71; }
.status-dot.degraded { background: #f39c12; }
.status-dot.partial { background: #e67e22; }
.status-dot.major { background: #e74c3c; }
.status-dot.maintenance { background: #3498db; }
</style>
<!-- ============================================================
SCRIPTS JAVASCRIPT (communs)
============================================================ -->
<script src="https://aptevia.fr/assets/js/faq_ai.js?v=1.11" defer></script>
<!-- Widget Statuspage : récupère le statut en temps réel -->
<script>
(function() {
fetch('https://aptevia.statuspage.io/api/v2/status.json')
.then(function(r) { return r.json(); })
.then(function(data) {
var indicator = data.status && data.status.indicator ? data.status.indicator : 'unknown';
var description = data.status && data.status.description ? data.status.description : 'Statut des services';
var dot = document.getElementById('status-indicator');
var label = document.getElementById('status-label');
if (!dot || !label) return;
label.textContent = description;
var cssClass = 'status-dot ';
switch (indicator) {
case 'none': cssClass += 'operational'; break;
case 'minor': cssClass += 'degraded'; break;
case 'major': cssClass += 'partial'; break;
case 'critical': cssClass += 'major'; break;
case 'maintenance': cssClass += 'maintenance'; break;
default: cssClass += '';
}
dot.className = cssClass;
})
.catch(function() {
// Silencieux si l'API est inaccessible
});
})();
</script>
<!-- #########################################################
POPUP CONNEXION ESPACE PRO (injectée globalement)
########################################################## -->
<div id="pro-login-overlay" aria-hidden="true">
<div class="pro-popup" role="dialog" aria-modal="true" aria-labelledby="pro-login-title">
<button type="button" id="pro-login-close" aria-label="Fermer">×</button>
<div class="pro-login-box">
<h2 class="pro-login-title" id="pro-login-title">Connexion espace pro</h2>
<div class="pro-login-sub">Accès réservé aux centres agréés et administrateurs APTEVIA.</div>
<!-- =======================
ÉTAPE 1 : LOGIN
======================== -->
<div id="login-step">
<form id="pro-login-form" method="POST" autocomplete="on">
<input type="hidden" name="from_popup" value="1">
<div class="pro-form-group">
<label for="pro-login-email">Adresse e-mail</label>
<input type="email" id="pro-login-email" name="email" class="pro-input" required autocomplete="username">
</div>
<div class="pro-form-group">
<label for="pro-login-password">Mot de passe</label>
<input type="password" id="pro-login-password" name="password" class="pro-input" required autocomplete="current-password">
</div>
<p class="otp-info">
Après validation, un code à usage unique (OTP) vous sera envoyé par e-mail.
</p>
<div class="btn-container">
<button type="submit" class="btn-pro-main">Continuer</button>
<button type="button" class="btn-pro-secondary" id="pro-login-cancel">Annuler</button>
</div>
<div style="text-align:center; margin-top:12px;">
<a href="#" id="pro-forgot-open" style="color:#002f3f; text-decoration:none;">Mot de passe oublié ?</a>
</div>
</form>
</div>
<!-- =======================
ÉTAPE 2 : OTP
======================== -->
<div id="otp-step" style="display:none;">
<h3 class="pro-login-title">Vérification du code</h3>
<p id="otp-info-message">Un code à 6 chiffres vous a été envoyé.</p>
<input type="text" id="otp-code" maxlength="6" inputmode="numeric"
class="pro-input" style="font-size:28px; text-align:center; letter-spacing:8px;">
<div class="btn-container">
<button class="btn-pro-main" type="button" id="btnValidateOTP">Valider le code</button>
<button class="btn-pro-secondary" type="button" id="cancel-otp">Annuler</button>
</div>
</div>
<!-- =======================
ÉTAPE 3 : MOT DE PASSE OUBLIÉ
======================== -->
<div id="forgot-step" style="display:none;">
<h3 class="pro-login-title">Réinitialisation du mot de passe</h3>
<p id="forgot-info-message">
Saisissez votre adresse email.<br>
Vous recevrez un lien de réinitialisation.
</p>
<input type="email" id="forgot-email" class="pro-input" placeholder="Votre adresse e-mail" autocomplete="email">
<div class="btn-container">
<button class="btn-pro-main" type="button" id="btnSendForgot">Envoyer</button>
<button class="btn-pro-secondary" type="button" id="cancel-forgot">Annuler</button>
</div>
</div>
</div>
</div>
</div>
<!-- Styles (isolés) -->
<style>
#pro-login-overlay{
display:none;
position:fixed;
inset:0;
background:rgba(0,0,0,0.45);
z-index:9999;
align-items:center;
justify-content:center;
}
#pro-login-overlay.is-open{ display:flex; }
.pro-popup{
background:#f7f4ef;
border-radius:12px;
max-width:520px;
width:min(520px, calc(100vw - 24px));
padding:22px;
position:relative;
box-shadow:0 10px 30px rgba(0,0,0,0.25);
}
.pro-login-title{ color:#002f3f; text-align:center; margin:0 0 10px 0; }
.pro-login-sub{ text-align:center; color:#4e4e4e; font-size:14px; margin-bottom:14px; }
.pro-form-group{ margin-bottom:14px; }
.pro-form-group label{ display:block; font-weight:700; margin-bottom:6px; color:#002f3f; }
.pro-input{
width:100%;
padding:12px;
border-radius:10px;
border:1px solid #cfd6da;
background:#fff;
box-sizing:border-box;
}
.otp-info{ color:#4e4e4e; font-size:13px; line-height:1.5; margin:8px 0 0 0; }
.btn-container{
display:flex;
gap:12px;
justify-content:center;
margin-top:14px;
flex-wrap:wrap;
}
.btn-pro-main{
flex:1;
min-width:160px;
background:#002f3f;
color:#fff;
padding:12px 14px;
border:none;
border-radius:999px;
cursor:pointer;
font-weight:800;
}
.btn-pro-secondary{
flex:1;
min-width:160px;
background:#c0b8ae;
color:#002f3f;
padding:12px 14px;
border:none;
border-radius:999px;
cursor:pointer;
font-weight:800;
}
#pro-login-close{
position:absolute;
top:8px;
right:12px;
border:none;
background:transparent;
font-size:26px;
cursor:pointer;
color:#002f3f;
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function () {
const overlay = document.getElementById('pro-login-overlay');
const btnOpen = document.getElementById('btnEspacePro');
const btnClose = document.getElementById('pro-login-close');
const btnCancel = document.getElementById('pro-login-cancel');
const loginForm = document.getElementById('pro-login-form');
const loginStep = document.getElementById('login-step');
const otpStep = document.getElementById('otp-step');
const forgotStep = document.getElementById('forgot-step');
const otpInput = document.getElementById('otp-code');
const otpBtn = document.getElementById('btnValidateOTP');
const otpCancelBtn = document.getElementById('cancel-otp');
const forgotOpen = document.getElementById('pro-forgot-open');
const forgotInput = document.getElementById('forgot-email');
const forgotSend = document.getElementById('btnSendForgot');
const forgotCancel = document.getElementById('cancel-forgot');
if (!overlay) return;
function openPopup(){
overlay.classList.add('is-open');
overlay.setAttribute('aria-hidden','false');
// focus email
const email = document.getElementById('pro-login-email');
if (email) setTimeout(()=>email.focus(), 50);
}
function closePopup(){
overlay.classList.remove('is-open');
overlay.setAttribute('aria-hidden','true');
// reset steps
loginStep.style.display = "block";
otpStep.style.display = "none";
forgotStep.style.display = "none";
if (otpInput) otpInput.value = "";
if (forgotInput) forgotInput.value = "";
}
// Ouvrir depuis le bouton du header
if (btnOpen) {
btnOpen.addEventListener("click", (e) => {
// IMPORTANT : empêcher navigation vers /admin/login.php
e.preventDefault();
openPopup();
});
}
if (btnClose) btnClose.addEventListener("click", closePopup);
if (btnCancel) btnCancel.addEventListener("click", closePopup);
overlay.addEventListener("click", (e) => {
if (e.target === overlay) closePopup();
});
// LOGIN → OTP
if (loginForm) {
loginForm.addEventListener("submit", (e) => {
e.preventDefault();
const fd = new FormData(loginForm);
fd.set("from_popup", "1");
fetch("https://aptevia.fr/admin/auth/login_process.php", {
method: "POST",
body: fd
})
.then(r => r.json())
.then(data => {
if (!data || !data.ok) {
alert((data && data.message) ? data.message : "Identifiants incorrects.");
return;
}
loginStep.style.display = "none";
otpStep.style.display = "block";
if (otpInput) { otpInput.value=""; otpInput.focus(); }
})
.catch(err => alert("Erreur : " + err));
});
}
// MOT DE PASSE OUBLIÉ
if (forgotOpen) {
forgotOpen.addEventListener("click", (e) => {
e.preventDefault();
loginStep.style.display = "none";
otpStep.style.display = "none";
forgotStep.style.display = "block";
if (forgotInput) forgotInput.focus();
});
}
if (forgotCancel) {
forgotCancel.addEventListener("click", () => {
forgotStep.style.display = "none";
loginStep.style.display = "block";
});
}
if (forgotSend) {
forgotSend.addEventListener("click", () => {
const email = (forgotInput ? forgotInput.value.trim() : "");
if (!email) { alert("Veuillez indiquer votre email."); return; }
const fd = new FormData();
fd.append("email", email);
fd.append("from_popup", "1");
fetch("https://aptevia.fr/admin/auth/forgot_process.php", {
method: "POST",
body: fd
})
.then(r => r.text())
.then(txt => {
let data;
try { data = JSON.parse(txt); } catch(e){
alert("Réponse inattendue du serveur :\n\n" + txt);
return;
}
if (!data.ok) { alert(data.message || "Erreur lors de la demande."); return; }
alert(data.message || "Un e-mail de réinitialisation vient d'être envoyé.");
forgotStep.style.display = "none";
loginStep.style.display = "block";
})
.catch(err => alert("Erreur : " + err));
});
}
// VALIDATION OTP
if (otpBtn) {
otpBtn.addEventListener("click", () => {
const code = (otpInput ? otpInput.value.trim() : "");
if (code.length !== 6) { alert("Veuillez saisir un code à 6 chiffres."); return; }
const fd = new FormData();
fd.append("otp", code);
fd.append("from_popup", "1");
fetch("https://aptevia.fr/admin/auth/otp_process.php", {
method: "POST",
body: fd
})
.then(r => r.json())
.then(data => {
if (!data || !data.ok) { alert((data && data.message) ? data.message : "Code incorrect."); return; }
window.location.href = data.redirect_url ? data.redirect_url : "https://aptevia.fr/admin/index.php";
})
.catch(err => alert("Erreur serveur : " + err));
});
}
if (otpCancelBtn) {
otpCancelBtn.addEventListener("click", () => {
otpStep.style.display = "none";
loginStep.style.display = "block";
});
}
// ESC pour fermer
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && overlay.classList.contains('is-open')) closePopup();
});
});
</script>
<!-- Matomo (stats.aptevia.net) - RGPD friendly (sans cookies) -->
<script>
var _paq = window._paq = window._paq || [];
_paq.push(["disableCookies"]);
_paq.push(["trackPageView"]);
_paq.push(["enableLinkTracking"]);
(function () {
var u = "https://stats.aptevia.net/";
_paq.push(["setTrackerUrl", u + "matomo.php"]);
_paq.push(["setSiteId", "1"]);
var d = document, g = d.createElement("script"), s = d.getElementsByTagName("script")[0];
g.async = true; g.src = u + "matomo.js";
s.parentNode.insertBefore(g, s);
})();
</script>
<script>console.log("FOOTER APTEVIA LOADED V1.5");</script>
</body>
</html>