{"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\/en\/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\">Terrace<\/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\">Elevator<\/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    <input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/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\tFind a Milkiya Real Estate Agent\t\t\t<\/h2>\n\t\t\t\t\t\t\t<p class=\"mkdf-st-text\" >\n\t\t\t\tMilkiya agents are available to respond to all your real estate requests. Whether you are an owner, a future buyer, looking for residential or commercial property, an advisor is there for you.\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\">Find a Real Estate Agent<\/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\">Contact Milkiya<\/span>\n    <\/a><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>","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\/en\/estimer\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\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\/en\/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=\"Estimated reading time\" \/>\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\":\"en-GB\",\"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\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/demo.milkiya.ma\/fr_fr\/#organization\",\"name\":\"MILKIYA\",\"url\":\"https:\/\/demo.milkiya.ma\/fr_fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@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\/en\/estimer\/","og_locale":"en_GB","og_type":"article","og_title":"Estimer - Milkiya","og_url":"https:\/\/demo.milkiya.ma\/en\/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":{"Estimated reading time":"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":"en-GB","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":"en-GB"},{"@type":"Organization","@id":"https:\/\/demo.milkiya.ma\/fr_fr\/#organization","name":"MILKIYA","url":"https:\/\/demo.milkiya.ma\/fr_fr\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@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\/en\/wp-json\/wp\/v2\/pages\/10213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.milkiya.ma\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/demo.milkiya.ma\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/demo.milkiya.ma\/en\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.milkiya.ma\/en\/wp-json\/wp\/v2\/comments?post=10213"}],"version-history":[{"count":10,"href":"https:\/\/demo.milkiya.ma\/en\/wp-json\/wp\/v2\/pages\/10213\/revisions"}],"predecessor-version":[{"id":10231,"href":"https:\/\/demo.milkiya.ma\/en\/wp-json\/wp\/v2\/pages\/10213\/revisions\/10231"}],"wp:attachment":[{"href":"https:\/\/demo.milkiya.ma\/en\/wp-json\/wp\/v2\/media?parent=10213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}