Publicador de Conteúdos e Mídias

Entrada da unidade Senac São Bernardo do Campo, estrutura espelhada com detalhes vermelhos.
Foto: André Mortatti

Conheça nossos cursos

Publicador de Conteúdos e Mídias

Técnico Livre Ensino Médio Técnico Jovem Aprendiz EAD

Cursos com bolsa de estudo

Senac Online - ao vivo

Cursos em destaque

Publicador de Conteúdos e Mídias

Um erro ocorreu enquanto processava o modelo.
Java method "com.liferay.journal.model.impl.JournalArticleImpl.getContent()" threw an exception when invoked on com.liferay.journal.model.impl.JournalArticleImpl object "{\"mvccVersion\": 2, \"ctCollectionId\": 0, \"uuid\": \"3765fd01-24e9-ab04-6fb0-fd757f1b1196\", \"id\": 105942411, \"resourcePrimKey\": 42164213, \"groupId\": 20125, \"companyId\": 20102, \"userId\": 44841, \"userName\": \"API Integração\", \"createDate\": \"Tue Jan 25 18:59:57 GMT 2022\", \"modifiedDate\": \"Mon Jul 07 21:02:53 GMT 2025\", \"externalReferenceCode\": \"42164211\", \"folderId\": 42112, \"classNameId\": 0, \"classPK\": 0, \"treePath\": \"/42112/\", \"articleId\": \"42164211\", \"version\": 5.8, \"urlTitle\": \"curso-tecnico-em-estilismo-e-coordenacao-de-moda\", \"DDMStructureKey\": \"41004\", \"DDMTemplateKey\": \"2186668\", \"defaultLanguageId\": \"pt_BR\", \"layoutUuid\": \"\", \"displayDate\": null, \"expirationDate\": null, \"reviewDate\": null, \"indexable\": true, \"smallImage\": false, \"smallImageId\": 0, \"smallImageURL\": \"\", \"lastPublishDate\": null, \"status\": 0, \"statusByUserId\": 44841, \"statusByUserName\": \"API Integração\", \"statusDate\": \"Mon Jul 07 21:02:53 GMT 2025\"}"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign document = saxReaderUtil.read...  [in template "20102#20129#40280" at line 15, column 5]
----
1<#-- 
2    Name: Cursos Sugeridos 
3    Type: Asset Publisher Widget Template 
4    Path: ROOT/assets/home-cursos-sugeridos/widget-templates/home-cursos-sugeridos.ftl 
5--> 
6 
7<#assign prefix = "ssp" /> 
8<#assign defaultImage = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuyJZ_Ky8o9kn0wiBy4mp5-3sb7xei_WudTL_3Jo6yvWmzQHuK&s" /> 
9 
10<#--  Detect the one valid dataEfetiva --> 
11<#assign today_dateInt = dateUtil.getCurrentDate("yyyyMMdd", locale)?number /> 
12<#list entries![] as entry> 
13 
14    <#assign renderer = entry.getAssetRenderer() /> 
15    <#assign document = saxReaderUtil.read(renderer.getArticle().getContent()) /> 
16    <#assign dataEfetivaRepeatableNode = document.getRootElement().selectNodes("//dynamic-element[@field-reference='dataEfetiva']") /> 
17 
18    <#assign greatestDataEfetiva_dateInt = 0 /> 
19    <#assign greatestDataEfetiva_dateInt_i = -1 /> 
20    <#assign i = -1 /> 
21    <#list dataEfetivaRepeatableNode as item> 
22        <#assign i++ /> 
23        <#assign currentDataEfetiva_DateObj = dateUtil.parseDate("yyyy-MM-dd", item.elementText("dynamic-content")?string, locale) /> <#-- make date obj from raw structure data --> 
24        <#assign currentDataEfetiva_dateInt = dateUtil.getDate(currentDataEfetiva_DateObj, "yyyyMMdd", locale)?number /> 
25        <#if currentDataEfetiva_dateInt lte today_dateInt && currentDataEfetiva_dateInt gt greatestDataEfetiva_dateInt> 
26            <#assign greatestDataEfetiva_dateInt = currentDataEfetiva_dateInt /> 
27            <#assign greatestDataEfetiva_dateInt_i = i /> 
28        </#if> 
29    </#list> 
30</#list> 
31 
32 
33<#--  Iterate the list with  --> 
34<#assign vocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") /> 
35<#assign normalizer = serviceLocator.findService("com.liferay.portal.kernel.util.FriendlyURLNormalizer") /> 
36 
37 
38 
39<div class="slick-area-estatico slick-area-estatico--md-bleed slider-container"> 
40 
41    <#list entries?reverse as entry> 
42 
43        <#if greatestDataEfetiva_dateInt_i??> 
44 
45            <div class="slick-area__item"> 
46 
47                <#assign renderer = entry.getAssetRenderer() /> 
48                <#assign document = saxReaderUtil.read(renderer.getArticle().getContent()) /> 
49                <#assign dataEfetivaRepeatableNode = document.getRootElement().selectNodes("//dynamic-element[@field-reference='dataEfetivaFT']") /> 
50                <#assign journalArticle = renderer.getArticle() /> 
51                <#assign articleIdCurso = journalArticle.getArticleId() /> 
52 
53				<#assign codigoFT = document.getRootElement().selectSingleNode("//dynamic-element[@field-reference='codigoFT']").getStringValue()?trim > 
54 
55                <#if dataEfetivaRepeatableNode?size gt 1> 
56                    <#assign item = dataEfetivaRepeatableNode[greatestDataEfetiva_dateInt_i] /> <#-- Choose only one of the repeatables if theres multiple --> 
57                <#else> 
58                    <#assign item = dataEfetivaRepeatableNode /> 
59                </#if> 
60 
61                <#if item??> 
62 
63                    <#-- Get fields --> 
64 
65                     
66 
67                     
68                    <#assign xPathSelector = saxReaderUtil.createXPath("//dynamic-element[@field-reference='imagemComercial']")> 
69 
70                    <#-- get imagem --> 
71                    <#if xPathSelector.selectSingleNode(item)?? > 
72 
73                        <#attempt> 
74   
75                            <#assign 
76                                imagemStr = xPathSelector.selectSingleNode(item).getStringValue() 
77                                imagemJson = jsonFactoryUtil.createJSONObject(imagemStr) 
78                                imagemId = getterUtil.getInteger(imagemJson.get('fileEntryId')) 
79                                dl = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService") 
80                                dlURLHelper = serviceLocator.findService("com.liferay.document.library.util.DLURLHelper") 
81                                fileEntry = dl.getFileEntry(imagemId) 
82
83                             
84                        <#recover> 
85 
86                        </#attempt> 
87 
88                        <#if fileEntry?? > 
89                             <#assign imagemUrl = dlURLHelper.getDownloadURL(fileEntry, fileEntry.getFileVersion(), themeDisplay,null)> 
90                        </#if> 
91 
92                    <#else> 
93                        <#assign imagemUrl = ""> 
94                    </#if> 
95 
96                    <#-- fnish get imagem --> 
97 
98 
99                    <#-- Paint! --> 
100                    <div class="${prefix}-card-curso" style="height: 288px;">  
101                    <#--  <div class="${prefix}-card-curso my-2 mx-3" id="" style="width: 237px; height: 288px;">     --> 
102 
103                        <a class="${prefix}-absolute-link ck-curso" id="link_curso_${codigoFT}" data-ck="${codigoFT}" href="#"></a> 
104 
105                        <div class="${prefix}-card-curso__image"> 
106							 
107                            <#if imagemUrl??> 
108 
109                            <div class="${prefix}-image-container" style="background-image: url(${imagemUrl}) "> 
110                                <img src="${imagemUrl}" /> 
111                            </div> 
112 
113                                <#else> 
114 
115                                <div class="${prefix}-image-container" style="background-image: url() "> 
116                                    <img src="" /> 
117                                </div> 
118 
119                            </#if> 
120 
121                        </div>                         
122 
123                        <div class="${prefix}-card-curso__body"> 
124 
125                            <#list entry.getCategories()![] as category> 
126                                <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim /> 
127 
128                                <#if normalizer.normalize(vocabularyName) == "tipo-de-curso"> 
129 
130                                    <#assign normalizedCategoryName = normalizer.normalize(category.getName()) /> 
131                                    <#assign categoryTipoCurso = category.getName() /> 
132 
133                                    <div class="ssp-card-curso__color-tag-modalidade bg-nivel-${normalizedCategoryName}"></div> 
134 
135                                </#if>  
136                                 
137                                <#if normalizer.normalize(vocabularyName) == "modalidade"> 
138                                    <#assign normalizedCategoryName = normalizer.normalize(category.getName()) /> 
139                                    <#assign categoryModalidade = category.getName() /> 
140                                </#if> 
141 
142                            </#list> 
143 
144                            <div class="${prefix}-card-curso__tags" style="margin-bottom:5px;"> 
145 
146                                <#list entry.getCategories()![] as category> 
147                                    <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim /> 
148 
149                                    <!-- Verificar o Tipo de curso --> 
150                                    <#if normalizer.normalize(vocabularyName) == "formato"> 
151										<#assign normalizedCategoryNameModalidade = normalizer.normalize(category.getName()) /> 
152 
153                                        <!-- Caso a modalidade de ensino seja EAD, insere a Tag do Senac ao vivo --> 
154                                        <#if normalizedCategoryNameModalidade?contains("senac-online-ao-vivo") > 
155                                         
156                                            <span class="tag-modalidade-title__senac-online">Senac Online - ao vivo</span> 
157 
158                                        <#else> 
159                                            <#assign textoCardCursoFinal = "" /> 
160                                              
161                                            <#if normalizer.normalize(categoryTipoCurso) == "livre" > 
162                                            	<!--  <#assign textoCardCursoFinal = "Curso Livre" + " ¿ " + category.getName() /> --> 
163                                            	<#assign textoCardCursoFinal = "Livre" /> 
164                                             
165                                            <#elseif normalizer.normalize(categoryTipoCurso) == "tecnico"> 
166                                           	  	<!-- <#assign textoCardCursoFinal = "Técnico" + " ¿ " + category.getName() /> --> 
167                                           	  	<#assign textoCardCursoFinal = "Técnico" /> 
168                                           	  	 
169                                           </#if> 	 
170                                            
171                                           <#if normalizedCategoryName == "graduacao"> 
172                                                <div style="font-size: 12px; line-height: 16px;"> 
173                                                    <div class="ssp-card-curso__tag-modalidade-title">Graduação</div> 
174 
175                                                    <#assign pos = categoryModalidade?index_of(" - ") + 3 /> 
176                                                    <#assign xPathSelectorDuracaoCursoFT = saxReaderUtil.createXPath("//dynamic-element[@field-reference='duracaoCursoFT']")> 
177                                                    <#assign duracaoCursoFT = xPathSelectorDuracaoCursoFT.selectSingleNode(item).getStringValue()> 
178                                                    <div class="ssp-card-curso__tag-formato-title">${categoryModalidade[pos..]} - ${duracaoCursoFT}</div> 
179                                                </div> 
180                                            </#if> 
181										</#if>  
182                                    </#if> 
183                                     
184                                </#list> 
185 
186                            </div> 
187                             
188                            <#assign  
189                                webContentServiceUtil = serviceLocator.findService("br.senac.services.service.WebContentServiceUtil") 
190                                curso = webContentServiceUtil.cursoInfoByJournalArticle(themeDisplay.getSiteGroupId(), journalArticle, false, true, true, false, false) 
191                            /> 
192 
193                            <span class="${prefix}-card-curso__tag-formato-title">${curso.toDisplay.tipoFormato}</span> 
194 
195                            <h6 class="${prefix}-card-curso__title pt-md-3"> 
196                                ${entry.getTitle(locale)} 
197                            </h6> 
198 
199                            <div class="${prefix}-card-curso__info d-none"> 
200 
201                                <span class="ssp-tag bg-white border-nivel-extensao text-nivel-extensao mr-1" id="botao_inscAberta_${articleIdCurso}">Inscriçôes abertas</span>  
202                                <span class="ssp-tag bg-white border-primary text-primary" id="botao_bolsa_${articleIdCurso}">Bolsas</span> 
203 
204                                <#--  <#list entry.getCategories()![] as category> 
205 
206                                    <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim /> 
207 
208                                    <#if normalizer.normalize(vocabularyName) == "unidades"> <#-- Break after finding the first one while there's no further logic implemented --> 
209                                        <#--  <small><i class="icon-map-marker mr-1"></i> ${category.getName()}</small> 
210                                        <#break> 
211                                    </#if> 
212 
213                                </#list>  -->  
214 
215                            </div> 
216 
217                        </div> 
218 
219                    </div> 
220 
221                </#if> 
222                 
223                <#-- Busca o link do curso --> 
224		 
225		<script> 
226	 
227		var isEmed = false;	 
228		var urlPage = window.location.href; 
229		var groupId = 20125; 
230		//var groupId = 20124; 
231 
232        var idCategoryByCodeUnit; 
233 
234		$(document).ready(function(){ 
235            // rotina para mostrar a tag do senac ao vivo 
236 
237			if(urlPage.indexOf('staging')> 1){ 
238			    groupId = 86888; 
239				//groupId = 419034; 
240
241			 
242			if(urlPage.indexOf('ensino-medio-tecnico')> 1){ 
243				isEmed = true; 
244
245			 
246			if(isEmed) 
247				buscaUrlCurso(0); 
248			else 
249				buscaUnidadeCategoryEUrlCurso(); 
250		 
251		 
252             
253			function  buscaUnidadeCategoryEUrlCurso(){ 
254                 
255                let map = new Map(); 
256 
257                if(idCategoryByCodeUnit != undefined) 
258                    map = new Map(JSON.parse(idCategoryByCodeUnit)); 
259 
260				var urlSearchCategories = '/o/senac-content-services/categoriaPorCodUnidade/{groupId}/{codUnidade}'; 
261				var urlSearch = urlSearchCategories.replace('\{groupId\}', groupId) 
262				.replace('\{codUnidade\}', $('#codUnidadeReferencia').text()); 
263	 
264				$.ajax({ 
265				url : urlSearch, 
266				async: false, 
267				method : 'get', 
268                beforeSend : function(xhr){ 
269                    if(idCategoryByCodeUnit != undefined && new Map(JSON.parse(idCategoryByCodeUnit)).get(urlSearch) != undefined){ 
270                        xhr.abort(); 
271                    }; 
272
273				}).done( 
274				function(data) { 
275	 
276				    if (data.toString().length > 0) { 
277 
278                        map.set(urlSearch, data); 
279                        idCategoryByCodeUnit = JSON.stringify([...map]); 
280					    		 
281
282	 
283                }); 
284 
285	            buscaUrlCurso(new Map(JSON.parse(idCategoryByCodeUnit)).get(urlSearch)); 
286				 
287			}; 
288 
289 
290            function buscaUrlCurso(unidadeCategory){ 
291				var urlSearchCursoUrl = '/o/senac-webcontent/webcontent/curso-url/{groupId}/{articleId}/{unidadeCategoryId}'; 
292				 
293				const url = urlSearchCursoUrl 
294		    	.replace('\{groupId\}', groupId) 
295		    	.replace('\{articleId\}', ${journalArticle.getArticleId()}) 
296		    	.replace('\{unidadeCategoryId\}',unidadeCategory); 
297		    	 
298		    	$.ajax({ 
299		    	    url :  url, 
300		    	    type : 'get' 
301		    	}) 
302		    	.done(function(res){ 
303		    		 
304		    		if(res.length > 0){ 
305						 
306		    			res = JSON.parse(res); 
307			    		 
308			    		$('#link_curso_${codigoFT}').attr('href', res.url); 
309		    		}		    					    		 
310		    		 
311		    	}); 
312			}; 
313 
314         
315        }); 
316	 
317		</script> 
318 
319            </div> 
320 
321        </#if> 
322	 
323	 
324		 
325 
326    </#list> 
327 
328</div> 

Próximas Turmas

Senac Online - ao vivo

Nossa infraestrutura

Publicador de Conteúdos e Mídias

Prédio espelhado com arco vermelho, céu azulado com totem laranja e a logo do Senac. foto: André Mortatti
Fachada do Senac São Bernardo do Campo

Com quase 9 mil metros quadrados de área construída, totalmente acessível as pessoas com deficiência e privilegiando conceitos de sustentabilidade, foi inaugurada em 20 de agosto de 2015. A unidade possui capacidade para atender cerca de 1.600 alunos por período, com a oferta distribuída pela manhã, tarde, noite e aos sábados. A unidade conta com 31 salas de aula e 14 ambientes especializados, uma cozinha pedagógica e outra experimental; laboratórios de rádio e vídeo, de farmácia, de meio ambiente, de enfermagem, de informática, hardware e de interiores; salas multifuncionais para moda e turismo e para visagismo e beleza, além de uma biblioteca, um auditório/teatro com capacidade para 150 pessoas e área de convivência.

Vista Aérea

Vista aérea de nossa escola.

Sala de aula com 3 bancadas na cor branca, e cadeiras ao redor nas cores azul e cinza. Nas mesas possuem computadores desmontados para estudo, fios, peças e kits que auxiliam na montagem e desmontagem. No fundo da sala possui 2 janelas e nas laterais computadores para utilização.
Laboratório de Hardware

O espaço possui 3 bancadas de trabalho pronto para atender aos cursos da área de redes e infraestrutura. Dispõe de máquinas e periféricos necessários para a montagem e desmontagem de um equipamento completo, possibilitando a prática do conhecimento adquirido em sala de aula. A sala dispões também de computadores para utilização e lousa eletrônica.

Laboratório de Design

Sala de aula para as práticas dos cursos das área de design e desenho, com bancadas, pranchetas e luminárias individuais.

LabSenac

Espaço colaborativo e de incentivo aos projetos desenvolvidos pelos nossos alunos. Trocas, construção e aprendizado em um ambiente exclusivo.

Laboratório de Beleza e Visagismo

O espaço é utilizado para todos os cursos práticos da área de beleza, com cadeiras hidráulicas, lavatórios, bancadas, espelhos e iluminação individual, pias e armários.

Laboratório de Moda

Espaço utilizado para as aulas de moda, modelagem, costura e desenho de moda. O espaço conta com manequins, provador, 3 máquinas industriais e bancada com 30 máquinas de costura para atividades dos alunos.

Laboratório de Enfermagem

Espaço utilizado para o curso Técnico em Enfermagem e demais títulos da área de saúde. Com equipamentos de última geração, o amplo laboratório conta com modelos anatômicos para ensino e pesquisa da anatomia humana, simulação de uma UTI e todos os equipamentos necessários para preparar o aluno para o mercado de trabalho.

Laboratório de Farmácia

Laboratório de Manicure e Pedicure

Sala de aula para as práticas do curso Manicure e Pedicure, com cadeiras de braço, cadeiras de manicure e todos os acessórios necessários para as atividades práticas.

Estúdio Fotográfico

Espaço utilizado para aulas práticas de fotografia, possui fundo infinito, mesa de still, equipamentos de iluminação e flash para o desenvolvimento de atividades práticas como foto publicitária e produção de moda.

Estúdio de Vídeo

Espaço utilizado para aulas práticas de vídeo, com equipamentos de luz, câmeras profissionais, microfones e demais equipamentos necessários para a atividade.

Estúdio de Rádio

Estúdio de Rádio

Laboratório de Informática

Espaço utilizado para aulas práticas, equipamentos com os mais modernos programas, o Senac oferece aula ministradas por profissionais cerificados e com experiência de mercado.

Cozinha Pedagógica

Sala Bar

Conheça a Unidade através do nosso Tour 360º

Tour 360º

Explore Senac

Publicador de Conteúdos e Mídias

#ConectaSenac

Publicador de Conteúdos e Mídias

Fale com a gente
pelo Whatsapp