Sobre a unidade
A Unidade II do Senac em Juiz de Fora (Blue Tower) conta com ampla oferta de cursos, tendo sido inaugurada em 2015, com intuito de aumentar a oferta dos produtos educacionais no município. Neste Centro de Educação Profissional, os alunos podem optar entre as áreas de Comércio, Comunicação, Gestão, Hospitalidade, Idiomas, Informática, entre outras.
No Blue Tower também há opções de cursos técnicos - Segurança do Trabalho e Administração - MBAs e turmas do Programa Jovem Aprendiz - iniciativa que oferece formação profissional a jovens entre 14 e 18 anos.
A equipe do Senac em Juiz de Fora (Unidades I e II) é responsável pelo atendimento de mais de 50 municípios na região da Zona da Mata.

Programa de gratuidade Senac
Da formação inicial ao nível técnico, com custo zero, o Programa Senac de Gratuidade foi pensado como um instrumento de inclusão produtiva para brasileiros oriundos de família de baixa renda.
A estrutura
Na Unidade Blue Tower você encontra:
• 5 salas convencionais;
• 2 laboratórios de informática;
• Equipamentos multimídia;
• Acessibilidade;
• Equipe Docente e Administrativa.
Visite a unidade e conheça os cursos disponíveis para você!

Notícias relacionadas
Avaliação de nossos alunos
Acompanhe avaliações dos nossos alunos sobre os cursos desta unidade.
Confira abaixo onde estamos localizados e como chegar até a unidade. Através do mapa interativo, você pode traçar rotas, visualizar os arredores e planejar sua visita com facilidade.
Denied access to method or field getAttribute of class org.apache.catalina.core.ApplicationHttpRequest
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign layoutDisplayPageObjectProvid... [in template "70687763866433#20120#33250" at line 21, column 1]
---- 1<#-- Extrai latitude e longitude dos dois formatos de URL do Google Maps --> 2<#function getCoords geolocationUrl> 3 <#if geolocationUrl?contains("!3d") && geolocationUrl?contains("!4d")> 4 <#return { 5 "lat": geolocationUrl?keep_after("!3d")?keep_before("!"), 6 "lng": geolocationUrl?keep_after("!4d")?keep_before("!") 7 } /> 8 <#elseif geolocationUrl?contains("@")> 9 <#local coordsPart = geolocationUrl?keep_after("@") /> 10 <#return { 11 "lat": coordsPart?keep_before(","), 12 "lng": coordsPart?keep_after(",")?keep_before(",") 13 } /> 14 </#if> 15 <#return {"lat": "", "lng": ""} /> 16</#function> 17 18<#-- Conteúdo exibido pela página de exibição (/w/...), quando houver --> 19<#assign currentUnit = {} /> 20<#assign displayArticle = "" /> 21<#assign layoutDisplayPageObjectProvider = (request.getAttribute("LAYOUT_DISPLAY_PAGE_OBJECT_PROVIDER"))! /> 22 23<#if layoutDisplayPageObjectProvider?has_content && layoutDisplayPageObjectProvider.getClassName() == "com.liferay.journal.model.JournalArticle"> 24 <#assign displayArticle = layoutDisplayPageObjectProvider.getDisplayObject() /> 25</#if> 26 27<#-- Alternativa: URL amigável do conteúdo, o trecho depois de /w/ --> 28<#assign currentURL = themeDisplay.getURLCurrent()?keep_before("?") /> 29<#if !displayArticle?has_content && currentURL?contains("/w/")> 30 <#assign urlTitle = currentURL?keep_after_last("/w/")?keep_before("/") /> 31 <#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 32 <#assign displayArticle = (JournalArticleLocalService.fetchArticleByUrlTitle(themeDisplay.getScopeGroupId(), urlTitle))!"" /> 33</#if> 34 35<#assign displayGeolocationUrl = "" /> 36<#assign displayCoords = {"lat": "", "lng": ""} /> 37 38<#if displayArticle?has_content> 39 <#assign displayDocXml = saxReaderUtil.read(displayArticle.getContent()) /> 40 <#assign displayGeolocationUrl = displayDocXml.valueOf("//dynamic-element[@field-reference='geolocation']/dynamic-content[@language-id='${locale}']")!"" /> 41 <#if !displayGeolocationUrl?has_content> 42 <#assign displayGeolocationUrl = displayDocXml.valueOf("(//dynamic-element[@field-reference='geolocation']/dynamic-content)[1]")!"" /> 43 </#if> 44 <#assign displayCoords = getCoords(displayGeolocationUrl?trim) /> 45 46 <#if displayCoords.lat?has_content && displayCoords.lng?has_content> 47 <#assign currentUnit = { 48 "id": displayArticle.getResourcePrimKey()?c, 49 "title": displayArticle.getTitle(locale), 50 "lat": displayCoords.lat, 51 "lng": displayCoords.lng, 52 "geolocationUrl": displayGeolocationUrl 53 } /> 54 </#if> 55</#if> 56 57<#if entries?has_content || currentUnit?has_content> 58 <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script> 59 60 <div id="map" style="height: 480px;"></div> 61 62 <script> 63 const allUnitsData = []; 64 const currentUnit = <#if currentUnit?has_content>{ 65 id: "${currentUnit.id}", 66 title: "${currentUnit.title?js_string}", 67 lat: "${currentUnit.lat}", 68 lng: "${currentUnit.lng}", 69 viewURL: window.location.href.split('?')[0], 70 geolocationUrl: "${currentUnit.geolocationUrl?js_string}" 71 }<#else>null</#if>; 72 </script> 73 74 <#-- Collect all units data --> 75 <#list entries as curEntry> 76 <#assign assetRenderer = curEntry.getAssetRenderer() /> 77 <#assign journalArticle = assetRenderer.getArticle() /> 78 <#assign docXml = saxReaderUtil.read(journalArticle.getContent()) /> 79 <#assign viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, assetRenderer, curEntry, !stringUtil.equals(assetLinkBehavior, "showFullContent")) /> 80 <#assign geolocationUrl = docXml.valueOf("//dynamic-element[@field-reference='geolocation']/dynamic-content[@language-id='${locale}']")!"" /> 81 82 <#-- Add unidadeId to viewURL --> 83 <#assign unidadeId = journalArticle.getResourcePrimKey() /> 84 <#assign viewURL = viewURL?keep_before_last("?") /> 85 <#if viewURL?contains("?")> 86 <#assign viewURL = viewURL + "&unidadeId=" + unidadeId /> 87 <#else> 88 <#assign viewURL = viewURL + "?unidadeId=" + unidadeId /> 89 </#if> 90 91 <#assign coords = getCoords(geolocationUrl) /> 92 <#assign lat = coords.lat /> 93 <#assign lng = coords.lng /> 94 95 <#if lat?has_content && lng?has_content> 96 <script> 97 allUnitsData.push({ 98 id: "${unidadeId}", 99 title: "${curEntry.getTitle(locale)?js_string}", 100 lat: "${lat}", 101 lng: "${lng}", 102 viewURL: "${viewURL?js_string}", 103 geolocationUrl: "${geolocationUrl?js_string}" 104 }); 105 </script> 106 </#if> 107 </#list> 108 109 <script> 110 // Function to initialize map with units 111 async function initMap(unitsToShow) { 112 if (unitsToShow.length === 0) return; 113 114 const map = L.map('map').setView([unitsToShow[0].lat, unitsToShow[0].lng], 13); 115 const customIcon = L.icon({ 116 iconUrl: '${themeDisplay.getPathThemeImages()}/marker-icon.png', 117 iconSize: [42, 64], 118 iconAnchor: [22, 94], 119 popupAnchor: [0, -90] 120 }); 121 122 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { 123 attribution: '© OpenStreetMap contributors' 124 }).addTo(map); 125 126 const group = L.featureGroup(); 127 128 unitsToShow.forEach(unit => { 129 const showDetailsButton = unitsToShow.length > 1; 130 131 const popupContent = ` 132 <div class="d-flex justify-content-between align-items-center"> 133 <h4 class="font-weight-bold text-primary mb-0">` + unit.title + `</h4> 134 <a 135 class="btn btn-link text-primary-1-100 p-0" 136 href="` + unit.geolocationUrl + `" 137 target="_blank" 138 rel="noopener noreferrer" 139 > 140 Ver no mapa 141 </a> 142 </div> 143 ` + (showDetailsButton ? ` 144 <a 145 class="btn btn-primary text-white btn-block mt-3" 146 href="` + unit.viewURL + `" 147 target="_blank" 148 > 149 Ver detalhes da unidade 150 </a> 151 ` : '') + ` 152 `; 153 L.marker([unit.lat, unit.lng], { icon: customIcon }) 154 .bindPopup(popupContent) 155 .addTo(group); 156 }); 157 158 group.addTo(map); 159 map.fitBounds(group.getBounds()); 160 } 161 162 // Get unidadeId from URL 163 const urlParams = new URLSearchParams(window.location.search); 164 const unidadeIdFromUrl = urlParams.get('unidadeId'); 165 166 // Main initialization 167 async function init() { 168 // Página de exibição: usa a geolocalização do próprio conteúdo exibido 169 if (currentUnit) { 170 initMap([currentUnit]); 171 } else if (unidadeIdFromUrl) { 172 // Try to fetch specific unit from Headless API 173 try { 174 const response = await fetch( 175 window.location.origin + '/o/headless-delivery/v1.0/structured-contents/' + unidadeIdFromUrl, 176 { 177 method: 'GET', 178 headers: { 179 'Accept': 'application/json' 180 } 181 } 182 ); 183 184 if (response.ok) { 185 const unitData = await response.json(); 186 // Extract geolocation from contentFields 187 const geolocationField = unitData.contentFields?.find(f => f.name === 'geolocation'); 188 const geolocationUrl = geolocationField?.contentFieldValue?.data || ''; 189 190 if (geolocationUrl) { 191 // Parse lat/lng from Google Maps URL 192 let lat = '', lng = ''; 193 if (geolocationUrl.includes('!3d') && geolocationUrl.includes('!4d')) { 194 lat = geolocationUrl.split('!3d')[1]?.split('!')[0] || ''; 195 lng = geolocationUrl.split('!4d')[1]?.split('!')[0] || ''; 196 } else if (geolocationUrl.includes('@')) { 197 const coords = geolocationUrl.split('@')[1]?.split(',') || []; 198 lat = coords[0] || ''; 199 lng = coords[1] || ''; 200 } 201 202 if (lat && lng) { 203 const unit = { 204 id: unidadeIdFromUrl, 205 title: unitData.title || '', 206 lat: lat, 207 lng: lng, 208 viewURL: window.location.href.split('?')[0], 209 geolocationUrl: geolocationUrl 210 }; 211 initMap([unit]); 212 return; 213 } 214 } 215 } 216 } catch (error) { 217 console.warn('Error fetching unit from Headless API:', error); 218 } 219 220 // Fallback: filter from local data 221 const filteredUnits = allUnitsData.filter(unit => unit.id === unidadeIdFromUrl); 222 initMap(filteredUnits); 223 } else { 224 // Show all units 225 initMap(allUnitsData); 226 } 227 } 228 229 init(); 230 </script> 231</#if> 