{"id":22401,"date":"2025-07-15T10:08:07","date_gmt":"2025-07-15T10:08:07","guid":{"rendered":"https:\/\/www.synetis.com\/career\/our-job-offers\/"},"modified":"2026-05-11T12:01:52","modified_gmt":"2026-05-11T12:01:52","slug":"our-job-offers","status":"publish","type":"page","link":"https:\/\/www.synetis.com\/en\/career\/our-job-offers\/","title":{"rendered":"Our job offers"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"22401\" class=\"elementor elementor-22401 elementor-833\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9ca223c e-flex e-con-boxed e-con e-parent\" data-id=\"9ca223c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0d62d7a elementor-invisible elementor-widget elementor-widget-shortcode\" data-id=\"0d62d7a\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:400}\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.synetis.com\/en\/\" title=\"Accueil\">Accueil<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u203a<\/span><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.synetis.com\/en\/career\/\" title=\"Career\">Career<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u203a<\/span><span class=\"aioseo-breadcrumb\">\n\tOur job offers\n<\/span><\/div><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b596dc3 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"b596dc3\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:400}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Career opportunities<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-17259a7 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"17259a7\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:400}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">Are you looking for a stimulating job where you can develop your skills and contribute to exciting projects?  <br><br>Discover our career opportunities.<\/div>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b3292e7 e-flex e-con-boxed e-con e-parent\" data-id=\"b3292e7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8902f28 elementor-widget elementor-widget-spacer\" data-id=\"8902f28\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2477d1 elementor-widget elementor-widget-heading\" data-id=\"f2477d1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Our vacancies<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cce4a1e elementor-widget elementor-widget-text-editor\" data-id=\"cce4a1e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>We have developed a specific recruitment policy to identify <strong>young talent<\/strong> and <strong>expert profiles<\/strong> in our business sectors. We are constantly recruiting new staff in our<strong> Paris and Rennes branches<\/strong>. <\/p><p>Our recruitment specialists are on hand to understand your <strong>professional aspirations<\/strong>, identify your skills and help you define your <strong>career objectives<\/strong>.<\/p><p>Our ambition is to work with you to build your ambitious <strong>professional project<\/strong> by offering you new perspectives and stimulating challenges to help you evolve at the <strong>heart of cyber<\/strong>!<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0360c43 e-flex e-con-boxed e-con e-parent\" data-id=\"0360c43\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-253fc14 elementor-widget elementor-widget-html\" data-id=\"253fc14\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- Styles \u00e0 appliquer pour la page -->\r\n<style>\r\n\/* D\u00e9finitions des variables *\/\r\n:root {\r\n    --text-dark: #2d3748;\r\n    --text-light: #718096;\r\n    --text-result: #4a5568;\r\n    --text-separator: #cbd5e0;\r\n    --synetis-red: #E2001A;\r\n    --bg-page: #ffffff; \r\n    --bg-card: #f5f5f7; \r\n    --bg-qrcode: #ffffff; \r\n    --bg-select: #f0f0f2; \r\n    --radius: 16px;        \r\n    --shadow-out: 4px 4px 10px rgba(163, 177, 198, 0.4), -4px -4px 10px rgba(255, 255, 255, 0.9);\r\n    --shadow-in: inset 2px 2px 5px rgba(163, 177, 198, 0.3), inset -2px -2px 5px rgba(255, 255, 255, 0.8);\r\n    --shadow-hover: 6px 6px 15px rgba(163, 177, 198, 0.5), -6px -6px 15px rgba(255, 255, 255, 1);\r\n}\r\n\r\n\/* Style general du bloc d'affichage *\/\r\n#synetis-careers {\r\n    font-family: \"Segoe UI\", Roboto, sans-serif;\r\n    max-width: 1200px;\r\n    margin: 40px auto;\r\n    color: var(--text-dark);\r\n}\r\n\r\n\/* Style pour le nombre de r\u00e9sultats *\/\r\n.job-stats { font-size: 0.6rem; font-weight: 600; color: var(--text-light); text-transform: uppercase; margin-bottom: 20px; padding-left: 10px;}\r\n.job-stats span { color: var(--text-result); font-weight: 800; }\r\n\r\n\/* Style de la barre contenant les filtres *\/\r\n.filter-bar {\r\n    background-color: var(--bg-card);\r\n    padding: 25px;\r\n    border-radius: var(--radius);\r\n    box-shadow: var(--shadow-out);\r\n    margin-bottom: 40px;\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 15px;\r\n}\r\n\r\n\/* Style du champ de recherche en texte libre *\/\r\n#search-input {\r\n    flex: 1.5;\r\n    min-width: 250px;\r\n    padding: 14px 20px;\r\n    border: none;\r\n    border-radius: var(--radius);\r\n    background-color: var(--bg-card);\r\n    box-shadow: var(--shadow-in);\r\n    font-size: 0.7rem;\r\n    color: var(--text-dark);\r\n}\r\n\r\n#search-input:focus { outline: none; }\r\n\r\n\/* Style pour le conteneur des menus d\u00e9roulants des filtres *\/\r\n.select-group { flex: 3; display: flex; gap: 10px; }\r\n.custom-select { position: relative; flex: 1; min-width: 140px; }\r\n\r\n\/* Style pour les menus d\u00e9roulant des filtres *\/\r\n.select-trigger {\r\n    padding: 14px 20px;\r\n    background-color: var(--bg-card);\r\n    border-radius: var(--radius);\r\n    box-shadow: var(--shadow-out);\r\n    cursor: pointer;\r\n    font-size: 0.7rem;\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n}\r\n.select-trigger:after {\r\n    content: \"\";\r\n    border: solid var(--text-light);\r\n    border-width: 0 1.5px 1.5px 0;\r\n    display: inline-block;\r\n    padding: 3px;\r\n    transform: rotate(45deg);\r\n    margin-left: 10px;\r\n    flex-shrink: 0;\r\n}\r\n.custom-options {\r\n    position: absolute;\r\n    top: 110%;\r\n    left: 0;\r\n    right: 0;\r\n    background: var(--bg-page);\r\n    border-radius: var(--radius);\r\n    box-shadow: 0 10px 25px rgba(0,0,0,0.1);\r\n    z-index: 100;\r\n    display: none;\r\n    max-height: 250px;\r\n    overflow-y: auto;\r\n    padding: 10px;\r\n}\r\n.custom-options.show { display: block; }\r\n\r\n\/* Style pour les \u00e9l\u00e9ments des menus d\u00e9roulant des filtres *\/\r\n.option-item {\r\n    padding: 12px 18px;\r\n    cursor: pointer;\r\n    border-radius: 10px;\r\n    transition: background 0.2s;\r\n    font-size: 0.7rem;\r\n}\r\n.option-item:hover { background-color: var(--bg-select); color: var(--text-dark); }\r\n\r\n\/* Style pour le conteneur de la liste des opportunit\u00e9s *\/\r\n.job-list-container { \r\n    display: grid; \r\n    grid-template-columns: 1fr 1fr; \r\n    gap: 25px; \r\n}\r\n\r\n\/* Style pour le conteneur d'une opportunit\u00e9 *\/\r\n.job-card {\r\n    background-color: var(--bg-card);\r\n    border-radius: var(--radius);\r\n    padding: 25px;\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    box-shadow: var(--shadow-out);\r\n    transition: all 0.3s ease;\r\n}\r\n.job-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); }\r\n.job-card h3 { margin: 0 0 12px 0; font-size: 0.85rem; line-height: 1.3; font-weight: 400; }\r\n\r\n\/* Style du texte des opportunit\u00e9s *\/\r\n.job-info { flex: 1; padding-right: 20px; }\r\n\r\n\/* Style du texte des opportunit\u00e9s \r\nGESTION PROPRE DES S\u00c9PARATEURS |*\/ \r\n.job-meta { font-size: 0.6rem; color: var(--text-light); }\r\n.job-meta span:not(:empty) + span:not(:empty):before { \r\n    content: \"|\"; \r\n    margin: 0 10px; \r\n    color: var(--text-separator); \r\n}\r\n\r\n\/* Style du conteneur du bouton et du QR code *\/\r\n.job-actions { \r\n    display: flex; \r\n    flex-direction: row;\r\n    align-items: center; \r\n    gap: 15px; \r\n}\r\n\r\n\/* Style des boutons des opportunit\u00e9s *\/\r\n.btn-apply {\r\n    padding: 10px 18px;\r\n    border-radius: 10px;\r\n    background-color: var(--bg-card);\r\n    color: var(--text-light) !important;\r\n    text-decoration: none !important;\r\n    font-weight: 700 !important;\r\n    text-transform: uppercase !important;\r\n    font-size: 0.55rem !important;\r\n    box-shadow: var(--shadow-out);\r\n    transition: all 0.2s ease;\r\n    text-align: center;\r\n}\r\n.btn-apply:hover { \r\n    color: var(--synetis-red) !important;\r\n    box-shadow: var(--shadow-in);\r\n}\r\n\r\n\/* Style des QR codes des opportunit\u00e9s *\/\r\n.qrcode-container {\r\n    background: var(--bg-qrcode);\r\n    padding: 5px;\r\n    border-radius: 6px;\r\n    box-shadow: var(--shadow-in);\r\n    line-height: 0;\r\n}\r\n.qrcode-container canvas, .qrcode-container img {\r\n    width: 65px !important;\r\n    height: 65px !important;\r\n}\r\n\r\n\r\n\/* Style des regles d'affichage pour diff\u00e9rentes media *\/\r\n@media (max-width: 1100px) {\r\n    .job-card { flex-direction: column; align-items: flex-start; }\r\n    .job-info { padding-right: 0; margin-bottom: 20px; }\r\n    .job-actions { width: 100%; justify-content: space-between; }\r\n}\r\n@media (max-width: 900px) {\r\n    .job-list-container { grid-template-columns: 1fr; }\r\n}\r\n<\/style>\r\n\r\n<!-- Zone d'affichage des carri\u00e8res -->\r\n<div id=\"synetis-careers\">\r\n    <div class=\"filter-wrapper\">\r\n\t\t<!-- Affichage du nombres d'opportunit\u00e9s en fonction des filtres de recherche -->\r\n\t\t<div class=\"job-stats-container\">\r\n            <div id=\"job-count\" class=\"job-stats\">Loading stations...<\/div>\r\n        <\/div>\r\n        \r\n        <!-- Affichage de la barre de recherche pour filtrer les opportunit\u00e9s -->\r\n\t\t<div class=\"filter-bar\">\r\n            <!-- Filtre de recherche en texte libre -->\r\n\t\t\t<input type=\"text\" id=\"search-input\" placeholder=\"Search for a job (e.g. Consultant, Manager...)\">\r\n            \r\n            <!-- Filtres de recherche pr\u00e9d\u00e9finis -->\r\n\t\t\t<div class=\"select-group\">\r\n  \t\t\t\t<!-- Filtres de recherche par practices -->\r\n\t\t\t\t<div class=\"custom-select\" id=\"dept-dropdown\">\r\n                    <div class=\"select-trigger\"><span>All practices<\/span><\/div>\r\n                    <div class=\"custom-options\" id=\"dept-options\"><\/div>\r\n                <\/div>                \r\n\r\n              <!-- Filtres de recherche par villes -->\r\n\t\t\t\t<div class=\"custom-select\" id=\"city-dropdown\">\r\n                    <div class=\"select-trigger\"><span>All cities<\/span><\/div>\r\n                    <div class=\"custom-options\" id=\"city-options\"><\/div>\r\n                <\/div>\r\n\r\n                <!-- Filtres de recherche par types de contrat -->\r\n\t\t\t\t<div class=\"custom-select\" id=\"contract-dropdown\">\r\n                    <div class=\"select-trigger\"><span>All contracts<\/span><\/div>\r\n                    <div class=\"custom-options\" id=\"contract-options\"><\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\t\r\n\t<!-- Affichage de la liste des opportunit\u00e9s en fonctions des filtres de recherche -->\r\n\t<div id=\"job-list\" class=\"job-list-container\">\r\n        <p class=\"loading\">Search for opportunities...<\/p>\r\n    <\/div>\r\n<\/div>\r\n\r\n<!-- Javascript permettant de cr\u00e9er des QR Code -->\r\n<script type=\"text\/javascript\" src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/qrcodejs\/1.0.0\/qrcode.min.js\"><\/script>\r\n<!-- Javascript permettant de cr\u00e9er des filtres dynamiques et\r\n d'afficher les r\u00e9sultats du flux WTTJ -->\r\n<script type=\"text\/javascript\">\r\n\/\/ D\u00e9claration des constantes\r\nconst ORG_REF = '4lMLezr'; \r\nconst API_URL = `https:\/\/www.welcomekit.co\/api\/v1\/embed?organization_reference=${ORG_REF}`;\r\nconst WEB_URL = `https:\/\/www.welcometothejungle.com\/fr\/companies\/synetis\/jobs\/`;\r\n\r\nconst QR_WIDTH  = 65;\r\nconst QR_HEIGHT = 65;\r\nconst QR_COL_DARK = \"#000000\";\r\nconst QR_COL_LIGHT = \"#ffffff\";\r\n\r\nconst translations = {\r\n    'full_time': 'CDI', 'full-time': 'CDI', 'part_time': 'Temps partiel',\r\n    'internship': 'Stage', 'temporary': 'CDD', 'apprenticeship': 'Alternance'\r\n};\r\nconst getJobData = (job, field) => {\r\n    if (!job) return \"\";\r\n    switch(field) {\r\n        case 'city': return job.office ? job.office.city : (job.city || \"\");\r\n        case 'contract': \r\n            let raw = job.contract_type ? (job.contract_type.en || job.contract_type.name || job.contract_type) : \"\";\r\n            if(typeof raw !== 'string') raw = \"\";\r\n            const key = raw.toLowerCase().replace(' ', '_').replace('-', '_');\r\n            return translations[key] || raw;\r\n        case 'dept': return job.department ? job.department.name : \"\";\r\n        case 'url': return job.website_url || `${WEB_URL}${job.slug}`;\r\n        default: return \"\";\r\n    }\r\n};\r\n\r\n\/\/ Declaration des variables globales (tableau des opportunit\u00e9s  et des filtres)\r\nlet allJobs = [];\r\nlet filters = { city: \"\", contract: \"\", dept: \"\", search: \"\" };\r\n\r\n\/\/******************************************************************************\r\n\/\/ Fonction asynchrone d'initialisation de la liste des opportunit\u00e9s\r\n\/\/******************************************************************************\r\nasync function initJobBoard() {\r\n    try {\r\n\t\t\/\/ Appel de l'API WWTJ (Welcome To The Jungle)\r\n        const response = await fetch(API_URL);\r\n        \/\/ R\u00e9cuperation du fichier JSON resultant le l'appel API\r\n        const data = await response.json();\r\n\t\t\/\/ Constrution du tableau des opportunit\u00e9s \u00e0 parti des donn\u00e9es du JSON\r\n\t\tallJobs = data.jobs || data;\r\n\t\t\/\/ Cr\u00e9ation dynamiques des valeurs utilisables pour les filtes\r\n\t\tsetupCustomSelects();\r\n\t\t\/\/ Affichage de la liste des opportunit\u00e9s\r\n        updateDisplay(allJobs);\r\n\t\t\r\n    } \r\n\t\/\/ Affichage des erreurs dasn la console du navigateur\r\n\tcatch (err) { console.error(err); }\r\n}\r\n\r\n\/\/******************************************************************************\r\n\/\/ Fonction permettant d'initier les valeurs de diff\u00e9rents filtres \r\n\/\/******************************************************************************\r\nfunction setupCustomSelects() \r\n{\r\n    \/\/ Initialiation du filtre des d\u00e9partements\r\n\tfillCustomOptions('dept', 'dept-options', 'dept-dropdown', 'Toutes les practices');\r\n    \/\/ Initialiation du filtre des villes\r\n\tfillCustomOptions('city', 'city-options', 'city-dropdown', 'Toutes les villes');\r\n    \/\/ Initialiation du filtre des types de contrat\r\n\tfillCustomOptions('contract', 'contract-options', 'contract-dropdown', 'Tous les contrats');\r\n    \/\/ Ajout d'un \u00e9v\u00e9nement \u00e0 chaque filtre de recherche pour d\u00e9clencher le filtrage lors de la selection d'une valeur\r\n\tdocument.addEventListener('click', () => {\r\n        document.querySelectorAll('.custom-options').forEach(el => el.classList.remove('show'));\r\n    });\r\n}\r\n\r\n\/\/******************************************************************************\r\n\/\/ Fonction d'initialisation d'un filtre \r\n\/\/ \u00e0 partir des donn\u00e9es de la liste des opportunit\u00e9s\r\n\/\/     field : nom du champ \u00e0 utiliser pour r\u00e9cupere les valeurs du filtre\r\n\/\/     optionsId : nom du composant HTHML contenant le filtre\r\n\/\/     dropdownId : nom du composant contenant les \u00e9l\u00e9ments du filtre\r\n\/\/     defaultLabel : Valeur par d\u00e9faut pour le filtre\r\n\/\/******************************************************************************\r\nfunction fillCustomOptions(field, optionsId, dropdownId, defaultLabel) {\r\n    \/\/ D\u00e9claration des objets\r\n\tconst container = document.getElementById(optionsId);\r\n    const dropdown = document.getElementById(dropdownId);\r\n    const trigger = dropdown.querySelector('.select-trigger span');\r\n    const values = [...new Set(allJobs.map(j => getJobData(j, field)))].filter(Boolean).sort();\r\n    \r\n\t\/\/ Cr\u00e9ation de la valeur par d\u00e9faut pour le filtre\r\n    const allOpt = document.createElement('div');\r\n    allOpt.className = 'option-item';\r\n    allOpt.textContent = defaultLabel;\r\n    allOpt.onclick = () => {\r\n        filters[field] = \"\";\r\n        trigger.textContent = allOpt.textContent;\r\n        runFilters();\r\n    };\r\n    container.appendChild(allOpt);\r\n\t\r\n\t\/\/ Recherche dans la liste des opportunit\u00e9s des valeurs associ\u00e9 au champ \"field\"\r\n    values.forEach(v => {\r\n        \/\/ cr\u00e9ation d'un objet HTLM pour un nouvel \u00e9l\u00e9ment de la liste\r\n\t\tconst opt = document.createElement('div');\r\n        opt.className = 'option-item';\r\n        \/\/ Ajout de la valeur\r\n\t\topt.textContent = v;\r\n\t\t\/\/ Ajout d'un \u00e9v\u00e9nement \u00e0 chaque element du filtre pour d\u00e9clencher le filtrage lors de la selection d'une valeur \r\n        opt.onclick = (e) => {\r\n            e.stopPropagation();\r\n            filters[field] = v;\r\n            trigger.textContent = v;\r\n            container.classList.remove('show');\r\n            runFilters();\r\n        };\r\n\t\t\/\/ Ajout de l'\u00e9l\u00e9ment au conteneur du filtre \r\n        container.appendChild(opt);\r\n    });\r\n\r\n    \/\/ ???? \r\n    dropdown.onclick = (e) => {\r\n        e.stopPropagation();\r\n        const wasShow = container.classList.contains('show');\r\n        document.querySelectorAll('.custom-options').forEach(el => el.classList.remove('show'));\r\n        if(!wasShow) container.classList.add('show');\r\n    };\r\n}\r\n\r\n\r\n\/\/  Fonction permettant de lancer la recherche des opportunit\u00e9s en fonction des filtres choisis\r\nfunction runFilters() {\r\n\t\/\/ Recuperation de la valeur saisie dans le champ de recherche\r\n    const textFilter = document.getElementById('search-input').value.toLowerCase();\r\n   \/\/ Construction de l'objet contenant les opportunit\u00e9s filtr\u00e9es\r\n\tconst filtered = allJobs.filter(j => {\r\n        \/\/ R\u00e9cup\u00e9ration de l'intitul\u00e9 de l'opportunit\u00e9\r\n\t\tconst jobTitle = (j.name || j.title).toLowerCase();\r\n\t\t\/\/ Filtrage sur la valeur :\r\n\t\t\/\/     de la liste d\u00e9roulante des practices\r\n\t\t\/\/     de la liste d\u00e9roulante des villes\r\n\t\t\/\/     de la liste d\u00e9roulante des types de contrat\r\n\t\t\/\/     du texte recherch\u00e9 dans l'intitul\u00e9 de l'opportunit\u00e9 \r\n        return (getJobData(j, 'dept') === filters.dept || filters.dept === \"\") &&\r\n               (getJobData(j, 'city') === filters.city || filters.city === \"\") &&\r\n               (getJobData(j, 'contract') === filters.contract || filters.contract === \"\") &&\r\n               (jobTitle.includes(textFilter));\r\n    });\r\n    \/\/ Affichage de la liste des opportunit\u00e9s filtr\u00e9es\r\n\tupdateDisplay(filtered);\r\n}\r\n\r\n\r\n\/\/******************************************************************************\r\n\/\/ Fonction d'affichage de la liste des opportunit\u00e9s pass\u00e9 en param\u00e8tre\r\n\/\/     job : tableau d'objet contenant les opportunit\u00e9s\r\n\/\/******************************************************************************\r\nfunction updateDisplay(jobs) {\r\n    \/\/ D\u00e9claration des objets\r\n\tconst container = document.getElementById('job-list');\r\n    \r\n\t\/\/ Affichage du nombre de r\u00e9sultats\r\n\tdocument.getElementById('job-count').innerHTML = `<span>${jobs.length}<\/span> opportunit\u00e9s`;\r\n    \/\/ Affichage d'un message si il n'y a pas d'objets dans le tableau \r\n\tcontainer.innerHTML = jobs.length ? '' : '<p class=\"loading\">Aucun r\u00e9sultat trouv\u00e9.<\/p>';\r\n\r\n    \/\/ R\u00e9cup\u00e9ration des objets du tableau\r\n    jobs.forEach((job, index) => {\r\n        \/\/ D\u00e9claration des variable pour g\u00e9rer l'URL et le QR code\r\n\t\tconst jobUrl = getJobData(job, 'url');\r\n        const qrId = `qr-code-${index}`;\r\n        \r\n\t\t\/\/ Creation d'un conteneur HTML pour afficher l'opportunit\u00e9\r\n        const cardHtml = `\r\n            <div class=\"job-card\">\r\n                <div class=\"job-info\">\r\n                    <h3>${job.name || job.title}<\/h3>\r\n                    <div class=\"job-meta\">\r\n                        <span>${getJobData(job, 'dept')}<\/span><span>${getJobData(job, 'city')}<\/span><span>${getJobData(job, 'contract')}<\/span>\r\n                    <\/div>\r\n                <\/div>\r\n                <div class=\"job-actions\">\r\n                    <a href=\"${jobUrl}\" target=\"_blank\" class=\"btn-apply\">D\u00c9COUVRIR<\/a>\r\n                    <div id=\"${qrId}\" class=\"qrcode-container\"><\/div>\r\n                <\/div>\r\n            <\/div>`;\r\n        \r\n        \/\/ Ajout du conteneur \u00e0 la page HTML\r\n        container.insertAdjacentHTML('beforeend', cardHtml);\r\n\r\n\t\t \/\/ Cr\u00e9ation du QR code \u00e0 partir de l'URL        \r\n        new QRCode(document.getElementById(qrId), {\r\n            text: jobUrl,\r\n            width: QR_WIDTH,\r\n            height: QR_HEIGHT,\r\n            colorDark : QR_COL_DARK,\r\n            colorLight : QR_COL_LIGHT,\r\n            correctLevel : QRCode.CorrectLevel.M\r\n        });\r\n    });\r\n}\r\n\r\n\/\/ Ajout d'un \u00e9v\u00e9nement au champ texte de recherche pour d\u00e9clencher le filtrage lors de la saisie\r\ndocument.getElementById('search-input').addEventListener('input', runFilters);\r\n\r\n\/\/ Initialisation dynamique de la liste des opportunit\u00e9s \r\n\/\/ (mode asynchrone -> pas d'attente de la fin de la recherche pour continuer l'ex\u00e9cution du code)\r\ninitJobBoard();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2c67d80 e-flex e-con-boxed elementor-invisible e-con e-parent\" data-id=\"2c67d80\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;animation&quot;:&quot;fadeIn&quot;,&quot;animation_delay&quot;:400}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8ab6cb5 elementor-widget elementor-widget-heading\" data-id=\"8ab6cb5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">unsolicited application<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ecce02 elementor-widget elementor-widget-text-editor\" data-id=\"3ecce02\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Can&#8217;t find your ideal job? Send us your application. <\/p><p>We&#8217;re always on the lookout for talented &#038; diverse profiles.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7d6d257 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"7d6d257\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/www.welcometothejungle.com\/fr\/companies\/synetis\/jobs\/candidatures-spontanees\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Send an application<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9c23642 e-flex e-con-boxed e-con e-parent\" data-id=\"9c23642\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-737ef75 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"737ef75\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:400}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">They chose synetis: why shouldn't you?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a788a5c elementor-invisible elementor-widget elementor-widget-text-editor\" data-id=\"a788a5c\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:400}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>They speak best of the Synetis adventure.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f82a0c5 e-grid e-con-full elementor-invisible e-con e-child\" data-id=\"f82a0c5\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeIn&quot;,&quot;animation_delay&quot;:400}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ce4c923 elementor-widget elementor-widget-video\" data-id=\"ce4c923\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;youtube_url&quot;:&quot;https:\\\/\\\/www.youtube.com\\\/watch?v=tzh2S6V8gGc&quot;,&quot;loop&quot;:&quot;yes&quot;,&quot;video_type&quot;:&quot;youtube&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-wrapper elementor-open-inline\">\n\t\t\t<div class=\"elementor-video\"><\/div>\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc6b3dd elementor-widget elementor-widget-video\" data-id=\"dc6b3dd\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;youtube_url&quot;:&quot;https:\\\/\\\/www.youtube.com\\\/watch?v=bu6PKMkxIyE&amp;t=3s&quot;,&quot;video_type&quot;:&quot;youtube&quot;,&quot;controls&quot;:&quot;yes&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-wrapper elementor-open-inline\">\n\t\t\t<div class=\"elementor-video\"><\/div>\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Explore our cybersecurity job offers at Synetis: IAM, GRC, Audit, Pentest or SOC. Find the opportunity that matches your expertise and join our teams. <\/p>\n","protected":false},"author":7,"featured_media":0,"parent":22357,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"class_list":["post-22401","page","type-page","status-publish","hentry"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.synetis.com\/en\/wp-json\/wp\/v2\/pages\/22401","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.synetis.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.synetis.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.synetis.com\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.synetis.com\/en\/wp-json\/wp\/v2\/comments?post=22401"}],"version-history":[{"count":1,"href":"https:\/\/www.synetis.com\/en\/wp-json\/wp\/v2\/pages\/22401\/revisions"}],"predecessor-version":[{"id":22402,"href":"https:\/\/www.synetis.com\/en\/wp-json\/wp\/v2\/pages\/22401\/revisions\/22402"}],"up":[{"embeddable":true,"href":"https:\/\/www.synetis.com\/en\/wp-json\/wp\/v2\/pages\/22357"}],"wp:attachment":[{"href":"https:\/\/www.synetis.com\/en\/wp-json\/wp\/v2\/media?parent=22401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}