{"id":2932,"date":"2025-08-14T12:29:17","date_gmt":"2025-08-14T12:29:17","guid":{"rendered":"https:\/\/eliteservicesenegal.com\/?page_id=2932"},"modified":"2026-09-01T22:52:00","modified_gmt":"2026-09-01T22:52:00","slug":"suivi-de-vos-dossiers","status":"publish","type":"page","link":"https:\/\/eliteservicesenegal.com\/index.php\/suivi-de-vos-dossiers\/","title":{"rendered":"CONSULTER SON DOSSIER"},"content":{"rendered":"<h1>Vos Exigences Font Notre Force<\/h1>\n<h5>VOS DOSSIERS EN TEMPS R\u00c9EL<\/h5>\n    <style>\n      \/* Interface align\u00e9e sur le style du site (rouge \/ blanc \/ gris) *\/\n      .es-suivi-wrap {\n        --es-red: #D8483C;\n        --es-red-dark: #B33A30;\n        --es-red-tint: #F6E2DF;\n        --es-charcoal: #241F1C;\n        --es-gray: #756E68;\n        --es-offwhite: #FAF8F7;\n        --es-line: #E7E2DF;\n        max-width: 640px;\n        margin: 32px auto;\n        font-family: \"Public Sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n        color: var(--es-charcoal);\n      }\n\n      .es-inner-wrap {\n        background: #fff;\n        border: 1px solid var(--es-line);\n        border-radius: 14px;\n        padding: 36px 32px;\n      }\n\n      .es-header { text-align: center; margin-bottom: 32px; }\n\n      .es-title {\n        font-family: \"Fraunces\", Georgia, serif;\n        font-weight: 500;\n        font-size: 28px;\n        margin: 0 0 8px;\n        color: var(--es-charcoal);\n      }\n\n      .es-subtitle { font-size: 15px; color: var(--es-gray); margin: 0; }\n\n      .es-card {\n        background: var(--es-offwhite);\n        border: 1px solid var(--es-line);\n        border-radius: 12px;\n        padding: 26px 24px;\n      }\n\n      .es-form-grid { display: grid; grid-template-columns: 1fr; gap: 4px; }\n      @media (min-width: 600px) {\n        .es-form-grid { grid-template-columns: repeat(2, 1fr); gap: 0 16px; }\n      }\n\n      .es-field { margin-bottom: 18px; }\n      .es-label { font-size: 13.5px; font-weight: 600; color: var(--es-charcoal); margin-bottom: 6px; display: block; }\n\n      .es-input-wrap { position: relative; }\n      .es-input {\n        width: 100%;\n        border: 1px solid var(--es-line);\n        border-radius: 8px;\n        padding: 12px 14px;\n        font-size: 15px;\n        font-family: inherit;\n        outline: none;\n        background: #fff;\n        box-sizing: border-box;\n        transition: border-color .15s ease;\n      }\n      .es-input:focus { border-color: var(--es-red); }\n      .es-input-wrap .es-input { padding-right: 42px; }\n\n      .es-toggle-pass {\n        position: absolute; top: 50%; right: 4px; transform: translateY(-50%);\n        background: none; border: 0; cursor: pointer; padding: 8px;\n        color: var(--es-gray); display: flex; align-items: center; justify-content: center;\n      }\n      .es-toggle-pass:hover { color: var(--es-charcoal); }\n      .es-toggle-pass .icon-eye-off { display: none; }\n      .es-toggle-pass.is-visible .icon-eye-on { display: none; }\n      .es-toggle-pass.is-visible .icon-eye-off { display: block; }\n\n      .es-actions { display: flex; gap: 12px; align-items: center; justify-content: center; margin-top: 6px; flex-wrap: wrap; }\n\n      .es-btn {\n        background: var(--es-red); color: #fff; border: none; border-radius: 8px;\n        padding: 13px 26px; font-weight: 600; font-size: 15px; cursor: pointer;\n        transition: background-color .15s ease; font-family: inherit;\n      }\n      .es-btn:hover { background: var(--es-red-dark); }\n      .es-btn:disabled { opacity: .6; cursor: not-allowed; }\n\n      .es-btn-secondary { background: #fff; color: var(--es-charcoal); border: 1px solid var(--es-line); box-shadow: none; }\n      .es-btn-secondary:hover { background: var(--es-offwhite); }\n\n      .es-help {\n        font-size: 13.5px; color: var(--es-gray); text-align: center; margin-top: 14px;\n        padding: 12px 14px; background: #fff; border-radius: 8px; border: 1px solid var(--es-line);\n      }\n\n      .es-link-text { text-align: center; margin-top: 14px; }\n\n      .es-logged-in-bar {\n        display: flex; align-items: center; justify-content: space-between; gap: 12px;\n        background: #eef6ef; border: 1px solid #cfe8d3; color: #2f5c3a;\n        padding: 14px 18px; border-radius: 10px; margin-bottom: 20px; font-size: 14px;\n      }\n      .es-logout-link {\n        background: none; border: 1px solid #2f5c3a; color: #2f5c3a; border-radius: 8px;\n        padding: 7px 14px; font-size: 13px; font-weight: 600; cursor: pointer; flex-shrink: 0;\n      }\n      .es-logout-link:hover { background: #2f5c3a; color: #fff; }\n      .es-link-text a { color: var(--es-red-dark); font-size: 13.5px; text-decoration: none; font-weight: 600; }\n      .es-link-text a:hover { text-decoration: underline; }\n\n      .es-error, .es-info, .es-success {\n        padding: 14px 16px; border-radius: 8px; margin-top: 18px; font-size: 14px;\n        border-left: 4px solid; background: var(--es-offwhite);\n      }\n      .es-error { border-color: var(--es-red); color: var(--es-red-dark); }\n      .es-info { border-color: var(--es-line); color: var(--es-charcoal); }\n      .es-success { border-color: #4c8c5c; color: #2f5c3a; background: #eef6ef; }\n\n      .es-loader { display: none; font-size: 14px; color: var(--es-gray); }\n      .es-loader.on { display: inline-flex; align-items: center; gap: 10px; }\n      .es-spinner {\n        width: 16px; height: 16px; border: 2px solid var(--es-line); border-top-color: var(--es-red);\n        border-radius: 50%; animation: es-spin 1s linear infinite;\n      }\n      @keyframes es-spin { to { transform: rotate(360deg); } }\n\n      .es-results { margin-top: 28px; display: flex; flex-direction: column; gap: 14px; }\n      .es-results-header { padding-bottom: 12px; border-bottom: 1px solid var(--es-line); }\n      .es-count { font-size: 16px; font-weight: 600; margin: 0; color: var(--es-charcoal); }\n\n      .es-result-card {\n        display: flex; justify-content: space-between; align-items: center; gap: 16px;\n        background: #fff; border: 1px solid var(--es-line); border-radius: 10px; padding: 18px 20px;\n        transition: box-shadow .18s ease;\n      }\n      .es-result-card:hover { box-shadow: 0 8px 20px rgba(36,31,28,.08); }\n\n      .es-main { display: flex; flex-direction: column; gap: 6px; min-width: 0; flex: 1; }\n      .es-line { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }\n      .es-cat { font-weight: 600; color: var(--es-charcoal); font-size: 15.5px; }\n      .es-status {\n        font-size: 12.5px; background: var(--es-red-tint); color: var(--es-red-dark);\n        border-radius: 999px; padding: 4px 12px; font-weight: 600;\n      }\n      .es-date { font-size: 13px; color: var(--es-gray); }\n\n      .es-actions-right { display: flex; gap: 10px; flex-shrink: 0; }\n      .es-link {\n        text-decoration: none; background: var(--es-red); color: #fff; border-radius: 8px;\n        padding: 10px 18px; font-size: 13.5px; font-weight: 600; transition: background-color .15s ease;\n      }\n      .es-link:hover { background: var(--es-red-dark); }\n      .es-no-doc { color: var(--es-gray); font-size: 13px; }\n\n      .es-files-section { margin-top: 32px; padding-top: 24px; border-top: 1px solid var(--es-line); }\n\n      \/* ---------- Section \"Mes num\u00e9ros de suivi\" \u2014 design distinct, moderne ---------- *\/\n      .es-prestations-section .es-count {\n        display:flex; align-items:center; gap:8px;\n      }\n      .es-prestations-section .es-count::before {\n        content:''; width:8px; height:8px; border-radius:50%;\n        background: linear-gradient(135deg, var(--es-red), var(--es-red-dark));\n        box-shadow: 0 0 0 4px var(--es-red-tint);\n      }\n      .es-prestation-card {\n        position: relative; overflow: hidden; border: none; border-radius: 16px;\n        padding: 20px 22px 18px 26px; margin-bottom: 16px;\n        background: #fff; box-shadow: 0 4px 18px rgba(36,31,28,.08);\n        transition: box-shadow .2s ease, transform .2s ease;\n      }\n      .es-prestation-card:hover { box-shadow: 0 10px 28px rgba(36,31,28,.13); transform: translateY(-2px); }\n      .es-prestation-card::before {\n        content:''; position:absolute; left:0; top:0; bottom:0; width:5px;\n        background: linear-gradient(180deg, var(--es-red), var(--es-red-dark));\n      }\n      .es-prestation-card.cloture::before { background: linear-gradient(180deg, #3a8a52, #1f4029); }\n      .es-prestation-card__head { display:flex; align-items:center; justify-content:space-between; gap:10px; flex-wrap:wrap; }\n      .es-prestation-card__numero { font-weight:800; color: var(--es-charcoal); font-size:16.5px; letter-spacing:.2px; }\n      .es-prestation-card__statut {\n        font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.5px;\n        padding:5px 13px; border-radius:999px; background: var(--es-red); color:#fff; white-space:nowrap;\n      }\n      .es-prestation-card__statut.cloture { background:#3a8a52; }\n      .es-prestation-histo {\n        list-style:none; margin:18px 0 0; padding:2px 0 0 4px; position:relative;\n      }\n      .es-prestation-histo::before {\n        content:''; position:absolute; left:9px; top:8px; bottom:8px; width:2px; background: var(--es-line);\n      }\n      .es-prestation-histo li {\n        position:relative; padding:0 0 16px 28px; font-size:13.5px; color: var(--es-charcoal); line-height:1.5;\n      }\n      .es-prestation-histo li:last-child { padding-bottom:0; }\n      .es-prestation-histo li::before {\n        content:''; position:absolute; left:3px; top:3px; width:12px; height:12px; border-radius:50%;\n        background:#fff; border:2.5px solid var(--es-red-dark); z-index:1;\n      }\n      .es-prestation-histo li:first-child::before { background: var(--es-red-dark); }\n      .es-prestation-histo li span {\n        display:block; font-weight:700; color: var(--es-red-dark); font-size:11px;\n        text-transform:uppercase; letter-spacing:.4px; margin-bottom:3px;\n      }\n      .es-file-row {\n        display: flex; align-items: center; gap: 14px; padding: 14px 16px;\n        background: var(--es-offwhite); border: 1px solid var(--es-line); border-radius: 10px; margin-bottom: 10px;\n      }\n      .es-file-row__icon {\n        flex-shrink: 0; width: 38px; height: 38px; border-radius: 8px;\n        background: var(--es-red-tint); color: var(--es-red-dark);\n        display: flex; align-items: center; justify-content: center;\n      }\n      .es-file-row__body { flex: 1; min-width: 0; }\n      .es-file-row__title { font-weight: 600; font-size: 14.5px; color: var(--es-charcoal); margin: 0; }\n      .es-file-row__meta { font-size: 12.5px; color: var(--es-gray); margin: 2px 0 0; }\n      .es-file-row__link {\n        flex-shrink: 0; text-decoration: none; background: var(--es-red); color: #fff;\n        border-radius: 8px; padding: 9px 16px; font-size: 13.5px; font-weight: 600;\n      }\n      .es-file-row__link:hover { background: var(--es-red-dark); }\n\n      .es-folder {\n        border: 1px solid var(--es-line); border-radius: 10px; margin-bottom: 10px; overflow: hidden;\n      }\n      .es-folder__summary {\n        display: flex; align-items: center; gap: 12px; padding: 14px 16px;\n        background: var(--es-offwhite); cursor: pointer; list-style: none;\n      }\n      .es-folder__summary::-webkit-details-marker { display: none; }\n      .es-folder__summary:hover { background: var(--es-red-tint); }\n      .es-folder__icon { flex-shrink: 0; color: var(--es-red-dark); display: flex; }\n      .es-folder__name { flex: 1; font-weight: 600; font-size: 14.5px; color: var(--es-charcoal); }\n      .es-folder__count { font-size: 12.5px; color: var(--es-gray); }\n      .es-folder__body { padding: 14px 16px; background: #fff; }\n      .es-folder[open] .es-folder__summary { border-bottom: 1px solid var(--es-line); }\n\n      #es-card-creation { margin-top: 18px; }\n\n      @media (max-width: 640px) {\n        .es-suivi-wrap { margin: 12px; }\n        .es-inner-wrap { padding: 24px 18px; }\n        .es-title { font-size: 23px; }\n        .es-card { padding: 20px 16px; }\n        .es-btn { width: 100%; }\n        .es-actions { flex-direction: column; }\n        .es-result-card { flex-direction: column; align-items: stretch; }\n        .es-actions-right { justify-content: stretch; }\n        .es-link { flex: 1; text-align: center; }\n      }\n    <\/style>\n\n    \n    <div class=\"es-suivi-wrap\" id=\"es-suivi-root\"\n         data-ajax-url=\"https:\/\/eliteservicesenegal.com\/wp-admin\/admin-ajax.php\"\n         data-nonce=\"84f8185dd3\"\n         data-session=\"\">\n\n      <div class=\"es-inner-wrap\">\n        <div class=\"es-header\">\n          <h1 class=\"es-title\">Consultation de dossier<\/h1>\n          <p class=\"es-subtitle\">Suivez l'avancement de votre dossier en temps r\u00e9el<\/p>\n        <\/div>\n\n        <div class=\"es-logged-in-bar\" id=\"es-logged-in-bar\" style=\"display:none;\">\n          <span>Bonjour <strong id=\"es-logged-in-name\"><\/strong>, vous \u00eates d\u00e9j\u00e0 connect\u00e9.<\/span>\n          <button type=\"button\" class=\"es-logout-link\" id=\"es-logout-btn\">Se d\u00e9connecter<\/button>\n        <\/div>\n\n        <div class=\"es-card\" id=\"es-login-card\">\n\n          <!-- ETAPE 1 : num\u00e9ro de t\u00e9l\u00e9phone -->\n          <div id=\"es-step-telephone\">\n            <div class=\"es-field\">\n              <label class=\"es-label\" for=\"es-telephone-init\">Num\u00e9ro de t\u00e9l\u00e9phone<\/label>\n              <input class=\"es-input\" type=\"tel\" id=\"es-telephone-init\" placeholder=\"Votre num\u00e9ro de t\u00e9l\u00e9phone\">\n            <\/div>\n            <div class=\"es-actions\">\n              <button class=\"es-btn\" id=\"es-btn-continuer\" type=\"button\">Continuer<\/button>\n            <\/div>\n          <\/div>\n\n          <!-- ETAPE 2A : mot de passe (client d\u00e9j\u00e0 connu) -->\n          <div id=\"es-step-password\" style=\"display:none;\">\n            <div class=\"es-field\">\n              <label class=\"es-label\" for=\"es-password-login\">Mot de passe<\/label>\n              <div class=\"es-input-wrap\">\n                <input class=\"es-input\" type=\"password\" id=\"es-password-login\" placeholder=\"Votre mot de passe\">\n                    <button type=\"button\" class=\"es-toggle-pass\" data-target=\"es-password-login\" aria-label=\"Afficher le mot de passe\">\n        <svg class=\"icon-eye-on\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7z\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><\/svg>\n        <svg class=\"icon-eye-off\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.94 17.94A10.94 10.94 0 0 1 12 19c-7 0-11-7-11-7a21.6 21.6 0 0 1 5.06-5.94\"\/><path d=\"M9.9 4.24A10.6 10.6 0 0 1 12 4c7 0 11 7 11 7a21.6 21.6 0 0 1-2.16 3.19\"\/><path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\"\/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"\/><\/svg>\n    <\/button>\n                  <\/div>\n            <\/div>\n            <div class=\"es-actions\">\n              <button class=\"es-btn\" id=\"es-btn-login\" type=\"button\">Se connecter<\/button>\n            <\/div>\n            <div class=\"es-link-text\">\n              <a href=\"#\" id=\"es-link-oublie\">Mot de passe oubli\u00e9, ou premi\u00e8re visite avec ce num\u00e9ro ?<\/a>\n            <\/div>\n          <\/div>\n\n          <!-- ETAPE 2B : nom \/ pr\u00e9nom (premi\u00e8re visite) -->\n          <div id=\"es-step-identite\" style=\"display:none;\">\n            <div class=\"es-form-grid\">\n              <div class=\"es-field\">\n                <label class=\"es-label\" for=\"es-nom\">Nom<\/label>\n                <input class=\"es-input\" type=\"text\" id=\"es-nom\" placeholder=\"Nom\">\n              <\/div>\n              <div class=\"es-field\">\n                <label class=\"es-label\" for=\"es-prenom\">Pr\u00e9nom<\/label>\n                <input class=\"es-input\" type=\"text\" id=\"es-prenom\" placeholder=\"Pr\u00e9nom\">\n              <\/div>\n            <\/div>\n            <div class=\"es-actions\">\n              <button class=\"es-btn\" id=\"es-btn-rechercher\" type=\"button\">Rechercher mon dossier<\/button>\n              <button class=\"es-btn es-btn-secondary\" id=\"es-btn-retour-tel\" type=\"button\">Retour<\/button>\n            <\/div>\n            <div class=\"es-help\">\n              Saisissez les m\u00eames informations que lors du d\u00e9p\u00f4t de votre dossier.\n            <\/div>\n          <\/div>\n\n          <div class=\"es-actions\">\n            <span class=\"es-loader\" id=\"es-loader\">\n              <span class=\"es-spinner\"><\/span>\n              Chargement\u2026\n            <\/span>\n          <\/div>\n\n          <div class=\"es-error\" id=\"es-error\" style=\"display:none;\"><\/div>\n        <\/div>\n\n        <!-- Panneau de cr\u00e9ation \/ r\u00e9initialisation de mot de passe -->\n        <div class=\"es-card\" id=\"es-card-creation\" style=\"display:none;\">\n          <h2 id=\"es-creation-title\" style=\"margin-top:0; font-size: 19px;\">Cr\u00e9ez votre mot de passe<\/h2>\n          <p class=\"es-subtitle\" id=\"es-creation-subtitle\">La prochaine fois, connectez-vous directement avec votre num\u00e9ro et ce mot de passe.<\/p>\n          <div class=\"es-form-grid\">\n            <div class=\"es-field\">\n              <label class=\"es-label\" for=\"es-new-password\">Nouveau mot de passe<\/label>\n              <div class=\"es-input-wrap\">\n                <input class=\"es-input\" type=\"password\" id=\"es-new-password\" placeholder=\"6 caract\u00e8res minimum\">\n                    <button type=\"button\" class=\"es-toggle-pass\" data-target=\"es-new-password\" aria-label=\"Afficher le mot de passe\">\n        <svg class=\"icon-eye-on\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7z\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><\/svg>\n        <svg class=\"icon-eye-off\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.94 17.94A10.94 10.94 0 0 1 12 19c-7 0-11-7-11-7a21.6 21.6 0 0 1 5.06-5.94\"\/><path d=\"M9.9 4.24A10.6 10.6 0 0 1 12 4c7 0 11 7 11 7a21.6 21.6 0 0 1-2.16 3.19\"\/><path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\"\/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"\/><\/svg>\n    <\/button>\n                  <\/div>\n            <\/div>\n            <div class=\"es-field\">\n              <label class=\"es-label\" for=\"es-new-password-confirm\">Confirmer le mot de passe<\/label>\n              <div class=\"es-input-wrap\">\n                <input class=\"es-input\" type=\"password\" id=\"es-new-password-confirm\" placeholder=\"Ressaisissez le mot de passe\">\n                    <button type=\"button\" class=\"es-toggle-pass\" data-target=\"es-new-password-confirm\" aria-label=\"Afficher le mot de passe\">\n        <svg class=\"icon-eye-on\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7z\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><\/svg>\n        <svg class=\"icon-eye-off\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.94 17.94A10.94 10.94 0 0 1 12 19c-7 0-11-7-11-7a21.6 21.6 0 0 1 5.06-5.94\"\/><path d=\"M9.9 4.24A10.6 10.6 0 0 1 12 4c7 0 11 7 11 7a21.6 21.6 0 0 1-2.16 3.19\"\/><path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\"\/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"\/><\/svg>\n    <\/button>\n                  <\/div>\n            <\/div>\n          <\/div>\n          <div class=\"es-actions\">\n            <button class=\"es-btn\" id=\"es-btn-creer-password\" type=\"button\">Enregistrer mon mot de passe<\/button>\n          <\/div>\n          <div class=\"es-error\" id=\"es-password-error\" style=\"display:none;\"><\/div>\n          <div class=\"es-success\" id=\"es-password-success\" style=\"display:none;\"><\/div>\n        <\/div>\n\n        <div class=\"es-results\" id=\"es-results\" style=\"display:none;\">\n          <div class=\"es-results-header\">\n            <h2 class=\"es-count\" id=\"es-count\"><\/h2>\n          <\/div>\n          <div id=\"es-list\"><\/div>\n        <\/div>\n\n        <div class=\"es-files-section\" id=\"es-files-section\" style=\"display:none;\">\n          <h2 class=\"es-count\">Mes fichiers<\/h2>\n          <div id=\"es-files-list\"><\/div>\n        <\/div>\n\n        <div class=\"es-files-section es-prestations-section\" id=\"es-prestations-section\" style=\"display:none;\">\n          <h2 class=\"es-count\">Mes num\u00e9ros de suivi<\/h2>\n          <div id=\"es-prestations-list\"><\/div>\n        <\/div>\n\n        <div class=\"es-info\" id=\"es-empty\" style=\"display:none;\">\n          <strong>Aucun dossier trouv\u00e9<\/strong><br>\n          V\u00e9rifiez les informations saisies.\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <script>\n      (function(){\n        const root = document.getElementById('es-suivi-root');\n        const ajaxUrl = root.getAttribute('data-ajax-url');\n        const nonce = root.getAttribute('data-nonce');\n\n        \/\/ Etapes\n        const stepTelephone = document.getElementById('es-step-telephone');\n        const stepPassword  = document.getElementById('es-step-password');\n        const stepIdentite  = document.getElementById('es-step-identite');\n\n        const telephoneInit = document.getElementById('es-telephone-init');\n        const passwordLogin = document.getElementById('es-password-login');\n        const nomInput = document.getElementById('es-nom');\n        const prenomInput = document.getElementById('es-prenom');\n\n        const btnContinuer = document.getElementById('es-btn-continuer');\n        const btnLogin = document.getElementById('es-btn-login');\n        const btnRechercher = document.getElementById('es-btn-rechercher');\n        const btnRetourTel = document.getElementById('es-btn-retour-tel');\n        const linkOublie = document.getElementById('es-link-oublie');\n\n        const loader = document.getElementById('es-loader');\n        const error  = document.getElementById('es-error');\n        const resultsWrap = document.getElementById('es-results');\n        const countEl = document.getElementById('es-count');\n        const listEl  = document.getElementById('es-list');\n        const emptyEl = document.getElementById('es-empty');\n\n        \/\/ Session d\u00e9j\u00e0 active (cookie) : on affiche directement les r\u00e9sultats,\n        \/\/ sans redemander le t\u00e9l\u00e9phone ni le mot de passe.\n        const loggedInBar = document.getElementById('es-logged-in-bar');\n        const loggedInName = document.getElementById('es-logged-in-name');\n        const logoutBtn = document.getElementById('es-logout-btn');\n        const loginCard = document.getElementById('es-login-card');\n        const rawSession = root.getAttribute('data-session');\n\n        if (logoutBtn) {\n            logoutBtn.addEventListener('click', function () {\n                var body = new URLSearchParams();\n                body.append('action', 'es_client_logout');\n                body.append('_ajax_nonce', nonce);\n                fetch(ajaxUrl, { method: 'POST', body: body }).finally(function () {\n                    window.location.reload();\n                });\n            });\n        }\n\n        if (rawSession) {\n            try {\n                var session = JSON.parse(rawSession);\n                if (loggedInBar && loggedInName) {\n                    loggedInName.textContent = session.name || '';\n                    loggedInBar.style.display = 'flex';\n                }\n                if (loginCard) loginCard.style.display = 'none';\n                renderResults(session.dossiers || []);\n                renderFiles(session.folders || [], session.files || []);\n                renderPrestations(session.prestations || []);\n            } catch (e) { \/* session illisible : on retombe sur le formulaire normal *\/ }\n        }\n\n        \/\/ Panneau cr\u00e9ation mot de passe\n        const cardCreation = document.getElementById('es-card-creation');\n        const creationTitle = document.getElementById('es-creation-title');\n        const creationSubtitle = document.getElementById('es-creation-subtitle');\n        const newPassword = document.getElementById('es-new-password');\n        const newPasswordConfirm = document.getElementById('es-new-password-confirm');\n        const btnCreerPassword = document.getElementById('es-btn-creer-password');\n        const passwordError = document.getElementById('es-password-error');\n        const passwordSuccess = document.getElementById('es-password-success');\n\n        let currentTelephone = '';\n        let currentNom = '';\n        let currentPrenom = '';\n        let forcedReset = false; \/\/ true si l'utilisateur passe par \"mot de passe oubli\u00e9\"\n\n        \/\/ === Afficher \/ masquer le mot de passe ===\n        document.querySelectorAll('.es-toggle-pass').forEach(function (btn) {\n          btn.addEventListener('click', function () {\n            const input = document.getElementById(btn.getAttribute('data-target'));\n            if (!input) return;\n            const isHidden = input.type === 'password';\n            input.type = isHidden ? 'text' : 'password';\n            btn.classList.toggle('is-visible', isHidden);\n            btn.setAttribute('aria-label', isHidden ? 'Masquer le mot de passe' : 'Afficher le mot de passe');\n          });\n        });\n\n        function showLoader(on) {\n          loader.classList.toggle('on', on);\n        }\n\n        function showError(msg) {\n          error.textContent = msg;\n          error.style.display = 'block';\n        }\n\n        function hideError() {\n          error.style.display = 'none';\n        }\n\n        function resetResultsUI() {\n          emptyEl.style.display = 'none';\n          resultsWrap.style.display = 'none';\n          listEl.innerHTML = '';\n          countEl.textContent = '';\n          cardCreation.style.display = 'none';\n          passwordError.style.display = 'none';\n          passwordSuccess.style.display = 'none';\n          newPassword.value = '';\n          newPasswordConfirm.value = '';\n          var filesSection = document.getElementById('es-files-section');\n          var filesList = document.getElementById('es-files-list');\n          if (filesSection) filesSection.style.display = 'none';\n          if (filesList) filesList.innerHTML = '';\n          var prestationsSection = document.getElementById('es-prestations-section');\n          var prestationsList = document.getElementById('es-prestations-list');\n          if (prestationsSection) prestationsSection.style.display = 'none';\n          if (prestationsList) prestationsList.innerHTML = '';\n        }\n\n        function renderFiles(folders, looseFiles) {\n          var filesSection = document.getElementById('es-files-section');\n          var filesList = document.getElementById('es-files-list');\n          if (!filesSection || !filesList) return;\n          filesList.innerHTML = '';\n\n          var hasFolders = folders && folders.length;\n          var hasLoose = looseFiles && looseFiles.length;\n\n          if (!hasFolders && !hasLoose) {\n            filesSection.style.display = 'none';\n            return;\n          }\n\n          function buildFileRow(f) {\n            var row = document.createElement('div');\n            row.className = 'es-file-row';\n            row.innerHTML =\n              '<div class=\"es-file-row__icon\">' +\n                '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 2c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6H6zm7 1.5L18.5 9H14a1 1 0 0 1-1-1V3.5z\"\/><\/svg>' +\n              '<\/div>' +\n              '<div class=\"es-file-row__body\">' +\n                '<p class=\"es-file-row__title\"><\/p>' +\n                '<p class=\"es-file-row__meta\"><\/p>' +\n              '<\/div>' +\n              '<a class=\"es-file-row__link\" target=\"_blank\" rel=\"noopener\">Ouvrir<\/a>';\n            row.querySelector('.es-file-row__title').textContent = f.titre;\n            row.querySelector('.es-file-row__meta').textContent = f.taille || '';\n            row.querySelector('.es-file-row__link').href = f.url;\n            return row;\n          }\n\n          \/\/ Dossiers : repli\u00e9s par d\u00e9faut, s'ouvrent au clic (natif, sans JS de bascule)\n          (folders || []).forEach(function (folder) {\n            var details = document.createElement('details');\n            details.className = 'es-folder';\n\n            var summary = document.createElement('summary');\n            summary.className = 'es-folder__summary';\n            summary.innerHTML =\n              '<span class=\"es-folder__icon\">' +\n                '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M10 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-8l-2-2z\"\/><\/svg>' +\n              '<\/span>' +\n              '<span class=\"es-folder__name\"><\/span>' +\n              '<span class=\"es-folder__count\"><\/span>';\n            summary.querySelector('.es-folder__name').textContent = folder.nom;\n            summary.querySelector('.es-folder__count').textContent =\n              folder.files.length + (folder.files.length > 1 ? ' fichiers' : ' fichier');\n            details.appendChild(summary);\n\n            var body = document.createElement('div');\n            body.className = 'es-folder__body';\n            if (folder.files.length) {\n              folder.files.forEach(function (f) { body.appendChild(buildFileRow(f)); });\n            } else {\n              var empty = document.createElement('p');\n              empty.className = 'es-no-doc';\n              empty.textContent = 'Ce dossier est vide pour le moment.';\n              body.appendChild(empty);\n            }\n            details.appendChild(body);\n\n            filesList.appendChild(details);\n          });\n\n          \/\/ Fichiers libres (hors dossier), affich\u00e9s directement\n          (looseFiles || []).forEach(function (f) {\n            filesList.appendChild(buildFileRow(f));\n          });\n\n          filesSection.style.display = 'block';\n        }\n\n        function renderPrestations(prestations) {\n          var section = document.getElementById('es-prestations-section');\n          var list = document.getElementById('es-prestations-list');\n          if (!section || !list) return;\n          list.innerHTML = '';\n\n          if (!prestations || !prestations.length) {\n            section.style.display = 'none';\n            return;\n          }\n\n          prestations.forEach(function (p) {\n            var card = document.createElement('div');\n            var estCloture = !!p.date_fermeture;\n            card.className = 'es-prestation-card' + (estCloture ? ' cloture' : '');\n\n            var head = document.createElement('div');\n            head.className = 'es-prestation-card__head';\n            head.innerHTML =\n              '<span class=\"es-prestation-card__numero\"><\/span>' +\n              '<span class=\"es-prestation-card__statut\"><\/span>';\n            head.querySelector('.es-prestation-card__numero').textContent = 'N\u00b0 ' + p.numero_suivi;\n            var statutEl = head.querySelector('.es-prestation-card__statut');\n            statutEl.textContent = p.statut;\n            if (estCloture) statutEl.classList.add('cloture');\n            card.appendChild(head);\n\n            if (p.historique && p.historique.length) {\n              var ul = document.createElement('ul');\n              ul.className = 'es-prestation-histo';\n              p.historique.forEach(function (h) {\n                var li = document.createElement('li');\n                li.innerHTML = '<span><\/span>';\n                li.querySelector('span').textContent = h.date || '';\n                li.appendChild(document.createTextNode(h.texte || ''));\n                ul.appendChild(li);\n              });\n              card.appendChild(ul);\n            }\n\n            list.appendChild(card);\n          });\n\n          section.style.display = 'block';\n        }\n\n        function formatDateDisplay(dateStr) {\n          return dateStr; \/\/ d\u00e9j\u00e0 format\u00e9 c\u00f4t\u00e9 serveur\n        }\n\n        function renderResults(dossiers) {\n          listEl.innerHTML = '';\n          if (!dossiers || !dossiers.length) {\n            emptyEl.style.display = 'block';\n            return;\n          }\n          resultsWrap.style.display = 'block';\n          countEl.textContent = `${dossiers.length} dossier${dossiers.length > 1 ? 's' : ''} trouv\u00e9${dossiers.length > 1 ? 's' : ''}`;\n\n          dossiers.forEach((r) => {\n            const card = document.createElement('div');\n            card.className = 'es-result-card';\n\n            card.innerHTML = `\n              <div class=\"es-main\">\n                <div class=\"es-line\">\n                  <div class=\"es-cat\">${r.categorie}<\/div>\n                  <div class=\"es-status\">${r.statut}<\/div>\n                <\/div>\n                <div class=\"es-date\">Mis \u00e0 jour : ${formatDateDisplay(r.date_update)}<\/div>\n              <\/div>\n              <div class=\"es-actions-right\">\n                ${r.lien_dropbox ? `<a class=\"es-link\" href=\"${r.lien_dropbox}\" target=\"_blank\">Ouvrir<\/a>` : '<span class=\"es-no-doc\">Aucun document<\/span>'}\n              <\/div>`;\n            listEl.appendChild(card);\n          });\n        }\n\n        function goToStepTelephone() {\n          stepTelephone.style.display = 'block';\n          stepPassword.style.display = 'none';\n          stepIdentite.style.display = 'none';\n          hideError();\n        }\n\n        function goToStepPassword() {\n          stepTelephone.style.display = 'none';\n          stepPassword.style.display = 'block';\n          stepIdentite.style.display = 'none';\n          passwordLogin.value = '';\n          hideError();\n        }\n\n        function goToStepIdentite() {\n          stepTelephone.style.display = 'none';\n          stepPassword.style.display = 'none';\n          stepIdentite.style.display = 'block';\n          hideError();\n        }\n\n        function showCreationPanel(reset) {\n          forcedReset = !!reset;\n          creationTitle.textContent = reset ? 'R\u00e9initialisez votre mot de passe' : 'Cr\u00e9ez votre mot de passe';\n          creationSubtitle.textContent = reset\n            ? 'Choisissez un nouveau mot de passe pour vous reconnecter la prochaine fois.'\n            : 'La prochaine fois, connectez-vous directement avec votre num\u00e9ro et ce mot de passe.';\n          cardCreation.style.display = 'block';\n        }\n\n        \/\/ === Etape 1 : saisie t\u00e9l\u00e9phone -> v\u00e9rifie si un compte existe ===\n        btnContinuer.addEventListener('click', async () => {\n          hideError();\n          resetResultsUI();\n          const tel = telephoneInit.value.trim();\n          if (!tel || tel.length < 8) {\n            showError('Merci de saisir un num\u00e9ro de t\u00e9l\u00e9phone valide.');\n            return;\n          }\n          currentTelephone = tel;\n\n          showLoader(true);\n          btnContinuer.disabled = true;\n          try {\n            const body = new URLSearchParams();\n            body.append('action', 'es_check_compte');\n            body.append('_ajax_nonce', nonce);\n            body.append('telephone', currentTelephone);\n\n            const resp = await fetch(ajaxUrl, { method: 'POST', body });\n            const data = await resp.json();\n\n            if (!data.success) {\n              throw new Error(data.data || 'Une erreur est survenue.');\n            }\n\n            if (data.data.has_account) {\n              goToStepPassword();\n            } else {\n              goToStepIdentite();\n            }\n          } catch (err) {\n            showError(err.message);\n          } finally {\n            showLoader(false);\n            btnContinuer.disabled = false;\n          }\n        });\n\n        btnRetourTel.addEventListener('click', () => {\n          goToStepTelephone();\n        });\n\n        linkOublie.addEventListener('click', (e) => {\n          e.preventDefault();\n          goToStepIdentite();\n        });\n\n        \/\/ === Etape 2A : connexion par mot de passe ===\n        btnLogin.addEventListener('click', async () => {\n          hideError();\n          resetResultsUI();\n          const pass = passwordLogin.value;\n          if (!pass) {\n            showError('Merci de saisir votre mot de passe.');\n            return;\n          }\n\n          showLoader(true);\n          btnLogin.disabled = true;\n          try {\n            const body = new URLSearchParams();\n            body.append('action', 'es_login_password');\n            body.append('_ajax_nonce', nonce);\n            body.append('telephone', currentTelephone);\n            body.append('password', pass);\n\n            const resp = await fetch(ajaxUrl, { method: 'POST', body });\n            const data = await resp.json();\n\n            if (!data.success) {\n              throw new Error(data.data || 'Num\u00e9ro ou mot de passe incorrect.');\n            }\n\n            renderResults(data.data.dossiers);\n            renderFiles(data.data.folders, data.data.files);\n            renderPrestations(data.data.prestations);\n          } catch (err) {\n            showError(err.message);\n          } finally {\n            showLoader(false);\n            btnLogin.disabled = false;\n          }\n        });\n\n        \/\/ === Etape 2B : recherche par nom \/ pr\u00e9nom \/ t\u00e9l\u00e9phone (premi\u00e8re visite ou reset) ===\n        btnRechercher.addEventListener('click', async () => {\n          hideError();\n          resetResultsUI();\n          const nom = nomInput.value.trim();\n          const prenom = prenomInput.value.trim();\n\n          if (!nom || !prenom) {\n            showError('Merci de renseigner votre nom et votre pr\u00e9nom.');\n            return;\n          }\n          currentNom = nom;\n          currentPrenom = prenom;\n\n          showLoader(true);\n          btnRechercher.disabled = true;\n          try {\n            const body = new URLSearchParams();\n            body.append('action', 'es_rechercher_dossier');\n            body.append('_ajax_nonce', nonce);\n            body.append('nom', currentNom);\n            body.append('prenom', currentPrenom);\n            body.append('telephone', currentTelephone);\n\n            const resp = await fetch(ajaxUrl, { method: 'POST', body });\n            const data = await resp.json();\n\n            if (!data.success) {\n              throw new Error(data.data || 'Erreur lors de la recherche de votre dossier.');\n            }\n\n            renderResults(data.data.dossiers);\n            renderFiles(data.data.folders, data.data.files);\n            renderPrestations(data.data.prestations);\n\n            if (data.data.dossiers && data.data.dossiers.length) {\n              if (forcedReset || !data.data.account_exists) {\n                showCreationPanel(!!data.data.account_exists);\n              }\n            }\n          } catch (err) {\n            showError(err.message);\n          } finally {\n            showLoader(false);\n            btnRechercher.disabled = false;\n          }\n        });\n\n        \/\/ === Cr\u00e9ation \/ r\u00e9initialisation du mot de passe ===\n        btnCreerPassword.addEventListener('click', async () => {\n          passwordError.style.display = 'none';\n          passwordSuccess.style.display = 'none';\n\n          const pass = newPassword.value;\n          const passConfirm = newPasswordConfirm.value;\n\n          if (pass.length < 6) {\n            passwordError.textContent = 'Le mot de passe doit contenir au moins 6 caract\u00e8res.';\n            passwordError.style.display = 'block';\n            return;\n          }\n          if (pass !== passConfirm) {\n            passwordError.textContent = 'Les mots de passe ne correspondent pas.';\n            passwordError.style.display = 'block';\n            return;\n          }\n\n          btnCreerPassword.disabled = true;\n          try {\n            const body = new URLSearchParams();\n            body.append('action', 'es_creer_mot_de_passe');\n            body.append('_ajax_nonce', nonce);\n            body.append('nom', currentNom);\n            body.append('prenom', currentPrenom);\n            body.append('telephone', currentTelephone);\n            body.append('password', pass);\n            body.append('password_confirm', passConfirm);\n\n            const resp = await fetch(ajaxUrl, { method: 'POST', body });\n            const data = await resp.json();\n\n            if (!data.success) {\n              throw new Error(data.data || 'Impossible d\\'enregistrer le mot de passe.');\n            }\n\n            passwordSuccess.textContent = 'Votre mot de passe a \u00e9t\u00e9 enregistr\u00e9. La prochaine fois, connectez-vous directement avec votre num\u00e9ro de t\u00e9l\u00e9phone.';\n            passwordSuccess.style.display = 'block';\n            newPassword.value = '';\n            newPasswordConfirm.value = '';\n          } catch (err) {\n            passwordError.textContent = err.message;\n            passwordError.style.display = 'block';\n          } finally {\n            btnCreerPassword.disabled = false;\n          }\n        });\n\n      })();\n    <\/script>\n    \n","protected":false},"excerpt":{"rendered":"<p>Vos Exigences Font Notre Force VOS DOSSIERS EN TEMPS R\u00c9EL<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_glsr_average":0,"_glsr_ranking":0,"_glsr_reviews":0,"footnotes":""},"class_list":["post-2932","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/eliteservicesenegal.com\/index.php\/wp-json\/wp\/v2\/pages\/2932","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eliteservicesenegal.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/eliteservicesenegal.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/eliteservicesenegal.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eliteservicesenegal.com\/index.php\/wp-json\/wp\/v2\/comments?post=2932"}],"version-history":[{"count":77,"href":"https:\/\/eliteservicesenegal.com\/index.php\/wp-json\/wp\/v2\/pages\/2932\/revisions"}],"predecessor-version":[{"id":3632,"href":"https:\/\/eliteservicesenegal.com\/index.php\/wp-json\/wp\/v2\/pages\/2932\/revisions\/3632"}],"wp:attachment":[{"href":"https:\/\/eliteservicesenegal.com\/index.php\/wp-json\/wp\/v2\/media?parent=2932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}