{"id":10213,"date":"2025-06-30T17:11:53","date_gmt":"2025-06-30T16:11:53","guid":{"rendered":"https:\/\/demo.milkiya.ma\/?page_id=10213"},"modified":"2025-09-18T15:44:38","modified_gmt":"2025-09-18T14:44:38","slug":"estimer","status":"publish","type":"page","link":"https:\/\/demo.milkiya.ma\/fr_fr\/estimer\/","title":{"rendered":"Estimer"},"content":{"rendered":"<div class=\"vc_row wpb_row vc_row-fluid\" ><div class=\"wpb_column vc_column_container vc_col-sm-12\"><div class=\"vc_column-inner\"><div class=\"wpb_wrapper\"><div class=\"vc_empty_space\"   style=\"height: 75px\"><span class=\"vc_empty_space_inner\"><\/span><\/div><div class=\"mkdf-section-title-holder  mkdf-st-standard mkdf-st-title-center mkdf-st-normal-space \" style=\"text-align: center\">\n\t<div class=\"mkdf-st-inner\">\n\t\t\t\t\t<h1 class=\"mkdf-st-title\" style=\"color: #dd3334\">\n\t\t\t\tEstimez votre Bien gratuitement en 2 min\t\t\t<\/h1>\n\t\t\t\t\t<\/div>\n<\/div><div class=\"vc_empty_space\"   style=\"height: 75px\"><span class=\"vc_empty_space_inner\"><\/span><\/div>\n\t<div class=\"wpb_text_column wpb_content_element \" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t    <meta charset=\"UTF-8\">\n    <form id=\"milkiya-estimation-form\">\n        <!-- Header with progress bar -->\n        <div class=\"milkiya-header\">\n            <div class=\"milkiya-progress\">\n                <div class=\"milkiya-progress-step active\" data-step=\"1\">1<\/div>\n                <div class=\"milkiya-progress-step\" data-step=\"2\">2<\/div>\n                <div class=\"milkiya-progress-step\" data-step=\"3\">3<\/div>\n                <div class=\"milkiya-progress-step\" data-step=\"4\">4<\/div>\n            <\/div>\n        <\/div>\n\n        <!-- Step 1: Project Type -->\n        <div class=\"milkiya-step active\" id=\"milkiya-step-1\">\n            <div class=\"milkiya-chat\">\n                <div class=\"milkiya-avatar\"><i class=\"fa-solid fa-user\"><\/i><\/div>\n                <div class=\"milkiya-chat-bubble\">\n                    <h3>Quel est votre projet ?<\/h3>\n                    <p>Choisissez le type de projet immobilier que vous souhaitez r\u00e9aliser<\/p>\n                <\/div>\n            <\/div>\n            \n            <div class=\"milkiya-form-group\">\n                <div class=\"milkiya-property-types\">\n                    <div class=\"milkiya-property-type\" data-value=\"achat\">\n                        <div class=\"type-icon\">\ud83c\udfe0<\/div>\n                        <div class=\"type-label\">Vente<\/div>\n                    <\/div>\n                    <div class=\"milkiya-property-type\" data-value=\"location\">\n                        <div class=\"type-icon\">\ud83d\udccb<\/div>\n                        <div class=\"type-label\">Location <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"milkiya-button-container\">\n                <button type=\"button\" class=\"milkiya-button\" id=\"milkiya-next-step-1\" disabled>Continuer<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Step 2: Property Details -->\n        <div class=\"milkiya-step\" id=\"milkiya-step-2\">\n            <div class=\"milkiya-chat\">\n                <div class=\"milkiya-avatar\">\ud83c\udfe2<\/div>\n                <div class=\"milkiya-chat-bubble\">\n                    <h3>Votre bien<\/h3>\n                    <p>D\u00e9crivez les caract\u00e9ristiques de votre propri\u00e9t\u00e9<\/p>\n                <\/div>\n            <\/div>\n            \n            <div class=\"milkiya-form-columns\">\n                <div class=\"milkiya-form-group\">\n                    <label>Cat\u00e9gorie *<\/label>\n                    <select name=\"categorie\" class=\"milkiya-select\" required><\/select>\n                <\/div>\n\n                <div class=\"milkiya-form-group\">\n                    <label>Type de bien *<\/label>\n                    <select name=\"type\" class=\"milkiya-select\" required><\/select>\n                <\/div>\n\n                <div class=\"milkiya-form-group\">\n                    <label>Ville *<\/label>\n                    <select name=\"ville\" class=\"milkiya-select\" required><\/select>\n                <\/div>\n\n                <div class=\"milkiya-form-group\">\n                    <label>Quartier *<\/label>\n                    <select name=\"quartier\" class=\"milkiya-select\" required><\/select>\n                <\/div>\n\n                <div class=\"milkiya-form-group\">\n                    <label>Adresse exacte *<\/label>\n                    <div class=\"milkiya-address-input\">\n                        <input type=\"text\" name=\"adresse_bien\" placeholder=\"43 rue Bd Yacoub El Mansour, Casablanca\" required>\n                    <\/div>\n                <\/div>\n\n                <div class=\"milkiya-form-group\">\n                    <label>Surface habitable *<\/label>\n                    <input type=\"number\" name=\"surface\" min=\"1\" max=\"10000\" value=\"100\" placeholder=\"0\" required>\n                    <small style=\"color: #6b7280; font-size: 12px;\">en m\u00b2<\/small>\n                <\/div>\n            <\/div>\n\n            <div class=\"milkiya-additional-criteria\">\n                <h4>Pour une estimation plus pr\u00e9cise<\/h4>\n                <button type=\"button\" class=\"milkiya-criteria-toggle\" id=\"toggle-criteria\">\n                    Afficher les crit\u00e8res compl\u00e9mentaires\n                    <i class=\"fa-solid fa-sort-down\"><\/i>\n                <\/button>\n                <div id=\"additional-fields\" style=\"display: none; margin-top: 16px;\">\n                    <div class=\"milkiya-form-columns\">\n                        <div class=\"milkiya-form-group\" id=\"field-nb_chambres\">\n                            <label>Nombre de chambres<\/label>\n                            <input type=\"number\" name=\"nb_chambres\" min=\"0\" placeholder=\"0\" max=\"15\">\n                        <\/div>\n                        <div class=\"milkiya-form-group\" id=\"field-nb_pieces\">\n                            <label>Nombre de pi\u00e8ces<\/label>\n                            <input type=\"number\" name=\"nb_pieces\" min=\"0\" placeholder=\"0\" max=\"20\">\n                        <\/div>\n                        <div class=\"milkiya-form-group\" id=\"field-nb_etages\">\n                            <label>Nombre d'\u00e9tages<\/label>\n                            <input type=\"number\" name=\"nb_etages\" min=\"0\" placeholder=\"0\" max=\"50\">\n                        <\/div>\n                        <div class=\"milkiya-form-group\" id=\"field-nb_sdb\">\n                            <label>Nombre de salles de bain<\/label>\n                            <input type=\"number\" name=\"nb_sdb\" min=\"0\" placeholder=\"0\" max=\"10\">\n                        <\/div>\n                        <div class=\"milkiya-form-group\" id=\"field-nb_etage_batiment\">\n                            <label>Nombre d'\u00e9tages de b\u00e2timent<\/label>\n                            <input type=\"number\" name=\"nb_etage_batiment\" min=\"0\" placeholder=\"0\" max=\"50\">\n                        <\/div>\n                        <div class=\"milkiya-form-group\" id=\"villa-fields\">\n                            <label>Surface du terrain (m\u00b2)<\/label>\n                            <input type=\"number\" name=\"surface_terrain\" min=\"0\" placeholder=\"200\">\n                        <\/div>\n                        \n                        <div class=\"milkiya-form-group\" id=\"radio-fields\">\n                            <label>\u00c9quipements :<\/label>\n                            <div class=\"milkiya-radio-group\">\n                                <div class=\"milkiya-radio-option\" id=\"parking-field\">\n                                    <input type=\"checkbox\" name=\"parking\" value=\"oui\" id=\"parking-oui\">\n                                    <label for=\"parking-oui\">Parking<\/label>\n                                <\/div>\n                                <div class=\"milkiya-radio-option\" id=\"balcon-field\">\n                                    <input type=\"checkbox\" name=\"balcon\" value=\"oui\" id=\"balcon-oui\">\n                                    <label for=\"balcon-oui\">Balcon<\/label>\n                                <\/div>\n                                <div class=\"milkiya-radio-option\" id=\"terrasse-field\">\n                                    <input type=\"checkbox\" name=\"terrasse\" value=\"oui\" id=\"terrasse-oui\">\n                                    <label for=\"terrasse-oui\">Terrasse<\/label>\n                                <\/div>\n                                <div class=\"milkiya-radio-option\" id=\"ascenseur-field\">\n                                    <input type=\"checkbox\" name=\"ascenseur\" value=\"oui\" id=\"ascenseur-oui\">\n                                    <label for=\"ascenseur-oui\">Ascenseur<\/label>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"milkiya-button-container\">\n                <button type=\"button\" class=\"milkiya-button secondary\" id=\"milkiya-prev-step-2\">Retour<\/button>\n                <button type=\"button\" class=\"milkiya-button\" id=\"milkiya-next-step-2\">Continuer<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Step 3: Personal Information -->\n        <div class=\"milkiya-step\" id=\"milkiya-step-3\">\n            <div class=\"milkiya-chat\">\n                <div class=\"milkiya-avatar\">\ud83d\udcdd<\/div>\n                <div class=\"milkiya-chat-bubble\">\n                    <h3>Vos coordonn\u00e9es<\/h3>\n                    <p>Nous avons besoin de vos informations pour vous envoyer l'estimation<\/p>\n                <\/div>\n            <\/div>\n            \n            <div class=\"milkiya-form-group\">\n                <label>Pr\u00e9nom *<\/label>\n                <input type=\"text\" name=\"prenom\" placeholder=\"Votre pr\u00e9nom\" required>\n            <\/div>\n\n            <div class=\"milkiya-form-group\">\n                <label>Nom *<\/label>\n                <input type=\"text\" name=\"nom\" placeholder=\"Votre nom\" required>\n            <\/div>\n\n            <div class=\"milkiya-form-group\">\n                <label>Email *<\/label>\n                <input type=\"email\" name=\"email\" placeholder=\"votre@email.com\" required>\n            <\/div>\n\n            <div class=\"milkiya-form-group\">\n                <label>T\u00e9l\u00e9phone *<\/label>\n                <input type=\"tel\" name=\"telephone\" placeholder=\"+212 6 12 34 56 78\" required>\n            <\/div>\n\n            <div class=\"milkiya-form-group\">\n                <label>Adresse personnelle<\/label>\n                <input type=\"text\" name=\"adresse_perso\" placeholder=\"Votre adresse compl\u00e8te\">\n            <\/div>\n\n            <div class=\"milkiya-button-container\">\n                <button type=\"button\" class=\"milkiya-button secondary\" id=\"milkiya-prev-step-3\">Retour<\/button>\n                <button type=\"button\" class=\"milkiya-button\" id=\"milkiya-next-step-3\">Continuer<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Step 4: Confirmation -->\n        <div class=\"milkiya-step\" id=\"milkiya-step-4\">\n            <div class=\"milkiya-chat\">\n                <div class=\"milkiya-avatar\">\u2705<\/div>\n                <div class=\"milkiya-chat-bubble\">\n                    <h3>R\u00e9capitulatif<\/h3>\n                    <p>V\u00e9rifiez vos informations avant l'envoi<\/p>\n                <\/div>\n            <\/div>\n            \n            <div id=\"milkiya-summary\" style=\"background: #f8fafc; line-height: 30px; padding: 24px; border-radius: 16px; margin-bottom: 24px;\">\n                <!-- Summary will be populated by JavaScript -->\n            <\/div>\n\n            <div class=\"milkiya-button-container\">\n                <button type=\"button\" class=\"milkiya-button secondary\" id=\"milkiya-prev-step-4\">Retour<\/button>\n                <button type=\"submit\" class=\"milkiya-button\">Estimer mon bien<\/button>\n            <\/div>\n        <\/div>\n    <\/form>\n\n    <div id=\"milkiya-estimation-result\" style=\"display: none;\"><\/div>\n\n    <script>\n    const apiUrl = \"https:\/\/demo.milkiya.ma\/wp-admin\/admin-ajax.php?action=milkiya_estimation\";\n    const metadataUrl = \"https:\/\/demo.milkiya.ma\/wp-admin\/admin-ajax.php?action=milkiya_metadata\";\n    const quartiersUrl = \"https:\/\/demo.milkiya.ma\/wp-admin\/admin-ajax.php?action=milkiya_quartiers\";\n    \n    console.log('API URLs:', { apiUrl, metadataUrl, quartiersUrl });\n\n    \/**\n     * Property Type IDs from API:\n     * 0  = Terrain\n     * 1  = Maison\n     * 2  = Appartement\n     * 3  = Villa\n     * 4  = Bureau\n     * 5  = Riad\n     * 6  = Boutique\n     * 7  = Studio\n     * 8  = Immeuble\n     * 9  = Duplex\n     * 10 = Ferme\n     * 11 = Triplex\n     *\/\n\n    \/\/ Mapping des valeurs anglaises vers fran\u00e7ais\n    const typeTranslations = {\n        'apartment': 'Appartement',\n        'building': 'Immeuble',\n        'bungalow': 'Bungalow',\n        'bureau': 'Bureau',\n        'duplex': 'Duplex',\n        'farm': 'Ferme',\n        'house': 'Maison',\n        'land': 'Terrain',\n        'penthouse': 'Penthouse',\n        'riad': 'Riad',\n        'studio': 'Studio',\n        'triplex': 'Triplex',\n        'villa': 'Villa'\n    };\n\n    let currentStep = 1;\n    const totalSteps = 4;\n\n    \/\/ Initialize form\n    document.addEventListener('DOMContentLoaded', function() {\n        \/\/ Show loading state in dropdowns immediately\n        showLoadingInDropdowns();\n        \n        initializeForm();\n        setupEventListeners();\n        chargerMetadata();\n    });\n    \n    function showLoadingInDropdowns() {\n        \/\/ Add loading option to all dropdowns\n        const dropdowns = ['categorie', 'type', 'ville'];\n        dropdowns.forEach(name => {\n            const select = document.querySelector(`select[name=\"${name}\"]`);\n            if (select) {\n                select.innerHTML = '<option value=\"\" disabled selected>Chargement...<\/option>';\n                select.disabled = true; \/\/ Disable while loading\n            }\n        });\n        \n        \/\/ Also disable quartier dropdown\n        const quartierSelect = document.querySelector('select[name=\"quartier\"]');\n        if (quartierSelect) {\n            quartierSelect.innerHTML = '<option value=\"\" disabled selected>S\u00e9lectionner une ville d\\'abord<\/option>';\n            quartierSelect.disabled = true;\n        }\n    }\n\n    function initializeForm() {\n        \/\/ Set initial project type selection\n        const projectTypes = document.querySelectorAll('#milkiya-step-1 .milkiya-property-type');\n        projectTypes.forEach(type => {\n            type.addEventListener('click', function() {\n                projectTypes.forEach(t => t.classList.remove('selected'));\n                this.classList.add('selected');\n                document.getElementById('milkiya-next-step-1').disabled = false;\n            });\n        });\n\n        \/\/ Toggle additional criteria\n        document.getElementById('toggle-criteria').addEventListener('click', function() {\n            const fields = document.getElementById('additional-fields');\n            const span = this.querySelector('span');\n            if (fields.style.display === 'none') {\n                fields.style.display = 'block';\n                span.textContent = '\u25b2';\n            } else {\n                fields.style.display = 'none';\n                span.textContent = '\u25bc';\n            }\n        });\n\n        \/\/ Conditional display for fields based on property type\n        const typeSelect = document.querySelector('select[name=\"type\"]');\n        const villaFields = document.getElementById('villa-fields');\n        const ascenseurField = document.getElementById('ascenseur-field');\n        const radioFields = document.getElementById('radio-fields');\n        const nbEtages = document.getElementById('field-nb_etages');\n        const nbSdb = document.getElementById('field-nb_sdb');\n        const nbChambres = document.getElementById('field-nb_chambres');\n        const nbPieces = document.getElementById('field-nb_pieces');\n        const nbEtageBatiment = document.getElementById('field-nb_etage_batiment');\n\n        function setTerrainMode(isTerrain) {\n            if (villaFields) villaFields.style.display = isTerrain ? 'block' : 'none';\n            if (ascenseurField) ascenseurField.style.display = 'none';\n            if (radioFields) radioFields.style.display = isTerrain ? 'none' : 'block';\n            if (nbEtages) nbEtages.style.display = isTerrain ? 'none' : '';\n            if (nbSdb) nbSdb.style.display = isTerrain ? 'none' : '';\n            if (nbChambres) nbChambres.style.display = isTerrain ? 'none' : '';\n            if (nbPieces) nbPieces.style.display = isTerrain ? 'none' : '';\n            if (nbEtageBatiment) nbEtageBatiment.style.display = isTerrain ? 'none' : '';\n        }\n\n        function setLogicByType(typeId) {\n            \/\/ Convert to string for comparison\n            const id = String(typeId);\n            \n            \/\/ ID 0 = Terrain (special case - hide everything)\n            if (id === '0') {\n                setTerrainMode(true);\n                return;\n            } else {\n                setTerrainMode(false);\n            }\n            \n            \/\/ IDs that should show \"Surface du terrain\"\n            \/\/ 10=Ferme, 8=Immeuble, 1=Maison, 5=Riad, 3=Villa\n            const terrainTypes = ['10', '8', '1', '5', '3'];\n            \n            \/\/ IDs that should show \"Ascenseur\" \n            \/\/ 2=Appartement, 6=Boutique, 4=Bureau, 9=Duplex, 7=Studio, 11=Triplex, 8=Immeuble\n            const ascTypes = ['2', '6', '4', '9', '7', '11', '8'];\n            \n            \/\/ IDs that should show \"Parking\"\n            \/\/ All except Terrain (0)\n            const parkingTypes = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'];\n            \n            \/\/ IDs that should show \"Terrasse\"\n            \/\/ 2=Appartement, 9=Duplex, 1=Maison, 5=Riad, 7=Studio, 11=Triplex, 3=Villa\n            const terrasseTypes = ['2', '9', '1', '5', '7', '11', '3'];\n            \n            \/\/ IDs that should show \"Balcon\"\n            \/\/ 2=Appartement, 9=Duplex, 7=Studio, 11=Triplex\n            const balconTypes = ['2', '9', '7', '11'];\n\n            \/\/ Show\/hide Surface du terrain\n            if (villaFields) {\n                villaFields.style.display = terrainTypes.includes(id) ? 'block' : 'none';\n            }\n            \n            \/\/ Show\/hide Ascenseur\n            if (ascenseurField) {\n                ascenseurField.style.display = ascTypes.includes(id) ? 'flex' : 'none';\n            }\n            \n            \/\/ Show\/hide Parking\n            const parkingField = document.getElementById('parking-field');\n            if (parkingField) {\n                parkingField.style.display = parkingTypes.includes(id) ? 'flex' : 'none';\n            }\n            \n            \/\/ Show\/hide Terrasse\n            const terrasseField = document.getElementById('terrasse-field');\n            if (terrasseField) {\n                terrasseField.style.display = terrasseTypes.includes(id) ? 'flex' : 'none';\n            }\n            \n            \/\/ Show\/hide Balcon\n            const balconField = document.getElementById('balcon-field');\n            if (balconField) {\n                balconField.style.display = balconTypes.includes(id) ? 'flex' : 'none';\n            }\n        }\n\n        if(typeSelect) {\n            typeSelect.addEventListener('change', function() {\n                setLogicByType(this.value);\n            });\n            \/\/ Initial state\n            setLogicByType(typeSelect.value);\n        }\n\n        const villeSelect = document.querySelector('select[name=\"ville\"]');\n        if (villeSelect) {\n            villeSelect.addEventListener(\"change\", async (e) => {\n                await chargerQuartiers(e.target.value);\n            });\n        }\n    }\n\n    function setupEventListeners() {\n        \/\/ Next step buttons\n        document.getElementById('milkiya-next-step-1').addEventListener('click', () => {\n            if (validateStep(currentStep)) {\n                goToStep(2);\n            }\n        });\n        document.getElementById('milkiya-next-step-2').addEventListener('click', () => {\n            if (validateStep(currentStep)) {\n                goToStep(3);\n            }\n        });\n        document.getElementById('milkiya-next-step-3').addEventListener('click', () => {\n            if (validateStep(currentStep)) {\n                goToStep(4);\n            }\n        });\n\n        \/\/ Previous step buttons\n        document.getElementById('milkiya-prev-step-2').addEventListener('click', () => goToStep(1));\n        document.getElementById('milkiya-prev-step-3').addEventListener('click', () => goToStep(2));\n        document.getElementById('milkiya-prev-step-4').addEventListener('click', () => goToStep(3));\n\n        \/\/ Form submission\n        document.getElementById('milkiya-estimation-form').addEventListener('submit', handleSubmit);\n    }\n\n    function goToStep(step) {\n        if (step < 1 || step > totalSteps) return;\n        \n        \/\/ Validate current step before proceeding, but only if going forward\n        if (step > currentStep && !validateStep(currentStep)) {\n            return; \n        }\n        \n        \/\/ Hide current step\n        document.getElementById(`milkiya-step-${currentStep}`).classList.remove('active');\n        \n        \/\/ Show new step\n        document.getElementById(`milkiya-step-${step}`).classList.add('active');\n        \n        \/\/ Update progress\n        updateProgress(step);\n        \n        \/\/ Update current step\n        currentStep = step;\n\n        \/\/ If going to step 4, populate summary\n        if (step === 4) {\n            populateSummary();\n        }\n    }\n\n    function validateStep(step) {\n        const currentStepElement = document.getElementById(`milkiya-step-${step}`);\n        const requiredFields = currentStepElement.querySelectorAll('[required]');\n        const numberFields = currentStepElement.querySelectorAll('input[type=\"number\"]');\n\n        let isValid = true;\n        clearErrorMessages(currentStepElement); \/\/ Clear previous errors\n\n        requiredFields.forEach(field => {\n            if (!field.value.trim() || (field.tagName === 'SELECT' && field.value === '')) {\n                field.style.borderColor = '#ef4444';\n                displayErrorMessage(field, 'Ce champ est requis.');\n                isValid = false;\n            } else {\n                field.style.borderColor = '#e5e7eb';\n            }\n        });\n\n        numberFields.forEach(field => {\n            const maxValue = field.getAttribute('max');\n            if (maxValue && parseFloat(field.value) > parseFloat(maxValue)) {\n                field.style.borderColor = '#ef4444';\n                displayErrorMessage(field, `La valeur maximale est ${maxValue}.`);\n                isValid = false;\n            }\n        });\n\n        \/\/ Special validation for select fields in step 1 and 2\n        if (step === 1) {\n            const selectedProject = currentStepElement.querySelector('.milkiya-property-type.selected');\n            if (!selectedProject) {\n                const projectTypeContainer = currentStepElement.querySelector('.milkiya-property-types');\n                if (projectTypeContainer) {\n                    displayErrorMessage(projectTypeContainer, 'Veuillez s\u00e9lectionner un type de projet.');\n                }\n                isValid = false;\n            }\n        }\n\n        if (step === 2) {\n            const categorySelect = currentStepElement.querySelector('select[name=\"categorie\"]');\n            const typeSelect = currentStepElement.querySelector('select[name=\"type\"]');\n            const villeSelect = currentStepElement.querySelector('select[name=\"ville\"]');\n            const quartierSelect = currentStepElement.querySelector('select[name=\"quartier\"]');\n\n            if (categorySelect && !categorySelect.value) {\n                categorySelect.style.borderColor = '#ef4444';\n                displayErrorMessage(categorySelect, 'Veuillez s\u00e9lectionner une cat\u00e9gorie.');\n                isValid = false;\n            } else if (categorySelect) {\n                categorySelect.style.borderColor = '#e5e7eb';\n            }\n\n            if (typeSelect && !typeSelect.value) {\n                typeSelect.style.borderColor = '#ef4444';\n                displayErrorMessage(typeSelect, 'Veuillez s\u00e9lectionner un type de bien.');\n                isValid = false;\n            } else if (typeSelect) {\n                typeSelect.style.borderColor = '#e5e7eb';\n            }\n\n            if (villeSelect && !villeSelect.value) {\n                villeSelect.style.borderColor = '#ef4444';\n                displayErrorMessage(villeSelect, 'Veuillez s\u00e9lectionner une ville.');\n                isValid = false;\n            } else if (villeSelect) {\n                villeSelect.style.borderColor = '#e5e7eb';\n            }\n\n            if (quartierSelect && !quartierSelect.value) {\n                quartierSelect.style.borderColor = '#ef4444';\n                displayErrorMessage(quartierSelect, 'Veuillez s\u00e9lectionner un quartier.');\n                isValid = false;\n            } else if (quartierSelect) {\n                quartierSelect.style.borderColor = '#e5e7eb';\n            }\n        }\n\n        return isValid;\n    }\n\n    function updateProgress(step) {\n        const progressSteps = document.querySelectorAll('.milkiya-progress-step');\n        \n        progressSteps.forEach((progressStep, index) => {\n            const stepNumber = index + 1;\n            progressStep.classList.remove('active', 'completed');\n            \n            if (stepNumber === step) {\n                progressStep.classList.add('active');\n            } else if (stepNumber < step) {\n                progressStep.classList.add('completed');\n            }\n        });\n    }\n\n    function populateSummary() {\n        const form = document.getElementById('milkiya-estimation-form');\n        const summary = document.getElementById('milkiya-summary');\n        \n        \/\/ Get TEXT values for display (not IDs)\n        const project = form.querySelector('#milkiya-step-1 .milkiya-property-type.selected .type-label')?.textContent.trim() || '';\n        const category = form.querySelector('select[name=\"categorie\"] option:checked')?.textContent || '';\n        const type = form.querySelector('select[name=\"type\"] option:checked')?.textContent || '';\n        const ville = form.querySelector('select[name=\"ville\"]')?.value || '';\n        const quartier = form.querySelector('select[name=\"quartier\"]')?.value || '';\n        const address = form.querySelector('input[name=\"adresse_bien\"]').value;\n        const surface = form.querySelector('input[name=\"surface\"]').value;\n        const nb_chambres = form.querySelector('input[name=\"nb_chambres\"]').value;\n        const nb_pieces = form.querySelector('input[name=\"nb_pieces\"]').value;\n        const nb_etages = form.querySelector('input[name=\"nb_etages\"]').value;\n        const nb_sdb = form.querySelector('input[name=\"nb_sdb\"]').value;\n        const surface_terrain = form.querySelector('input[name=\"surface_terrain\"]').value;\n        const nb_etage_batiment = form.querySelector('input[name=\"nb_etage_batiment\"]').value;\n        const parking = form.querySelector('input[name=\"parking\"]:checked')?.value || 'non';\n        const balcon = form.querySelector('input[name=\"balcon\"]:checked')?.value || 'non';\n        const terrasse = form.querySelector('input[name=\"terrasse\"]:checked')?.value || 'non';\n        const ascenseur = form.querySelector('input[name=\"ascenseur\"]:checked')?.value || 'non';\n        const prenom = form.querySelector('input[name=\"prenom\"]').value;\n        const nom = form.querySelector('input[name=\"nom\"]').value;\n        const email = form.querySelector('input[name=\"email\"]').value;\n        const telephone = form.querySelector('input[name=\"telephone\"]').value;\n        const adresse_perso = form.querySelector('input[name=\"adresse_perso\"]').value;\n\n        \/\/ Clear existing content\n        summary.innerHTML = '';\n        \n        \/\/ Create container\n        const container = document.createElement('div');\n        container.style.cssText = 'display: grid; grid-template-columns: 1fr 1fr; gap: 16px;';\n        \n        \/\/ Create left column - display text values\n        const leftCol = document.createElement('div');\n        leftCol.innerHTML = '<h3>D\u00e9tails du bien<\/h3><strong>Projet:<\/strong> ' + project + '<br>' +\n                           '<strong>Cat\u00e9gorie:<\/strong> ' + category + '<br>' +\n                           '<strong>Type de bien:<\/strong> ' + type + '<br>' +\n                           '<strong>Ville:<\/strong> ' + ville + '<br>' +\n                           '<strong>Quartier:<\/strong> ' + quartier + '<br>' +\n                           '<strong>Adresse:<\/strong> ' + address + '<br>' +\n                           '<strong>Surface:<\/strong> ' + surface + ' m\u00b2';\n\n        if (nb_chambres) leftCol.innerHTML += '<br><strong>Chambres:<\/strong> ' + nb_chambres;\n        if (nb_pieces) leftCol.innerHTML += '<br><strong>Pi\u00e8ces:<\/strong> ' + nb_pieces;\n        if (nb_etages) leftCol.innerHTML += '<br><strong>\u00c9tages:<\/strong> ' + nb_etages;\n        if (nb_sdb) leftCol.innerHTML += '<br><strong>Salles de bain:<\/strong> ' + nb_sdb;\n        if (surface_terrain) leftCol.innerHTML += '<br><strong>Surface terrain:<\/strong> ' + surface_terrain + ' m\u00b2';\n        if (nb_etage_batiment) leftCol.innerHTML += '<br><strong>Nb \u00e9tage de batiment:<\/strong> ' + nb_etage_batiment;\n        if (parking === 'oui') leftCol.innerHTML += '<br><strong>Parking:<\/strong> Oui';\n        if (balcon === 'oui') leftCol.innerHTML += '<br><strong>Balcon:<\/strong> Oui';\n        if (terrasse === 'oui') leftCol.innerHTML += '<br><strong>Terrasse:<\/strong> Oui';\n        if (ascenseur === 'oui') leftCol.innerHTML += '<br><strong>Ascenseur:<\/strong> Oui';\n        \n        \/\/ Create right column\n        const rightCol = document.createElement('div');\n        rightCol.innerHTML = '<h3>Informations personnelles<\/h3><strong>Nom:<\/strong> ' + prenom + ' ' + nom + '<br>' +\n                            '<strong>Email:<\/strong> ' + email + '<br>' +\n                            '<strong>T\u00e9l\u00e9phone:<\/strong> ' + telephone + '<br>' +\n                            '<strong>Adresse personnelle:<\/strong> ' + adresse_perso;\n        \n        \/\/ Append columns to container\n        container.appendChild(leftCol);\n        container.appendChild(rightCol);\n        \n        \/\/ Append container to summary\n        summary.appendChild(container);\n    }\n\n    async function chargerMetadata() {\n        try {\n            const response = await fetch(metadataUrl);\n            const data = await response.json();\n            \n            console.log('Metadata received:', data);\n            \n            \/\/ Map field names to API response keys\n            const fieldMapping = {\n                'categorie': 'categories',\n                'type': 'types',\n                'ville': 'villes'\n            };\n            \n            \/\/ Process dropdowns for categorie, type, and ville\n            [\"categorie\", \"type\", \"ville\"].forEach(champ => {\n                const select = document.querySelector(`select[name=\"${champ}\"]`);\n                if (select) {\n                    select.innerHTML = \"\";\n                    const defaultOption = document.createElement(\"option\");\n                    defaultOption.value = \"\";\n                    defaultOption.innerHTML = `S\u00e9lectionner ${champ === 'type' ? 'un type de bien' : champ === 'categorie' ? 'une cat\u00e9gorie' : 'une ville'}`;\n                    defaultOption.disabled = true;\n                    defaultOption.selected = true;\n                    select.appendChild(defaultOption);\n                    \n                    const dataKey = fieldMapping[champ];\n                    if (data[dataKey] && Array.isArray(data[dataKey])) {\n                        data[dataKey].forEach(item => {\n                            const opt = document.createElement(\"option\");\n                            \/\/ APIs return objects with {id, name, code}\n                            if (typeof item === 'object' && item.name) {\n                                \/\/ For ville: use NAME as value (needed for neighborhoods API)\n                                \/\/ For categorie\/type: use ID as value\n                                if (champ === 'ville') {\n                                    opt.value = item.name;  \/\/ City NAME for API calls\n                                    opt.textContent = item.name;\n                                } else {\n                                    opt.value = item.id;    \/\/ ID for categorie and type\n                                    opt.textContent = item.name;\n                                }\n                            } else if (typeof item === 'string') {\n                                \/\/ Fallback for simple string responses\n                                opt.value = item;\n                                opt.textContent = item.charAt(0).toUpperCase() + item.slice(1);\n                            }\n                            select.appendChild(opt);\n                        });\n                    }\n                    \n                    \/\/ Re-enable dropdown after loading\n                    select.disabled = false;\n                }\n            });\n            \n            \/\/ Load transaction types (Vente\/Location) and update button data-values with IDs\n            if (data.transactions && Array.isArray(data.transactions)) {\n                const transactionButtons = document.querySelectorAll('.milkiya-property-type');\n                data.transactions.forEach(transaction => {\n                    if (transaction.name && transaction.id !== undefined) {\n                        \/\/ Find button by label text\n                        transactionButtons.forEach(button => {\n                            const label = button.querySelector('.type-label');\n                            if (label && label.textContent.trim() === transaction.name) {\n                                \/\/ Update data-value with ID from API\n                                button.setAttribute('data-value', transaction.id);\n                            }\n                        });\n                    }\n                });\n            }\n            \n            const villeSelect = document.querySelector('select[name=\"ville\"]');\n            if (villeSelect && villeSelect.value) await chargerQuartiers(villeSelect.value);\n\n            \/\/ Trigger change on type select to apply conditional logic\n            const typeSelect = document.querySelector('select[name=\"type\"]');\n            if (typeSelect && typeSelect.value) {\n                const event = new Event('change');\n                typeSelect.dispatchEvent(event);\n            }\n        } catch (error) {\n            console.error('Error loading metadata:', error);\n            \/\/ Show error in dropdowns\n            [\"categorie\", \"type\", \"ville\"].forEach(champ => {\n                const select = document.querySelector(`select[name=\"${champ}\"]`);\n                if (select) {\n                    select.innerHTML = '<option value=\"\" disabled selected>Erreur de chargement<\/option>';\n                    select.disabled = false;\n                }\n            });\n        }\n    }\n\n    async function chargerQuartiers(ville) {\n        const quartierSelect = document.querySelector('select[name=\"quartier\"]');\n        if (!quartierSelect) return;\n        \n        \/\/ Ensure city name starts with uppercase letter\n        const villeCapitalized = ville.charAt(0).toUpperCase() + ville.slice(1).toLowerCase();\n        \n        \/\/ Show loading state and disable\n        quartierSelect.innerHTML = \"<option value=\\\"\\\" disabled selected>Chargement...<\/option>\";\n        quartierSelect.disabled = true;\n        \n        try {\n            const response = await fetch(quartiersUrl + \"&ville=\" + encodeURIComponent(villeCapitalized));\n            const json = await response.json();\n            \n            console.log('Quartiers response:', json);\n            \n            \/\/ Handle different response structures\n            let quartiers = [];\n            if (json.success && json.data && json.data.quartiers) {\n                quartiers = json.data.quartiers;\n            } else if (json.data && Array.isArray(json.data)) {\n                quartiers = json.data;\n            } else if (Array.isArray(json)) {\n                quartiers = json;\n            } else if (json.quartiers) {\n                quartiers = json.quartiers;\n            }\n            \n            quartierSelect.innerHTML = \"\";\n            const defaultOption = document.createElement(\"option\");\n            defaultOption.value = \"\";\n            defaultOption.innerHTML = \"S\u00e9lectionner un quartier\";\n            defaultOption.disabled = true;\n            defaultOption.selected = true;\n            quartierSelect.appendChild(defaultOption);\n            \n            quartiers.forEach(q => {\n                const opt = document.createElement(\"option\");\n                \/\/ Handle if q is an object or string\n                const value = typeof q === 'object' ? (q.value || q.name || q.id) : q;\n                const label = typeof q === 'object' ? (q.label || q.name || q.value) : q;\n                \n                opt.value = value;\n                opt.textContent = typeof label === 'string' ? label.charAt(0).toUpperCase() + label.slice(1) : label;\n                quartierSelect.appendChild(opt);\n            });\n            \n            \/\/ Re-enable quartier dropdown after loading\n            quartierSelect.disabled = false;\n        } catch (err) {\n            quartierSelect.innerHTML = \"<option value=\\\"\\\" disabled selected>Erreur chargement<\/option>\";\n            \/\/ Re-enable even on error so user can see the error message\n            quartierSelect.disabled = false;\n            console.error('Error loading quartiers:', err);\n        }\n    }\n\n    function handleSubmit(e) {\n        e.preventDefault();\n        \n        if (!validateStep(currentStep)) return;\n\n        const form = e.target;\n        const formData = new FormData(form);\n        \n        \/\/ Get selected values from custom selectors (IDs)\n        const projectId = form.querySelector('#milkiya-step-1 .milkiya-property-type.selected')?.dataset.value || '';\n        const categoryId = form.querySelector('select[name=\"categorie\"]')?.value || '';\n        const typeId = form.querySelector('select[name=\"type\"]')?.value || '';\n        const ville = form.querySelector('select[name=\"ville\"]')?.value || '';\n        const quartier = form.querySelector('select[name=\"quartier\"]')?.value || '';\n\n        \/\/ Get TEXT values (names) for email and database\n        const projectText = form.querySelector('#milkiya-step-1 .milkiya-property-type.selected .type-label')?.textContent.trim() || '';\n        const categoryText = form.querySelector('select[name=\"categorie\"] option:checked')?.textContent || '';\n        const typeText = form.querySelector('select[name=\"type\"] option:checked')?.textContent || '';\n\n        \/\/ Prepare data for API\n        const data = {\n            projet: projectId,              \/\/ ID for API\n            projet_text: projectText,       \/\/ Text for email\/database\n            categorie: categoryId,          \/\/ ID for API\n            categorie_text: categoryText,   \/\/ Text for email\/database\n            type: typeId,                   \/\/ ID for API\n            type_text: typeText,            \/\/ Text for email\/database\n            ville: ville,\n            quartier: quartier,\n            adresse_bien: formData.get('adresse_bien'),\n            surface: parseFloat(formData.get('surface')),\n            prenom: formData.get('prenom'),\n            nom: formData.get('nom'),\n            email: formData.get('email'),\n            telephone: formData.get('telephone'),\n            adresse_perso: formData.get('adresse_perso'),\n            \/\/ Additional fields\n            nb_chambres: formData.get('nb_chambres') || '',\n            nb_pieces: formData.get('nb_pieces') || '',\n            parking: formData.get('parking') || 'non',\n            balcon: formData.get('balcon') || 'non',\n            terrasse: formData.get('terrasse') || 'non',\n            ascenseur: formData.get('ascenseur') || 'non',\n            surface_terrain: formData.get('surface_terrain') || '',\n            nb_etages: formData.get('nb_etages') || '',\n            nb_sdb: formData.get('nb_sdb') || '',\n            nb_etage_batiment: formData.get('nb_etage_batiment') || ''\n        };\n\n        \/\/ Show loading state\n        const submitButton = form.querySelector('button[type=\"submit\"]');\n        const originalText = submitButton.textContent;\n        submitButton.textContent = 'Estimation en cours...';\n        submitButton.disabled = true;\n\n        \/\/ Send to API\n        console.log('Sending data to API:', data);\n        \n        fetch(apiUrl, {\n            method: \"POST\",\n            headers: {\"Content-Type\": \"application\/json\"},\n            body: JSON.stringify(data)\n        })\n        .then(r => {\n            console.log('API Response status:', r.status);\n            return r.json();\n        })\n        .then(result => {\n            console.log('API Response:', result);\n            if (result.success && result.data && result.data.prix_estime) {\n                \/\/ Send extra data to admin\n                fetch(apiUrl + \"&extra_admin=1\", {\n                    method: \"POST\",\n                    headers: {\"Content-Type\": \"application\/json\"},\n                    body: JSON.stringify({\n                        ...data,\n                        prix_estime: result.data.prix_estime\n                    })\n                });\n\n                \/\/ Show success message\n                const resultDiv = document.getElementById('milkiya-estimation-result');\n                resultDiv.innerHTML = '';\n                \n                \/\/ Create chat container\n                const chatDiv = document.createElement('div');\n                chatDiv.className = 'milkiya-chat';\n                \n                \/\/ Create avatar\n                const avatar = document.createElement('div');\n                avatar.className = 'milkiya-avatar';\n                \n                \/\/ Create chat bubble\n                const bubble = document.createElement('div');\n                bubble.className = 'milkiya-chat-bubble';\n                \n                const title = document.createElement('h3');\n                title.innerHTML = 'Estimation termin\u00e9e !';\n                \n                const message = document.createElement('p');\n                message.classList.add('success-message');\n                message.innerHTML = `Merci ! Votre estimation a \u00e9t\u00e9 envoy\u00e9e.`;\n                \n                bubble.appendChild(title);\n                bubble.appendChild(message);\n                chatDiv.appendChild(avatar);\n                chatDiv.appendChild(bubble);\n                resultDiv.appendChild(chatDiv);\n                resultDiv.style.display = 'block';\n                resultDiv.scrollIntoView({ behavior: 'smooth' });\n\n                \/\/ Reset form and go to step 1\n                setTimeout(() => {\n                    form.reset();\n                    goToStep(1);\n                    resultDiv.style.display = 'none';\n                }, 5000);\n            } else {\n                throw new Error(\"Erreur lors de l'estimation\");\n            }\n        })\n        .catch(error => {\n            console.error('Error during estimation:', error);\n            \n            const resultDiv = document.getElementById('milkiya-estimation-result');\n            resultDiv.innerHTML = '';\n            \n            \/\/ Create chat container\n            const chatDiv = document.createElement('div');\n            chatDiv.className = 'milkiya-chat';\n            \n            \/\/ Create avatar\n            const avatar = document.createElement('div');\n            avatar.className = 'milkiya-avatar';\n            avatar.textContent = '\u274c';\n            \n            \/\/ Create chat bubble\n            const bubble = document.createElement('div');\n            bubble.className = 'milkiya-chat-bubble';\n            \n            const title = document.createElement('h3');\n            title.textContent = 'Erreur';\n            \n            const message = document.createElement('div');\n            message.innerHTML = '<p><strong>Erreur lors de l\\'estimation:<\/strong><\/p>' +\n                              '<p>' + (error.message || 'Une erreur inattendue s\\'est produite') + '<\/p>' +\n                              '<p style=\"font-size: 12px; color: #666; margin-top: 10px;\">V\u00e9rifiez la console pour plus de d\u00e9tails.<\/p>';\n            \n            bubble.appendChild(title);\n            bubble.appendChild(message);\n            chatDiv.appendChild(avatar);\n            chatDiv.appendChild(bubble);\n            resultDiv.appendChild(chatDiv);\n            \n            resultDiv.style.display = 'block';\n            resultDiv.classList.add('error');\n        })\n        .finally(() => {\n            submitButton.textContent = originalText;\n            submitButton.disabled = false;\n        });\n    }\n\n    \/\/ Helper function for number formatting (missing in original file, but used in dev.php logic)\n    function number_format(number, decimals, dec_point, thousands_sep) {\n        number = (number + '').replace(\/[^0-9+\\-Ee.]\/g, '');\n        var n = !isFinite(+number) ? 0 : +number,\n            prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n            sep = (typeof thousands_sep === 'undefined') ? ',': thousands_sep,\n            dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n            s = '',\n            toFixedFix = function (n, prec) {\n                var k = Math.pow(10, prec);\n                return ''+(Math.round(n * k) \/ k).toFixed(prec);\n            };\n\n        s = (prec ? toFixedFix(n, prec) : ''+Math.round(n)).split('.');\n        if (s[0].length > 3) {\n            s[0] = s[0].replace(\/\\B(?=(?:\\d{3})+(?!\\d))\/g, sep);\n        }\n        if ((s[1] || '').length < prec) {\n            s[1] = s[1] || '';\n            s[1] += new Array(prec - s[1].length + 1).join('0');\n        }\n        return s.join(dec);\n    }\n\n    \/\/ Helper function to display error messages under inputs\n    function displayErrorMessage(inputElement, message) {\n        let errorElement = inputElement.nextElementSibling;\n        if (errorElement && errorElement.classList.contains('milkiya-error-message')) {\n            errorElement.innerHTML = message;\n        } else {\n            errorElement = document.createElement('span');\n            errorElement.classList.add('milkiya-error-message');\n            errorElement.innerHTML = message;\n            inputElement.parentNode.insertBefore(errorElement, inputElement.nextElementSibling);\n        }\n    }\n\n    function clearErrorMessages(parentElement) {\n        parentElement.querySelectorAll('.milkiya-error-message').forEach(el => el.remove());\n        parentElement.querySelectorAll('.milkiya-form-group input, .milkiya-form-group select').forEach(field => {\n            field.style.borderColor = '#e5e7eb';\n        });\n    }\n\n    <\/script>\n\n\n\t\t<\/div>\n\t<\/div>\n<div class=\"vc_empty_space\"   style=\"height: 75px\"><span class=\"vc_empty_space_inner\"><\/span><\/div><div class=\"mkdf-section-title-holder  mkdf-st-standard mkdf-st-title-center mkdf-st-normal-space \" style=\"text-align: center\">\n\t<div class=\"mkdf-st-inner\">\n\t\t\t\t\t<h2 class=\"mkdf-st-title\" style=\"color: #dd3334\">\n\t\t\t\tTrouver un Agent Mandataire Immobilier Milkiya\t\t\t<\/h2>\n\t\t\t\t\t\t\t<p class=\"mkdf-st-text\" >\n\t\t\t\tLes AMIs Milkiya sont disponibles pour r\u00e9pondre \u00e0 toutes vos demandes immobili\u00e8res. Que vous soyez propri\u00e9taire, futur acqu\u00e9reur, en recherche de bien r\u00e9sidentiel ou commercial, un conseiller est l\u00e0 pour vous.\t\t\t<\/p>\n\t\t\t<\/div>\n<\/div><div class=\"vc_empty_space\"   style=\"height: 75px\"><span class=\"vc_empty_space_inner\"><\/span><\/div><div class=\"vc_row wpb_row vc_inner vc_row-fluid btn-estimer vc_row-o-content-middle vc_row-flex\" ><div class=\"wpb_column vc_column_container vc_col-sm-12\"><div class=\"vc_column-inner\"><div class=\"wpb_wrapper\"><a itemprop=\"url\" href=\"\/trouver-un-conseiller-milkiya\/\" target=\"_self\" style=\"color: #ffffff;background-color: #dd3334\" class=\"mkdf-btn mkdf-btn-large mkdf-btn-solid mkdf-btn-custom-hover-bg mkdf-btn-custom-hover-color\" data-hover-color=\"#ffffff\" data-hover-bg-color=\"#e37879\" >\n    <span class=\"mkdf-btn-text\">Trouver un AMI<\/span>\n    <\/a><a itemprop=\"url\" href=\"\/contactez-milkiya\/\" target=\"_self\" style=\"color: #ffffff;background-color: #e37879\" class=\"mkdf-btn mkdf-btn-large mkdf-btn-solid mkdf-btn-custom-hover-bg mkdf-btn-custom-hover-color\" data-hover-color=\"#ffffff\" data-hover-bg-color=\"#dd3334\" >\n    <span class=\"mkdf-btn-text\">Contacter Milkiya<\/span>\n    <\/a><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"Estimez votre Bien gratuitement en 2 min 1 2 3 4 Quel est votre projet ? Choisissez le type de projet immobilier que vous souhaitez r\u00e9aliser \ud83c\udfe0 Vente \ud83d\udccb Location Continuer \ud83c\udfe2 Votre bien D\u00e9crivez les caract\u00e9ristiques de votre propri\u00e9t\u00e9 Cat\u00e9gorie * Type de bien [...]","protected":false},"author":52,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_lmt_disableupdate":"no","_lmt_disable":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-10213","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Estimer - Milkiya<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/demo.milkiya.ma\/fr_fr\/estimer\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Estimer - Milkiya\" \/>\n<meta property=\"og:url\" content=\"https:\/\/demo.milkiya.ma\/fr_fr\/estimer\/\" \/>\n<meta property=\"og:site_name\" content=\"Milkiya\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/MILKIYA.officiel\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-18T14:44:38+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@Milkiya22\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/demo.milkiya.ma\/estimer\/\",\"url\":\"https:\/\/demo.milkiya.ma\/estimer\/\",\"name\":\"Estimer - Milkiya\",\"isPartOf\":{\"@id\":\"https:\/\/demo.milkiya.ma\/fr_fr\/#website\"},\"datePublished\":\"2025-06-30T16:11:53+00:00\",\"dateModified\":\"2025-09-18T14:44:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/demo.milkiya.ma\/estimer\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/demo.milkiya.ma\/estimer\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/demo.milkiya.ma\/estimer\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/demo.milkiya.ma\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Estimer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/demo.milkiya.ma\/fr_fr\/#website\",\"url\":\"https:\/\/demo.milkiya.ma\/fr_fr\/\",\"name\":\"Milkiya\",\"description\":\"Premier r\u00e9seau de mandataires immobilier au Maroc\",\"publisher\":{\"@id\":\"https:\/\/demo.milkiya.ma\/fr_fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/demo.milkiya.ma\/fr_fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/demo.milkiya.ma\/fr_fr\/#organization\",\"name\":\"MILKIYA\",\"url\":\"https:\/\/demo.milkiya.ma\/fr_fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/demo.milkiya.ma\/fr_fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.milkiya.ma\/wp-content\/uploads\/2022\/08\/logo-milkiya-wrb.webp\",\"contentUrl\":\"https:\/\/www.milkiya.ma\/wp-content\/uploads\/2022\/08\/logo-milkiya-wrb.webp\",\"width\":1440,\"height\":675,\"caption\":\"MILKIYA\"},\"image\":{\"@id\":\"https:\/\/demo.milkiya.ma\/fr_fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/MILKIYA.officiel\/\",\"https:\/\/x.com\/Milkiya22\",\"https:\/\/www.instagram.com\/milkiya.officiel\/\",\"https:\/\/www.linkedin.com\/company\/milkiya\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Estimer - Milkiya","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/demo.milkiya.ma\/fr_fr\/estimer\/","og_locale":"fr_FR","og_type":"article","og_title":"Estimer - Milkiya","og_url":"https:\/\/demo.milkiya.ma\/fr_fr\/estimer\/","og_site_name":"Milkiya","article_publisher":"https:\/\/www.facebook.com\/MILKIYA.officiel\/","article_modified_time":"2025-09-18T14:44:38+00:00","twitter_card":"summary_large_image","twitter_site":"@Milkiya22","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/demo.milkiya.ma\/estimer\/","url":"https:\/\/demo.milkiya.ma\/estimer\/","name":"Estimer - Milkiya","isPartOf":{"@id":"https:\/\/demo.milkiya.ma\/fr_fr\/#website"},"datePublished":"2025-06-30T16:11:53+00:00","dateModified":"2025-09-18T14:44:38+00:00","breadcrumb":{"@id":"https:\/\/demo.milkiya.ma\/estimer\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/demo.milkiya.ma\/estimer\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/demo.milkiya.ma\/estimer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/demo.milkiya.ma\/"},{"@type":"ListItem","position":2,"name":"Estimer"}]},{"@type":"WebSite","@id":"https:\/\/demo.milkiya.ma\/fr_fr\/#website","url":"https:\/\/demo.milkiya.ma\/fr_fr\/","name":"Milkiya","description":"Premier r\u00e9seau de mandataires immobilier au Maroc","publisher":{"@id":"https:\/\/demo.milkiya.ma\/fr_fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/demo.milkiya.ma\/fr_fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/demo.milkiya.ma\/fr_fr\/#organization","name":"MILKIYA","url":"https:\/\/demo.milkiya.ma\/fr_fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/demo.milkiya.ma\/fr_fr\/#\/schema\/logo\/image\/","url":"https:\/\/www.milkiya.ma\/wp-content\/uploads\/2022\/08\/logo-milkiya-wrb.webp","contentUrl":"https:\/\/www.milkiya.ma\/wp-content\/uploads\/2022\/08\/logo-milkiya-wrb.webp","width":1440,"height":675,"caption":"MILKIYA"},"image":{"@id":"https:\/\/demo.milkiya.ma\/fr_fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/MILKIYA.officiel\/","https:\/\/x.com\/Milkiya22","https:\/\/www.instagram.com\/milkiya.officiel\/","https:\/\/www.linkedin.com\/company\/milkiya\/"]}]}},"_links":{"self":[{"href":"https:\/\/demo.milkiya.ma\/fr_fr\/wp-json\/wp\/v2\/pages\/10213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.milkiya.ma\/fr_fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/demo.milkiya.ma\/fr_fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/demo.milkiya.ma\/fr_fr\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.milkiya.ma\/fr_fr\/wp-json\/wp\/v2\/comments?post=10213"}],"version-history":[{"count":10,"href":"https:\/\/demo.milkiya.ma\/fr_fr\/wp-json\/wp\/v2\/pages\/10213\/revisions"}],"predecessor-version":[{"id":10231,"href":"https:\/\/demo.milkiya.ma\/fr_fr\/wp-json\/wp\/v2\/pages\/10213\/revisions\/10231"}],"wp:attachment":[{"href":"https:\/\/demo.milkiya.ma\/fr_fr\/wp-json\/wp\/v2\/media?parent=10213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}