{"id":5920,"date":"2024-02-02T09:16:07","date_gmt":"2024-02-02T13:16:07","guid":{"rendered":"https:\/\/info-arch.com\/forma-tu-equipo\/"},"modified":"2026-09-17T15:25:34","modified_gmt":"2026-09-17T19:25:34","slug":"forma-tu-equipo","status":"publish","type":"page","link":"https:\/\/info-arch.com\/es\/forma-tu-equipo\/","title":{"rendered":"Crea tu equipo ahora"},"content":{"rendered":"<div class=\"wpb-content-wrapper\" id=\"wpb-content-root\"><p>[vc_row][vc_column]<div id=\"ultimate-heading-1716ab334021b926\" class=\"uvc-heading ult-adjust-bottom-margin ultimate-heading-1716ab334021b926 uvc-7395 accent-border-color\" data-hspacer=\"no_spacer\"  data-halign=\"center\" style=\"text-align:center\"><div class=\"uvc-heading-spacer no_spacer\" style=\"top\"><\/div><div class=\"uvc-main-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-1716ab334021b926 h2'  data-responsive-json-new='{\"font-size\":\"desktop:44px;tablet:35px;tablet_portrait:30px;\",\"line-height\":\"desktop:54px;tablet_portrait:40px;\"}' ><h2 style=\"font-family:&#039;Raleway&#039;;font-weight:bold;color:#333333;margin-top:2%;margin-bottom:4%;\">Tu equipo de ingenier\u00eda de software ideal te espera: empieza a construirlo ahora<\/h2><\/div><div class=\"uvc-sub-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-1716ab334021b926 .uvc-sub-heading '  data-responsive-json-new='{\"font-size\":\"desktop:22px;mobile_landscape:16px;\",\"line-height\":\"desktop:32px;mobile_landscape:26px;\"}'  style=\"font-family:&#039;Raleway&#039;;font-style:italic;font-weight:normal;color:#000000;\"><\/p>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\">\n<p class=\"cgHgbA pYZEjA Xp24Nw PanoWQ\" style=\"text-align: center;\">\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><\/div><\/div>[\/vc_column][\/vc_row][vc_row full_width=\u00bbstretch_row_content\u00bb equal_height=\u00bbyes\u00bb content_placement=\u00bbmiddle\u00bb bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1707406949856{margin-top: 0px !important;margin-bottom: 0px !important;padding-top: 0px !important;padding-right: 3% !important;padding-bottom: 0px !important;}\u00bb bg_color_value=\u00bb#114774&#8243;][vc_column width=\u00bb1\/2&#8243; el_class=\u00bbcolumnas\u00bb][vc_single_image image=\u00bb5680&#8243; img_size=\u00bb950&#215;700&#8243; alignment=\u00bbcenter\u00bb][\/vc_column][vc_column width=\u00bb1\/2&#8243; el_class=\u00bbcolumnas\u00bb]<div id=\"ultimate-heading-29766ab334021b989\" class=\"uvc-heading ult-adjust-bottom-margin ultimate-heading-29766ab334021b989 uvc-676 accent-border-color texto_unlock\" data-hspacer=\"no_spacer\"  data-halign=\"center\" style=\"text-align:center\"><div class=\"uvc-heading-spacer no_spacer\" style=\"top\"><\/div><div class=\"uvc-sub-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-29766ab334021b989 .uvc-sub-heading '  data-responsive-json-new='{\"font-size\":\"desktop:35px;tablet:30px;mobile_landscape:16px;\",\"line-height\":\"desktop:45px;mobile_landscape:26px;\"}'  style=\"font-family:&#039;Raleway&#039;;font-style:italic;font-weight:normal;color:#ffffff;\"><\/p>\n<p class=\"texto_unlock\" style=\"text-align: center;\">Desbloquea el \u00e9xito del software con nuestro \u00abCreador del Equipo Ideal de Ingenier\u00eda del Software\u00bb. Tu equipo ideal te espera: empieza a construirlo ahora para un viaje de innovaci\u00f3n y excelencia en los proyectos. Crea un equipo de talento y experiencia para elevar tus proyectos de software.  <\/p>\n<p><\/div><\/div>[\/vc_column][\/vc_row][vc_row full_width=\u00bbstretch_row_content\u00bb bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1707250134859{padding-right: 5% !important;padding-left: 5% !important;}\u00bb bg_color_value=\u00bb#efefef\u00bb][vc_column el_id=\u00bbbuild-your-team\u00bb]<div id=\"ultimate-heading-62236ab334021b9b1\" class=\"uvc-heading ult-adjust-bottom-margin ultimate-heading-62236ab334021b9b1 uvc-714 accent-border-color\" data-hspacer=\"no_spacer\"  data-halign=\"center\" style=\"text-align:center\"><div class=\"uvc-heading-spacer no_spacer\" style=\"top\"><\/div><div class=\"uvc-main-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-62236ab334021b9b1 h2'  data-responsive-json-new='{\"font-size\":\"desktop:44px;tablet_portrait:30px;\",\"line-height\":\"desktop:54px;tablet_portrait:40px;\"}' ><h2 style=\"font-family:&#039;Raleway&#039;;font-weight:bold;color:#333333;margin-top:3%;margin-bottom:3%;\">\u00bfQu\u00e9 habilidades necesitas?<\/h2><\/div><div class=\"uvc-sub-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-62236ab334021b9b1 .uvc-sub-heading '  data-responsive-json-new='{\"font-size\":\"desktop:22px;mobile_landscape:16px;\",\"line-height\":\"desktop:32px;mobile_landscape:26px;\"}'  style=\"font-family:&#039;Raleway&#039;;font-style:italic;font-weight:normal;color:#000000;margin-bottom:2.3%;\"><\/p>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\">\n<p class=\"cgHgbA pYZEjA Xp24Nw PanoWQ\" style=\"text-align: center;\"><span class=\"OYPEnA\">Crea tu equipo ahora y obt\u00e9n un<\/span> <span class=\"OYPEnA\">Presupuesto o <\/span><span class=\"OYPEnA\">d\u00e9janos ayudarte<\/span><span class=\"OYPEnA\"> a crear el equipo con mejor rendimiento.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><\/div><\/div>[\/vc_column][\/vc_row][vc_row bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1745256259340{padding-right: 3% !important;padding-left: 3% !important;}\u00bb bg_color_value=\u00bb#efefef\u00bb el_class=\u00bbsession-item-rol\u00bb][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"front_development\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/Front-End-Development.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Desarrollo Front-End<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus class_menos icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus class_mas icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#front_development\",\n            data: {\n                contador: 0,\n                nombreRol: \"Desarrollo Front-End\",\n                mapid: \"4\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"front_development\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"front_development\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"front_development\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"back_end_engineer\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/Back-End-Engineer-1.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Ingeniero de Back-End<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus  icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus  icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#back_end_engineer\",\n            data: {\n                contador: 0,\n                nombreRol: \"Ingeniero de Back-End\",\n                mapid: \"5\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"back_end_engineer\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"back_end_engineer\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"back_end_engineer\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"full_stack_engineer\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/Full-Stack-Engineer-1.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Ingeniero Full Stack<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus  icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus  icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#full_stack_engineer\",\n            data: {\n                contador: 0,\n                nombreRol: \"Ingeniero Full Stack\",\n                mapid: \"6\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"full_stack_engineer\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"full_stack_engineer\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"full_stack_engineer\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"dev_ops\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/Cloud-DevOps-Engineer.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Ingeniero de Nube y DevOps<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus  icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus  icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#dev_ops\",\n            data: {\n                contador: 0,\n                nombreRol: \"Ingeniero de Nube y DevOps\",\n                mapid: \"7\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"dev_ops\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"dev_ops\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"dev_ops\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][\/vc_row][vc_row bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1745256330073{padding-right: 3% !important;padding-left: 3% !important;}\u00bb bg_color_value=\u00bb#efefef\u00bb el_class=\u00bbsession-item-rol\u00bb][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"engineer\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/QA-Engineer.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\"> Ingeniero de Calidad<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus class_menos icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus class_mas icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#engineer\",\n            data: {\n                contador: 0,\n                nombreRol: \" Ingeniero de Calidad\",\n                mapid: \"8\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"engineer\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"engineer\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"engineer\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"qa_automation\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/QA-Automation-Engineer.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Ingeniero QA de Automatizaci\u00f3n<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus  icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus  icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#qa_automation\",\n            data: {\n                contador: 0,\n                nombreRol: \"Ingeniero QA de Automatizaci\u00f3n\",\n                mapid: \"9\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"qa_automation\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"qa_automation\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"qa_automation\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"ai_ml_enginer\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/AI-ML-Engineer.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Ingeniero en IA y Machine Learning<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus  icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus  icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#ai_ml_enginer\",\n            data: {\n                contador: 0,\n                nombreRol: \"Ingeniero en IA y Machine Learning\",\n                mapid: \"10\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"ai_ml_enginer\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"ai_ml_enginer\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"ai_ml_enginer\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"scientist\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/Full-Stack-Engineer.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Especialista en Ciencia de Datos<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus  icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus  icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#scientist\",\n            data: {\n                contador: 0,\n                nombreRol: \"Especialista en Ciencia de Datos\",\n                mapid: \"11\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"scientist\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"scientist\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"scientist\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][\/vc_row][vc_row bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1745260143795{padding-right: 3% !important;padding-bottom: 5% !important;padding-left: 3% !important;}\u00bb bg_color_value=\u00bb#efefef\u00bb el_class=\u00bbsession-item-rol\u00bb][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"ui_ux\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/Front-End-development.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Dise\u00f1ador UX \/ UI<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus class_menos icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus class_mas icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#ui_ux\",\n            data: {\n                contador: 0,\n                nombreRol: \"Dise\u00f1ador UX \/ UI\",\n                mapid: \"12\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"ui_ux\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"ui_ux\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"ui_ux\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"owner\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/Product-Owner.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Product Owner<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus  icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus  icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#owner\",\n            data: {\n                contador: 0,\n                nombreRol: \"Product Owner\",\n                mapid: \"13\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"owner\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"owner\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"owner\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"proyect_manager\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/Project-Manager.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\"> Gestor de Proyecto<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus  icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus  icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#proyect_manager\",\n            data: {\n                contador: 0,\n                nombreRol: \" Gestor de Proyecto\",\n                mapid: \"14\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"proyect_manager\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"proyect_manager\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"proyect_manager\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;]<div id=\"specialist\" class=\"item-rol-element\" v-bind:style=\"{ backgroundColor: fondoColor }\"><img decoding=\"async\" class=\"img-responsive img-rol-element\" src=\"https:\/\/info-arch.com\/wp-content\/uploads\/2024\/02\/Security-specialist.png\" alt=\"Image\" \/><p class=\"item-rol-element-item-nombre\" style=\"font-size: 1.8rem;\">Especialista en Ciberseguridad<\/p><p class=\"item-contador\"><i class=\"fa fa-user btn_avatar_rol\" aria-hidden=\"true\"><span class=\"counter\"> {{ contador }}<\/span><\/i> <i class=\"fas fa-minus  icono_tool\" aria-hidden=\"true\" v-on:click=\"decrement\"><\/i><i class=\"fas fa-plus  icono_tool\" aria-hidden=\"true\" v-on:click=\"increment\"><\/i><span class=\"btn_remove_rol\" v-on:click=\"remove\"><i class=\"fa fa-trash btn_remove_rol\" aria-hidden=\"true\"><\/i> Borrar<\/span><\/p><\/div><script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        new Vue({\n            el: \"#specialist\",\n            data: {\n                contador: 0,\n                nombreRol: \"Especialista en Ciberseguridad\",\n                mapid: \"15\",\n                fondoColor: \"#FFFFFF\"\n            },\n            mounted() {\n                this.loadFromLocalStorage();\n                window.addEventListener('storage', this.loadFromLocalStorage);\n            },\n            beforeDestroy() {\n                window.removeEventListener('storage', this.loadFromLocalStorage);\n            },\n            methods: {\n                increment() {\n                    this.contador++;\n                    this.fondoColor = \"#AEECFC\";\n                    this.saveToLocalStorage();\n                },\n                decrement() {\n                    if (this.contador > 0) {\n                        this.contador--;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                        this.saveToLocalStorage();\n                    } else {\n                        this.fondoColor = \"#FFFFFF\";\n                        this.removeFromLocalStorage();\n                    }\n                },\n                remove() {\n                    this.removeFromLocalStorage();\n                },\n                saveToLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    \/\/ Usar element_id como clave \u00fanica para evitar sobreescrituras\n                    rolesData[\"specialist\"] = {\n                        nombre_elemento: this.nombreRol,\n                        contador: this.contador,\n                        type: \"team\",\n                        mapid: this.mapid\n                    };\n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n\n                    const userSelections = document.getElementById(\"userSelections\");\n                    if (userSelections) {\n                        userSelections.value = JSON.stringify(rolesData);\n                    }\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                removeFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const keyToRemove = \"specialist\";\n                    \n                    if (rolesData[keyToRemove]) {\n                        delete rolesData[keyToRemove];\n                    } else {\n                        \/\/ Fallback por si acaso fue guardado por nombre (ej. IA Recommendation)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) delete rolesData[index];\n                    }\n                    \n                    localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                    this.contador = 0;\n                    this.fondoColor = \"#FFFFFF\";\n\n                    if (typeof vueInstance !== \"undefined\") {\n                        vueInstance.initializeData();\n                    }\n                    window.dispatchEvent(new Event('storage'));\n                },\n                findIndexByName(rolesData, roleName) {\n                    if (!roleName) return null;\n                    const searchName = roleName.trim().toLowerCase();\n                    return Object.keys(rolesData).find(index => {\n                        const item = rolesData[index];\n                        return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                    });\n                },\n                loadFromLocalStorage() {\n                    const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                    const key = \"specialist\";\n                    let existingRole = rolesData[key];\n                    \n                    if (!existingRole) {\n                        \/\/ Fallback: tratar de encontrar por nombre si la clave ID no existe (ej. IA o previo)\n                        const index = this.findIndexByName(rolesData, this.nombreRol);\n                        if (index !== null) existingRole = rolesData[index];\n                    }\n                    \n                    if (existingRole && typeof existingRole.contador !== \"undefined\") {\n                        this.contador = existingRole.contador;\n                        this.fondoColor = this.contador > 0 ? \"#AEECFC\" : \"#FFFFFF\";\n                    } else {\n                        this.contador = 0;\n                        this.fondoColor = \"#FFFFFF\";\n                    }\n                }\n            }\n        });\n    });\n    <\/script>[\/vc_column][\/vc_row][vc_row full_width=\u00bbstretch_row_content\u00bb bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1707241888562{padding-right: 5% !important;padding-left: 5% !important;}\u00bb bg_color_value=\u00bb#ffffff\u00bb][vc_column]<div id=\"ultimate-heading-66346ab334021d98f\" class=\"uvc-heading ult-adjust-bottom-margin ultimate-heading-66346ab334021d98f uvc-1701 accent-border-color\" data-hspacer=\"no_spacer\"  data-halign=\"center\" style=\"text-align:center\"><div class=\"uvc-heading-spacer no_spacer\" style=\"top\"><\/div><div class=\"uvc-main-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-66346ab334021d98f h2'  data-responsive-json-new='{\"font-size\":\"desktop:44px;tablet_portrait:30px;\",\"line-height\":\"desktop:54px;tablet_portrait:40px;\"}' ><h2 style=\"font-family:&#039;Raleway&#039;;font-weight:bold;color:#333333;margin-top:3%;margin-bottom:3%;\">Detalles del proyecto<\/h2><\/div><div class=\"uvc-sub-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-66346ab334021d98f .uvc-sub-heading '  data-responsive-json-new='{\"font-size\":\"desktop:22px;mobile_landscape:16px;\",\"line-height\":\"desktop:32px;mobile_landscape:26px;\"}'  style=\"font-family:&#039;Raleway&#039;;font-style:italic;font-weight:normal;color:#000000;margin-bottom:2.7%;\"><\/p>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\">\n<p class=\"cgHgbA pYZEjA Xp24Nw PanoWQ\" style=\"text-align: center;\">\u00bfCu\u00e1ndo necesitas que tu equipo est\u00e9 preparado?<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><\/div><\/div>[\/vc_column][\/vc_row][vc_row full_width=\u00bbstretch_row_content\u00bb bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1745260477837{padding-right: 5% !important;padding-left: 5% !important;}\u00bb bg_color_value=\u00bb#ffffff\u00bb el_class=\u00bbsession-element-ready\u00bb][vc_column width=\u00bb1\/4&#8243;]<div class=\"element-ready\" id=\"yesterday\" style=\"background-color: #f1f1f1;\"><div class=\"radio-container\">  <input type=\"radio\" id=\"radio_6ab334021db20\" name=\"element_ready_radio\" value=\"Ayer\" style=\"width: 40px; height: 40px; border: 2px solid #114774\" v-model=\"selectedElement\" @change=\"toggleElement\"><\/div><div class=\"containder_descrip_title\"><h2>Ayer<\/h2><p>Necesito talento ahora<\/p><\/div><\/div><script>document.addEventListener(\"DOMContentLoaded\", function() {  new Vue({    el: \"#yesterday\",    data: {      selectedElement: \"Ayer\",      nombreElemento: \"Ayer\",      tipoElemento: \"proyect\",      proyectos: [],    },    methods: {retrieveProyectos() {  const elementosData = JSON.parse(localStorage.getItem(\"roles\")) || {};  this.proyectos = Object.values(elementosData).filter(element => element.type === \"proyect\");  console.log(\"Elementos de tipo proyect recuperados:\", JSON.stringify(this.proyectos, null, 2));},      toggleElement() {        const elementosData = JSON.parse(localStorage.getItem(\"roles\")) || {};        Object.keys(elementosData).forEach(key => {          if (elementosData[key].type === \"proyect\") {            delete elementosData[key];          }        });        elementosData[\"yesterday\"] = { nombre_elemento: this.nombreElemento, contador: 1, type: this.tipoElemento , mapid:16 };        localStorage.setItem(\"roles\", JSON.stringify(elementosData));        document.getElementById(\"userSelections\").value =  JSON.stringify(elementosData) ;        if (typeof vueInstance !== \"undefined\") { vueInstance.initializeData(); }        window.dispatchEvent(new Event(\"storage\"));        this.proyectos = Object.values(elementosData).filter(element => element.type === \"proyect\");        console.log(\"Elementos de tipo proyect recuperados:\", this.proyectos);      },    },    watch: {      selectedElement: function(newVal) {        console.log(\"Elemento seleccionado: \" + newVal);      },    },    mounted() {      this.retrieveProyectos();      window.addEventListener(\"storage\", this.handleProjectStorageChange);      if (this.proyectos.length > 0) {        const primerProyecto = this.proyectos[0];        this.selectedElement = primerProyecto.nombre_elemento;      }    },    beforeDestroy() {        window.removeEventListener(\"storage\", this.handleProjectStorageChange);    }  });});<\/script>[\/vc_column][vc_column width=\u00bb1\/4&#8243;]<div class=\"element-ready\" id=\"soon\" style=\"background-color: #f1f1f1;\"><div class=\"radio-container\">  <input type=\"radio\" id=\"radio_6ab334021dcce\" name=\"element_ready_radio\" value=\"Pronto\" style=\"width: 40px; height: 40px; border: 2px solid #114774\" v-model=\"selectedElement\" @change=\"toggleElement\"><\/div><div class=\"containder_descrip_title\"><h2>Pronto<\/h2><p>En las pr\u00f3ximas semanas<\/p><\/div><\/div><script>document.addEventListener(\"DOMContentLoaded\", function() {  new Vue({    el: \"#soon\",    data: {      selectedElement: \"Pronto\",      nombreElemento: \"Pronto\",      tipoElemento: \"proyect\",      proyectos: [],    },    methods: {retrieveProyectos() {  const elementosData = JSON.parse(localStorage.getItem(\"roles\")) || {};  this.proyectos = Object.values(elementosData).filter(element => element.type === \"proyect\");  console.log(\"Elementos de tipo proyect recuperados:\", JSON.stringify(this.proyectos, null, 2));},      toggleElement() {        const elementosData = JSON.parse(localStorage.getItem(\"roles\")) || {};        Object.keys(elementosData).forEach(key => {          if (elementosData[key].type === \"proyect\") {            delete elementosData[key];          }        });        elementosData[\"soon\"] = { nombre_elemento: this.nombreElemento, contador: 1, type: this.tipoElemento , mapid:16 };        localStorage.setItem(\"roles\", JSON.stringify(elementosData));        document.getElementById(\"userSelections\").value =  JSON.stringify(elementosData) ;        if (typeof vueInstance !== \"undefined\") { vueInstance.initializeData(); }        window.dispatchEvent(new Event(\"storage\"));        this.proyectos = Object.values(elementosData).filter(element => element.type === \"proyect\");        console.log(\"Elementos de tipo proyect recuperados:\", this.proyectos);      },    },    watch: {      selectedElement: function(newVal) {        console.log(\"Elemento seleccionado: \" + newVal);      },    },    mounted() {      this.retrieveProyectos();      window.addEventListener(\"storage\", this.handleProjectStorageChange);      if (this.proyectos.length > 0) {        const primerProyecto = this.proyectos[0];        this.selectedElement = primerProyecto.nombre_elemento;      }    },    beforeDestroy() {        window.removeEventListener(\"storage\", this.handleProjectStorageChange);    }  });});<\/script>[\/vc_column][vc_column width=\u00bb1\/4&#8243;]<div class=\"element-ready\" id=\"quarter\" style=\"background-color: #f1f1f1;\"><div class=\"radio-container\">  <input type=\"radio\" id=\"radio_6ab334021ddca\" name=\"element_ready_radio\" value=\"El pr\u00f3ximo trimestre\" style=\"width: 40px; height: 40px; border: 2px solid #114774\" v-model=\"selectedElement\" @change=\"toggleElement\"><\/div><div class=\"containder_descrip_title\"><h2>El pr\u00f3ximo trimestre<\/h2><p>En los pr\u00f3ximos meses<\/p><\/div><\/div><script>document.addEventListener(\"DOMContentLoaded\", function() {  new Vue({    el: \"#quarter\",    data: {      selectedElement: \"El pr\u00f3ximo trimestre\",      nombreElemento: \"El pr\u00f3ximo trimestre\",      tipoElemento: \"proyect\",      proyectos: [],    },    methods: {retrieveProyectos() {  const elementosData = JSON.parse(localStorage.getItem(\"roles\")) || {};  this.proyectos = Object.values(elementosData).filter(element => element.type === \"proyect\");  console.log(\"Elementos de tipo proyect recuperados:\", JSON.stringify(this.proyectos, null, 2));},      toggleElement() {        const elementosData = JSON.parse(localStorage.getItem(\"roles\")) || {};        Object.keys(elementosData).forEach(key => {          if (elementosData[key].type === \"proyect\") {            delete elementosData[key];          }        });        elementosData[\"quarter\"] = { nombre_elemento: this.nombreElemento, contador: 1, type: this.tipoElemento , mapid:16 };        localStorage.setItem(\"roles\", JSON.stringify(elementosData));        document.getElementById(\"userSelections\").value =  JSON.stringify(elementosData) ;        if (typeof vueInstance !== \"undefined\") { vueInstance.initializeData(); }        window.dispatchEvent(new Event(\"storage\"));        this.proyectos = Object.values(elementosData).filter(element => element.type === \"proyect\");        console.log(\"Elementos de tipo proyect recuperados:\", this.proyectos);      },    },    watch: {      selectedElement: function(newVal) {        console.log(\"Elemento seleccionado: \" + newVal);      },    },    mounted() {      this.retrieveProyectos();      window.addEventListener(\"storage\", this.handleProjectStorageChange);      if (this.proyectos.length > 0) {        const primerProyecto = this.proyectos[0];        this.selectedElement = primerProyecto.nombre_elemento;      }    },    beforeDestroy() {        window.removeEventListener(\"storage\", this.handleProjectStorageChange);    }  });});<\/script>[\/vc_column][vc_column width=\u00bb1\/4&#8243;]<div class=\"element-ready\" id=\"future\" style=\"background-color: #f1f1f1;\"><div class=\"radio-container\">  <input type=\"radio\" id=\"radio_6ab334021deaa\" name=\"element_ready_radio\" value=\"En el futuro\" style=\"width: 40px; height: 40px; border: 2px solid #114774\" v-model=\"selectedElement\" @change=\"toggleElement\"><\/div><div class=\"containder_descrip_title\"><h2>En el futuro<\/h2><p>M\u00e1s de 6 meses<\/p><\/div><\/div><script>document.addEventListener(\"DOMContentLoaded\", function() {  new Vue({    el: \"#future\",    data: {      selectedElement: \"En el futuro\",      nombreElemento: \"En el futuro\",      tipoElemento: \"proyect\",      proyectos: [],    },    methods: {retrieveProyectos() {  const elementosData = JSON.parse(localStorage.getItem(\"roles\")) || {};  this.proyectos = Object.values(elementosData).filter(element => element.type === \"proyect\");  console.log(\"Elementos de tipo proyect recuperados:\", JSON.stringify(this.proyectos, null, 2));},      toggleElement() {        const elementosData = JSON.parse(localStorage.getItem(\"roles\")) || {};        Object.keys(elementosData).forEach(key => {          if (elementosData[key].type === \"proyect\") {            delete elementosData[key];          }        });        elementosData[\"future\"] = { nombre_elemento: this.nombreElemento, contador: 1, type: this.tipoElemento , mapid:16 };        localStorage.setItem(\"roles\", JSON.stringify(elementosData));        document.getElementById(\"userSelections\").value =  JSON.stringify(elementosData) ;        if (typeof vueInstance !== \"undefined\") { vueInstance.initializeData(); }        window.dispatchEvent(new Event(\"storage\"));        this.proyectos = Object.values(elementosData).filter(element => element.type === \"proyect\");        console.log(\"Elementos de tipo proyect recuperados:\", this.proyectos);      },    },    watch: {      selectedElement: function(newVal) {        console.log(\"Elemento seleccionado: \" + newVal);      },    },    mounted() {      this.retrieveProyectos();      window.addEventListener(\"storage\", this.handleProjectStorageChange);      if (this.proyectos.length > 0) {        const primerProyecto = this.proyectos[0];        this.selectedElement = primerProyecto.nombre_elemento;      }    },    beforeDestroy() {        window.removeEventListener(\"storage\", this.handleProjectStorageChange);    }  });});<\/script>[\/vc_column][\/vc_row][vc_row full_width=\u00bbstretch_row\u00bb bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1745262206892{padding-right: 5% !important;padding-bottom: 5% !important;padding-left: 5% !important;}\u00bb bg_color_value=\u00bb#ffffff\u00bb el_class=\u00bbsession-team-grupo\u00bb][vc_column width=\u00bb1\/2&#8243;]<div id=\"ultimate-heading-15866ab334021dee4\" class=\"uvc-heading ult-adjust-bottom-margin ultimate-heading-15866ab334021dee4 uvc-7529 accent-border-color\" data-hspacer=\"no_spacer\"  data-halign=\"center\" style=\"text-align:center\"><div class=\"uvc-heading-spacer no_spacer\" style=\"top\"><\/div><div class=\"uvc-main-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-15866ab334021dee4 h2'  data-responsive-json-new='{\"font-size\":\"desktop:44px;tablet:30px;tablet_portrait:30px;\",\"line-height\":\"desktop:54px;tablet_portrait:40px;\"}' ><h2 style=\"font-family:&#039;Raleway&#039;;font-weight:bold;color:#333333;margin-top:5%;margin-bottom:8%;\">Resumen de tu equipo<\/h2><\/div><div class=\"uvc-sub-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-15866ab334021dee4 .uvc-sub-heading '  data-responsive-json-new='{\"font-size\":\"desktop:22px;mobile_landscape:16px;\",\"line-height\":\"desktop:32px;mobile_landscape:26px;\"}'  style=\"font-family:&#039;Raleway&#039;;font-style:italic;font-weight:normal;color:#000000;\"><\/p>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\">\n<p class=\"cgHgbA pYZEjA Xp24Nw PanoWQ\" style=\"text-align: center;\">\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><\/div><\/div>    <div id=\"localstorage-content\">\n    <\/div>\n\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/vue@2\"><\/script>\n    <script>\n        var vueInstance; \/\/ Declara la variable en el \u00e1mbito global\n        document.addEventListener(\"DOMContentLoaded\", function() {\n            \/\/ Vue.js App\n            vueInstance = new Vue({\n                el: '#localstorage-content',\n                data: {\n                    storageData: {},\n                    keys: []\n                },\n                mounted() {\n                    this.initializeData();\n\n                    \/\/ Agrega un listener para el evento 'storage'\n                    window.addEventListener('storage', this.handleStorageChange);\n                },\n                beforeDestroy() {\n                    \/\/ Elimina el listener cuando el componente se destruye para evitar fugas de memoria\n                    window.removeEventListener('storage', this.handleStorageChange);\n                },\n                methods: {\n                    initializeData() {\n                        \/\/ Obtener el objeto del LocalStorage\n                        this.storageData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n\n                        \/\/ Obtener las claves del objeto\n                        this.keys = Object.keys(this.storageData);\n                    },\n                    handleStorageChange(event) {\n                        \/\/ Maneja el evento de cambio de almacenamiento\n                        if (event.key === \"roles\" || !event.key) {\n                            this.initializeData();\n                        }\n                    },\n                    clearLocalStorage() {\n                        if (confirm(\"Are you sure you want to clear your selection?\")) {\n                            localStorage.removeItem(\"roles\");\n                            this.initializeData();\n                            \n                            \/\/ Disparar evento para que otros componentes se enteren si es necesario\n                            window.dispatchEvent(new Event('storage'));\n                            \n                            \/\/ Recargar si es necesario para resetear contadores en otros componentes Vue\n                            location.reload(); \n                        }\n                    },\n                    applyRecommendedTeam() {\n                        const recRoles = {\n                            \"rec1\": { nombre_elemento: \" Gestor de Proyecto\", contador: 1, type: \"team\", mapid: \"16\" },\n                            \"rec2\": { nombre_elemento: \"Dise\u00f1ador UX \/ UI\", contador: 1, type: \"team\", mapid: \"16\" },\n                            \"rec3\": { nombre_elemento: \"Desarrollo Front-End\", contador: 1, type: \"team\", mapid: \"16\" },\n                            \"rec4\": { nombre_elemento: \"Ingeniero de Back-End\", contador: 1, type: \"team\", mapid: \"16\" },\n                            \"rec5\": { nombre_elemento: \" Ingeniero de Calidad\", contador: 1, type: \"team\", mapid: \"16\" },\n                            \"rec6\": { nombre_elemento: \"Ingeniero Full Stack\", contador: 1, type: \"team\", mapid: \"16\" },\n                            \"rec_proj\": { nombre_elemento: \"Ready in 3 to 6 months\", contador: 1, type: \"proyect\", mapid: \"16\" }\n                        };\n                        localStorage.setItem(\"roles\", JSON.stringify(recRoles));\n                        this.initializeData();\n                        \n                        window.dispatchEvent(new Event('storage'));\n                        if (typeof vueInstance !== \"undefined\") {\n                            vueInstance.initializeData();\n                        }\n                    },\n                    removeItem(index) {\n                        const rolesData = JSON.parse(localStorage.getItem(\"roles\")) || {};\n                        delete rolesData[index];\n                        localStorage.setItem(\"roles\", JSON.stringify(rolesData));\n                        this.initializeData();\n                        window.dispatchEvent(new Event('storage'));\n                        \n                        const userSelections = document.getElementById(\"userSelections\");\n                        if (userSelections) {\n                            userSelections.value = JSON.stringify(rolesData);\n                        }\n                    },\n                    findIndexByName(rolesData, roleName) {\n                        if (!roleName) return null;\n                        const searchName = roleName.trim().toLowerCase();\n                        return Object.keys(rolesData).find(index => {\n                            const item = rolesData[index];\n                            return item && item.nombre_elemento && item.nombre_elemento.trim().toLowerCase() === searchName;\n                        });\n                    },\n                },\n                template: `\n                <div class=\"sumary_container\">\n    <div v-if=\"keys.length > 0\" id=\"table-container\">\n        <!-- Tabla para \"My Team\" -->\n        <table>\n            <thead>\n                <tr>\n                    <th style=\"margin-left:10px;\">{{ 'Mi Equipo' }}<\/th>\n                    <th style=\"text-align:center;\">{{ 'Calidad' }}<\/th>\n                    <th><\/th>\n                <\/tr>\n            <\/thead>\n            <tbody>\n                <tr v-for=\"(element, index) in storageData\" :key=\"index\" v-if=\"element.type === 'team'\" >\n                    <td  >\n                        <span class=\"table_name\">\n                            <i aria-hidden=\"true\" class=\"fa fa-user btn_avatar_sumary\"><\/i>\n                            {{ element.nombre_elemento }}\n                        <\/span>\n                    <\/td>\n                    <td style=\"text-align:center;\">{{ element.contador }}<\/td>\n                    <td style=\"text-align:right;\">\n                        <i class=\"fa fa-times-circle removeItemIcon\" @click=\"removeItem(index)\" style=\"color: #e74c3c; cursor: pointer; font-size: 18px;\"><\/i>\n                    <\/td>\n                <\/tr>\n            <\/tbody>\n        <\/table>\n\n        <!-- Tabla para \"Project Details\" -->\n        <table>\n            <thead>\n                <tr>\n                    <th>{{ 'Plazo del proyecto' }}<\/th>\n                    <th><\/th>\n                <\/tr>\n            <\/thead>\n            <tbody>\n                <tr v-for=\"(element, index) in storageData\" :key=\"index\" v-if=\"element.type === 'proyect'\">\n                    <td>\n                        <span class=\"table_name\">\n                            <i class=\"fa fa-clock btn_avatar_sumary\" aria-hidden=\"true\"><\/i>\n                            {{ element.nombre_elemento }}\n                        <\/span>\n                    <\/td>\n                    <td style=\"text-align:right;\">\n                        <i class=\"fa fa-times-circle removeItemIcon\" @click=\"removeItem(index)\" style=\"color: #e74c3c; cursor: pointer; font-size: 18px;\"><\/i>\n                    <\/td>\n                <\/tr>\n            <\/tbody>\n        <\/table>\n\n        <!-- Bot\u00f3n para borrar todo -->\n        <div class=\"clear-selection-container\" style=\"text-align: center; margin-top: 20px;\">\n            <button class=\"ai-recommendation-btn clear-btn\" @click=\"clearLocalStorage\" style=\"background-color: #e74c3c; border: none; color: white; padding: 10px 20px; border-radius: 5px; cursor: pointer; font-size: 14px;\">\n                <i class=\"fa fa-trash\"><\/i>\n                {{ 'Borrar Selecci\u00f3n' }}\n            <\/button>\n        <\/div>\n    <\/div>\n\n    <div v-else class=\"empty-selection-placeholder\" style=\"text-align: center; padding: 30px; border: 2px dashed #ccc; border-radius: 10px;\">\n        <h3 style=\"margin-bottom: 20px;\">{{ 'Crea tu equipo' }}<\/h3>\n        <div class=\"ai-recommendation-btn\" @click=\"applyRecommendedTeam\" style=\"display: inline-block; background-color: #3498db; color: white; padding: 15px 25px; border-radius: 30px; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 4px 6px rgba(0,0,0,0.1);\">\n            <i class=\"fa fa-magic\" style=\"margin-right: 10px;\"><\/i>\n            {{ 'Recomendaci\u00f3n de IA' }}\n        <\/div>\n        <p style=\"margin-top: 20px; color: #7f8c8d;\">{{ 'Selecciona los miembros manualmente o utiliza nuestra recomendaci\u00f3n.' }}<\/p>\n    <\/div>\n<\/div>\n\n                `\n            });\n        });\n    <\/script>\n\n    [\/vc_column][vc_column width=\u00bb1\/2&#8243;]<div id=\"ultimate-heading-45086ab334021e896\" class=\"uvc-heading ult-adjust-bottom-margin ultimate-heading-45086ab334021e896 uvc-9073 accent-border-color\" data-hspacer=\"no_spacer\"  data-halign=\"center\" style=\"text-align:center\"><div class=\"uvc-heading-spacer no_spacer\" style=\"top\"><\/div><div class=\"uvc-main-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-45086ab334021e896 h2'  data-responsive-json-new='{\"font-size\":\"desktop:44px;tablet:30px;tablet_portrait:30px;\",\"line-height\":\"desktop:54px;tablet_portrait:40px;\"}' ><h2 style=\"font-family:&#039;Raleway&#039;;font-weight:bold;color:#333333;margin-top:5%;margin-bottom:8%;\">P\u00eddeme un presupuesto<\/h2><\/div><div class=\"uvc-sub-heading ult-responsive\"  data-ultimate-target='.uvc-heading.ultimate-heading-45086ab334021e896 .uvc-sub-heading '  data-responsive-json-new='{\"font-size\":\"desktop:22px;mobile_landscape:16px;\",\"line-height\":\"desktop:32px;mobile_landscape:26px;\"}'  style=\"font-family:&#039;Raleway&#039;;font-style:italic;font-weight:normal;color:#000000;\"><\/p>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\">\n<p class=\"cgHgbA pYZEjA Xp24Nw PanoWQ\" style=\"text-align: center;\">\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div class=\"DF_utQ _682gpw _0xkaeQ\">\n<div class=\"aF9o6Q _0yZ6Qg\">\n<div class=\"AdBbhQ hGbcYA _7rUwsA\" lang=\"es-ES\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><\/div><\/div>[vc_raw_html]W2NvbnRhY3QtZm9ybS03IGlkPSI5ZThiOGVkIiB0aXRsZT0iRXF1aXBvIGRlIGNvbnN0cnVjY2nDs24iIGNsYXNzPSJ3cGNmNyJdCgo=[\/vc_raw_html][\/vc_column][\/vc_row]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[vc_row][vc_column][\/vc_column][\/vc_row][vc_row full_width=\u00bbstretch_row_content\u00bb equal_height=\u00bbyes\u00bb content_placement=\u00bbmiddle\u00bb bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1707406949856{margin-top: 0px !important;margin-bottom: 0px !important;padding-top: 0px !important;padding-right: 3% !important;padding-bottom: 0px !important;}\u00bb bg_color_value=\u00bb#114774&#8243;][vc_column width=\u00bb1\/2&#8243; el_class=\u00bbcolumnas\u00bb][vc_single_image image=\u00bb5680&#8243; img_size=\u00bb950&#215;700&#8243; alignment=\u00bbcenter\u00bb][\/vc_column][vc_column width=\u00bb1\/2&#8243; el_class=\u00bbcolumnas\u00bb][\/vc_column][\/vc_row][vc_row full_width=\u00bbstretch_row_content\u00bb bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1707250134859{padding-right: 5% !important;padding-left: 5% !important;}\u00bb bg_color_value=\u00bb#efefef\u00bb][vc_column el_id=\u00bbbuild-your-team\u00bb][\/vc_column][\/vc_row][vc_row bg_type=\u00bbbg_color\u00bb css=\u00bb.vc_custom_1745256259340{padding-right: 3% !important;padding-left: 3% !important;}\u00bb bg_color_value=\u00bb#efefef\u00bb el_class=\u00bbsession-item-rol\u00bb][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;][\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;][\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3 vc_col-md-4 vc_col-xs-12&#8243;][\/vc_column][vc_column width=\u00bb1\/3&#8243; offset=\u00bbvc_col-lg-3&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"pageGetInfoArch.php","meta":{"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"class_list":["post-5920","page","type-page","status-publish","hentry","description-off"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.4 (Yoast SEO v28.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Crea tu equipo de ingenier\u00eda empresarial | Info-Arch<\/title>\n<meta name=\"description\" content=\"Info-Arch ofrece servicios de selecci\u00f3n de personal inform\u00e1tico de \u00e9lite y desarrollo nearshore para ampliar tus equipos de ingenier\u00eda empresarial en EE. UU. y Latinoam\u00e9rica. \u00a1Colaboremos para alcanzar el \u00e9xito!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/info-arch.com\/es\/forma-tu-equipo\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Crea tu equipo de ingenier\u00eda empresarial | Info-Arch\" \/>\n<meta property=\"og:description\" content=\"Info-Arch ofrece servicios de selecci\u00f3n de personal de TI de \u00e9lite y desarrollo nearshore para ampliar tus equipos de ingenier\u00eda empresarial en EE. UU. y Latinoam\u00e9rica. \u00a1Colaboremos para alcanzar el \u00e9xito!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/info-arch.com\/es\/forma-tu-equipo\/\" \/>\n<meta property=\"og:site_name\" content=\"INFOARCH\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-17T19:25:34+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Crea tu equipo ahora\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/info-arch.com\\\/es\\\/forma-tu-equipo\\\/\",\"url\":\"https:\\\/\\\/info-arch.com\\\/es\\\/forma-tu-equipo\\\/\",\"name\":\"Crea tu equipo de ingenier\u00eda empresarial | Info-Arch\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/info-arch.com\\\/#website\"},\"datePublished\":\"2024-02-02T13:16:07+00:00\",\"dateModified\":\"2026-09-17T19:25:34+00:00\",\"description\":\"Info-Arch ofrece servicios de selecci\u00f3n de personal inform\u00e1tico de \u00e9lite y desarrollo nearshore para ampliar tus equipos de ingenier\u00eda empresarial en EE. UU. y Latinoam\u00e9rica. \u00a1Colaboremos para alcanzar el \u00e9xito!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/info-arch.com\\\/es\\\/forma-tu-equipo\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/info-arch.com\\\/es\\\/forma-tu-equipo\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/info-arch.com\\\/es\\\/forma-tu-equipo\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/info-arch.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Crea tu equipo ahora\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/info-arch.com\\\/#website\",\"url\":\"https:\\\/\\\/info-arch.com\\\/\",\"name\":\"INFOARCH\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/info-arch.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Crea tu equipo de ingenier\u00eda empresarial | Info-Arch","description":"Info-Arch ofrece servicios de selecci\u00f3n de personal inform\u00e1tico de \u00e9lite y desarrollo nearshore para ampliar tus equipos de ingenier\u00eda empresarial en EE. UU. y Latinoam\u00e9rica. \u00a1Colaboremos para alcanzar el \u00e9xito!","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:\/\/info-arch.com\/es\/forma-tu-equipo\/","og_locale":"es_ES","og_type":"article","og_title":"Crea tu equipo de ingenier\u00eda empresarial | Info-Arch","og_description":"Info-Arch ofrece servicios de selecci\u00f3n de personal de TI de \u00e9lite y desarrollo nearshore para ampliar tus equipos de ingenier\u00eda empresarial en EE. UU. y Latinoam\u00e9rica. \u00a1Colaboremos para alcanzar el \u00e9xito!","og_url":"https:\/\/info-arch.com\/es\/forma-tu-equipo\/","og_site_name":"INFOARCH","article_modified_time":"2026-09-17T19:25:34+00:00","twitter_card":"summary_large_image","twitter_title":"Crea tu equipo ahora","twitter_misc":{"Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/info-arch.com\/es\/forma-tu-equipo\/","url":"https:\/\/info-arch.com\/es\/forma-tu-equipo\/","name":"Crea tu equipo de ingenier\u00eda empresarial | Info-Arch","isPartOf":{"@id":"https:\/\/info-arch.com\/#website"},"datePublished":"2024-02-02T13:16:07+00:00","dateModified":"2026-09-17T19:25:34+00:00","description":"Info-Arch ofrece servicios de selecci\u00f3n de personal inform\u00e1tico de \u00e9lite y desarrollo nearshore para ampliar tus equipos de ingenier\u00eda empresarial en EE. UU. y Latinoam\u00e9rica. \u00a1Colaboremos para alcanzar el \u00e9xito!","breadcrumb":{"@id":"https:\/\/info-arch.com\/es\/forma-tu-equipo\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/info-arch.com\/es\/forma-tu-equipo\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/info-arch.com\/es\/forma-tu-equipo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/info-arch.com\/es\/"},{"@type":"ListItem","position":2,"name":"Crea tu equipo ahora"}]},{"@type":"WebSite","@id":"https:\/\/info-arch.com\/#website","url":"https:\/\/info-arch.com\/","name":"INFOARCH","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/info-arch.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"}]}},"_links":{"self":[{"href":"https:\/\/info-arch.com\/es\/wp-json\/wp\/v2\/pages\/5920","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/info-arch.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/info-arch.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/info-arch.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/info-arch.com\/es\/wp-json\/wp\/v2\/comments?post=5920"}],"version-history":[{"count":21,"href":"https:\/\/info-arch.com\/es\/wp-json\/wp\/v2\/pages\/5920\/revisions"}],"predecessor-version":[{"id":7191,"href":"https:\/\/info-arch.com\/es\/wp-json\/wp\/v2\/pages\/5920\/revisions\/7191"}],"wp:attachment":[{"href":"https:\/\/info-arch.com\/es\/wp-json\/wp\/v2\/media?parent=5920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}