Um erro ocorreu enquanto processava o modelo.
The following has evaluated to null or missing: ==> articleId [in template "20102#20129#28135110" at line 996, column 160] ---- 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: ${articleId} [in template "20102#20129#28135110" at line 996, column 158] ----
1<style>
2
3 body{
4 background-color:#e4e4e4;
5 }
6
7 .ssp:not(.liferay-instance) .ssp-card-detalhe-curso__description p {
8 max-width:830px;
9 }
10
11 .ssp:not(.liferay-instance) .ssp-card-detalhe-curso__title {
12 max-width:830px;
13 }
14
15 .ssp-card-unidade-curso{
16
17 width: 388px;
18 height: 514px;
19 background: #FFFFFF;
20 box-shadow: 0px 0px 12px #00000010;
21 opacity: 1;
22 border-radius: 12px;
23 padding: 29px 46px;
24
25 }
26
27 .section-slider-unidades{
28 padding: 40px 0 60px 0;
29 background: #2A2E43;
30 display: flex;
31 justify-content:center;
32 }
33
34 .ssp-card-unidade-curso>p{
35 margin: 28.56px 0!important;
36 color:#4f596f!important;
37 font-weight:600!important;
38 font-size:16px!important;
39 }
40
41 .ssp-card-unidade-curso a{
42 width: 295px;
43 height: 50px;
44 display: flex;
45 align-items: center;
46 justify-content: center;
47 margin-bottom: 28.56px;
48 }
49
50 .ssp-card-unidade-curso__nome-unidade{
51 display: flex;
52 color: #78849E;
53 }
54
55 .ssp-card-unidade-curso__nome-unidade p{
56 margin: 0!important;
57 font-size:22px!important;
58 font-weight: bold!important;
59 }
60
61 .ssp-card-unidade-curso__nome-unidade i{
62 font-size: 26px;
63 margin-right: 11px;
64 }
65
66 .ssp-card-unidade-curso__img-content{
67 width: 297px;
68 height: 235px;
69 background-color: #78849E;
70 border-radius: 12px;
71 margin-top: 24.5px;
72 background-size: cover;
73 background-position: center;
74
75 }
76
77 .ssp-slider-control-mobile {
78 display: none;
79 }
80
81 /*Card Mobile*/
82
83 @media only screen and (max-width: 1024px) {
84
85 .ssp-card-unidade-curso{
86
87 width: 334px;
88 height: 502px;
89 border-radius: 12px;
90 padding: 29px;
91 margin:12px;
92
93 }
94
95 .ssp-card-unidade-curso>p {
96 margin: 28.56px 0!important;
97 color: #4f596f!important;
98 font-weight: 600!important;
99 font-size: 15px!important;
100 }
101
102 .ssp-card-unidade-curso__img-content{
103
104 width: 100%;
105 height: 242px;
106 border-radius: 12px;
107 margin-top: 21.43px;
108
109 }
110
111 .ssp-card-unidade-curso__nome-unidade>p{
112 margin: 0!important;
113 font-size:18px!important;
114 font-weight: bold!important;
115 }
116
117 .ssp-card-unidade-curso__nome-unidade i{
118 font-size: 22px;
119 margin-right: 11px;
120 }
121
122
123 .ssp-slider-control-mobile {
124 display: flex;
125 justify-content: space-between;
126 color: white;
127 }
128
129 .ssp-slider-control-mobile__item-prev {
130 cursor: pointer;
131 }
132
133
134 .ssp:not(.liferay-instance) .oferta-slick-area--md-bleed .slick-arrow {
135 display: none !important;
136 color: white;
137 font-size: 14px;
138 font-weight: normal;
139 }
140
141 .ssp-slider-control-mobile__item-next {
142 cursor: pointer;
143 bottom: -30px!important;
144 right: 25px!important;
145 width: auto!important;
146 height: auto!important;
147 }
148
149 .ssp-slider-control-mobile__item-prev {
150 cursor: pointer;
151 bottom: -30px!important;
152 left: 25px!important;
153 width: auto!important;
154 height: auto!important;
155 }
156
157 }
158
159
160 /* Form de Aprendizagem */
161
162 [data-modal="modal"]{
163 background-color: rgba(0,0,0,0.7);
164 backdrop-filter: blur(10px);
165 display:none;
166 }
167
168 [data-modal="close-form-modal"]{
169
170 font-size: 22px;
171 background: unset!important;
172 color: white!important;
173 display: flex;
174 align-items: center;
175 margin: 0;
176 padding: 0;
177 position:absolute;
178 right:0;
179 border:0;
180 gap:5px;
181 right: 2%;
182 top: -2%;
183
184 }
185
186 [data-modal="close-form-modal"] i{
187
188 font-size:43px;
189 height:fit-content;
190
191 }
192
193 .open-modal-form{
194 position: fixed;
195 top: 0;
196 width: 100%;
197 height: 100%;
198 z-index: 100;
199 display: flex;
200 justify-content: center;
201 align-items: center;
202 overflow:auto;
203
204 }
205
206 .open-modal-form .ssp_ct_form_programe{
207 animation-name: animatetop;
208 animation-duration: .4s;
209 position:relative;
210 }
211
212 .ssp_ct_form_programe .lfr-ddm__default-page-header{
213 display:none;
214 }
215
216
217 label .reference-mark {
218 color:#78849e;
219 }
220 .lexicon-icon-asterisk {
221 color:#78849e;
222 }
223 .lexicon-icon-reload {
224 margin-left:10px;
225 }
226 .ssp_title_form_programe{
227 font-size: 42px!important;
228 color: #ffffff!important;
229 font-family: "Montserrat",sans-serif;
230 font-weight:600;
231 text-align:left;
232 }
233 .ssp_subtitle_form_programe {
234 margin-top:0px!important;
235
236 }
237 .ssp_subtitle_form_programe{
238 font-size: 20px!important;
239 color: #ffffff!important;
240 font-family: "Montserrat",sans-serif;
241 font-weight:600;
242 text-align:left;
243 }
244 .lfr-ddm-form-page {
245 background-color: #fff;
246 border-radius: 12px 12px 0px 0px;
247 padding: 35px 15px!important;
248 }
249 .ssp:not(.liferay-instance) .form-group label {
250 color: #78849E;
251 font: normal normal 600 16px/19px Montserrat;
252 padding-bottom: 10px;
253 }
254 .lfr-ddm-form-page-description {
255 display: none!important;
256 }
257 .lfr-ddm-form-page-title {
258 display: none!important;
259 }
260 .lfr-ddm-form-submit {
261 background-color: #0380F0;
262 text-align: center;
263 float: none!important;
264 border: 1px solid #0380F0;
265 border-radius: 6px;
266 font-size: 16px;
267 width: 245px;
268 height: 50px;
269 }
270 .lfr-ddm-form-pagination-controls {
271 background-color: #fff;
272 text-align: center;
273 border-radius: 0px 0px 12px 12px;
274 padding-bottom: 25px;
275 }
276 .ddm-form-name {
277 display: none!important;
278 }
279 .ddm-form-description {
280 display: none!important;
281 }
282 .ddm-form-builder-app {
283 margin-top:35px;
284 }
285 .taglib-captcha {
286 display: flex;
287 }
288 .input-text-wrapper {
289 left: 20px;
290 }
291 .lfr-ddm-form-pagination-controls {
292 padding-top:0px!important;
293 display:flex;
294 justify-content:center;
295 align-items: center;
296 flex-flow:column;
297}
298
299@media only screen and (max-width: 1024px) {
300
301 .open-modal-form{
302
303 align-items: flex-start;
304
305 }
306
307 .ddm-form-builder-app {
308 margin-top: 15px;
309 }
310
311 .ssp_title_form_programe{
312 font-size: 34px!important;
313 line-height: 1.2!important;
314 }
315 .ssp_subtitle_form_programe{
316 font-size:18px!important;
317 }
318 .taglib-captcha {
319 display:block;
320 }
321 .input-text-wrapper {
322 left:0;
323 }
324 .ssp_ct_form_programe {
325 padding:0px;
326 max-width:100%;
327 padding:40px 20px;
328 }
329
330 [data-modal="close-form-modal"]{
331
332 right: 20px;
333 top: 0;
334
335 }
336
337}
338
339.slick-area__item {
340 display: flex;
341 flex-basis: auto;
342 }
343
344 .slick-initialized .slick-track {
345 display: flex;
346 }
347
348 .slick-initialized .slick-slide {
349 height: inherit!important;
350 display: flex;
351 }
352
353 @media only screen and (max-width: 550px) {
354
355 .slick-initialized .slick-track {
356 display: flex;
357 }
358
359 .slick-initialized .slick-slide {
360 height: inherit!important;
361 display: flex;
362 min-height: 440px;
363 }
364
365 }
366
367 /* Prev and next Mobile button */
368
369
370.prev-mobile{
371 color: white;
372 display: flex;
373 align-items: center;
374 text-decoration: none;
375 text-decoration: none!important;
376}
377
378.prev-mobile:hover{
379 color: white;
380 font-weight: normal!important;
381}
382
383.prev-mobile::after{
384 font-family: "Montserrat", sans-serif;
385 content: "Anterior";
386 font-weight: 600;
387 font-size: 14px;
388 display: block;
389 margin-left: 9px;
390 color: white;
391}
392
393.prev-mobile.slick-arrow.slick-disabled{
394 opacity: 0.4;
395}
396
397.next-mobile{
398 color: white;
399 display: flex;
400 align-items: center;
401 text-decoration: none!important;
402}
403
404.next-mobile:hover{
405 color: white;
406 font-weight: normal!important;
407}
408
409.next-mobile::before{
410 font-family: "Montserrat", sans-serif;
411 content: "Próxima";
412 font-size: 14px;
413 font-weight: 600;
414 display: block;
415 margin-right: 9px;
416 color: white;
417}
418
419.next-mobile.slick-arrow.slick-disabled{
420 opacity: 0.4;
421}
422@media screen and (min-width: 767px){
423
424 .ssp-modal-local-realizacao{
425 width: 480px!important;
426 }
427
428 .ssp-modal-local-realizacao__title{
429 color:#01488C !important;
430 text-align: center!important;
431 margin-left: -23px!important;
432 }
433
434 .ssp:not(.liferay-instance) .ssp-modal-local-realizacao__title {
435 font-size: 14pt;
436 }
437
438}
439
440@media only screen and (max-width: 768px){
441
442 .ssp:not(.liferay-instance) .ssp-card-oferta-curso__dia-hora-item__dia {
443 font-size: 16px;
444 }
445
446 .ssp:not(.liferay-instance) .ssp-modal-local-realizacao__title {
447 font-size: 16pt;
448 }
449
450
451
452}
453
454.ssp:not(.liferay-instance) .ssp-card-oferta-curso__dia-hora-item {
455 border-radius: 0;
456 background-color: unset;
457 padding: 0;
458 max-width: 100%;
459 width: 100%;
460 margin: 0;
461 }
462
463.ssp:not(.liferay-instance) .ssp-card-oferta-curso__dia-hora-item__dia {
464 margin: 0;
465 font-size: 17px;
466 font-weight: bold;
467 font-stretch: normal;
468 font-style: normal;
469 line-height: 1.23;
470 letter-spacing: normal;
471 text-align: center;
472 }
473
474 .ssp:not(.liferay-instance) .ssp-card-oferta-curso__dia-hora_content{
475 margin:0;
476 opacity: 0;
477 transition: 0.3s;
478 }
479
480 .content-data-dias{
481
482 padding:20px;
483 border-bottom: 1px #E4E8F0 solid;
484 margin-bottom: 17px;
485
486 }
487
488 .container-local-realizacao {
489 padding:0;
490 border:0;
491 border-radius: unset;
492 width: 100%;
493 margin: 10px 0 0 0;
494 box-shadow: none;
495 display: flex;
496 justify-content:center;
497 align-items: flex-end;
498 }
499
500 .ssp:not(.liferay-instance) .ssp-card-oferta-curso__local-realizacao-content__title {
501 font-size: 13px;
502 color: #00488C;
503 font-weight: 600;
504 text-decoration: none!important;
505 border: 1px solid #00488C;
506 padding: 11px 14px;
507 transition:.3s;
508 border-radius: 4px;
509 }
510
511 .ssp:not(.liferay-instance) .ssp-card-oferta-curso__local-realizacao-content__title:hover {
512 color: #FC9F34;
513 font-weight: 600!important;
514 opacity: .7;
515 }
516
517 .ssp-modal-local-realizacao__title{
518 color:#01488C !important;
519 text-align: center!important;
520 }
521
522 h6.ssp-modal-local-realizacao__title::after {
523 content: "";
524 display: block;
525 width: 20%;
526 padding-top: 10px;
527 border-bottom: 1px solid #01488C;
528 transition: .5s;
529 margin:auto;
530 }
531
532 .ssp-modal__local-realizacao-content__icon-wifi{
533 display: flex;
534 margin-right: 2px
535 }
536
537 .ssp:not(.liferay-instance) .ssp-modal__local-realizacao-content__icon-wifi::after {
538 font-family: "Font Awesome 5 Free";
539 content: '\f1eb';
540 font-weight: 600;
541 color: #00488c;
542 font-size: 9pt;
543 font-style: normal;
544 margin-right: 10px;
545 }
546
547 .ssp:not(.liferay-instance) .ssp-modal__local-realizacao-content__icon-chalkboard-teacher::after {
548 font-family: "Font Awesome 5 Free";
549 content: '\f51c';
550 font-weight: 600;
551 color: #00488c;
552 font-size: 16pt;
553 font-style: normal;
554 margin-left: -16px;
555 }
556
557 .ssp-modal-local-realizacao__texto{
558 text-align:center!important;
559 }
560
561 /* Troca cor fonte (solicitação gcr) - ajuste 4 - Tarefa 9525**/
562 .ssp:not(.liferay-instance) .ssp-bolsa-formulario__card-aviso-texto > p {
563
564 color: #474F61 !important;
565}
566
567/* CSS filtro inscrições abertas e unidades por região - tarefa 10090**/
568.ssp-filters-px {
569 padding: 0 80px;
570}
571
572 /* Slider **/
573 .ssp-switch {
574 position: relative;
575 display: inline-block;
576 width: 63px;
577 height: 32px;
578 }
579
580 .ssp-switch input {
581 opacity: 0;
582 width: 0;
583 height: 0;
584 }
585
586 .ssp-switch-label {
587 margin: auto 15px;
588 font: normal normal 600 16px/19px Montserrat;
589 letter-spacing: 0px;
590 color: #FFFFFF;
591 white-space: nowrap;
592 }
593
594 .ssp-switch-label-section {
595 font: normal normal 600 18px/22px Montserrat;
596 margin-bottom: 11px;
597 }
598
599 .ssp-switch-label-message {
600 font: normal normal medium 16px/19px Montserrat !important;
601 letter-spacing: 0px;
602 color: #FFFFFF;
603 margin-top: 16px;
604 padding-left: 25px;
605 padding-right: 25px;
606 }
607
608 .ssp-switch-divider {
609 border-bottom: 1px solid #4a4d5f;
610 width: 100%;
611 }
612 .ssp-switch-slider {
613 position: absolute;
614 cursor: pointer;
615 top: 0;
616 left: 0;
617 right: 0;
618 bottom: 0;
619 background-color: #00000000;
620 border: 1px solid #FFFFFF;
621 -webkit-transition: .4s;
622 transition: .4s;
623 }
624
625 .ssp-switch-slider:before {
626 position: absolute;
627 content: "";
628 height: 21px;
629 width: 21px;
630 left: 4px;
631 bottom: 4px;
632 background-color: white;
633 -webkit-transition: .4s;
634 transition: .4s;
635 }
636
637 input:checked + .ssp-switch-slider {
638 background-color: #5ACC75;
639 border: 1px solid #5ACC75;
640 }
641 input:checked + .ssp-switch-slider-secondary {
642 background-color: #2967F4;
643 border: 1px solid #2967F4;
644 }
645
646 input:focus + .ssp-switch-slider {
647 box-shadow: 0 0 1px #5ACC75;
648 }
649 input:focus + .ssp-switch-slider-secondary {
650 box-shadow: 0 0 1px #2967F4;
651 }
652
653 input:checked + .ssp-switch-slider:before {
654 -webkit-transform: translateX(33px);
655 -ms-transform: translateX(33px);
656 transform: translateX(33px);
657 }
658
659 /* Rounded sliders */
660 .ssp-switch-slider.round {
661 border-radius: 34px;
662 }
663
664 .ssp-switch-slider.round:before {
665 border-radius: 50%;
666 }
667
668 .ssp-switch-label {
669 margin: auto 15px;
670 font: normal normal 600 16px/19px Montserrat;
671 letter-spacing: 0px;
672 color: #FFFFFF;
673 white-space: nowrap;
674 }
675
676 .ssp-switch-label-section {
677 font: normal normal 600 18px/22px Montserrat;
678 margin-bottom: 11px;
679 }
680
681 .ssp-switch-label-message {
682 font: normal normal medium 16px/19px Montserrat !important;
683 letter-spacing: 0px;
684 color: #FFFFFF;
685 margin-top: 16px;
686 padding-left: 25px;
687 padding-right: 25px;
688 }
689
690 @media screen and (max-width: 1199px){
691 .ssp-filters-px {
692 padding: 0 !important;
693 }
694 .ssp-switch-label {
695 margin: auto 0 !important;
696 }
697 .ssp-switch-label-message {
698 margin-top: 10px;
699 margin-bottom: 10px;
700 padding-right: 0 !important;
701 padding-left: 0 !important;
702 }
703 .ssp-container-selecione-unidade [name="unidades-ofertas"] {
704 max-width: 316px!important;
705 }
706 .ssp-detalhe-curso-titulo-filter {
707 font-size: 16px !important;
708 }
709 }
710
711 .ssp-option-group {
712 text-align: left;
713 font: normal normal 600 15px/19px Montserrat;
714 letter-spacing: 0px;
715 color: #004A8C;
716 }
717</style>
718
719
720<#assign prefix = "ssp" />
721<#-- Iterate the list with -->
722<#assign vocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") />
723<#assign normalizer = serviceLocator.findService("com.liferay.portal.kernel.util.FriendlyURLNormalizer") />
724
725<#assign defaultImage = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuyJZ_Ky8o9kn0wiBy4mp5-3sb7xei_WudTL_3Jo6yvWmzQHuK&s" />
726
727<#function getStringValue dom name>
728 <#assign
729 seletorSTR = "dynamic-element[@field-reference='"+name+"']"
730 xPathSelector = saxReaderUtil.createXPath(seletorSTR)
731 />
732 <#if xPathSelector.selectSingleNode(dom)?? >
733 <#assign
734 valueSTR = xPathSelector.selectSingleNode(dom).getStringValue()?trim
735 />
736 <#return valueSTR>
737 </#if>
738 <#return ''>
739 </#function>
740
741 <#list entries![] as entry>
742
743 <#assign renderer = entry.getAssetRenderer() />
744 <#assign document = saxReaderUtil.read(renderer.getArticle().getContent()) />
745 <#assign rootElement = document.getRootElement() />
746 <#assign journalArticle = renderer.getArticle() />
747
748
749
750 <#-- Get fields -->
751
752 <#assign
753
754 <#-- Codigo FT -->
755 codigoFT = getStringValue(rootElement,'codigoFT')
756
757 <#-- Data Efetiva -->
758 xPathSelectorDataEfetiva = saxReaderUtil.createXPath("dynamic-element[@field-reference='dataEfetivaFT']")
759
760 dataEfetiva = xPathSelectorDataEfetiva.selectSingleNode(rootElement)
761
762 dataEfetivaSTR = dataEfetiva.elementText("dynamic-content")?string
763
764 <#-- Title -->
765 tituloCurso = journalArticle.getTitle()
766
767 <#-- Objetivo -->
768 xPathSelectorObjetivoCurso = saxReaderUtil.createXPath("dynamic-element[@field-reference='objetivoComercial']")
769
770 objetivo = xPathSelectorObjetivoCurso.selectSingleNode(rootElement).getStringValue()
771
772 <#-- Carga Horária -->
773
774 xPathSelectorCargaHoraria = saxReaderUtil.createXPath("dynamic-element[@field-reference='cargaHorariaTotalFT']")
775
776 cargaHoraria = xPathSelectorCargaHoraria.selectSingleNode(rootElement).getStringValue()?trim
777
778
779
780 />
781
782 <#if codigoFT?? && dataEfetivaSTR??>
783 <#assign searchImpl = serviceLocator.findService("br.senac.search.api.Search") />
784 <#assign articles = searchImpl.search("Curso", {"codigoFT_pt_BR":codigoFT,"dataEfetivaFT":dataEfetivaSTR}, themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId(), themeDisplay.getUserId(), false) />
785
786 <#list articles![] as article>
787 <#assign articleId = article.getArticleId()>
788 </#list>
789
790 </#if>
791
792
793 <#assign xPathSelector = saxReaderUtil.createXPath("dynamic-element[@field-reference='imagemComercial']")>
794
795 <#assign imagemStr = xPathSelector.selectSingleNode(rootElement).getStringValue()>
796
797 <#if imagemStr?contains("{") >
798 <#assign
799 imagemJson = jsonFactoryUtil.createJSONObject(imagemStr)
800 imagemId = getterUtil.getInteger(imagemJson.get('fileEntryId'))
801 imagemDescricao = imagemJson.get('alt')
802 dl = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")
803 dlURLHelper = serviceLocator.findService("com.liferay.document.library.util.DLURLHelper")
804 fileEntry = dl.getFileEntry(imagemId)
805 <#-- imagemUrl = dlURLHelper.getImagePreviewURL(fileEntry, themeDisplay) -->
806 <#-- faz o get da imagem em alta qualidade -->
807 imagemUrl = dlURLHelper.getDownloadURL(fileEntry, fileEntry.getFileVersion(), themeDisplay,null)
808 />
809 <#else>
810 <#assign imagemUrl = "">
811 </#if>
812
813 <#-- Header Curso -->
814
815 <div class="${prefix}-header-curso__image" style="background-image:url(${imagemUrl})">
816
817
818 <#list entry.getCategories()![] as category>
819
820 <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim />
821
822 <#if normalizer.normalize(vocabularyName) == "tipo-de-curso">
823
824 <#assign normalizedCategoryName = normalizer.normalize(category.getName()) />
825
826 <div class="${prefix}-header-curso__tag-formato bg-nivel-${normalizedCategoryName}">
827
828 <#list entry.getCategories()![] as category>
829
830
831 <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim />
832
833 <#if normalizer.normalize(vocabularyName) == "tipo-de-curso">
834 <#assign normalizedCategoryName = normalizer.normalize(category.getName()) />
835 <span>${category.getName()}</span>
836 </#if>
837
838 </#list>
839
840 </div>
841
842 </#if>
843 </#list>
844
845
846 </div>
847
848 <#-- Detalhe de Curso -->
849
850 <section id="curso-info">
851
852 <div class="ssp-card-detalhe-curso__container">
853
854 <div class="ssp-card-detalhe-curso">
855
856 <#list entry.getCategories()![] as category>
857
858 <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim />
859
860 <#if normalizer.normalize(vocabularyName) == "tipo-de-curso">
861
862 <#assign normalizedCategoryName = normalizer.normalize(category.getName()) />
863
864 <div class="ssp-card-detalhe-curso__tag-color-tipo bg-nivel-${normalizedCategoryName}"></div>
865
866 </#if>
867
868 </#list>
869
870
871
872 <div class="container">
873
874 <div class="ssp-card-detalhe-curso__content">
875
876 <div>
877
878 <h1 class="ssp-card-detalhe-curso__title">${tituloCurso}</h1>
879 <span class="ssp-card-detalhe-curso__description">${objetivo}</span>
880
881 </div>
882
883 <div class="ssp-card-detalhe-curso__secunday-info-content">
884
885 <#list entry.getCategories()![] as category>
886
887
888 <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim />
889
890 <#if normalizer.normalize(vocabularyName) == "tipo-de-curso">
891 <#assign normalizedCategoryName = normalizer.normalize(category.getName()) />
892 <a class="ssp-card-detalhe-curso__secunday-info-back-link d-lg-none d-md-none" href="#">${category.getName()}</a>
893 </#if>
894
895 </#list>
896
897 <#if cargaHoraria?length != 0>
898 <p class="ssp-card-detalhe-curso__secundary-info-carga-horaria">${cargaHoraria}</p>
899 </#if>
900
901 </div>
902
903 </div>
904
905 <div class="ssp-saiba-mais-curso-accordion">
906
907 <#-- Get no campo repeatable -->
908 <#assign topicoItemRepeatableNode = document.getRootElement().selectNodes("//dynamic-element[@field-reference='topicoItemFieldSet']") />
909
910 <#-- Lista de cardsUnidades -->
911 <#list topicoItemRepeatableNode as itemTopico>
912
913 <#-- ìcone Slider -->
914 <#assign tituloTopico = itemTopico.selectSingleNode("dynamic-element[@field-reference='tituloTopico']").getStringValue()?trim>
915
916 <#-- Nome da Unidade -->
917 <#assign descTopico = itemTopico.selectSingleNode("dynamic-element[@field-reference='descTopico']").getStringValue()?trim>
918
919 <div class="ssp-saiba-mais-curso-accordion__body">
920 <div class="ssp-saiba-mais-curso-accordion__heading">${tituloTopico}</div>
921 <div class="ssp-saiba-mais-curso-accordion__contents">${descTopico}</div>
922 </div>
923
924 </#list>
925
926 </div>
927
928 </div>
929
930 </div>
931 </div>
932
933 <!-- Confira as novas turmas -->
934
935 <section class="ssp-section-novas-turmas" style="background: #2a2e43;">
936 <div class="container">
937
938 <h3 class="ssp-section-title ssp-card-oferta-curso__section-title" style="margin: 24px 0;">Confira as unidades com vagas disponíveis</h3>
939
940 <div class="row ssp-filters-px justify-content-center">
941 <div class="col-12 col-lg px-md-0 order-1">
942 <div class="ssp-container-selecione-unidade row no-gutters">
943 <div class="col-12">
944 <div class="ssp-container__form-select mx-auto">
945 <label for="unidades-ofertas" class="ssp-switch-label ssp-switch-label-section mx-0 d-none d-lg-block">Selecione uma unidade:</label>
946 <select id="unidades-ofertas" class="form-control" name="unidades-ofertas">
947 <option value="">Selecione uma unidade</option>
948 </select>
949 </div>
950 </div>
951 </div>
952 </div>
953
954 <div id="ssp-alternadores" class="col mt-5 mt-lg-0 px-md-0 order-3 order-lg-2" style="max-width: 480px;">
955 <div class="row no-gutters ssp-switch-label ssp-switch-label-section mx-0">Filtre por:</div>
956 <div class="row no-gutters mt-4">
957
958 <div class="col-12 col-lg">
959 <div class="d-flex justify-content-between justify-content-lg-start">
960 <label class="ssp-switch order-2 order-lg-1">
961 <input type="checkbox" id="chkInscricao">
962 <span class="ssp-switch-slider round"></span>
963 </label>
964 <label for="chkInscricao" class="ssp-switch-label order-1 order-lg-2">Inscrições abertas</label>
965 </div>
966 </div>
967
968 <div class="ssp-switch-divider d-md-none my-4"></div>
969
970 </div>
971 </div>
972
973 <div class="col-12 order-2 order-lg-3">
974 <div class="row text-center text-lg-left">
975 <div id="msgFiltroAplicado" class="col-12 ssp-switch-label-message" style="display: none;">
976 <div class="row no-gutters">
977 <span class="col-12 ssp-col-lg-without">Filtro aplicado com sucesso! Confira o resultado.</span>
978 </div>
979 </div>
980 </div>
981 </div>
982
983 </div>
984
985 <div class="ssp-ofertas__box-endereco-unidade d-none">
986 <i class="icon-map-adress"></i>
987 <a href="" target="_blank" class="ssp-ofertas__endereco-unidade"></a>
988 </div>
989
990 </div>
991
992 </section>
993
994 <input type="hidden" name="codigoFT" value="${codigoFT}" />
995 <input type="hidden" name="dataEfetivaSTR" value="${dataEfetivaSTR}" />
996 <input type="hidden" name="articleId" value="${articleId}" />
997
998
999 <#-- Section para listar as ofertas - 9525 -28/02/2022-->
1000 <section id="ssp-section-response" class="ssp-section" style="background: #2a2e43; position: relative;">
1001
1002 <div id="turmas-container" class="container">
1003
1004 <div id="informe-novas-turmas">
1005 <div style="display: flex; flex-wrap: nowrap;">
1006
1007 <a class="prev-mobile d-lg-none d-xl-none nextPrevOpacity" href="#" >
1008 <i class="fas fa-chevron-left"></i>
1009 </a>
1010
1011 <h2 id="ssp-h3-turmas" class="ssp-section-title ssp-card-oferta-curso__section-title text-capitalize" style="font-weight: bold;text-transform: uppercase; display: none;">Turmas</h2>
1012
1013 <a href="#" class="next-mobile d-lg-none d-xl-none" >
1014 <i class="fas fa-chevron-right"></i>
1015 </a>
1016
1017 </div>
1018
1019
1020 <div class="oferta-slick-area oferta-slick-area--md-bleed slider-container">
1021
1022 </div>
1023 </div>
1024
1025 <div class="ssp-card-oferta-curso__sem-vaga d-none" style="margin: auto;">
1026
1027 <h3 class="ssp-card-oferta-curso__sem-vaga-title">
1028 Poxa... Estamos sem turmas agendadas no momento.
1029 </h3>
1030
1031 <p class="ssp-card-oferta-curso__sem-vaga-description">
1032 Mas, registre seu interesse aqui embaixo e avisamos você quando surgirem novas turmas.
1033 </p>
1034 </div>
1035
1036 <p class="ssp-card-oferta-curso__mensagem-legal" style="margin: 0px 0 0 0;">A turma pode ser cancelada ou ter alterações do número de vagas, datas e horários.<p>
1037
1038 <div class="oferta-slick-area_modal">
1039 </div>
1040 </div>
1041
1042 <div id="ssp-abrir-pagina-bolsa" class="ssp-card-duvida__bolsa-estudo d-none" style="margin-top: 44px;">
1043
1044 <p>Tem dúvidas sobre bolsas de estudo?</p>
1045 <a href="/bolsas-de-estudo/como-funciona">Saiba como funciona</a>
1046
1047 </div>
1048
1049 </section>
1050
1051 <!-- Aviso para curso de aprendizagem -->
1052 <div id="aviso-curso-aprendizagem" class="ssp-bolsa-formulario__card-aviso-atencao d-none" style="width: 100%;">
1053
1054 <i class="fas fa-exclamation-circle ssp-bolsa-formulario__card-aviso-atencao-icon" aria-hidden="true"></i>
1055
1056 <div class="ssp-bolsa-formulario__card-aviso-texto">
1057 <p>Para contratar aprendiz, preencha o formulário e entraremos em contato.</p>
1058 </div>
1059
1060 </div>
1061
1062
1063 <!-- modal form de aprendizagem -->
1064
1065 <#assign formId = 48097883 />
1066 <!-- formInstanceId é variável de acordo com o ID do formulário -->
1067 <#assign formPreferences = {"displayDepth": "1", "portletSetupPortletDecoratorId": "barebone", "formInstanceId": "formId"}/>
1068 <section class="ssp-section ssp-section-lg-bottom" data-modal="modal">
1069
1070 <div class="container ssp_ct_form_programe">
1071
1072 <button type="button" data-modal="close-form-modal">
1073 fechar
1074 <i class="fas fa-times"></i>
1075 </button>
1076
1077 <@liferay_portlet["runtime"]
1078 portletName="com_liferay_dynamic_data_mapping_form_web_portlet_DDMFormPortlet"
1079 defaultPreferences=freeMarkerPortletPreferences.getPreferences(formPreferences)
1080 />
1081
1082 </div>
1083
1084 </section>
1085
1086 </#list>
1087
1088
1089 <script>
1090
1091 const codigoFT = $('[name="codigoFT"]').val();
1092 const dataEfetiva = $('[name="dataEfetivaSTR"]').val();
1093 const articleId = $('[name="articleId"]').val();
1094 var ofertasMap = new Map();
1095 var groupId = themeDisplay.getScopeGroupId();
1096 var startOfertaParam = 0;
1097 var endOfertaParam = 16;
1098 var regIndex = new RegExp('\{index\}', 'g');
1099
1100 var objsTela = {
1101 unidades: [],
1102 categoriesIds:[]
1103 };
1104
1105 var urlSearchCursoInfo = '/o/senac-content-services/cursosInfoDetalhe/{groupId}/{cursosInfo}?inscricaoAberta={inscricaoAberta}&bolsaAberta={bolsaAberta}';
1106 var urlUnidadeInfoDetalhe = '/o/senac-content-services/unidadeInfoDetalhe/{companyId}/{codigoUnidade}';
1107 var urlSearchOferta = '/o/senac-oferta-services/ofertasPorCategoryIds/' + groupId
1108
1109 $(document).ready(function(){
1110
1111
1112 const urlParams = new URLSearchParams(window.location.search);
1113 $('#chkInscricao').prop("checked", urlParams.get('inscricao') == 'true');
1114 $('#chkInscricao').change(ev => selectFilter('inscricao', $('#chkInscricao')) );
1115
1116 loadUnidades(true,"")
1117
1118 $(".next-mobile").on("click",function(e){
1119 e.preventDefault();
1120
1121 acoesMobileSliderOfertas("left");
1122 });
1123
1124 $(".prev-mobile").on("click",function(e){
1125 e.preventDefault();
1126
1127 acoesMobileSliderOfertas("right");
1128 });
1129
1130 //ação de drag do card de ofertas no mobile
1131 $('.oferta-slick-area').on('swipe', function(event, slick, direction){
1132 acoesMobileSliderOfertas(direction);
1133 });
1134
1135 // Modal Aprendizagem
1136 let modalFormAprendizagem = document.querySelector('[data-modal="modal"]')
1137 if(modalFormAprendizagem){
1138 // Create dinamic close buttom form
1139 let btnCloseModalForm = document.querySelector('[data-modal="close-form-modal"]')
1140
1141 btnCloseModalForm.addEventListener('click',closeModalFormAprendizagem)
1142
1143 }
1144
1145 $(".oferta-slick-area").on("click", ".btnModalAprendizagem", function (){
1146 openModalFormAprendizagem();
1147 })
1148
1149 });
1150
1151 $(".ssp-saiba-mais-curso-accordion").on("click", ".ssp-saiba-mais-curso-accordion__heading", function() {
1152
1153 $(this).toggleClass("active").next().slideToggle();
1154
1155 $(".sp-saiba-mais-curso-accordion__contents").not($(this).next()).slideUp(300);
1156
1157 $(this).siblings().removeClass("active");
1158 });
1159
1160 function acoesMobileSliderOfertas(direcao){
1161
1162 if(direcao == "right"){
1163 $("a.slick-prev").click();
1164
1165 if($('.slick-current').attr('data-slick-index') == "0")
1166 $('.prev-mobile').addClass('nextPrevOpacity');
1167
1168 if($(".next-mobile").hasClass('nextPrevOpacity'))
1169 $('.next-mobile').removeClass('nextPrevOpacity');
1170 }
1171
1172
1173 if(direcao == "left"){
1174 $("a.slick-next").click();
1175
1176 if($(".prev-mobile").hasClass('nextPrevOpacity'))
1177 $('.prev-mobile').removeClass('nextPrevOpacity');
1178
1179 if(carregouUltimaOferta){
1180 var totalCardOfertas = $('#turmas-container .slick-area__item').length;
1181 var currentSliderIndex = parseInt($('.slick-current').attr('data-slick-index'));
1182
1183 //o card do meio é o último
1184 if(totalCardOfertas == (currentSliderIndex + 1))
1185 $('.next-mobile').addClass('nextPrevOpacity');
1186 }
1187 }
1188 }
1189
1190 function loadUnidades(showOptions, unidadeValue){
1191
1192 //Busca as unidades do curso
1193 const urlCursoInfo = urlSearchCursoInfo
1194 .replace('\{groupId\}', groupId)
1195 .replace('\{cursosInfo\}', $('[name="articleId"]').val())
1196 .replace('\{inscricaoAberta\}', $('#chkInscricao').prop('checked'))
1197 .replace('\{bolsaAberta\}', false);
1198
1199 $.ajax({
1200 url:urlCursoInfo,
1201 method:'get',
1202 async: false,
1203 beforeSend: function () {
1204 loading('.oferta-slick-area');
1205 }
1206 }).done(
1207 function(data){
1208
1209 if(data.length > 0){
1210
1211 const cursoInfo = JSON.parse(data);
1212
1213
1214 //GCR pediu para voltarmos no combo as unidades vinculadas e não somente as que possuem ofertas
1215 //const unidades = cursoInfo.unidadesComOferta;
1216 const unidades = cursoInfo.unidadesOfertantes;
1217
1218 objsTela.unidades = []
1219 mapUnidadesIds = new Map();
1220
1221 $.each(unidades, function(k,item){
1222
1223 var unidade = cloneObj(item);
1224 unidade['categoryId'] = item['categoryId'];
1225 unidade['codigoUnidade'] = item['codigoUnidade'];
1226 unidade['nome'] = item['nomeUnidade'];
1227 unidade['enderecoUnidade'] =item['enderecoUnidade'];
1228 unidade['numero'] =item['numEnderecoUnidade'];
1229 unidade['complemento'] = item['complementoEnderecoUnidade'];
1230 unidade['bairro'] = item['bairroUnidade'];
1231 unidade['googlemapsUnidade'] = item['googlemapsUnidade'];
1232 unidade['ofertas'] = [];
1233 unidade['friendlyURL'] = item['friendlyURL'];
1234
1235 objsTela.unidades.push(unidade);
1236
1237 mapUnidadesIds.set(unidade['categoryId'], unidade['codigoUnidade']);
1238 console.log("items ", item)
1239 });
1240
1241 populaSelectUnidades(undefined, showOptions, unidadeValue);
1242
1243 }
1244 });
1245
1246 }
1247
1248 function selectFilter(paramkey, el) {
1249 setUrlParam(paramkey, el.prop("checked"))
1250 var unidades = objsTela.unidades;
1251 //const currentUnidadeFriendlyURLSelected = $('#unidades-ofertas').find('option').filter(':selected').attr('data-unidade-friendly-url')
1252
1253 splitted = $('#unidades-ofertas').val().split("@");
1254 var categoryIdUnidade = splitted[0];
1255 var codUnidade = splitted[1];
1256 console.log("splitted ", splitted)
1257 for(var i = 0; unidades.length > i ; i++){
1258
1259 if(unidades[i].categoryId == categoryIdUnidade){
1260
1261 getOfertas(codigoFT, dataEfetiva, unidades[i].categoryId, $('#chkInscricao').prop("checked"));
1262
1263 }
1264 }
1265 loadUnidades(true, "")
1266
1267 if($('#chkInscricao').prop("checked")) $('#msgFiltroAplicado').show()
1268 else $('#msgFiltroAplicado').hide()
1269 }
1270
1271 function setUrlParam(key, value) {
1272 const url = new URL(window.location.href);
1273
1274 if(value)
1275 url.searchParams.set(key, value);
1276 else
1277 url.searchParams.delete(key);
1278
1279 window.history.pushState({}, '', url.toString())
1280 }
1281
1282 function defineCurrentUrl(ev) {
1283 const currentUnidadeFriendlyURLSelected = $(ev.target).find('option').filter(':selected').attr('data-unidade-friendly-url')
1284
1285 const hasPathWeb = window.location.pathname.includes('/web')
1286 const hasPathGuest = window.location.pathname.includes('/guest')
1287
1288 let currentPath = window.location.pathname
1289 currentPath = hasPathWeb ? currentPath.substring(4) : currentPath
1290 currentPath = hasPathGuest ? currentPath.substring(6) : currentPath
1291
1292 objsTela.unidadesRegistroInteresse.forEach(unidade => currentPath = currentPath.replace('/' + unidade.friendlyURL, ''))
1293
1294 currentPath = (currentUnidadeFriendlyURLSelected ? '/' + currentUnidadeFriendlyURLSelected : '') + currentPath
1295 currentPath = hasPathGuest ? '/guest' + currentPath : currentPath
1296 currentPath = hasPathWeb ? '/web' + currentPath : currentPath
1297
1298 if(keepURL())
1299 window.history.replaceState(window.history.state, '', currentPath + window.location.search)
1300 }
1301
1302
1303
1304 function populaSelectUnidades(unidades, showOptions, unidadeValue){
1305
1306 //Oredenacao
1307 objsTela.unidades.sort(function (a, b) {
1308 return ordenar(a, b, 'nome');
1309 });
1310
1311 $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').addClass('d-none');
1312 hideCardSemTurmas(true)
1313
1314 //console.log('Unidade Pre '+unidadePreSelecionada);
1315
1316 if(objsTela.unidades.length == 0){
1317 if(!showOptions)
1318 $('.ssp-container-selecione-unidade').addClass('d-none');
1319 $('.oferta-slick-area').empty();
1320 $('.prev-mobile').addClass('d-none');
1321 $('.next-mobile').addClass('d-none');
1322
1323 }
1324
1325 let unidadeFounded;
1326
1327 $('#unidades-ofertas').empty()
1328
1329 if(objsTela.unidades && objsTela.unidades.length)
1330 $('#unidades-ofertas').append($('<option value="">Clique na unidade de interesse</option>'))
1331 else
1332 $('#unidades-ofertas').append($('<option value="">Nenhum resultado encontrado</option>'))
1333
1334 unidadeFounded = criarOptionUnidadesPorRegiao(objsTela.unidades)
1335
1336 /* $.each(objsTela.unidades, function(k,unidade){
1337
1338 if($('#unidades-ofertas').find('[value="'+unidade['categoryId']+'"]').length == 0){
1339
1340 var option = $('<option>');
1341 option.val(unidade['categoryId']+"@"+unidade['codigoUnidade']);
1342 option.text(unidade['nome']);
1343 option.attr('data-unidade-friendly-url', unidade.friendlyURL)
1344
1345 $('#unidades-ofertas').append(option);
1346
1347
1348 }
1349 });
1350
1351 **/
1352
1353 if(unidadeFounded){
1354 $('#unidades-ofertas').val(unidadeFounded['categoryId']+"@"+unidadeFounded['codigoUnidade']);
1355 $('#unidades-ofertas').change();
1356 }
1357
1358 loadAlternadores();
1359
1360 $('.prev-mobile').addClass('d-none');
1361 $('.next-mobile').addClass('d-none');
1362 $('.oferta-slick-area').empty();
1363
1364
1365 }
1366
1367 function ordenar(objA, objB, nomeAtributo){
1368 let a = (nomeAtributo) ? objA[nomeAtributo] : objA;
1369 let b = (nomeAtributo) ? objB[nomeAtributo] : objB;
1370
1371 if (a > b) return 1;
1372 if (a < b) return -1;
1373 return 0;
1374 }
1375
1376 $('#unidades-ofertas').change(ev => {
1377 mudarUnidade(ev)
1378 });
1379
1380
1381 function mudarUnidade(ev){
1382
1383 var elem = $(ev.target);
1384 var unidades = objsTela.unidades;
1385
1386 //Unidade sem value tratamento
1387 if(!elem.val()){
1388 $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').addClass('d-none');
1389
1390 if($('#unidades-ofertas option').length <= 1)
1391 hideCardSemTurmas(false)
1392 else
1393 hideCardSemTurmas(true)
1394
1395
1396 elem.val('')
1397 return;
1398 } else {
1399 $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').removeClass('d-none');
1400
1401 if($('#unidades-ofertas option').length <= 1)
1402 hideCardSemTurmas(false)
1403 else
1404 hideCardSemTurmas(true)
1405 }
1406
1407 //colocamos dentro do option categoryId@codUnidade
1408 splitted = elem.val().split("@");
1409 var categoryIdUnidade = splitted[0];
1410 var codUnidade = splitted[1];
1411 console.log("splitted ", splitted)
1412 for(var i = 0; unidades.length > i ; i++){
1413
1414 if(unidades[i].categoryId == categoryIdUnidade){
1415
1416 var unidade = unidades[i];
1417
1418 //Exibe o endereco da unidade
1419 const urlBuscaUnidade = urlUnidadeInfoDetalhe
1420 .replace('\{companyId\}',themeDisplay.getCompanyId())
1421 .replace('\{codigoUnidade\}', unidade.codigoUnidade);
1422
1423 $.ajax({
1424 url : urlBuscaUnidade,
1425 type : 'get',
1426 dataType: 'json',
1427 success: function( unidadeInfo ) {
1428 if(unidadeInfo != null && typeof unidadeInfo !== 'undefined'){
1429
1430 var endereco = concatSTR(unidadeInfo.enderecoUnidade,unidadeInfo.numEnderecoUnidade,', ');
1431 endereco = concatSTR(endereco,unidadeInfo.complementoEnderecoUnidade, ' - ');
1432 endereco = concatSTR(endereco,unidadeInfo.bairroUnidade, ' - ');
1433
1434 $('.ssp-ofertas__endereco-unidade').text(endereco);
1435 $('.ssp-ofertas__endereco-unidade').attr('href',unidadeInfo.googlemapsUnidade);
1436 $('.ssp-ofertas__box-endereco-unidade').removeClass("d-none")
1437 }
1438 },
1439 error: function(data){
1440 $('.ssp-ofertas__box-endereco-unidade').addClass("d-none")
1441 $('.ssp-ofertas__endereco-unidade').text('');
1442 $('.ssp-ofertas__endereco-unidade').attr('href','#a');
1443 console.log('Unidade não encontrada');
1444 }
1445 })
1446
1447 getOfertas(codigoFT, dataEfetiva, unidades[i].categoryId, $('#chkInscricao').prop("checked"));
1448
1449 }
1450 }
1451
1452 }
1453
1454 function criarOptionUnidadesPorRegiao(unidades) {
1455 let regioes = {}
1456 let unidadeFounded
1457
1458 unidades.forEach(unidade => {
1459 if(!regioes[unidade.codRegiaoUnidade || 'N'])
1460 regioes[unidade.codRegiaoUnidade || 'N'] = []
1461
1462 regioes[unidade.codRegiaoUnidade || 'N'].push(unidade)
1463 })
1464
1465 Array.from(['C', 'I', 'GS', 'N'])
1466 .filter(key => Object.keys(regioes).includes(key))
1467 .forEach(key => {
1468 const unidadesDaRegiao = regioes[key]
1469
1470 const optionDisabled = $('<option>')
1471 optionDisabled.attr('label', getRegiaoName(key))
1472 optionDisabled.text(getRegiaoName(key));
1473 optionDisabled.attr('disabled', true)
1474 optionDisabled.addClass('ssp-option-group')
1475 $('#unidades-ofertas').append(optionDisabled)
1476
1477 $.each(unidadesDaRegiao, function(k,unidade){
1478 if($('#unidades-ofertas').find('[value="'+unidade['categoryId']+'"]').length == 0){
1479 var option = $('<option>');
1480 option.val(unidade['categoryId']+"@"+unidade['codigoUnidade']);
1481 option.text(unidade['nome']);
1482 option.attr('data-unidade-friendly-url', unidade.friendlyURL)
1483 option.addClass('ssp-option')
1484
1485 $('#unidades-ofertas').append(option);
1486
1487 unidadeFounded = !unidadeFounded
1488 }
1489 })
1490 })
1491
1492 return unidadeFounded
1493 }
1494
1495 function getRegiaoName(key) {
1496 switch (key) {
1497 case "C":
1498 return "Capital";
1499 case "I":
1500 return "Interior";
1501 case "GS":
1502 return "Grande São Paulo e Litoral";
1503 default:
1504 return "Sem Região";
1505 }
1506 }
1507
1508 function loadAlternadores() {
1509
1510 let $alternadores = $('#ssp-alternadores');
1511 if($('#unidades-ofertas').is(":hidden") || $('#unidades-ofertas option').length <= 1) {
1512
1513 if(!$('#chkInscricao').prop('checked')) $alternadores.hide();
1514 else $alternadores.show();
1515
1516 }else $alternadores.show();
1517
1518 }
1519
1520 function hideCardSemTurmas(hide){
1521 if(hide){
1522 $('.ssp-card-oferta-curso__sem-vaga').addClass('d-none');
1523 $('.ssp-card-oferta-curso__mensagem-legal').css('margin', '0px 0 0 0;')
1524 }else{
1525 $('.ssp-card-oferta-curso__sem-vaga').removeClass('d-none');
1526 $('.ssp-card-oferta-curso__mensagem-legal').css('margin', '')
1527 }
1528 }
1529
1530 function getOfertas(codigoFT, dataEfetivaOferta, categoryId, filtrarInscricoes){
1531
1532 var indiceUnidade = -1;
1533
1534 for(var i = 0; i < objsTela.unidades.length; i++)
1535 if(objsTela.unidades[i].categoryId == categoryId)
1536 indiceUnidade = i;
1537
1538 if(!objsTela.categoriesIds.includes(categoryId) ||
1539 objsTela.unidades[indiceUnidade].ofertasFiltradas != filtrarInscricoes){
1540
1541 objsTela.unidades[indiceUnidade]['ofertas'] = []
1542
1543 var params = new URLSearchParams();
1544 params.set('codigoFTOferta',codigoFT)
1545 params.set('dataEfetivaOferta',dataEfetivaOferta)
1546 params.set('categoryIds',categoryId)
1547 params.set('start',startOfertaParam)
1548 params.set('end',endOfertaParam)
1549 params.set('inscricaoAberta', filtrarInscricoes)
1550 params.set('bolsaAberta', false)
1551 params.set('cursoArticleId', $('[name="articleId"]').val() || '');
1552
1553 const url = urlSearchOferta + '?' + params.toString()
1554
1555 $.ajax({
1556 url:url,
1557 method:'get',
1558 dataType:'json',
1559 async: false
1560 }).done(
1561 function(data){
1562
1563 if(data.length > 0){
1564 $('.ssp-container-selecione-unidade').show();
1565
1566 data.forEach(function(ofertaJSON,index){
1567
1568 var oferta = getOfertaObjectFromJson(ofertaJSON,index);
1569
1570 //Preenche as ofertas da unidade
1571 objsTela.unidades[indiceUnidade]['ofertas'].push(oferta);
1572
1573
1574 });
1575 }
1576 objsTela.categoriesIds.push(categoryId);
1577 populaOfertas(objsTela.unidades[indiceUnidade]['ofertas']);
1578 objsTela.unidades[indiceUnidade].ofertasFiltradas = filtrarInscricoes;
1579 }
1580 )
1581
1582 //Se estiver na cache, valida as ofertas
1583 }else{
1584
1585 populaOfertas(objsTela.unidades[indiceUnidade]['ofertas']);
1586
1587 }
1588 }
1589
1590 function getOfertaObjectFromJson(ofertaJSON,index){
1591
1592
1593 var oferta = {};
1594 var xml = $($.parseXML(ofertaJSON.content));
1595 oferta['ordenar'] = paramOrdem(xml);
1596 oferta['vagasTotal'] = xml.find('[name="vagasTotal"]').text().trim();
1597 var dataInicio = xml.find('[name="dataInicioOferta"]').text().split('-');
1598 var dataFim =xml.find('[name="dataFimOferta"]').text().split('-');
1599 oferta['dataInicio'] = dataInicio[2].trim()+'/'+dataInicio[1].trim()+'/'+dataInicio[0].trim();
1600 oferta['dataFim'] = dataFim[2].trim()+'/'+dataFim[1].trim()+'/'+dataFim[0].trim();
1601 oferta['horaInicio'] = xml.find('[name="horaInicioOferta"]').text();
1602 oferta['codigoOferta'] = xml.find('[name="codigoOferta"]').text().trim();
1603 var dias = [];
1604 oferta['horaFimOferta'] = xml.find('[name="horaFimOferta"]').text().trim();
1605 xml.find('[name="diasDaSemanaOferta"]').find('option').each(function(index,dia){
1606 dias.push($(dia).text());
1607 });
1608 oferta['diasDaSemanaOferta'] = dias;
1609 oferta['periodoDiaOferta'] = xml.find('[name="periodoDiaOferta"]').text().trim();
1610 oferta['precoCheioOferta'] = xml.find('[name="precoCheioOferta"]').text().trim();
1611 oferta['precoVendaOferta'] = xml.find('[name="precoVendaOferta"]').text().trim();
1612 oferta['numeroMaxParcelasOferta'] = xml.find('[name="numeroMaxParcelasOferta"]').text().trim();
1613
1614 oferta['textoCartoesAceitos'] = pegarTextoCartoesAceitos(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim());
1615 oferta['numParcelaCartoes'] = pegaNumParcela(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim());
1616 oferta['precoParcelaCartoes'] = pegaValorParcela(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim());
1617 oferta['numParcelaBoleto'] = pegaNumParcela(xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim());
1618 oferta['precoParcelaBoleto'] = pegaValorParcela(xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim());
1619
1620 oferta['precoVendaMaxParcelaOferta'] = xml.find('[name="precoVendaMaxParcelaOferta"]').text().trim();
1621 oferta['formaDePagamentoOferta'] = xml.find('[name="formaDePagamentoOferta"]').text().trim();
1622 oferta['botaoCompraOferta'] = xml.find('[name="botaoCompraOferta"]').text().trim();
1623 oferta['vagasParaCompraOferta'] = xml.find('[name="vagasParaCompraOferta"]').text().trim();
1624 oferta['botaoBolsaOferta'] = xml.find('[name="botaoBolsaOferta"]').text().trim();
1625 oferta['vagasBolsaOferta'] = xml.find('[name="vagasBolsaOferta"]').text().trim();
1626 oferta['dataAberturaBolsaOferta'] = xml.find('[name="dataAberturaBolsaOferta"]').text().trim();
1627 oferta['horaAberturaBolsaOferta'] = xml.find('[name="horaAberturaBolsaOferta"]').text().trim();
1628 oferta['espacoExterno'] = xml.find('[name="espacoExterno"]').text().trim();
1629 oferta['localEspacoExterno'] = xml.find('[name="localEspacoExterno"]').text().trim();
1630 oferta['ruaEspacoExterno'] = xml.find('[name="ruaEspacoExterno"]').text().trim();
1631 oferta['numeroEspacoExterno'] = xml.find('[name="numeroEspacoExterno"]').text().trim();
1632 oferta['complementoEspacoExterno'] = xml.find('[name="complementoEspacoExterno"]').text().trim();
1633 oferta['bairroEspacoExterno'] = xml.find('[name="bairroEspacoExterno"]').text().trim();
1634 oferta['cidadeEspacoExterno'] = xml.find('[name="cidadeEspacoExterno"]').text().trim();
1635 oferta['ufEspacoExterno'] = xml.find('[name="ufEspacoExterno"]').text().trim();
1636 oferta['cepEspacoExterno'] = xml.find('[name="cepEspacoExterno"]').text().trim();
1637 oferta['qtdeTotalVagas'] = xml.find('[name="qtdeTotalVagas"]').text().trim();
1638 oferta['qtdeTotalVagasPSG'] = xml.find('[name="qtdeTotalVagasPSG"]').text().trim();
1639 oferta['horariosAllOferta'] = xml.find('[name="horariosAllOferta"]').text().trim();
1640 oferta['formaDePagamentoCartaoOferta'] = xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim();
1641 oferta['formaDePagamentoBoletoOferta'] = xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim();
1642 oferta['dtLimiteMatricula'] = xml.find('[name="dtLimiteMatricula"]').text().trim();
1643 oferta['dataAberturaMatricula'] = xml.find('[name="dataAberturaMatricula"]').text().trim();
1644 oferta['etapa'] = xml.find('[name="etapa"]').text().trim();
1645
1646 return oferta;
1647 }
1648
1649 function populaOfertas(ofertas){
1650
1651 objsTela.ofertas = ofertas;
1652
1653 if(ofertas && ofertas.length)
1654 $('#ssp-h3-turmas').show()
1655 else
1656 $('#ssp-h3-turmas').hide()
1657
1658
1659 if(ofertas.length == 0){
1660
1661 if($('#unidades-ofertas').val() || $('#chkInscricao').prop('checked') || $('#chkBolsa').prop('checked'))
1662 hideCardSemTurmas(false)
1663
1664 $('.oferta-slick-area').empty();
1665 $('.prev-mobile').addClass('d-none');
1666 $('.next-mobile').addClass('d-none');
1667
1668
1669 return;
1670 }else{
1671 hideCardSemTurmas(true)
1672 $('.prev-mobile, .next-mobile').removeClass('d-none');
1673 }
1674
1675
1676 $('.oferta-slick-area').empty();
1677 ofertas = ofertas.sort(function(a, b){
1678 return ordenar(a, b, 'ordenar');
1679 });
1680 // executa a class do slick slider
1681 $('.oferta-slick-area').removeClass('slick-initialized slick-slider slick-dotted');
1682
1683 //busca o codigoUnidade para o link do ecommerce
1684
1685 var selectedUnidade = $('#unidades-ofertas').val().split('@')[0];
1686 for(var i=0;objsTela.unidades.length > i ;i++){
1687 if(selectedUnidade == objsTela.unidades[i].categoryId)
1688 codigoUnidade = objsTela.unidades[i].codigoUnidade;
1689 }
1690
1691
1692 for(var i=0;ofertas.length > i ;i++){
1693
1694 var oferta = ofertas[i];
1695
1696 //guardando a oferta no map para chamar ajax com infos de bolsa em tempo real
1697 oferta['indice'] = i;
1698 ofertasMap.set(oferta.codigoOferta, oferta);
1699 montaHTMLOferta(oferta, i, codigoUnidade, false);
1700 montaHTMLModalLocalRealizacao(oferta, i);
1701 verificaCursoAprendizagem(i);
1702 associaEventoBtnLocalRealizacao(i);
1703 associaEventosFecharModal(i);
1704
1705 }
1706
1707 sliderOfertas();
1708 }
1709
1710 function montaHTMLOferta(oferta, index, codigoUnidade, posLoad){
1711
1712 var retornoDiasHorarios = processaDiasHorariosOferta(oferta.horariosAllOferta);
1713 diasSemanaHTML = "";
1714
1715 for(var diaDaOferta of retornoDiasHorarios){
1716 diasSemanaHTML += htmlSlickAreaDiasSemana.replace('\{diasSemana\}',diaDaOferta.dias);
1717 diasSemanaHTML = diasSemanaHTML.replace('\{horasSemana\}',diaDaOferta.horario)
1718 }
1719
1720 var ofertaHTML = "";
1721 ofertaHTML = htmlSlickArea(index, oferta, diasSemanaHTML, codigoUnidade)
1722
1723 if(!posLoad)
1724 $('.oferta-slick-area').append(ofertaHTML);
1725 else{
1726 $('.oferta-slick-area').slick('slickAdd', ofertaHTML);
1727 }
1728
1729 ajustaTextoDiasHorarioOferta(oferta.codigoOferta);
1730
1731 if(turmasIniciadas(oferta.dataInicio))
1732 $("#aviso-turma-iniciada-"+index).show();
1733
1734 //remove os botões/itens de compra/bolsa caso seja preciso
1735 $('.oferta-slick-area').find('.d-none-btn').remove();
1736 }
1737
1738 function processaDiasHorariosOferta(horariosAllOferta){
1739
1740 var dias = horariosAllOferta.trim().split(',');
1741 let arrayDiasSemana = [{"Seg":"Segunda"},{"Ter":"Terça"},{"Qua":"Quarta"},{"Qui":"Quinta"},{"Sex":"Sexta"},{"Sab":"Sábado"},{"Dom":"Domingo"}]
1742
1743 var arrayDia = [];
1744 if(dias.length >= 1){
1745 for(var k=0; dias.length > k; k++){
1746
1747 var diasSplit = dias[k].trim().split(' ');
1748 var diasSemana = diasSplit.shift()
1749 var ultimaPos = diasSplit.length-1;
1750 var horasStr = diasSplit[0] + ' às ' + diasSplit[ultimaPos]
1751 arrayDia.push({horasStr,diasSemana});
1752 }
1753 }
1754
1755 arrayDia = groupByArray(arrayDia, 'horasStr','diasSemana');
1756 arrayDia = orderByArray(arrayDia,arrayDiasSemana);
1757
1758 var ret = diaHorarioOfertaFormatado(arrayDia,arrayDiasSemana);
1759 return ret;
1760 }
1761
1762 //cria um array de objetos Agrupando de acordo ao campo informado como chave.
1763 //@arr = Array multidimensional que tenha os campos key e valueAdd
1764 //@key = campo que será chave nesse array
1765 //@valueAdd = campo que será agrupado caso tenha a mesma informação passada no campo key
1766 const groupByArray = (arr, key,valueAdd) => {
1767 const initialValue = [];
1768 const retornoValue = [];
1769 arr.forEach((acc, cval) => {
1770 const myAttribute = cval[key];
1771 acc[key] in retornoValue ? retornoValue[acc[key]].push(acc[valueAdd]):retornoValue[acc[key]]=[acc[valueAdd]];
1772 return acc;
1773 }, initialValue);
1774 return retornoValue;
1775 };
1776
1777
1778 //Cria um array de objetos a partir do primeiro array inserido e ordenados de acordo a ordem do segundo array informado.
1779 //@arrayOrdena = Array de objetos que tenha os campos que precisa ser ordenados
1780 //@ordem = array com a sequencia que queira ordenar - ex: seg, ter, qua, qua
1781 const orderByArray = (arrayOrdena, ordem) => {
1782
1783 let diasSem = [];
1784 const arrayOrdenado = [];
1785 let controle;
1786
1787 //percorre cada campo existente no ordem e busca o mesmo no arrayOrdena, encontrando insere no arrayOrdenado
1788 for(let campo of ordem){
1789 Object.entries(arrayOrdena).forEach(([key, value]) => {
1790 for(let diaOferta of value){
1791 if(diaOferta===Object.keys(campo)[0]){
1792 arrayOrdenado[key]=arrayOrdena[key];
1793 }
1794 }
1795 })
1796 }
1797 return arrayOrdenado;
1798 };
1799
1800 function diaHorarioOfertaFormatado(arrayAgrupadoEOrdenado, arrayDiasDaSemana){
1801
1802 var stringAux = "";
1803 var listRetorno = [];
1804
1805 Object.entries(arrayAgrupadoEOrdenado).forEach(([key, value]) => {
1806
1807 var sequencial = diasSequenciaisOuAlternados(value, arrayDiasDaSemana);
1808 var stringAux = "";
1809 var diaOferta = {};
1810
1811 if(sequencial){
1812 switch (value.length) {
1813 case 1:
1814 stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+": ";
1815 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1816 diaOferta.horario = key;
1817 break;
1818 case 2:
1819 stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" e "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": ";
1820 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1821 diaOferta.horario = key;
1822 break;
1823 default:
1824 stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" a "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": ";
1825
1826 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1827 diaOferta.horario = key;
1828 break;
1829 }
1830 }else{
1831 switch (value.length) {
1832 case 2:
1833 stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" e "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": ";
1834 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1835 diaOferta.horario = key;
1836 break;
1837 default:
1838 var ct = 0;
1839 var stringDias="";
1840 for(let v of value){
1841 ct++;
1842 ct==value.length ? stringDias=stringDias.substring(0,stringDias.length - 2)+" e "+findValueInObject(arrayDiasDaSemana,v) : stringDias+=findValueInObject(arrayDiasDaSemana,v)+", ";
1843 }
1844 stringAux = stringAux+stringDias+": ";
1845 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1846 diaOferta.horario = key;
1847 break;
1848 }
1849 }
1850
1851 listRetorno.push(diaOferta);
1852 })
1853 return listRetorno;
1854 };
1855
1856 //retorna o valor de um objeto dentro de um array
1857 //@objetoBusca = array de objetos que sera buscado o valor
1858 //@keyBusca = nome do campo a ser buscada no objeto para pegar o seu valor
1859 function findValueInObject(objetoBusca, keyBusca){
1860 var retorno = "";
1861 Object.entries(objetoBusca).forEach(([horario, dias]) => {
1862 Object.entries(dias).forEach(([key,val]) => {
1863 if(key.trim()==keyBusca.trim()){
1864 retorno = val;
1865 }
1866 });
1867 });
1868 return retorno;
1869 }
1870
1871 //Recebe um objeto com valores dos dias da semana e define se sao dias seguidos ou alternados.
1872 //@arrayComDiasDaSemana = array com os dias da semana a serem validados - exemplo ['Qua','Qui','Sex']
1873 //@keyBusca = nome do campo a ser buscada no objeto para pegar o seu valor
1874 function diasSequenciaisOuAlternados(arrayComDiasDaSemana, arrayDiasDaSemana){
1875
1876 let arrayValidador = [];
1877
1878 //cria um array com o index dos dias das semanas encontrados [0 = seg, 1 = ter ... 6 = dom]
1879 for(let diaOferta of arrayComDiasDaSemana){
1880 for(let i = 0; i < arrayDiasDaSemana.length; i++){
1881 if(diaOferta === Object.keys(arrayDiasDaSemana[i])[0]){
1882 arrayValidador[i] = true;
1883 }
1884 }
1885 }
1886
1887 let keyCompair = 99;
1888 var sequencial = true;
1889
1890 //verifica quais posições foram criadas no array, e se os valores delas estão em sequencia.
1891 for(let keyValidator of Object.keys(arrayValidador)){
1892 keyValidator = parseInt(keyValidator);
1893 if(keyCompair!==99){
1894 if(keyValidator===keyCompair){
1895 sequencial = true;
1896 }else{
1897 sequencial = false;
1898 break;
1899 }
1900 }
1901 keyCompair = keyValidator+1;
1902 }
1903 return sequencial;
1904 }
1905
1906 function concatSTR(str1, str2, separador){
1907
1908 if(str2){
1909
1910 return str1+separador+str2;
1911 }
1912 return str1;
1913 }
1914
1915 //Distribui dia e horario com quebra de linha entre eles ou nao dependendo da resolução de tela e tamanho da string
1916 function ajustaTextoDiasHorarioOferta(codOferta){
1917
1918 var classOferta = ".codigoOferta_"+codOferta;
1919 let oferta = $(classOferta);
1920
1921 let ofertaDiasSemana = $(oferta).find('*[data-dia-hora="dias-semana"]');
1922
1923 let widthDevice = window.screen.width;
1924 let tamLimDesktop = 185;
1925
1926 if(widthDevice <= 1024){
1927 tamLimDesktop = 180;
1928 }
1929
1930 ofertaDiasSemana.each(function(index){
1931
1932
1933 let widthDiaSemana = $(this).width();
1934
1935 let contentDiaHora = $(this).parent().parent().parent();
1936
1937 if(!(widthDiaSemana <= tamLimDesktop)){
1938 $(this).css("display","block");
1939 }
1940
1941 if(ofertaDiasSemana.length == parseInt(index+1)){
1942 contentDiaHora.css("opacity","1");
1943 }
1944
1945 })
1946 }
1947
1948 function turmasIniciadas(dataInicioCurso){
1949
1950 var hoje = new Date();
1951 var dataInicioPartes = dataInicioCurso.split('/');
1952 var dataInicioCursoOferta = new Date(dataInicioPartes[2], dataInicioPartes[1] - 1, dataInicioPartes[0] , hoje.getHours(),hoje.getMinutes(),hoje.getSeconds(),hoje.getMilliseconds());
1953
1954 return dataInicioCursoOferta.getTime() <= hoje.getTime();
1955 }
1956
1957 function paramOrdem(xml){
1958 return xml.find('[name="dataInicioOferta"]').text();
1959 }
1960
1961 function pegarTextoCartoesAceitos(campo){
1962 indice = campo.indexOf(' em até ');
1963 inicio = 0;
1964 fim = indice;
1965
1966 return campo.substring(inicio, fim);
1967 }
1968
1969 function pegaNumParcela(campo){
1970
1971 indice = campo.indexOf('até ');
1972 inicio = indice + 4;
1973 fim = indice + 6;
1974
1975 return campo.substring(inicio, fim);
1976
1977 }
1978
1979 function pegaValorParcela(campo){
1980
1981 indice = campo.indexOf('R$');
1982 inicio = indice+2;
1983 valorAmericano = campo.substring(inicio)
1984
1985 return formataValor(valorAmericano);
1986
1987 }
1988
1989 function formataValor(valor){
1990
1991 if(!valor.toString().includes(".")){
1992 valor = parseFloat(valor).toLocaleString('pt-BR')+",00";
1993 }else{
1994 valor = parseFloat(valor).toLocaleString('pt-BR');
1995
1996 if(valor.split(",").length == 2){
1997
1998 if(valor.split(",")[1].length == 1)
1999 valor += "0";
2000
2001 }else
2002 valor += ",00";
2003 }
2004
2005 return valor;
2006 }
2007
2008 function verificaCursoAprendizagem(i){
2009 //Esconde elementsos quando o curso é aprendizagem
2010 if($('[name="codigoFT"]').val() == codigoFT){
2011 $('#btnComprar_'+i).remove();
2012 $('#container_investimento_'+i).remove();
2013 $('#container_forma_pgto_'+i).remove();
2014
2015 var avisoAprendizagem = $('#aviso-curso-aprendizagem').clone();
2016 let btnFormAprendizagem = '<button class="btn btn-lg btn-success w-100 mt-3 btnModalAprendizagem" data-modal="open-modal" style="font-size:16px;background:#1FC923;font-weight: 600;">Preencher formulário</button>'
2017 avisoAprendizagem.removeAttr('id');
2018 avisoAprendizagem.removeClass('d-none');
2019 $('.card_oferta_'+i+ ' .ssp-card-oferta-curso').append(avisoAprendizagem);
2020 $('.card_oferta_'+i+ ' .ssp-card-oferta-curso').append(btnFormAprendizagem);
2021 }
2022 }
2023
2024 function associaEventoBtnLocalRealizacao(i){
2025 var btnLocalRealizacao = document.getElementById("btnLocalRealizacao_"+i);
2026
2027 if(btnLocalRealizacao!=null){
2028 btnLocalRealizacao.onclick = function(ev) {
2029 event.preventDefault();
2030 var elem = $(ev.target);
2031 var _modal = document.getElementById(
2032 'modalLocalRealizacao_'+elem.data('index'));
2033 _modal.style.display = "flex";
2034 }
2035 }
2036 }
2037
2038 var htmlModalLocalRealizacao = '<div id="modalLocalRealizacao_{index}" class="ssp-modal">'
2039 htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao">'
2040 htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao__title-content">'
2041
2042 htmlModalLocalRealizacao += '{tituloLocalRealizacao}'
2043
2044 htmlModalLocalRealizacao += '<i class="ssp-card-modal-local-realizacao__btn-close_{index} ssp-card-modal-forma-pagamento__btn-close"></i>'
2045 htmlModalLocalRealizacao += '</div>'
2046 htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao__texto">'
2047 htmlModalLocalRealizacao += '<p class="{classeTextoInfoLocalRealizacao}">A unidade {nomeUnidade} realizará as aulas em outro endereço, conforme informações abaixo:</p>'
2048 htmlModalLocalRealizacao += '<p><span class="ssp-modal-local-realizacao__subtitle localEspacoExternoTexto_{index}">{localEspacoExterno}</span></p>'
2049 htmlModalLocalRealizacao += '<address>'
2050 htmlModalLocalRealizacao += '<span id="endereco_realizacao_{index}" class="{classeEnderecoRealizacao}">{ruaEspacoExterno}, {numeroEspacoExterno} {complementoEspacoExterno}<br></span>'
2051 htmlModalLocalRealizacao += '<span id="bairro_realizacao_{index}" class="{classeBairroRealizacao}">Bairro: {bairroEspacoExterno}<br></span>'
2052 htmlModalLocalRealizacao += '<span id="cidade_realizacao_{index}" class="{classeCidadeRealizacao}">Cidade: {cidadeEspacoExterno} - SP<br></span>'
2053 htmlModalLocalRealizacao += '<span id="cep_realizacao_{index}" class="{classeCepRealizacao}">CEP: {cepEspacoExterno}</span>'
2054 htmlModalLocalRealizacao += '</address>'
2055 htmlModalLocalRealizacao += '<div class="btn ssp-modal-local-realizacao__btn-content">'
2056 htmlModalLocalRealizacao += '<a class="btn ssp-modal-local-realizacao__btn {classeEntendi} ssp-modal-local-realizacao__btn_{index}" href="#a">Entendi</a>'
2057 htmlModalLocalRealizacao +='</div>'
2058 htmlModalLocalRealizacao +='</div>'
2059 htmlModalLocalRealizacao +='</div>'
2060 htmlModalLocalRealizacao +='</div>';
2061
2062 var htmlSlickAreaDiasSemana = '<div class="ssp-card-oferta-curso__dia-hora-item">'
2063 htmlSlickAreaDiasSemana +='<p class="ssp-card-oferta-curso__dia-hora-item__dia">'
2064 htmlSlickAreaDiasSemana += '<span data-dia-hora="dias-semana">{diasSemana}</span>'
2065 htmlSlickAreaDiasSemana += '<span data-dia-hora="horário">{horasSemana}</span>'
2066 htmlSlickAreaDiasSemana += '</p>'
2067 htmlSlickAreaDiasSemana += '</div>';
2068
2069 function htmlSlickArea(index, oferta, diasSemanaHTML, codigoUnidade) {
2070 const btnLocalReal = function(oferta){
2071
2072 var btn = `<div class="container-local-realizacao ` + (oferta.espacoExterno == 'true' ? '' : 'd-none-btn') + `">`;
2073
2074 btn += `<a id="btnLocalRealizacao_` + index + `" data-index="` + index + `" class="ssp-card-oferta-curso__local-realizacao-content__title" href="#"><i class="fas fa-user"></i>Onde as aulas vão acontecer?</a>`;
2075
2076 btn += `</div>`;
2077
2078 return btn;
2079
2080 }
2081
2082 // Card Oferta
2083
2084 let result = `
2085 <div class="slick-area__item card_oferta_` + index + ` codigoOferta_` + oferta.codigoOferta + ` ` + `">
2086
2087 <div class="ssp-card-oferta-curso">
2088
2089 <div class="content-data-dias">
2090
2091 <div class="ssp-card-oferta__info-turma-iniciada" id="aviso-turma-iniciada-` + index + `" style="display:none">
2092 <h6 style="color:white;background-color:#ff7157;border-radius: 5px;padding: 8px 0px;width: 60%;font-size: 12px;margin-top: 0;"><strong>Turma iniciada, comece já!</strong></h6>
2093 </div>
2094
2095 <div class="ssp-card-oferta__info-turma-content">
2096 <h6 class="ssp-card-oferta__info-turma">Informações da turma</h6>
2097 </div>
2098
2099 <div>
2100 <small class="ssp-card-oferta-curso__title-item">Período:</small>
2101 <h6 class="ssp-card-oferta-curso__item-data-periodo item-data-periodo_` + index + `">` + formataPeriodo(oferta.dataInicio, oferta.dataFim) + `</h6>
2102 </div>
2103
2104 <div class="content-horario-dias-semana">
2105
2106 <div class="horario">
2107 <small class="ssp-card-oferta-curso__title-item">Horário e dias das aulas:</small>
2108 </div> ` +
2109
2110 `<div class="ssp-card-oferta-curso__dia-hora_content">
2111 ` + diasSemanaHTML + `
2112 </div>
2113
2114 </div>
2115
2116 ` + btnLocalReal(oferta)
2117
2118
2119 return result
2120 }
2121
2122 function montaHTMLModalLocalRealizacao(oferta, index){
2123
2124 var tituloLocalRealizacao = '<i class="ssp-modal__local-realizacao-content__icon-wifi"></i> <i class="ssp-modal__local-realizacao-content__icon-chalkboard-teacher"></i> <h6 class="ssp-modal-local-realizacao__title"> ONDE AS AULAS VÃO ACONTECER?</h6>';
2125
2126 var localRealizacaoHTMLModal = htmlModalLocalRealizacao
2127 .replace('\{nomeUnidade\}',$('#unidades-ofertas option:selected').text())
2128 .replace('\{localEspacoExterno\}', oferta.localEspacoExterno )
2129 .replace('\{classeTextoInfoLocalRealizacao\}', oferta.ruaEspacoExterno != "" ? "" : "d-none")
2130 .replace('\{classeEnderecoRealizacao\}', oferta.ruaEspacoExterno != "" ? "" : "d-none")
2131 .replace('\{ruaEspacoExterno\}',oferta.ruaEspacoExterno)
2132 .replace('\{numeroEspacoExterno\}',oferta.numeroEspacoExterno)
2133 .replace('\{complementoEspacoExterno\}',oferta.complementoEspacoExterno)
2134 .replace('\{classeBairroRealizacao\}', oferta.bairroEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none")
2135 .replace('\{bairroEspacoExterno\}',oferta.bairroEspacoExterno)
2136 .replace('\{classeCidadeRealizacao\}', oferta.cidadeEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none")
2137 .replace('\{cidadeEspacoExterno\}',oferta.cidadeEspacoExterno)
2138 .replace('\{classeCepRealizacao\}', oferta.cepEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none")
2139 .replace('\{cepEspacoExterno\}',oferta.cepEspacoExterno)
2140 .replace(regIndex, index)
2141 .replace('\{tituloLocalRealizacao\}', tituloLocalRealizacao)
2142 .replace('\{classeEntendi\}', "");
2143
2144 $('.oferta-slick-area_modal').append(localRealizacaoHTMLModal);
2145 $('.oferta-slick-area_modal').find('.d-none-btn').remove();
2146
2147 if(oferta.ruaEspacoExterno == "")
2148 $('.localEspacoExternoTexto_'+index).removeClass('ssp-modal-local-realizacao__subtitle');
2149 }
2150
2151 //Formata exibicao de datas conforme especificacao GCR
2152 function formataPeriodo(dataInicio, dataFim){
2153
2154 var dtInicioPartes = dataInicio.split('/');
2155 var dtFimPartes = dataFim.split('/');
2156
2157 //Não exibir o número zero antes dos números e o dia 1 como 1º
2158 var dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim())) +'/'+parseInt(dtInicioPartes[1].trim())+'/'+dtInicioPartes[2].trim();
2159 var dFimFormatada = (parseInt(dtFimPartes[0].trim()) == 1 ? '1º' : parseInt(dtFimPartes[0].trim())) +'/'+parseInt(dtFimPartes[1].trim())+'/'+dtFimPartes[2].trim();
2160
2161 //Quando um curso inicia e finaliza dentro do mesmo ano: 17/2 a 25/4/2020
2162 if(dtInicioPartes[2].trim() == dtFimPartes[2].trim()){
2163
2164 dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim()))+'/'+parseInt(dtInicioPartes[1].trim());
2165
2166 //Quando um curso inicia e finaliza dentro do mesmo mês: 5 a 30/4/2020
2167 if(dtInicioPartes[1].trim() == dtFimPartes[1].trim())
2168 dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim()));
2169 }
2170
2171 return dInicioFormatada + ' a ' + dFimFormatada;
2172 }
2173
2174 function strToFloat(str) {
2175 const separator = str.includes(',') ? ',' : '.'
2176
2177 const numArr = str.split(separator)
2178 const inteiro = numArr[0].replaceAll('.', '').replaceAll(',', '.')
2179 const decimal = numArr[1] ? numArr[1].replaceAll('.', '').replaceAll(',', '.') : ''
2180 return parseFloat(inteiro.concat('.').concat(decimal ? decimal : '0'))
2181 }
2182
2183 function associaEventosFecharModal(i){
2184
2185 var closeModalLocalRealizacao = document.getElementsByClassName("ssp-card-modal-local-realizacao__btn-close_"+i)[0];
2186 var btnEntendiLocalRealizacao = document.getElementsByClassName("ssp-modal-local-realizacao__btn_"+i)[0];
2187
2188 //event close modal
2189 closeModalLocalRealizacao.onclick = function() {
2190
2191 $('[id^="modalLocalRealizacao_"]').each(function(index,modal){
2192 modal.style.display = "none";
2193
2194 });
2195 }
2196
2197 btnEntendiLocalRealizacao.onclick = function() {
2198
2199 $('[id^="modalLocalRealizacao_"]').each(function(index,modal){
2200 modal.style.display = "none";
2201 });
2202 }
2203
2204 // When the user clicks anywhere outside of the modal, close it
2205 window.onclick = function(event) {
2206
2207 $('[id^="modalLocalRealizacao_"]').each(function(index,_modal){
2208 if (event.target == _modal)
2209 _modal.style.display = "none";
2210 });
2211
2212
2213 }
2214 }
2215
2216 //Abrir e fechar modal
2217
2218 function closeModalFormAprendizagem(){
2219 let modal = document.querySelector('[data-modal="modal"]')
2220
2221 modal.classList.remove('open-modal-form')
2222
2223 }
2224
2225
2226 function openModalFormAprendizagem(){
2227 let modal = document.querySelector('[data-modal="modal"]')
2228
2229 modal.classList.add('open-modal-form')
2230
2231 }
2232
2233 function cloneObj(original) {
2234 return JSON.parse(JSON.stringify(original));
2235 }
2236
2237
2238 </script>