Cursos 100% gratuitos
Sem taxas de matrícula. Cursos gratuitos para quem tem renda familiar mensal de até 2 salários mínimos federais.
Escolha entre cursos livres, técnicos, de idiomas e ensino médio técnico.
Acreditamos que a educação tem o poder de transformar vidas. Por isso, anualmente, o Programa Senac de Gratuidade garante o acesso a milhares de bolsas de estudos. Até 2023, foram mais de 1,5 milhão de pessoas atendidas pelo programa.
Já são mais de 2 milhões de pessoas beneficiadas
Sem taxas de matrícula. Cursos gratuitos para quem tem renda familiar mensal de até 2 salários mínimos federais.
Nos cursos livres, técnicos, de idiomas e ensino médio técnico você ganha todos os materiais usados nas aulas.
Abrem 20 dias antes do início das aulas, sempre às 12hs. São preenchidas por ordem de chegada, sem provas e taxas
O envio da inscrição não garante a bolsa, pois as vagas são limitadas. Acompanhe o resultado pelo seu e-mail
O valor do salário mínimo é R$1.621,00. Descubra se com a sua renda familiar você poderá solicitar uma bolsa.
Você dever ler na página do curso os campos "Posso fazer este curso?" e "Como me matricular?" para saber detalhes sobre escolaridade e documentação.
Para solicitar uma bolsa, você não pode fazer outro curso no Senac nos mesmos dias e horários.
Não é possível se matricular como bolsista em um curso que você já comprou.
Se esse foi o seu caso, você deve esperar 6 meses para solicitar uma nova bolsa.
Você pode ser bolsista em até dois cursos ao mesmo tempo, desde que sejam cursos, dias e horários diferentes.
Assista ao tutorial e saiba como se inscrever!
Lembre-se: para se inscrever é preciso atender todas as regras do programa.
As inscrições para bolsas em cursos livres, de idiomas e técnicos começam 20 dias antes do início do curso, sempre às 12 horas.
Para inscrições de bolsas para o ensino médio técnico, acompanhe a abertura da matrícula na página do ensino médio técnico.
Você também encontra mais detalhes sobre datas e horários das turmas nas páginas dos cursos.
Após clicar no botão de inscrição, faça login em nosso site utilizando a conta da pessoa que irá se inscrever para a bolsa. Depois, você será direcionado ao sistema de solicitação de bolsas de estudo. Lá, você deve preencher o formulário até receber a mensagem "Inscrição enviada com sucesso".
Atualize seus dados cadastrais no site do Senac
Para não perder tempo no momento da solicitação, preencha ou atualize seus dados cadastrais no site do Senac São Paulo antes da abertura das vagas de bolsa. Se ainda não tem conta, faça agora seu cadastro.
Importante: tenha certeza que você fez o login em nosso site com a conta de quem irá estudar com a gente, pois os dados informados no cadastro serão utilizados para solicitar a bolsa.
As inscrições começam ao meio dia
Se atente ao dia e horário de abertura da inscrição, pois as vagas são preenchidas por ordem de chegada.
Procure uma boa conexão de internet
No dia de realizar sua inscrição, esteja em um local com boa conexão de internet.
Após realizar a inscrição da bolsa de estudo, toda comunicação com você será por e-mail, Área Exclusiva e/ou SMS. Por isso, mantenha seus dados de e-mail e telefone atualizados no cadastro do site.
Bolsa aprovada
Você receberá no seu e-mail um link para realizar sua matrícula.
Caso não faça a matrícula no prazo indicado, você perderá a bolsa.
Importante: confirme datas e horários da sua turma, pois se faltar no primeiro dia de aula sua bolsa será cancelada.
Bolsa em lista de espera
Você saberá o número que ocupa na lista de espera, recebendo no seu e-mail as atualizações dessa lista. Acompanhe para saber se conseguirá ou não uma vaga.
Bolsa não aprovada
Não desanime, escolha outro curso e faça uma nova inscrição!
Precisa de mais informações? Confira as dúvidas frequentes sobre o programa de bolsas.
Acessar dúvidas frequentesAs inscrições abrem 20 dias antes do início do curso, sempre às 12 horas, e as vagas são limitadas.
The following has evaluated to null or missing:
==> unidade [in template "20102#20129#91047004" at line 424, column 74]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: ${unidade.nomeUsual?trim} [in template "20102#20129#91047004" at line 424, column 72]
----
1<style>
2 #btn-search:disabled{
3 opacity:0.5;
4 }
5
6 .ssp-new-bolsa__filtro-select-content .select-dropdown button {
7 gap: 8px;
8 }
9
10 a.btn-clean-element, a.btn-clean-element:hover {
11 text-decoration: none !important;
12 color: var(--marca-azulsenac-400) !important;
13 font-size: 14px;
14 font-weight: 600;
15 }
16
17 input.filter-search, input.filter-search:focus,input.filter-search::placeholder{
18 font-size: 16px;
19 border:none;
20 outline: none;
21 padding: 0;
22 width: 100%;
23 }
24
25
26</style>
27
28<#assign unidadesAPI = serviceLocator.findService("br.senac.unidades.api.Unidades") />
29<#assign searchAPI = serviceLocator.findService("br.senac.search.api.Search")>
30<#assign contentAPI = serviceLocator.findService("br.senac.services.api.WebContent") />
31<#assign companyId = themeDisplay.getCompanyId() />
32<#assign groupId = themeDisplay.getScopeGroupId() />
33
34<#assign tiposRequeridos = {
35 "Ensino Médio Técnico" : "Ensino Médio Técnico",
36 "Livre" : "Cursos Livres e Idiomas",
37 "Técnico" : "Cursos Técnicos"
38} />
39<#assign tipos = contentAPI.categoriesByVocabularyName(groupId, "Tipo de curso", 0) />
40<#assign tipos = tipos?filter(t -> tiposRequeridos?keys?seq_contains(t.name)) />
41
42<#assign areas = contentAPI.categoriesByVocabularyName(groupId, "Tema(Mercadológico)", 0) />
43
44<#assign unidades = unidadesAPI.getUnidades(companyId, null, null, 100, 0) />
45
46<#function getUrlSubPath >
47 <#attempt>
48 <#assign url = themeDisplay.getURLCurrent()?replace("//", "/") />
49 <#assign friendly = url?split("/")[1]?split("?")?first />
50 <#if !friendly?contains("web") >
51 <#if url?split("/")?size gt 2 >
52 <#assign friendly = url?split("/")[2]?split("?")?first />
53 <#else>
54 <#assign friendly = "" />
55 </#if>
56
57 <#else>
58 <#if url?split("/")?size gt 4 >
59 <#assign friendly = url?split("/")[4]?split("?")?first>
60 <#else>
61 <#assign friendly = "" />
62 </#if>
63 </#if>
64
65 <#return friendly />
66 <#recover>
67 <#return ''>
68 </#attempt>
69
70</#function>
71<#assign hasSubPath = (getUrlSubPath() == "cursos-com-bolsa") />
72
73<div class="ssp-new-bolsa__buscar-cursos-form-filtro-content">
74 <form id="filter">
75
76 <fieldset class="ssp-new-bolsa__filtro-select-content">
77 <legend class="label-legenda">Em qual unidade quer estudar?</legend>
78 <div class="select-dropdown" id="filter-unidade">
79 <button type="button" role="combobox" aria-autocomplete="list" aria-owns="filter-unidade-content"
80 aria-label="Filtrar por unidade" class="">
81 <i aria-hidden="true" class="fa-regular fa-chevron-down"></i>
82 </button>
83 <ul class="dropdown-content" role="listbox" aria-expanded="false"
84 aria-multiselectable="true" aria-orientation="vertical" tabindex="0"
85 id="filter-unidade-content">
86 </ul>
87 </div>
88 </fieldset>
89
90 <fieldset class="ssp-new-bolsa__filtro-select-content">
91 <legend class="label-legenda">Qual tipo de curso?</legend>
92 <div class="select-dropdown" id="filter-tipo-curso">
93 <button type="button" id="btn-combolist" role="combobox" aria-autocomplete="list"
94 aria-owns="filter-tipo-curso-content" aria-label="Filtrar por tipo de curso" class="">
95 <i aria-hidden="true" class="fa-regular fa-chevron-down"></i>
96 </button>
97 <ul class="dropdown-content" role="listbox" aria-expanded="false"
98 aria-multiselectable="true" aria-orientation="vertical" tabindex="0"
99 id="filter-tipo-curso-content">
100 </ul>
101 </div>
102 </fieldset>
103
104 <fieldset class="ssp-new-bolsa__filtro-select-content">
105 <legend class="label-legenda">Qual a sua área de interesse?</legend>
106 <div class="select-dropdown" id="filter-area">
107 <button type="button" role="combobox" aria-autocomplete="list" aria-owns="filter-area-content"
108 aria-label="Filtrar por área de interesse" class="">
109 <i aria-hidden="true" class="fa-regular fa-chevron-down"></i>
110 </button>
111 <ul class="dropdown-content" role="listbox" aria-expanded="false" aria-multiselectable="true"
112 aria-orientation="vertical" tabindex="0" id="filter-area-content">
113 </ul>
114 </div>
115
116 </fieldset>
117
118 <fieldset id="filter-qual-periodo-group" class="ssp-new-bolsa__filtro-select-content">
119 <legend class="label-legenda">Para qual período?</legend>
120 <div class="checkbox-content" id="filter-periodo">
121 <label for="manha" class="checkbox-button">
122 <input type="checkbox" id="manha" name="periodo" value="MA">
123 Manhã
124 </label>
125 <label for="tarde" class="checkbox-button">
126 <input type="checkbox" id="tarde" name="periodo" value="TA">
127 Tarde
128 </label>
129 <label for="noite" class="checkbox-button">
130 <input type="checkbox" id="noite" name="periodo" value="NO">
131 Noite
132 </label>
133 </div>
134 </fieldset>
135
136 <fieldset id="inicio-bolsa-group" class="ssp-new-bolsa__filtro-select-content">
137 <legend class="label-legenda">Quando você quer solicitar uma bolsa?</legend>
138 <div class="select-dropdown" id="filter-inicio-bolsa">
139 <button type="button" role="combobox" aria-autocomplete="list" aria-owns="filter-inicio-bolsa-content"
140 aria-label="Quando você quer solicitar uma bolsa?" class="">
141 <i aria-hidden="true" class="fa-regular fa-chevron-down"></i>
142 </button>
143 <ul class="dropdown-content" role="listbox" aria-expanded="false" aria-multiselectable="true"
144 aria-orientation="vertical" tabindex="0" id="filter-inicio-bolsa-content">
145 </ul>
146 </div>
147
148 </fieldset>
149
150 <button id="btn-search" type="button" class="btn-buscar-cursos" disabled>
151 <span>Buscar cursos com bolsas </span>
152 </button>
153
154 </form>
155</div>
156
157<#if hasSubPath>
158 <div id="loading-container"></div>
159
160 <div id="result-container" class="ssp-new-bolsa__page-cursos-content-cards-cursos d-none" >
161 <p class="resultados-text"></p>
162 <div id="results" class="grid-cards-cursos-bolsa">
163
164 </div>
165
166 <#-- Mensagem caso não encontre cursos -->
167 <div id="no-result-msg" class="grid-sem-cursos d-none">
168 <h3>Opa! Não encontramos resultados para a sua busca</h3>
169 <p>Altere ou limpe os filtros para fazer uma nova busca.</p>
170 <button type="button" id="btn-clean-all" style="cursor:pointer">Limpar todos os filtros</button>
171 </div>
172
173 <a href="#filter" class="btn-float-refazer-busca">
174 <span>Refazer busca</span>
175 <i class="fa-solid fa-arrow-up"></i>
176 </a>
177
178 </div>
179</#if>
180
181<script>
182
183 const ajaxGetCall = url =>{
184 return $.ajax({
185 url: url,
186 method: 'GET',
187 dataType:'json'
188 });
189 }
190
191 const filter = {
192 unidades : [],
193 tipos : [],
194 areas : [],
195 periodo : [],
196 dataBolsa : []
197 }
198
199 const search = {
200 unidades : [],
201 areas : [],
202 tipos : [],
203 mapUnidadesCategories : new Map(),
204 isSearchPage : ("${hasSubPath?c}" === "true"),
205 redirectParams : new URLSearchParams(window.location.search)
206 }
207
208 const regioes = {
209 'C':'Capital',
210 'I':'Interior',
211 'GS':'Grande São Paulo',
212 'N':'Outras Regiões'
213 }
214
215 const unidadeCategorySearch = async (codUnidade) => {
216
217 let category = search.mapUnidadesCategories.get(codUnidade);
218 if(!category){
219 const url = '/o/senac-content-services/categoriaPorCodUnidade/${groupId}/{codUnidade}'
220 .replace('\{codUnidade\}', codUnidade);
221
222 category = await ajaxGetCall(url);
223 search.mapUnidadesCategories.set(codUnidade, category);
224 }
225
226 return category;
227
228 }
229
230 const getFilterUrlParams = async (includeCategoryIdsUnidade = false) => {
231
232 const getCategoryIdsUnidades = async (urls) => {
233 let categories = [];
234 if(urls.length){
235 for(let urlUnidade of urls){
236 let categoryByURL = search.unidades.filter(un => un.friendlyURL == urlUnidade);
237 if(categoryByURL.length){
238 let category = await unidadeCategorySearch(categoryByURL[0].codigoUnidade);
239 categories.push(category);
240 }
241 }
242 }
243 return categories;
244 }
245
246 const isRedirect = (search.isSearchPage && search.redirectParams.size > 0);
247 let paramsUnidade = isRedirect ? search.redirectParams.getAll('unidade') : filter.unidades;
248 let categoryIdsUnidade = null;
249 let searchParams = isRedirect ? search.redirectParams : new URLSearchParams();
250
251 if(includeCategoryIdsUnidade && paramsUnidade && paramsUnidade.length){
252 categoryIdsUnidade = await getCategoryIdsUnidades(paramsUnidade);
253 categoryIdsUnidade.forEach(id => searchParams.append('categoryIdsUnidade', id));
254 searchParams.set('considerarUnidade', (categoryIdsUnidade && categoryIdsUnidade.length) ? 1 : 0);
255 }
256
257 if(isRedirect) return searchParams;
258
259 // change filter selection object to queryparams
260
261 if(filter.unidades) filter.unidades.forEach(u => searchParams.append('unidade', u));
262 if(filter.tipos) filter.tipos.forEach(t => searchParams.append('categoryIdsTipoCurso', t));
263 if(filter.areas) filter.areas.forEach(a => searchParams.append('categoryIdsTema', a));
264 if(filter.periodo) filter.periodo.forEach(p => searchParams.append('periodosOferta', p));
265 if(filter.dataBolsa) filter.dataBolsa.forEach(d => {
266 let [inicio, fim] = d.split("|");
267 searchParams.append('datasInicioBolsa', inicio);
268 searchParams.append('datasFimBolsa', fim);
269 });
270
271 return searchParams;
272 }
273
274 const cursosearch = async () => {
275
276 let url = "/o/senac-content-services/cursosComBolsa/${groupId}/-1/-1?ordenarPelaOferta=1&";
277 let filterParams = await getFilterUrlParams(true);
278 filterParams.delete('unidade');
279 if(!filterParams.getAll('categoryIdsTipoCurso').length){
280 // evitar trazer tipos que nao estao na lista
281 search.tipos.map(t => t.categoryId).forEach(id => filterParams.append('categoryIdsTipoCurso', id));
282 }
283 url += filterParams.toString();
284 return ajaxGetCall(url);
285
286 }
287
288 const resetResults = () => {
289 if(!$('#no-result-msg').hasClass('d-none')) $('#no-result-msg').addClass('d-none');
290 $('#results').empty();
291 }
292
293 const getResults = async () => {
294 loading('#loading-container');
295 resetResults();
296 const $results = $('#results, .resultados-text');
297 if(!$results.hasClass('d-none')) $results.addClass('d-none');
298 try{
299 let cursosSearch = await cursosearch();
300 let total = cursosSearch.total;
301 cursosSearch = cursosSearch.cursos;
302
303 $('#result-container').removeClass('d-none');
304 $('#loading-container').empty();
305
306 if(total == 0){
307 $('#no-result-msg').removeClass('d-none');
308 return;
309 }
310
311 $results.removeClass('d-none');
312 $('.resultados-text').html('<strong>'+total+'</strong> ' + (total>1 ? 'resultados' : 'resultado'));
313
314 $.each(cursosSearch,function(k, curso) {
315 let infoBotoes = [];
316 infoBotoes[curso.articleId] = {'botaoBolsas':'true'};
317 let itemCurso = buildCardCurso(curso, infoBotoes, ($(window).width() <=1024));
318 itemCurso.addClass('card-curso-nivel-2');
319 let hrefCard = itemCurso.find('.ck-curso').attr('href') + '?bolsa=true';
320 itemCurso.find('.ck-curso').attr('href', hrefCard);
321 $('#results').append(itemCurso);
322 });
323
324 }catch(err){
325 console.error(err);
326 $('#loading-container').empty();
327 $('#no-result-msg').removeClass('d-none');
328 if(!$results.hasClass('d-none')) $results.addClass('d-none');
329 }
330 }
331
332 const resetFilter = () => {
333 const filterSection = document.getElementById('filter');
334
335 $(`#filter-unidade-content input:checked,
336 #filter-tipo-curso-content input:checked,
337 #filter-area-content input:checked,
338 #filter-inicio-bolsa-content input:checked,
339 input[name=periodo]:checked`).prop('checked', false);
340
341 $.each($(`#filter-unidade-content,
342 #filter-tipo-curso-content,
343 #filter-area-content,
344 #filter-inicio-bolsa-content`),
345 (i, el) => refreshLabelSelector($(el).parents('.select-dropdown').first()));
346
347 $('#btn-search').attr('disabled','');
348
349 filterSection.scrollIntoView({ behavior: 'smooth' });
350
351 }
352
353 const applyFilter = async () => {
354
355 filter.unidades = getSelection($('#filter-unidade-content')).filter(u => !Object.keys(regioes).includes(u)) || [];
356 filter.tipos = getSelection($('#filter-tipo-curso-content')) || [];
357 filter.areas = getSelection($('#filter-area-content')) || [];
358 filter.periodo = getSelection($('#filter-periodo')) || [];
359 filter.dataBolsa = $('.this-month:checked:last, .next-month:checked').map(function(){return $(this).val()}).get() || [];
360
361 if(!search.isSearchPage){
362 const current = window.location;
363 const hash = ($(window).width() <= 768) ? '#inicio-bolsa-group' : '#filter';
364 const filterParams = await getFilterUrlParams(false);
365 window.location.href = current.origin + current.pathname + "/cursos-com-bolsa?" + filterParams.toString() + hash;
366 } else{
367 if(search.redirectParams.size > 0){
368 // remove redirect data
369 search.redirectParams = new URLSearchParams();
370 window.history.pushState({}, '', window.location.origin + window.location.pathname);
371 }
372 getResults();
373 }
374
375 }
376
377 const getSelection = ($element) => {
378 return $element.find('input:checked').map(
379 function(){if($(this).val() > '0') return $(this).val();}
380 ).get();
381 }
382
383 const createOption = (value, text, selected=false, cssClass='') => {
384 let $input = '';
385
386 $input = $('<input type="checkbox">');
387 $input.attr('value', value);
388 if(selected) $input.prop('checked',true);
389 if(cssClass.length > 0){
390 $input.addClass(cssClass);
391 if(cssClass.indexOf('d-none') >= 0) $input.attr('disabled','');
392 }
393
394 const $label = $('<label></label>');
395 $label.html(text);
396 $label.prepend($input);
397 const $option = $('<li role="option"></li>');
398 $option.append($label);
399 return $option;
400 }
401
402 const initSelector = ($element) => {
403
404 $element.empty();
405 let $txtSearch = $('<label><input type="text" class="filter-search"></label>');
406 let $btnClean = $('<a class="btn-clean-element d-none">limpar</a>');
407 $element.siblings('button').first().prepend($txtSearch, $btnClean);
408
409 $txtSearch.keyup(searchSelect);
410 $txtSearch.focusout(()=>$('.filter-search').val(''));
411
412 $btnClean.click((ev) => {
413 let $select = $(ev.target).parents('.select-dropdown').first();
414 $select.find('input').prop('checked', false);
415 $select.find('li').removeClass('d-none');
416 refreshLabelSelector($select);
417 checkSearchBtn();
418 });
419
420 }
421
422 const initSelectorUnidade = async () => {
423
424 search.unidades = [<#list unidades as unidade>{ "nomeUsual" : "${unidade.nomeUsual?trim}", "codigoUnidade" : "${unidade.codigoUnidade}", "codRegiaoUnidade" : "${unidade.codRegiaoUnidade}", "friendlyURL" : "${unidade.friendlyURL}"}, </#list>];
425
426 const $element = $('#filter-unidade-content');
427 initSelector($element);
428
429 let unidParams = search.redirectParams.getAll('unidade');
430
431 let $selectAllOption = createOption(-1, '<b>Selecionar todos</b>', false, 'multiple-selection all-selection');
432 $element.append($selectAllOption);
433 let allSelected = unidParams.length > 0;
434
435 for(r of Object.keys(regioes)){
436 let unidadesRegiao = search.unidades.filter(ur => ur.codRegiaoUnidade == r).sort((a, b) => a["nomeUsual"].localeCompare(b["nomeUsual"]));
437 if(unidadesRegiao.length > 0){
438 let $rOption = createOption(r, '<b>'+regioes[r]+'</b>', false, 'multiple-selection');
439 $element.append($rOption);
440 let allRegSelected = unidParams.length > 0;
441 for(u of unidadesRegiao){
442 let selected = false;
443 if(unidParams.length > 0) selected = unidParams.includes(u.friendlyURL);
444
445 $element.append(createOption(u.friendlyURL, u.nomeUsual, selected));
446 allRegSelected = allRegSelected && selected;
447 allSelected = allSelected && selected;
448 }
449 if(allRegSelected) $rOption.find('input').prop('checked', true);
450 }
451 }
452 if(allSelected) $selectAllOption.find('input').prop('checked', true);
453
454 refreshLabelSelector($element.parents('.select-dropdown').first());
455 $element.find('input').change(changeUnidade);
456 }
457
458 const initSelectorTipos = ()=>{
459
460 search.tipos = [<#list tipos as t>{ "displayName" : "${tiposRequeridos[t.name]}", "categoryId" : "${t.categoryId}"}, </#list>];
461 const $element = $('#filter-tipo-curso-content');
462 initSelector($element);
463
464 let tiposParams = search.redirectParams.getAll('categoryIdsTipoCurso');
465
466 let $selectAllOption = createOption(-1, '<b>Selecionar todos</b>', false, 'multiple-selection all-selection');
467 $element.append($selectAllOption);
468 let allSelected = tiposParams.length > 0;
469
470 search.tipos.sort((a, b) => a["displayName"].localeCompare(b["displayName"])).forEach(tipo => {
471 let selected = tiposParams.includes(tipo.categoryId);
472 $element.append(createOption(tipo.categoryId, tipo.displayName, selected));
473 allSelected = allSelected && selected;
474 });
475 if(allSelected) $selectAllOption.find('input').prop('checked', true);
476
477 refreshLabelSelector($element.parents('.select-dropdown').first());
478 $element.find('input').change(changeSelect);
479
480 }
481
482 const initSelectorAreas = ()=>{
483
484 search.areas = [<#list areas as a>{ "name" : "${a.name?trim}", "categoryId" : "${a.categoryId}"}, </#list>];
485 const $element = $('#filter-area-content');
486 initSelector($element);
487
488 let areasParams = search.redirectParams.getAll('categoryIdsTema');
489
490 let $selectAllOption = createOption(-1, '<b>Selecionar todos</b>', false, 'multiple-selection all-selection')
491 $element.append($selectAllOption);
492 let allSelected = areasParams.length > 0;
493
494 search.areas.sort((a, b) => a["name"].localeCompare(b["name"])).forEach(area => {
495 let selected = areasParams.includes(area.categoryId);
496 $element.append(createOption(area.categoryId, area.name, selected));
497 allSelected = allSelected && selected;
498 });
499 if(allSelected) $selectAllOption.find('input').prop('checked', true);
500
501 refreshLabelSelector($element.parents('.select-dropdown').first());
502 $element.find('input').change(changeSelect);
503
504 }
505
506 const initSelectorData = ()=>{
507
508 const formatDate = (date) => {
509 let format = Array.of(date.getFullYear(), (date.getMonth()<9 ?'0':'') + (date.getMonth()+1), (date.getDate()<=9 ?'0':'') + date.getDate());
510 return format.join('-');
511 }
512
513 const calcDate = (startDate, daysDiff)=>{
514 const dayMillis = 60 * 60 * 24 * 1000;
515 daysDiff*=dayMillis;
516 return new Date(startDate.getTime() + daysDiff);
517 }
518
519 const getDateRange = (startDate, endDate) => formatDate(startDate) + '|' + formatDate(endDate);
520
521 const today = new Date();
522 const minRange = calcDate(today, -365);
523 const maxRange = calcDate(today, 365);
524 const dateOptions = {
525 "Hoje" : {'dates': getDateRange(minRange, calcDate(today,0)), 'class':'this-month'},
526 "Esta Semana" : {'dates': getDateRange(minRange, calcDate(today,7)), 'class':'this-month'},
527 "Este mês" : {'dates': getDateRange(minRange, new Date(today.getFullYear(), today.getMonth() + 1, 0)), 'class':'this-month'},
528 "Próximos meses" : {'dates': getDateRange(new Date(today.getFullYear(), today.getMonth() + 1), maxRange), 'class':'next-month'}
529 }
530
531 const $element = $('#filter-inicio-bolsa-content');
532 initSelector($element);
533
534 let dataInicioParams = search.redirectParams.getAll('datasInicioBolsa');
535 let dataFimParams = search.redirectParams.getAll('datasFimBolsa');
536
537 $element.append(createOption('', '<b>Bolsas abertas em:</b>', false, 'd-none'));
538 Object.keys(dateOptions).forEach(option => {
539 let selected = false;
540 if(dataInicioParams.length > 0 && dataFimParams.length > 0){
541 const [inicio, fim] = dateOptions[option].dates.split('|');
542 selected = dataInicioParams.includes(inicio) && dataFimParams.includes(fim);
543 }
544 $element.append(createOption(dateOptions[option].dates, option, selected, dateOptions[option].class));
545 });
546
547 refreshLabelSelector($element.parents('.select-dropdown').first());
548 $element.find('input').change(changeSelect);
549
550 }
551
552 const initSelectorPeriodo = ()=>{
553 const paramPeriodo = search.redirectParams.get('periodosOferta');
554 if(paramPeriodo) $('input[name=periodo][value='+paramPeriodo+']').prop('checked', true);
555 }
556
557 const refreshLabelSelector = ($element) => {
558 let checked = $element.find('input:checked').not('.multiple-selection');
559 let $filterSearch = $element.find('.filter-search').first();
560 let $btnClean = $element.find('.btn-clean-element').first();
561 if(checked.length == 0){
562 $filterSearch.attr('placeholder', 'Selecionar');
563 if(!$btnClean.hasClass('d-none')) $btnClean.addClass('d-none');
564 }
565 else{
566 $filterSearch.attr('placeholder', checked.length == 1 ? checked.parent().text() : (checked.length + ' Selecionados'));
567 $btnClean.removeClass('d-none');
568 }
569 }
570
571 const changeSelect = (ev) => {
572 const $select = $(ev.target).parents('.select-dropdown').first();
573 if($(ev.target).attr('value') == -1) $select.find('input').prop('checked', $(ev.target).is(':checked'));
574 else $select.find('input[value=-1]').prop('checked', false);
575 refreshLabelSelector($select);
576 }
577
578 const changeUnidade = (ev) => {
579 const $select = $(ev.target).parents('.select-dropdown');
580 const siglasRegioes = Object.keys(regioes);
581 if(siglasRegioes.includes($(ev.target).attr('value'))){
582 let unidadesRegiao = search.unidades.filter(u => u.codRegiaoUnidade == $(ev.target).attr('value')).map(u => u.friendlyURL);
583 $.each($select.find('input'), (i, item) => {
584 if(unidadesRegiao.includes($(item).val())) $(item).prop('checked', $(ev.target).is(':checked'));
585 });
586 }else if($(ev.target).attr('value') != -1){
587 $.each($select.find('input'), (i, item) => {
588 if(siglasRegioes.includes($(item).val())) $(item).prop('checked', false);
589 });
590 }
591 changeSelect(ev);
592
593 }
594
595 const searchSelect = (ev) => {
596
597 const normalize = word => {
598 return word
599 .toLowerCase()
600 .trim()
601 .normalize("NFD")
602 .replace(/[\u0300-\u036f]/g, "");
603 }
604
605 let txt = $(ev.target).val();
606 let $list = $(ev.target).parents('.select-dropdown').find('ul').first();
607 if(txt.trim().length == 0) $list.find('li').removeClass('d-none');
608 else{
609 txt = normalize(txt);
610 $.each($list.find('input[type="checkbox"]').not('.multiple-selection').parents("li"), (_,$item) => {
611 let itemVal = $($item).find('label').text();
612 if(normalize(itemVal).indexOf(txt) >=0 ) $($item).removeClass('d-none');
613 else if(!$($item).hasClass('d-none')) $($item).addClass('d-none');
614 });
615 let $multiples = $list.find('input.multiple-selection').parents("li");
616 if($multiples.length > 0 && !$multiples.hasClass('d-none')) $multiples.addClass('d-none');
617 }
618
619 }
620
621 const checkSearchBtn = () =>{
622
623 if($('#filter input:checked').length > 0) $('#btn-search').removeAttr('disabled');
624 else $('#btn-search').attr('disabled','');
625
626 }
627
628 $(async ()=>{
629 loading('#loading-container');
630
631 initSelectorAreas();
632 initSelectorTipos();
633 initSelectorData();
634 initSelectorPeriodo();
635 await initSelectorUnidade();
636
637 if(search.redirectParams.size > 0){
638 $('#btn-search').removeAttr('disabled');
639 getResults();
640 }
641 else $('#loading-container').empty();
642
643 $('#btn-search').click(() => applyFilter());
644
645 $('#btn-clean-all').click(() => resetFilter());
646
647 $('#filter input').change(()=> checkSearchBtn());
648
649 });
650
651 const toggleDropdown = (dropdownContent)=>{
652 var isExpanded = dropdownContent.getAttribute('aria-expanded') === 'true';
653 dropdownContent.setAttribute('aria-expanded', !isExpanded);
654
655 if (!isExpanded) {
656 dropdownContent.classList.add('dropdown-active'); // Ensure class is added before focusing
657 dropdownContent.querySelectorAll('li.d-none').forEach(item => item.classList.remove('d-none'));
658 } else {
659 dropdownContent.classList.remove('dropdown-active');
660 }
661 }
662
663 const btnComboList = document.querySelectorAll('.ssp-new-bolsa__filtro-select-content .select-dropdown button');
664
665 btnComboList.forEach((comboList) => {
666 comboList.addEventListener('click', (e) => {
667 if(!e.target.classList.contains('btn-active')){
668 let active = document.querySelector('.btn-active');
669 if(active) active.click();
670 }
671 let parentDropdownContent = comboList.parentElement;
672 let dropdownContent = parentDropdownContent.querySelector('.dropdown-content');
673 comboList.classList.toggle('btn-active');
674 toggleDropdown(dropdownContent);
675 });
676 })
677
678 window.onclick = function(ev){
679
680 let $target = $(ev.target);
681 if( $target.parents('.select-dropdown').length == 0){
682
683 let activeCombos = document.querySelectorAll('.select-dropdown .btn-active');
684 activeCombos.forEach((combo) => {
685 let parentDropdownContent = combo.parentElement;
686 let dropdownContent = parentDropdownContent.querySelector('.dropdown-content');
687 combo.classList.toggle('btn-active');
688 toggleDropdown(dropdownContent);
689 });
690
691 }
692 }
693
694</script>
É com esse propósito que nosso programa de bolsas de estudo, o Senac de Gratuidade, cria oportunidade para pessoas transformarem suas vidas.
Desde 2008, o programa é referência em educação inclusiva e inovadora e já ofereceu mais de 2 milhões de bolsas.
Confira no vídeo ao lado como o programa muda a vida das pessoas na prática!
Técnico em Hotelaria
Senac PiracicabaFiz quatro cursos livres e um curso técnico como bolsista. Foi a realização de um sonho, sem falar que o mercado reconhece o diferencial de quem estuda no Senac. Hoje, moro em Portugal e trabalho numa conceituada rede hoteleira.
Técnico em Podologia
Senac Santo AndréO Senac foi a melhor experiência de aprendizado que já tive. Além da qualidade do ensino, da estrutura e dos laboratórios, o material didático também está incluso. Se não fosse por tudo que o Senac me possibilitou, talvez não alcançaria meus objetivos.
Ensino Médio Técnico em Administração
Senac CampinasO jeito Senac de educar é diferente de tudo o que eu conhecia. Durante um dos projetos pedagógicos, criei uma ideia de negócio que deu certo de verdade. Hoje tenho a minha empresa e uma perspectiva de futuro.
Técnico em Guia de Turismo
Senac PindamonhangabaQueria fazer transição de carreira, mas não sabia por onde começar. As aulas, a estrutura e os professores fizeram a diferença. Aprendi o que precisava para tirar meus planos do papel e abrir minha agência de ecoturismo.
Clique no assunto e conheça as dúvidas mais frequentes.
Após finalizar a inscrição, você receberá as informações sobre as próximas etapas no seu e-mail. Se atente à caixa de spam ou acompanhe os detalhes na Área Exclusiva. Todo o processo de solicitação de bolsa acontece de forma on-line. Se a sua bolsa for aprovada, você receberá um link para realizar a sua matrícula no e-mail cadastrado. Caso não faça a matrícula no prazo indicado, você perderá a vaga.
Basta seguir todas as orientações que receber do Senac São Paulo por e-mail, como entregar as documentações dentro do prazo, realizar sua matrícula no curso e comparecer às aulas.
Se você tiver menos de 18 anos, também precisará apresentar RG e CPF da pessoa que é sua responsável legal.
Se você abandonar o curso, sua matrícula será cancelada e você vai precisar esperar seis meses para solicitar uma nova vaga no Programa Senac de Gratuidade. Essa regra existe para estimular a escolha pela bolsa com responsabilidade já que as vagas são limitadas, dando preferência a quem realmente busca essa oportunidade.
Lembramos que, no momento da matrícula, você - ou seu responsável legal - precisa aceitar o termo de compromisso, que apresenta as regras do programa e explica o que acontece em caso de desistência sem justificativa.
Não desanime! Sempre estamos com vagas de bolsas abertas em diversos cursos. Acompanhe as opções em nosso site e tente novamente
Não. A inscrição é apenas a primeira etapa do processo para você solicitar uma bolsa de estudo.
Em até 30 minutos após a realização da sua inscrição, você receberá um e-mail indicando o status do seu pedido de bolsa de estudo e possíveis orientações sobre as próximas etapas.
As inscrições para bolsas de estudo acontecem por ordem de chegada. Se você ficou em lista de espera, significa que outras pessoas se inscreveram antes de você e preencheram as vagas disponíveis para aquela turma.
Caso alguém desista ou não avance nas próximas etapas, você receberá nosso e-mail para seguir no processo de inscrição de bolsa.
Sim, mas existem regras. Para quem é estudante bolsista, as novas solicitações devem ser feitas depois de terminado o curso atual. Além disso, só vai ser possível entrar com novo pedido em outros cursos e em dias e horários diferentes daquele onde já esteja matriculado.
Já estudantes pagantes só podem pedir uma bolsa de estudos em outros dias e horários do curso onde esteja matriculado.
A inscrição para bolsas de estudo no Senac São Paulo é 100% online.
Se você não tiver computador, não se preocupe! Você pode fazer a inscrição pelo seu celular e, se precisar, também pode ir até uma de nossas unidades, pois todas oferecem computadores com internet para que possa se inscrever.
Confira nessa página as regras e as etapas para realizar a sua inscrição de bolsa de estudo em cursos livres, técnicos e ensino médio técnico.
Se você quer bolsa para cursos de graduação, confira aqui os programas disponíveis.
O Programa Senac de Gratuidade oferece cursos livres, técnicos, de idiomas, ensino médio técnico e aprendizagem profissional. É uma excelente oportunidade para quem busca qualificação gratuita e de qualidade.
Não é possível solicitar bolsas de estudo via Programa Senac de Gratuidade para a graduação. Mas, caso você já esteja cursando a
graduação no Senac São Paulo poderá se inscrever em programas específicos como bolsas de extensão universitária, bolsa social, monitoria, iniciação científica, entre outras ações. Conheça os detalhes desses programas.
Você pode cancelar a inscrição para a bolsa de estudo acessando a sua Área Exclusiva em nosso site. É só fazer o seu login e cancelar.
As vagas para bolsas de estudo são preenchidas por ordem de chegada no processo de inscrição, que começa em nosso site sempre 20 dias antes do início do curso, às 12 horas. Caso o início do curso seja prorrogado, é possível que o prazo de inscrição para bolsa seja mais longo do que o normal.
Recebe a bolsa de estudo quem concluir a inscrição no site enquanto houver vagas disponíveis e tiver aprovação nas etapas seguintes, como entrega de todos os documentos dentro dos prazos indicados.
Sim. O Senac poderá solicitar documentos que comprovem a renda, caso haja indícios de irregularidades no preenchimento da inscrição ou da Autodeclaração ou em casos de denúncias de fraude nas informações declaradas na inscrição. Se ainda houver dúvidas sobre o que está registrado na Autodeclaração de Renda, a unidade pode pedir outros documentos que comprovem a renda de cada morador da mesma residência.
Você deve ter renda familiar de até 2 salários mínimos federais por pessoa.
Utilize nossa calculadora de renda familiar e descubra se você poderá solicitar ou não uma bolsa.