Um erro ocorreu enquanto processava o modelo.
The following has evaluated to null or missing:
==> articleId [in template "20102#20129#28135110" at line 957, 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 957, 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 <div class="${prefix}-header-curso__tag-formato bg-nivel-jovem-aprendiz">
818 <span>Jovem Aprendiz</span>
819 </div>
820
821 </div>
822
823 <#-- Detalhe de Curso -->
824
825 <section id="curso-info">
826
827 <div class="ssp-card-detalhe-curso__container">
828
829 <div class="ssp-card-detalhe-curso">
830
831 <div class="ssp-card-detalhe-curso__tag-color-tipo bg-nivel-jovem-aprendiz"></div>
832
833 <div class="container">
834
835 <div class="ssp-card-detalhe-curso__content">
836
837 <div>
838
839 <h1 class="ssp-card-detalhe-curso__title">${tituloCurso}</h1>
840 <span class="ssp-card-detalhe-curso__description">${objetivo}</span>
841
842 </div>
843
844 <div class="ssp-card-detalhe-curso__secunday-info-content">
845
846 <#list entry.getCategories()![] as category>
847
848
849 <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim />
850
851 <#if normalizer.normalize(vocabularyName) == "tipo-de-curso">
852 <#assign normalizedCategoryName = normalizer.normalize(category.getName()) />
853 <a class="ssp-card-detalhe-curso__secunday-info-back-link d-lg-none d-md-none" href="#">${category.getName()}</a>
854 </#if>
855
856 </#list>
857
858 <#if cargaHoraria?length != 0>
859 <p class="ssp-card-detalhe-curso__secundary-info-carga-horaria">${cargaHoraria}</p>
860 </#if>
861
862 </div>
863
864 </div>
865
866 <div class="ssp-saiba-mais-curso-accordion">
867
868 <#-- Get no campo repeatable -->
869 <#assign topicoItemRepeatableNode = document.getRootElement().selectNodes("//dynamic-element[@field-reference='topicoItemFieldSet']") />
870
871 <#-- Lista de cardsUnidades -->
872 <#list topicoItemRepeatableNode as itemTopico>
873
874 <#-- ìcone Slider -->
875 <#assign tituloTopico = itemTopico.selectSingleNode("dynamic-element[@field-reference='tituloTopico']").getStringValue()?trim>
876
877 <#-- Nome da Unidade -->
878 <#assign descTopico = itemTopico.selectSingleNode("dynamic-element[@field-reference='descTopico']").getStringValue()?trim>
879
880 <div class="ssp-saiba-mais-curso-accordion__body">
881 <div class="ssp-saiba-mais-curso-accordion__heading">${tituloTopico}</div>
882 <div class="ssp-saiba-mais-curso-accordion__contents">${descTopico}</div>
883 </div>
884
885 </#list>
886
887 </div>
888
889 </div>
890
891 </div>
892 </div>
893
894 <!-- Confira as novas turmas -->
895
896 <section class="ssp-section-novas-turmas" style="background: #2a2e43;">
897 <div class="container">
898
899 <h3 class="ssp-section-title ssp-card-oferta-curso__section-title" style="margin: 24px 0;">Confira as unidades com vagas disponíveis</h3>
900
901 <div class="row ssp-filters-px justify-content-center">
902 <div class="col-12 col-lg px-md-0 order-1">
903 <div class="ssp-container-selecione-unidade row no-gutters">
904 <div class="col-12">
905 <div class="ssp-container__form-select mx-auto">
906 <label for="unidades-ofertas" class="ssp-switch-label ssp-switch-label-section mx-0 d-none d-lg-block">Selecione uma unidade:</label>
907 <select id="unidades-ofertas" class="form-control" name="unidades-ofertas">
908 <option value="">Selecione uma unidade</option>
909 </select>
910 </div>
911 </div>
912 </div>
913 </div>
914
915 <div id="ssp-alternadores" class="col mt-5 mt-lg-0 px-md-0 order-3 order-lg-2" style="max-width: 480px;">
916 <div class="row no-gutters ssp-switch-label ssp-switch-label-section mx-0">Filtre por:</div>
917 <div class="row no-gutters mt-4">
918
919 <div class="col-12 col-lg">
920 <div class="d-flex justify-content-between justify-content-lg-start">
921 <label class="ssp-switch order-2 order-lg-1">
922 <input type="checkbox" id="chkInscricao">
923 <span class="ssp-switch-slider round"></span>
924 </label>
925 <label for="chkInscricao" class="ssp-switch-label order-1 order-lg-2">Inscrições abertas</label>
926 </div>
927 </div>
928
929 <div class="ssp-switch-divider d-md-none my-4"></div>
930
931 </div>
932 </div>
933
934 <div class="col-12 order-2 order-lg-3">
935 <div class="row text-center text-lg-left">
936 <div id="msgFiltroAplicado" class="col-12 ssp-switch-label-message" style="display: none;">
937 <div class="row no-gutters">
938 <span class="col-12 ssp-col-lg-without">Filtro aplicado com sucesso! Confira o resultado.</span>
939 </div>
940 </div>
941 </div>
942 </div>
943
944 </div>
945
946 <div class="ssp-ofertas__box-endereco-unidade d-none">
947 <i class="icon-map-adress"></i>
948 <a href="" target="_blank" class="ssp-ofertas__endereco-unidade"></a>
949 </div>
950
951 </div>
952
953 </section>
954
955 <input type="hidden" name="codigoFT" value="${codigoFT}" />
956 <input type="hidden" name="dataEfetivaSTR" value="${dataEfetivaSTR}" />
957 <input type="hidden" name="articleId" value="${articleId}" />
958
959
960 <#-- Section para listar as ofertas - 9525 -28/02/2022-->
961 <section id="ssp-section-response" class="ssp-section" style="background: #2a2e43; position: relative;">
962
963 <div id="turmas-container" class="container">
964
965 <div id="informe-novas-turmas">
966 <div style="display: flex; flex-wrap: nowrap;">
967
968 <a class="prev-mobile d-lg-none d-xl-none nextPrevOpacity" href="#" >
969 <i class="fas fa-chevron-left"></i>
970 </a>
971
972 <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>
973
974 <a href="#" class="next-mobile d-lg-none d-xl-none" >
975 <i class="fas fa-chevron-right"></i>
976 </a>
977
978 </div>
979
980
981 <div class="oferta-slick-area oferta-slick-area--md-bleed slider-container">
982
983 </div>
984 </div>
985
986 <div class="ssp-card-oferta-curso__sem-vaga d-none" style="margin: auto;">
987
988 <h3 class="ssp-card-oferta-curso__sem-vaga-title">
989 Poxa... Estamos sem turmas agendadas no momento.
990 </h3>
991
992 <p class="ssp-card-oferta-curso__sem-vaga-description">
993 Mas, registre seu interesse aqui embaixo e avisamos você quando surgirem novas turmas.
994 </p>
995 </div>
996
997 <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>
998
999 <div class="oferta-slick-area_modal">
1000 </div>
1001 </div>
1002
1003 <div id="ssp-abrir-pagina-bolsa" class="ssp-card-duvida__bolsa-estudo d-none" style="margin-top: 44px;">
1004
1005 <p>Tem dúvidas sobre bolsas de estudo?</p>
1006 <a href="/bolsas-de-estudo/como-funciona">Saiba como funciona</a>
1007
1008 </div>
1009
1010 </section>
1011
1012 <!-- Aviso para curso de aprendizagem -->
1013 <div id="aviso-curso-aprendizagem" class="ssp-bolsa-formulario__card-aviso-atencao d-none" style="width: 100%;">
1014
1015 <i class="fas fa-exclamation-circle ssp-bolsa-formulario__card-aviso-atencao-icon" aria-hidden="true"></i>
1016
1017 <div class="ssp-bolsa-formulario__card-aviso-texto">
1018 <p>Para contratar aprendiz, preencha o formulário e entraremos em contato.</p>
1019 </div>
1020
1021 </div>
1022
1023
1024 <!-- modal form de aprendizagem -->
1025
1026 <#assign resources = themeDisplay.getPortalURL() />
1027 <link href="${resources}/documents/d/global/css-formulario-aprendizagem" rel="stylesheet" type="text/css">
1028
1029 <dialog id="modal-form" class="ssp-modal-ds">
1030
1031 <button type="button" data-modal="close-form-modal">
1032 Fechar
1033 <i class="fas fa-times"></i>
1034 </button>
1035
1036 </dialog>
1037
1038 </#list>
1039
1040
1041 <script>
1042
1043 const codigoFT = $('[name="codigoFT"]').val();
1044 const dataEfetiva = $('[name="dataEfetivaSTR"]').val();
1045 const articleId = $('[name="articleId"]').val();
1046 var ofertasMap = new Map();
1047 var groupId = themeDisplay.getScopeGroupId();
1048 var startOfertaParam = 0;
1049 var endOfertaParam = 16;
1050 var regIndex = new RegExp('\{index\}', 'g');
1051
1052 var objsTela = {
1053 unidades: [],
1054 categoriesIds:[]
1055 };
1056
1057 var urlSearchCursoInfo = '/o/senac-content-services/cursosInfoDetalhe/{groupId}/{cursosInfo}?inscricaoAberta={inscricaoAberta}&bolsaAberta={bolsaAberta}';
1058 var urlUnidadeInfoDetalhe = '/o/senac-content-services/unidadeInfoDetalhe/{companyId}/{codigoUnidade}';
1059 var urlSearchOferta = '/o/senac-oferta-services/ofertasPorCategoryIds/' + groupId
1060
1061 $(document).ready(function(){
1062
1063
1064 const urlParams = new URLSearchParams(window.location.search);
1065 $('#chkInscricao').prop("checked", urlParams.get('inscricao') == 'true');
1066 $('#chkInscricao').change(ev => selectFilter('inscricao', $('#chkInscricao')) );
1067
1068 loadUnidades(true,"")
1069
1070 $(".next-mobile").on("click",function(e){
1071 e.preventDefault();
1072
1073 acoesMobileSliderOfertas("left");
1074 });
1075
1076 $(".prev-mobile").on("click",function(e){
1077 e.preventDefault();
1078
1079 acoesMobileSliderOfertas("right");
1080 });
1081
1082 //ação de drag do card de ofertas no mobile
1083 $('.oferta-slick-area').on('swipe', function(event, slick, direction){
1084 acoesMobileSliderOfertas(direction);
1085 });
1086
1087 // Modal Aprendizagem
1088 let modalFormAprendizagem = document.querySelector('[data-modal="modal"]')
1089 if(modalFormAprendizagem){
1090 // Create dinamic close buttom form
1091 let btnCloseModalForm = document.querySelector('[data-modal="close-form-modal"]')
1092
1093 btnCloseModalForm.addEventListener('click',closeModalFormAprendizagem)
1094
1095 }
1096
1097 $(".oferta-slick-area").on("click", ".btnModalAprendizagem", openModalFormAprendizagem);
1098
1099 });
1100
1101 $(".ssp-saiba-mais-curso-accordion").on("click", ".ssp-saiba-mais-curso-accordion__heading", function() {
1102
1103 $(this).toggleClass("active").next().slideToggle();
1104
1105 $(".sp-saiba-mais-curso-accordion__contents").not($(this).next()).slideUp(300);
1106
1107 $(this).siblings().removeClass("active");
1108 });
1109
1110 function acoesMobileSliderOfertas(direcao){
1111
1112 if(direcao == "right"){
1113 $("a.slick-prev").click();
1114
1115 if($('.slick-current').attr('data-slick-index') == "0")
1116 $('.prev-mobile').addClass('nextPrevOpacity');
1117
1118 if($(".next-mobile").hasClass('nextPrevOpacity'))
1119 $('.next-mobile').removeClass('nextPrevOpacity');
1120 }
1121
1122
1123 if(direcao == "left"){
1124 $("a.slick-next").click();
1125
1126 if($(".prev-mobile").hasClass('nextPrevOpacity'))
1127 $('.prev-mobile').removeClass('nextPrevOpacity');
1128
1129 if(carregouUltimaOferta){
1130 var totalCardOfertas = $('#turmas-container .slick-area__item').length;
1131 var currentSliderIndex = parseInt($('.slick-current').attr('data-slick-index'));
1132
1133 //o card do meio é o último
1134 if(totalCardOfertas == (currentSliderIndex + 1))
1135 $('.next-mobile').addClass('nextPrevOpacity');
1136 }
1137 }
1138 }
1139
1140 function loadUnidades(showOptions, unidadeValue){
1141
1142 //Busca as unidades do curso
1143 const urlCursoInfo = urlSearchCursoInfo
1144 .replace('\{groupId\}', groupId)
1145 .replace('\{cursosInfo\}', $('[name="articleId"]').val())
1146 .replace('\{inscricaoAberta\}', $('#chkInscricao').prop('checked'))
1147 .replace('\{bolsaAberta\}', false);
1148
1149 $.ajax({
1150 url:urlCursoInfo,
1151 method:'get',
1152 async: false,
1153 beforeSend: function () {
1154 loading('.oferta-slick-area');
1155 }
1156 }).done(
1157 function(data){
1158
1159 if(data.length > 0){
1160
1161 const cursoInfo = JSON.parse(data);
1162
1163
1164 //GCR pediu para voltarmos no combo as unidades vinculadas e não somente as que possuem ofertas
1165 //const unidades = cursoInfo.unidadesComOferta;
1166 const unidades = cursoInfo.unidadesOfertantes;
1167
1168 objsTela.unidades = []
1169 mapUnidadesIds = new Map();
1170
1171 $.each(unidades, function(k,item){
1172
1173 var unidade = cloneObj(item);
1174 unidade['categoryId'] = item['categoryId'];
1175 unidade['codigoUnidade'] = item['codigoUnidade'];
1176 unidade['nome'] = item['nomeUnidade'];
1177 unidade['enderecoUnidade'] =item['enderecoUnidade'];
1178 unidade['numero'] =item['numEnderecoUnidade'];
1179 unidade['complemento'] = item['complementoEnderecoUnidade'];
1180 unidade['bairro'] = item['bairroUnidade'];
1181 unidade['googlemapsUnidade'] = item['googlemapsUnidade'];
1182 unidade['ofertas'] = [];
1183 unidade['friendlyURL'] = item['friendlyURL'];
1184
1185 objsTela.unidades.push(unidade);
1186
1187 mapUnidadesIds.set(unidade['categoryId'], unidade['codigoUnidade']);
1188 console.log("items ", item)
1189 });
1190
1191 populaSelectUnidades(undefined, showOptions, unidadeValue);
1192
1193 }
1194 });
1195
1196 }
1197
1198 function selectFilter(paramkey, el) {
1199 setUrlParam(paramkey, el.prop("checked"))
1200 var unidades = objsTela.unidades;
1201 //const currentUnidadeFriendlyURLSelected = $('#unidades-ofertas').find('option').filter(':selected').attr('data-unidade-friendly-url')
1202
1203 splitted = $('#unidades-ofertas').val().split("@");
1204 var categoryIdUnidade = splitted[0];
1205 var codUnidade = splitted[1];
1206 console.log("splitted ", splitted)
1207 for(var i = 0; unidades.length > i ; i++){
1208
1209 if(unidades[i].categoryId == categoryIdUnidade){
1210
1211 getOfertas(codigoFT, dataEfetiva, unidades[i].categoryId, $('#chkInscricao').prop("checked"));
1212
1213 }
1214 }
1215 loadUnidades(true, "")
1216
1217 if($('#chkInscricao').prop("checked")) $('#msgFiltroAplicado').show()
1218 else $('#msgFiltroAplicado').hide()
1219 }
1220
1221 function setUrlParam(key, value) {
1222 const url = new URL(window.location.href);
1223
1224 if(value)
1225 url.searchParams.set(key, value);
1226 else
1227 url.searchParams.delete(key);
1228
1229 window.history.pushState({}, '', url.toString())
1230 }
1231
1232 function defineCurrentUrl(ev) {
1233 const currentUnidadeFriendlyURLSelected = $(ev.target).find('option').filter(':selected').attr('data-unidade-friendly-url')
1234
1235 const hasPathWeb = window.location.pathname.includes('/web')
1236 const hasPathGuest = window.location.pathname.includes('/guest')
1237
1238 let currentPath = window.location.pathname
1239 currentPath = hasPathWeb ? currentPath.substring(4) : currentPath
1240 currentPath = hasPathGuest ? currentPath.substring(6) : currentPath
1241
1242 objsTela.unidadesRegistroInteresse.forEach(unidade => currentPath = currentPath.replace('/' + unidade.friendlyURL, ''))
1243
1244 currentPath = (currentUnidadeFriendlyURLSelected ? '/' + currentUnidadeFriendlyURLSelected : '') + currentPath
1245 currentPath = hasPathGuest ? '/guest' + currentPath : currentPath
1246 currentPath = hasPathWeb ? '/web' + currentPath : currentPath
1247
1248 if(keepURL())
1249 window.history.replaceState(window.history.state, '', currentPath + window.location.search)
1250 }
1251
1252
1253
1254 function populaSelectUnidades(unidades, showOptions, unidadeValue){
1255
1256 //Oredenacao
1257 objsTela.unidades.sort(function (a, b) {
1258 return ordenar(a, b, 'nome');
1259 });
1260
1261 $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').addClass('d-none');
1262 hideCardSemTurmas(true)
1263
1264 //console.log('Unidade Pre '+unidadePreSelecionada);
1265
1266 if(objsTela.unidades.length == 0){
1267 if(!showOptions)
1268 $('.ssp-container-selecione-unidade').addClass('d-none');
1269 $('.oferta-slick-area').empty();
1270 $('.prev-mobile').addClass('d-none');
1271 $('.next-mobile').addClass('d-none');
1272
1273 }
1274
1275 let unidadeFounded;
1276
1277 $('#unidades-ofertas').empty()
1278
1279 if(objsTela.unidades && objsTela.unidades.length)
1280 $('#unidades-ofertas').append($('<option value="">Clique na unidade de interesse</option>'))
1281 else
1282 $('#unidades-ofertas').append($('<option value="">Nenhum resultado encontrado</option>'))
1283
1284 unidadeFounded = criarOptionUnidadesPorRegiao(objsTela.unidades)
1285
1286 /* $.each(objsTela.unidades, function(k,unidade){
1287
1288 if($('#unidades-ofertas').find('[value="'+unidade['categoryId']+'"]').length == 0){
1289
1290 var option = $('<option>');
1291 option.val(unidade['categoryId']+"@"+unidade['codigoUnidade']);
1292 option.text(unidade['nome']);
1293 option.attr('data-unidade-friendly-url', unidade.friendlyURL)
1294
1295 $('#unidades-ofertas').append(option);
1296
1297
1298 }
1299 });
1300
1301 **/
1302
1303 if(unidadeFounded){
1304 $('#unidades-ofertas').val(unidadeFounded['categoryId']+"@"+unidadeFounded['codigoUnidade']);
1305 $('#unidades-ofertas').change();
1306 }
1307
1308 loadAlternadores();
1309
1310 $('.prev-mobile').addClass('d-none');
1311 $('.next-mobile').addClass('d-none');
1312 $('.oferta-slick-area').empty();
1313
1314
1315 }
1316
1317 function ordenar(objA, objB, nomeAtributo){
1318 let a = (nomeAtributo) ? objA[nomeAtributo] : objA;
1319 let b = (nomeAtributo) ? objB[nomeAtributo] : objB;
1320
1321 if (a > b) return 1;
1322 if (a < b) return -1;
1323 return 0;
1324 }
1325
1326 $('#unidades-ofertas').change(ev => {
1327 mudarUnidade(ev)
1328 });
1329
1330
1331 function mudarUnidade(ev){
1332
1333 var elem = $(ev.target);
1334 var unidades = objsTela.unidades;
1335
1336 //Unidade sem value tratamento
1337 if(!elem.val()){
1338 $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').addClass('d-none');
1339
1340 if($('#unidades-ofertas option').length <= 1)
1341 hideCardSemTurmas(false)
1342 else
1343 hideCardSemTurmas(true)
1344
1345
1346 elem.val('')
1347 return;
1348 } else {
1349 $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').removeClass('d-none');
1350
1351 if($('#unidades-ofertas option').length <= 1)
1352 hideCardSemTurmas(false)
1353 else
1354 hideCardSemTurmas(true)
1355 }
1356
1357 //colocamos dentro do option categoryId@codUnidade
1358 splitted = elem.val().split("@");
1359 var categoryIdUnidade = splitted[0];
1360 var codUnidade = splitted[1];
1361 console.log("splitted ", splitted)
1362 for(var i = 0; unidades.length > i ; i++){
1363
1364 if(unidades[i].categoryId == categoryIdUnidade){
1365
1366 var unidade = unidades[i];
1367
1368 //Exibe o endereco da unidade
1369 const urlBuscaUnidade = urlUnidadeInfoDetalhe
1370 .replace('\{companyId\}',themeDisplay.getCompanyId())
1371 .replace('\{codigoUnidade\}', unidade.codigoUnidade);
1372
1373 $.ajax({
1374 url : urlBuscaUnidade,
1375 type : 'get',
1376 dataType: 'json',
1377 success: function( unidadeInfo ) {
1378 if(unidadeInfo != null && typeof unidadeInfo !== 'undefined'){
1379
1380 var endereco = concatSTR(unidadeInfo.enderecoUnidade,unidadeInfo.numEnderecoUnidade,', ');
1381 endereco = concatSTR(endereco,unidadeInfo.complementoEnderecoUnidade, ' - ');
1382 endereco = concatSTR(endereco,unidadeInfo.bairroUnidade, ' - ');
1383
1384 $('.ssp-ofertas__endereco-unidade').text(endereco);
1385 $('.ssp-ofertas__endereco-unidade').attr('href',unidadeInfo.googlemapsUnidade);
1386 $('.ssp-ofertas__box-endereco-unidade').removeClass("d-none")
1387 }
1388 },
1389 error: function(data){
1390 $('.ssp-ofertas__box-endereco-unidade').addClass("d-none")
1391 $('.ssp-ofertas__endereco-unidade').text('');
1392 $('.ssp-ofertas__endereco-unidade').attr('href','#a');
1393 console.log('Unidade não encontrada');
1394 }
1395 })
1396
1397 getOfertas(codigoFT, dataEfetiva, unidades[i].categoryId, $('#chkInscricao').prop("checked"));
1398
1399 }
1400 }
1401
1402 }
1403
1404 function criarOptionUnidadesPorRegiao(unidades) {
1405 let regioes = {}
1406 let unidadeFounded
1407
1408 unidades.forEach(unidade => {
1409 if(!regioes[unidade.codRegiaoUnidade || 'N'])
1410 regioes[unidade.codRegiaoUnidade || 'N'] = []
1411
1412 regioes[unidade.codRegiaoUnidade || 'N'].push(unidade)
1413 })
1414
1415 Array.from(['C', 'I', 'GS', 'N'])
1416 .filter(key => Object.keys(regioes).includes(key))
1417 .forEach(key => {
1418 const unidadesDaRegiao = regioes[key]
1419
1420 const optionDisabled = $('<option>')
1421 optionDisabled.attr('label', getRegiaoName(key))
1422 optionDisabled.text(getRegiaoName(key));
1423 optionDisabled.attr('disabled', true)
1424 optionDisabled.addClass('ssp-option-group')
1425 $('#unidades-ofertas').append(optionDisabled)
1426
1427 $.each(unidadesDaRegiao, function(k,unidade){
1428 if($('#unidades-ofertas').find('[value="'+unidade['categoryId']+'"]').length == 0){
1429 var option = $('<option>');
1430 option.val(unidade['categoryId']+"@"+unidade['codigoUnidade']);
1431 option.text(unidade['nome']);
1432 option.attr('data-unidade-friendly-url', unidade.friendlyURL)
1433 option.addClass('ssp-option')
1434
1435 $('#unidades-ofertas').append(option);
1436
1437 unidadeFounded = !unidadeFounded
1438 }
1439 })
1440 })
1441
1442 return unidadeFounded
1443 }
1444
1445 function getRegiaoName(key) {
1446 switch (key) {
1447 case "C":
1448 return "Capital";
1449 case "I":
1450 return "Interior";
1451 case "GS":
1452 return "Grande São Paulo e Litoral";
1453 default:
1454 return "Sem Região";
1455 }
1456 }
1457
1458 function loadAlternadores() {
1459
1460 let $alternadores = $('#ssp-alternadores');
1461 if($('#unidades-ofertas').is(":hidden") || $('#unidades-ofertas option').length <= 1) {
1462
1463 if(!$('#chkInscricao').prop('checked')) $alternadores.hide();
1464 else $alternadores.show();
1465
1466 }else $alternadores.show();
1467
1468 }
1469
1470 function hideCardSemTurmas(hide){
1471 if(hide){
1472 $('.ssp-card-oferta-curso__sem-vaga').addClass('d-none');
1473 $('.ssp-card-oferta-curso__mensagem-legal').css('margin', '0px 0 0 0;')
1474 }else{
1475 $('.ssp-card-oferta-curso__sem-vaga').removeClass('d-none');
1476 $('.ssp-card-oferta-curso__mensagem-legal').css('margin', '')
1477 }
1478 }
1479
1480 function getOfertas(codigoFT, dataEfetivaOferta, categoryId, filtrarInscricoes){
1481
1482 var indiceUnidade = -1;
1483
1484 for(var i = 0; i < objsTela.unidades.length; i++)
1485 if(objsTela.unidades[i].categoryId == categoryId)
1486 indiceUnidade = i;
1487
1488 if(!objsTela.categoriesIds.includes(categoryId) ||
1489 objsTela.unidades[indiceUnidade].ofertasFiltradas != filtrarInscricoes){
1490
1491 objsTela.unidades[indiceUnidade]['ofertas'] = []
1492
1493 var params = new URLSearchParams();
1494 params.set('codigoFTOferta',codigoFT)
1495 params.set('dataEfetivaOferta',dataEfetivaOferta)
1496 params.set('categoryIds',categoryId)
1497 params.set('start',startOfertaParam)
1498 params.set('end',endOfertaParam)
1499 params.set('inscricaoAberta', filtrarInscricoes)
1500 params.set('bolsaAberta', false)
1501 params.set('cursoArticleId', $('[name="articleId"]').val() || '');
1502
1503 const url = urlSearchOferta + '?' + params.toString()
1504
1505 $.ajax({
1506 url:url,
1507 method:'get',
1508 dataType:'json',
1509 async: false
1510 }).done(
1511 function(data){
1512
1513 if(data.length > 0){
1514 $('.ssp-container-selecione-unidade').show();
1515
1516 data.forEach(function(ofertaJSON,index){
1517
1518 var oferta = getOfertaObjectFromJson(ofertaJSON,index);
1519
1520 //Preenche as ofertas da unidade
1521 objsTela.unidades[indiceUnidade]['ofertas'].push(oferta);
1522
1523
1524 });
1525 }
1526 objsTela.categoriesIds.push(categoryId);
1527 populaOfertas(objsTela.unidades[indiceUnidade]['ofertas']);
1528 objsTela.unidades[indiceUnidade].ofertasFiltradas = filtrarInscricoes;
1529 }
1530 )
1531
1532 //Se estiver na cache, valida as ofertas
1533 }else{
1534
1535 populaOfertas(objsTela.unidades[indiceUnidade]['ofertas']);
1536
1537 }
1538 }
1539
1540 function getOfertaObjectFromJson(ofertaJSON,index){
1541
1542
1543 var oferta = {};
1544 var xml = $($.parseXML(ofertaJSON.content));
1545 oferta['ordenar'] = paramOrdem(xml);
1546 oferta['vagasTotal'] = xml.find('[name="vagasTotal"]').text().trim();
1547 var dataInicio = xml.find('[name="dataInicioOferta"]').text().split('-');
1548 var dataFim =xml.find('[name="dataFimOferta"]').text().split('-');
1549 oferta['dataInicio'] = dataInicio[2].trim()+'/'+dataInicio[1].trim()+'/'+dataInicio[0].trim();
1550 oferta['dataFim'] = dataFim[2].trim()+'/'+dataFim[1].trim()+'/'+dataFim[0].trim();
1551 oferta['horaInicio'] = xml.find('[name="horaInicioOferta"]').text();
1552 oferta['codigoOferta'] = xml.find('[name="codigoOferta"]').text().trim();
1553 var dias = [];
1554 oferta['horaFimOferta'] = xml.find('[name="horaFimOferta"]').text().trim();
1555 xml.find('[name="diasDaSemanaOferta"]').find('option').each(function(index,dia){
1556 dias.push($(dia).text());
1557 });
1558 oferta['diasDaSemanaOferta'] = dias;
1559 oferta['periodoDiaOferta'] = xml.find('[name="periodoDiaOferta"]').text().trim();
1560 oferta['precoCheioOferta'] = xml.find('[name="precoCheioOferta"]').text().trim();
1561 oferta['precoVendaOferta'] = xml.find('[name="precoVendaOferta"]').text().trim();
1562 oferta['numeroMaxParcelasOferta'] = xml.find('[name="numeroMaxParcelasOferta"]').text().trim();
1563
1564 oferta['textoCartoesAceitos'] = pegarTextoCartoesAceitos(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim());
1565 oferta['numParcelaCartoes'] = pegaNumParcela(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim());
1566 oferta['precoParcelaCartoes'] = pegaValorParcela(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim());
1567 oferta['numParcelaBoleto'] = pegaNumParcela(xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim());
1568 oferta['precoParcelaBoleto'] = pegaValorParcela(xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim());
1569
1570 oferta['precoVendaMaxParcelaOferta'] = xml.find('[name="precoVendaMaxParcelaOferta"]').text().trim();
1571 oferta['formaDePagamentoOferta'] = xml.find('[name="formaDePagamentoOferta"]').text().trim();
1572 oferta['botaoCompraOferta'] = xml.find('[name="botaoCompraOferta"]').text().trim();
1573 oferta['vagasParaCompraOferta'] = xml.find('[name="vagasParaCompraOferta"]').text().trim();
1574 oferta['botaoBolsaOferta'] = xml.find('[name="botaoBolsaOferta"]').text().trim();
1575 oferta['vagasBolsaOferta'] = xml.find('[name="vagasBolsaOferta"]').text().trim();
1576 oferta['dataAberturaBolsaOferta'] = xml.find('[name="dataAberturaBolsaOferta"]').text().trim();
1577 oferta['horaAberturaBolsaOferta'] = xml.find('[name="horaAberturaBolsaOferta"]').text().trim();
1578 oferta['espacoExterno'] = xml.find('[name="espacoExterno"]').text().trim();
1579 oferta['localEspacoExterno'] = xml.find('[name="localEspacoExterno"]').text().trim();
1580 oferta['ruaEspacoExterno'] = xml.find('[name="ruaEspacoExterno"]').text().trim();
1581 oferta['numeroEspacoExterno'] = xml.find('[name="numeroEspacoExterno"]').text().trim();
1582 oferta['complementoEspacoExterno'] = xml.find('[name="complementoEspacoExterno"]').text().trim();
1583 oferta['bairroEspacoExterno'] = xml.find('[name="bairroEspacoExterno"]').text().trim();
1584 oferta['cidadeEspacoExterno'] = xml.find('[name="cidadeEspacoExterno"]').text().trim();
1585 oferta['ufEspacoExterno'] = xml.find('[name="ufEspacoExterno"]').text().trim();
1586 oferta['cepEspacoExterno'] = xml.find('[name="cepEspacoExterno"]').text().trim();
1587 oferta['qtdeTotalVagas'] = xml.find('[name="qtdeTotalVagas"]').text().trim();
1588 oferta['qtdeTotalVagasPSG'] = xml.find('[name="qtdeTotalVagasPSG"]').text().trim();
1589 oferta['horariosAllOferta'] = xml.find('[name="horariosAllOferta"]').text().trim();
1590 oferta['formaDePagamentoCartaoOferta'] = xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim();
1591 oferta['formaDePagamentoBoletoOferta'] = xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim();
1592 oferta['dtLimiteMatricula'] = xml.find('[name="dtLimiteMatricula"]').text().trim();
1593 oferta['dataAberturaMatricula'] = xml.find('[name="dataAberturaMatricula"]').text().trim();
1594 oferta['etapa'] = xml.find('[name="etapa"]').text().trim();
1595 oferta['duracaoDescricaoOferta'] = xml.find('[name="duracaoDescricaoOferta"]').text().trim();
1596
1597 return oferta;
1598 }
1599
1600 function populaOfertas(ofertas){
1601
1602 objsTela.ofertas = ofertas;
1603
1604 if(ofertas && ofertas.length)
1605 $('#ssp-h3-turmas').show()
1606 else
1607 $('#ssp-h3-turmas').hide()
1608
1609
1610 if(ofertas.length == 0){
1611
1612 if($('#unidades-ofertas').val() || $('#chkInscricao').prop('checked') || $('#chkBolsa').prop('checked'))
1613 hideCardSemTurmas(false)
1614
1615 $('.oferta-slick-area').empty();
1616 $('.prev-mobile').addClass('d-none');
1617 $('.next-mobile').addClass('d-none');
1618
1619
1620 return;
1621 }else{
1622 hideCardSemTurmas(true)
1623 $('.prev-mobile, .next-mobile').removeClass('d-none');
1624 }
1625
1626
1627 $('.oferta-slick-area').empty();
1628 ofertas = ofertas.sort(function(a, b){
1629 return ordenar(a, b, 'ordenar');
1630 });
1631 // executa a class do slick slider
1632 $('.oferta-slick-area').removeClass('slick-initialized slick-slider slick-dotted');
1633
1634 //busca o codigoUnidade para o link do ecommerce
1635
1636 var selectedUnidade = $('#unidades-ofertas').val().split('@')[0];
1637 for(var i=0;objsTela.unidades.length > i ;i++){
1638 if(selectedUnidade == objsTela.unidades[i].categoryId)
1639 codigoUnidade = objsTela.unidades[i].codigoUnidade;
1640 }
1641
1642
1643 for(var i=0;ofertas.length > i ;i++){
1644
1645 var oferta = ofertas[i];
1646
1647 //guardando a oferta no map para chamar ajax com infos de bolsa em tempo real
1648 oferta['indice'] = i;
1649 ofertasMap.set(oferta.codigoOferta, oferta);
1650 montaHTMLOferta(oferta, i, codigoUnidade, false);
1651 montaHTMLModalLocalRealizacao(oferta, i);
1652 verificaCursoAprendizagem(i, oferta.codigoOferta);
1653 associaEventoBtnLocalRealizacao(i);
1654 associaEventosFecharModal(i);
1655
1656 }
1657
1658 sliderOfertas();
1659 }
1660
1661 function montaHTMLOferta(oferta, index, codigoUnidade, posLoad){
1662
1663 var retornoDiasHorarios = processaDiasHorariosOferta(oferta.horariosAllOferta);
1664 diasSemanaHTML = "";
1665
1666 for(var diaDaOferta of retornoDiasHorarios){
1667 diasSemanaHTML += htmlSlickAreaDiasSemana.replace('\{diasSemana\}',diaDaOferta.dias);
1668 diasSemanaHTML = diasSemanaHTML.replace('\{horasSemana\}',diaDaOferta.horario)
1669 }
1670
1671 var ofertaHTML = "";
1672 ofertaHTML = htmlSlickArea(index, oferta, diasSemanaHTML, codigoUnidade)
1673
1674 if(!posLoad)
1675 $('.oferta-slick-area').append(ofertaHTML);
1676 else{
1677 $('.oferta-slick-area').slick('slickAdd', ofertaHTML);
1678 }
1679
1680 ajustaTextoDiasHorarioOferta(oferta.codigoOferta);
1681
1682 if(turmasIniciadas(oferta.dataInicio))
1683 $("#aviso-turma-iniciada-"+index).show();
1684
1685 //remove os botões/itens de compra/bolsa caso seja preciso
1686 $('.oferta-slick-area').find('.d-none-btn').remove();
1687 }
1688
1689 function processaDiasHorariosOferta(horariosAllOferta){
1690
1691 var dias = horariosAllOferta.trim().split(',');
1692 let arrayDiasSemana = [{"Seg":"Segunda"},{"Ter":"Terça"},{"Qua":"Quarta"},{"Qui":"Quinta"},{"Sex":"Sexta"},{"Sab":"Sábado"},{"Dom":"Domingo"}]
1693
1694 var arrayDia = [];
1695 if(dias.length >= 1){
1696 for(var k=0; dias.length > k; k++){
1697
1698 var diasSplit = dias[k].trim().split(' ');
1699 var diasSemana = diasSplit.shift()
1700 var ultimaPos = diasSplit.length-1;
1701 var horasStr = diasSplit[0] + ' às ' + diasSplit[ultimaPos]
1702 arrayDia.push({horasStr,diasSemana});
1703 }
1704 }
1705
1706 arrayDia = groupByArray(arrayDia, 'horasStr','diasSemana');
1707 arrayDia = orderByArray(arrayDia,arrayDiasSemana);
1708
1709 var ret = diaHorarioOfertaFormatado(arrayDia,arrayDiasSemana);
1710 return ret;
1711 }
1712
1713 //cria um array de objetos Agrupando de acordo ao campo informado como chave.
1714 //@arr = Array multidimensional que tenha os campos key e valueAdd
1715 //@key = campo que será chave nesse array
1716 //@valueAdd = campo que será agrupado caso tenha a mesma informação passada no campo key
1717 const groupByArray = (arr, key,valueAdd) => {
1718 const initialValue = [];
1719 const retornoValue = [];
1720 arr.forEach((acc, cval) => {
1721 const myAttribute = cval[key];
1722 acc[key] in retornoValue ? retornoValue[acc[key]].push(acc[valueAdd]):retornoValue[acc[key]]=[acc[valueAdd]];
1723 return acc;
1724 }, initialValue);
1725 return retornoValue;
1726 };
1727
1728
1729 //Cria um array de objetos a partir do primeiro array inserido e ordenados de acordo a ordem do segundo array informado.
1730 //@arrayOrdena = Array de objetos que tenha os campos que precisa ser ordenados
1731 //@ordem = array com a sequencia que queira ordenar - ex: seg, ter, qua, qua
1732 const orderByArray = (arrayOrdena, ordem) => {
1733
1734 let diasSem = [];
1735 const arrayOrdenado = [];
1736 let controle;
1737
1738 //percorre cada campo existente no ordem e busca o mesmo no arrayOrdena, encontrando insere no arrayOrdenado
1739 for(let campo of ordem){
1740 Object.entries(arrayOrdena).forEach(([key, value]) => {
1741 for(let diaOferta of value){
1742 if(diaOferta===Object.keys(campo)[0]){
1743 arrayOrdenado[key]=arrayOrdena[key];
1744 }
1745 }
1746 })
1747 }
1748 return arrayOrdenado;
1749 };
1750
1751 function diaHorarioOfertaFormatado(arrayAgrupadoEOrdenado, arrayDiasDaSemana){
1752
1753 var stringAux = "";
1754 var listRetorno = [];
1755
1756 Object.entries(arrayAgrupadoEOrdenado).forEach(([key, value]) => {
1757
1758 var sequencial = diasSequenciaisOuAlternados(value, arrayDiasDaSemana);
1759 var stringAux = "";
1760 var diaOferta = {};
1761
1762 if(sequencial){
1763 switch (value.length) {
1764 case 1:
1765 stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+": ";
1766 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1767 diaOferta.horario = key;
1768 break;
1769 case 2:
1770 stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" e "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": ";
1771 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1772 diaOferta.horario = key;
1773 break;
1774 default:
1775 stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" a "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": ";
1776
1777 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1778 diaOferta.horario = key;
1779 break;
1780 }
1781 }else{
1782 switch (value.length) {
1783 case 2:
1784 stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" e "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": ";
1785 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1786 diaOferta.horario = key;
1787 break;
1788 default:
1789 var ct = 0;
1790 var stringDias="";
1791 for(let v of value){
1792 ct++;
1793 ct==value.length ? stringDias=stringDias.substring(0,stringDias.length - 2)+" e "+findValueInObject(arrayDiasDaSemana,v) : stringDias+=findValueInObject(arrayDiasDaSemana,v)+", ";
1794 }
1795 stringAux = stringAux+stringDias+": ";
1796 diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula
1797 diaOferta.horario = key;
1798 break;
1799 }
1800 }
1801
1802 listRetorno.push(diaOferta);
1803 })
1804 return listRetorno;
1805 };
1806
1807 //retorna o valor de um objeto dentro de um array
1808 //@objetoBusca = array de objetos que sera buscado o valor
1809 //@keyBusca = nome do campo a ser buscada no objeto para pegar o seu valor
1810 function findValueInObject(objetoBusca, keyBusca){
1811 var retorno = "";
1812 Object.entries(objetoBusca).forEach(([horario, dias]) => {
1813 Object.entries(dias).forEach(([key,val]) => {
1814 if(key.trim()==keyBusca.trim()){
1815 retorno = val;
1816 }
1817 });
1818 });
1819 return retorno;
1820 }
1821
1822 //Recebe um objeto com valores dos dias da semana e define se sao dias seguidos ou alternados.
1823 //@arrayComDiasDaSemana = array com os dias da semana a serem validados - exemplo ['Qua','Qui','Sex']
1824 //@keyBusca = nome do campo a ser buscada no objeto para pegar o seu valor
1825 function diasSequenciaisOuAlternados(arrayComDiasDaSemana, arrayDiasDaSemana){
1826
1827 let arrayValidador = [];
1828
1829 //cria um array com o index dos dias das semanas encontrados [0 = seg, 1 = ter ... 6 = dom]
1830 for(let diaOferta of arrayComDiasDaSemana){
1831 for(let i = 0; i < arrayDiasDaSemana.length; i++){
1832 if(diaOferta === Object.keys(arrayDiasDaSemana[i])[0]){
1833 arrayValidador[i] = true;
1834 }
1835 }
1836 }
1837
1838 let keyCompair = 99;
1839 var sequencial = true;
1840
1841 //verifica quais posições foram criadas no array, e se os valores delas estão em sequencia.
1842 for(let keyValidator of Object.keys(arrayValidador)){
1843 keyValidator = parseInt(keyValidator);
1844 if(keyCompair!==99){
1845 if(keyValidator===keyCompair){
1846 sequencial = true;
1847 }else{
1848 sequencial = false;
1849 break;
1850 }
1851 }
1852 keyCompair = keyValidator+1;
1853 }
1854 return sequencial;
1855 }
1856
1857 function concatSTR(str1, str2, separador){
1858
1859 if(str2){
1860
1861 return str1+separador+str2;
1862 }
1863 return str1;
1864 }
1865
1866 //Distribui dia e horario com quebra de linha entre eles ou nao dependendo da resolução de tela e tamanho da string
1867 function ajustaTextoDiasHorarioOferta(codOferta){
1868
1869 var classOferta = ".codigoOferta_"+codOferta;
1870 let oferta = $(classOferta);
1871
1872 let ofertaDiasSemana = $(oferta).find('*[data-dia-hora="dias-semana"]');
1873
1874 let widthDevice = window.screen.width;
1875 let tamLimDesktop = 185;
1876
1877 if(widthDevice <= 1024){
1878 tamLimDesktop = 180;
1879 }
1880
1881 ofertaDiasSemana.each(function(index){
1882
1883
1884 let widthDiaSemana = $(this).width();
1885
1886 let contentDiaHora = $(this).parent().parent().parent();
1887
1888 if(!(widthDiaSemana <= tamLimDesktop)){
1889 $(this).css("display","block");
1890 }
1891
1892 if(ofertaDiasSemana.length == parseInt(index+1)){
1893 contentDiaHora.css("opacity","1");
1894 }
1895
1896 })
1897 }
1898
1899 function turmasIniciadas(dataInicioCurso){
1900
1901 var hoje = new Date();
1902 var dataInicioPartes = dataInicioCurso.split('/');
1903 var dataInicioCursoOferta = new Date(dataInicioPartes[2], dataInicioPartes[1] - 1, dataInicioPartes[0] , hoje.getHours(),hoje.getMinutes(),hoje.getSeconds(),hoje.getMilliseconds());
1904
1905 return dataInicioCursoOferta.getTime() <= hoje.getTime();
1906 }
1907
1908 function paramOrdem(xml){
1909 return xml.find('[name="dataInicioOferta"]').text();
1910 }
1911
1912 function pegarTextoCartoesAceitos(campo){
1913 indice = campo.indexOf(' em até ');
1914 inicio = 0;
1915 fim = indice;
1916
1917 return campo.substring(inicio, fim);
1918 }
1919
1920 function pegaNumParcela(campo){
1921
1922 indice = campo.indexOf('até ');
1923 inicio = indice + 4;
1924 fim = indice + 6;
1925
1926 return campo.substring(inicio, fim);
1927
1928 }
1929
1930 function pegaValorParcela(campo){
1931
1932 indice = campo.indexOf('R$');
1933 inicio = indice+2;
1934 valorAmericano = campo.substring(inicio)
1935
1936 return formataValor(valorAmericano);
1937
1938 }
1939
1940 function formataValor(valor){
1941
1942 if(!valor.toString().includes(".")){
1943 valor = parseFloat(valor).toLocaleString('pt-BR')+",00";
1944 }else{
1945 valor = parseFloat(valor).toLocaleString('pt-BR');
1946
1947 if(valor.split(",").length == 2){
1948
1949 if(valor.split(",")[1].length == 1)
1950 valor += "0";
1951
1952 }else
1953 valor += ",00";
1954 }
1955
1956 return valor;
1957 }
1958
1959 function verificaCursoAprendizagem(i, codigoOferta){
1960 //Esconde elementsos quando o curso é aprendizagem
1961 if($('[name="codigoFT"]').val() == codigoFT){
1962 $('#btnComprar_'+i).remove();
1963 $('#container_investimento_'+i).remove();
1964 $('#container_forma_pgto_'+i).remove();
1965
1966 var avisoAprendizagem = $('#aviso-curso-aprendizagem').clone();
1967 let btnFormAprendizagem = '<button class="btn btn-lg btn-success w-100 mt-3 btnModalAprendizagem" data-codigo-oferta="'+ codigoOferta +'" data-modal="open-modal" style="font-size:16px;background:#1FC923;font-weight: 600;">Preencher formulário</button>'
1968 avisoAprendizagem.removeAttr('id');
1969 avisoAprendizagem.removeClass('d-none');
1970 $('.card_oferta_'+i+ ' .ssp-card-oferta-curso').append(avisoAprendizagem);
1971 $('.card_oferta_'+i+ ' .ssp-card-oferta-curso').append(btnFormAprendizagem);
1972 }
1973 }
1974
1975 function associaEventoBtnLocalRealizacao(i){
1976 var btnLocalRealizacao = document.getElementById("btnLocalRealizacao_"+i);
1977
1978 if(btnLocalRealizacao!=null){
1979 btnLocalRealizacao.onclick = function(ev) {
1980 event.preventDefault();
1981 var elem = $(ev.target);
1982 var _modal = document.getElementById(
1983 'modalLocalRealizacao_'+elem.data('index'));
1984 _modal.style.display = "flex";
1985 }
1986 }
1987 }
1988
1989 var htmlModalLocalRealizacao = '<div id="modalLocalRealizacao_{index}" class="ssp-modal">'
1990 htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao">'
1991 htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao__title-content">'
1992
1993 htmlModalLocalRealizacao += '{tituloLocalRealizacao}'
1994
1995 htmlModalLocalRealizacao += '<i class="ssp-card-modal-local-realizacao__btn-close_{index} ssp-card-modal-forma-pagamento__btn-close"></i>'
1996 htmlModalLocalRealizacao += '</div>'
1997 htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao__texto">'
1998 htmlModalLocalRealizacao += '<p class="{classeTextoInfoLocalRealizacao}">A unidade {nomeUnidade} realizará as aulas em outro endereço, conforme informações abaixo:</p>'
1999 htmlModalLocalRealizacao += '<p><span class="ssp-modal-local-realizacao__subtitle localEspacoExternoTexto_{index}">{localEspacoExterno}</span></p>'
2000 htmlModalLocalRealizacao += '<address>'
2001 htmlModalLocalRealizacao += '<span id="endereco_realizacao_{index}" class="{classeEnderecoRealizacao}">{ruaEspacoExterno}, {numeroEspacoExterno} {complementoEspacoExterno}<br></span>'
2002 htmlModalLocalRealizacao += '<span id="bairro_realizacao_{index}" class="{classeBairroRealizacao}">Bairro: {bairroEspacoExterno}<br></span>'
2003 htmlModalLocalRealizacao += '<span id="cidade_realizacao_{index}" class="{classeCidadeRealizacao}">Cidade: {cidadeEspacoExterno} - SP<br></span>'
2004 htmlModalLocalRealizacao += '<span id="cep_realizacao_{index}" class="{classeCepRealizacao}">CEP: {cepEspacoExterno}</span>'
2005 htmlModalLocalRealizacao += '</address>'
2006 htmlModalLocalRealizacao += '<div class="btn ssp-modal-local-realizacao__btn-content">'
2007 htmlModalLocalRealizacao += '<a class="btn ssp-modal-local-realizacao__btn {classeEntendi} ssp-modal-local-realizacao__btn_{index}" href="#a">Entendi</a>'
2008 htmlModalLocalRealizacao +='</div>'
2009 htmlModalLocalRealizacao +='</div>'
2010 htmlModalLocalRealizacao +='</div>'
2011 htmlModalLocalRealizacao +='</div>';
2012
2013 var htmlSlickAreaDiasSemana = '<div class="ssp-card-oferta-curso__dia-hora-item">'
2014 htmlSlickAreaDiasSemana +='<p class="ssp-card-oferta-curso__dia-hora-item__dia">'
2015 htmlSlickAreaDiasSemana += '<span data-dia-hora="dias-semana">{diasSemana}</span>'
2016 htmlSlickAreaDiasSemana += '<span data-dia-hora="horário">{horasSemana}</span>'
2017 htmlSlickAreaDiasSemana += '</p>'
2018 htmlSlickAreaDiasSemana += '</div>';
2019
2020 function htmlSlickArea(index, oferta, diasSemanaHTML, codigoUnidade) {
2021 const btnLocalReal = function(oferta){
2022
2023 var btn = `<div class="container-local-realizacao ` + (oferta.espacoExterno == 'true' ? '' : 'd-none-btn') + `">`;
2024
2025 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>`;
2026
2027 btn += `</div>`;
2028
2029 return btn;
2030
2031 }
2032
2033 // Card Oferta
2034
2035 let result = `
2036 <div class="slick-area__item card_oferta_` + index + ` codigoOferta_` + oferta.codigoOferta + ` ` + `">
2037
2038 <div class="ssp-card-oferta-curso">
2039
2040 <div class="content-data-dias">
2041
2042 <div class="ssp-card-oferta__info-turma-iniciada" id="aviso-turma-iniciada-` + index + `" style="display:none">
2043 <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>
2044 </div>
2045
2046 <div class="ssp-card-oferta__info-turma-content">
2047 <h6 class="ssp-card-oferta__info-turma">Informações da turma</h6>
2048 </div>
2049
2050 <div>
2051 <small class="ssp-card-oferta-curso__title-item">Período:</small>
2052 <h6 class="ssp-card-oferta-curso__item-data-periodo item-data-periodo_` + index + `">` + formataPeriodo(oferta.dataInicio, oferta.dataFim) + `</h6>
2053 </div>
2054
2055 <div class="content-horario-dias-semana">
2056
2057 <div class="horario">
2058 <small class="ssp-card-oferta-curso__title-item">Horário e dias das aulas:</small>
2059 </div> ` +
2060
2061 `<div class="ssp-card-oferta-curso__dia-hora_content">
2062 ` + diasSemanaHTML + `
2063 </div>
2064
2065 </div>
2066
2067 ` + btnLocalReal(oferta)
2068
2069
2070 return result
2071 }
2072
2073 function montaHTMLModalLocalRealizacao(oferta, index){
2074
2075 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>';
2076
2077 var localRealizacaoHTMLModal = htmlModalLocalRealizacao
2078 .replace('\{nomeUnidade\}',$('#unidades-ofertas option:selected').text())
2079 .replace('\{localEspacoExterno\}', oferta.localEspacoExterno )
2080 .replace('\{classeTextoInfoLocalRealizacao\}', oferta.ruaEspacoExterno != "" ? "" : "d-none")
2081 .replace('\{classeEnderecoRealizacao\}', oferta.ruaEspacoExterno != "" ? "" : "d-none")
2082 .replace('\{ruaEspacoExterno\}',oferta.ruaEspacoExterno)
2083 .replace('\{numeroEspacoExterno\}',oferta.numeroEspacoExterno)
2084 .replace('\{complementoEspacoExterno\}',oferta.complementoEspacoExterno)
2085 .replace('\{classeBairroRealizacao\}', oferta.bairroEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none")
2086 .replace('\{bairroEspacoExterno\}',oferta.bairroEspacoExterno)
2087 .replace('\{classeCidadeRealizacao\}', oferta.cidadeEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none")
2088 .replace('\{cidadeEspacoExterno\}',oferta.cidadeEspacoExterno)
2089 .replace('\{classeCepRealizacao\}', oferta.cepEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none")
2090 .replace('\{cepEspacoExterno\}',oferta.cepEspacoExterno)
2091 .replace(regIndex, index)
2092 .replace('\{tituloLocalRealizacao\}', tituloLocalRealizacao)
2093 .replace('\{classeEntendi\}', "");
2094
2095 $('.oferta-slick-area_modal').append(localRealizacaoHTMLModal);
2096 $('.oferta-slick-area_modal').find('.d-none-btn').remove();
2097
2098 if(oferta.ruaEspacoExterno == "")
2099 $('.localEspacoExternoTexto_'+index).removeClass('ssp-modal-local-realizacao__subtitle');
2100 }
2101
2102 //Formata exibicao de datas conforme especificacao GCR
2103 function formataPeriodo(dataInicio, dataFim){
2104
2105 var dtInicioPartes = dataInicio.split('/');
2106 var dtFimPartes = dataFim.split('/');
2107
2108 //Não exibir o número zero antes dos números e o dia 1 como 1º
2109 var dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim())) +'/'+parseInt(dtInicioPartes[1].trim())+'/'+dtInicioPartes[2].trim();
2110 var dFimFormatada = (parseInt(dtFimPartes[0].trim()) == 1 ? '1º' : parseInt(dtFimPartes[0].trim())) +'/'+parseInt(dtFimPartes[1].trim())+'/'+dtFimPartes[2].trim();
2111
2112 //Quando um curso inicia e finaliza dentro do mesmo ano: 17/2 a 25/4/2020
2113 if(dtInicioPartes[2].trim() == dtFimPartes[2].trim()){
2114
2115 dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim()))+'/'+parseInt(dtInicioPartes[1].trim());
2116
2117 //Quando um curso inicia e finaliza dentro do mesmo mês: 5 a 30/4/2020
2118 if(dtInicioPartes[1].trim() == dtFimPartes[1].trim())
2119 dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim()));
2120 }
2121
2122 return dInicioFormatada + ' a ' + dFimFormatada;
2123 }
2124
2125 function strToFloat(str) {
2126 const separator = str.includes(',') ? ',' : '.'
2127
2128 const numArr = str.split(separator)
2129 const inteiro = numArr[0].replaceAll('.', '').replaceAll(',', '.')
2130 const decimal = numArr[1] ? numArr[1].replaceAll('.', '').replaceAll(',', '.') : ''
2131 return parseFloat(inteiro.concat('.').concat(decimal ? decimal : '0'))
2132 }
2133
2134 function associaEventosFecharModal(i){
2135
2136 var closeModalLocalRealizacao = document.getElementsByClassName("ssp-card-modal-local-realizacao__btn-close_"+i)[0];
2137 var btnEntendiLocalRealizacao = document.getElementsByClassName("ssp-modal-local-realizacao__btn_"+i)[0];
2138
2139 //event close modal
2140 closeModalLocalRealizacao.onclick = function() {
2141
2142 $('[id^="modalLocalRealizacao_"]').each(function(index,modal){
2143 modal.style.display = "none";
2144
2145 });
2146 }
2147
2148 btnEntendiLocalRealizacao.onclick = function() {
2149
2150 $('[id^="modalLocalRealizacao_"]').each(function(index,modal){
2151 modal.style.display = "none";
2152 });
2153 }
2154
2155 // When the user clicks anywhere outside of the modal, close it
2156 window.onclick = function(event) {
2157
2158 $('[id^="modalLocalRealizacao_"]').each(function(index,_modal){
2159 if (event.target == _modal)
2160 _modal.style.display = "none";
2161 });
2162
2163
2164 }
2165 }
2166
2167 //Abrir e fechar modal
2168
2169 function closeModalFormAprendizagem(){
2170 let modal = document.querySelector('[data-modal="modal"]')
2171
2172 modal.classList.remove('open-modal-form')
2173
2174 }
2175
2176
2177 async function openModalFormAprendizagem(ev){
2178
2179 const $container = document.getElementById('modal-form');
2180 if(!$container || !$container.nodeName == 'DIALOG') return;
2181
2182 const ofertaSel = ofertasMap.get(ev.target.getAttribute('data-codigo-oferta'));
2183
2184 function getUnidadeSelecionada() {
2185 const categoryUnidade = $('#unidades-ofertas').val().split('@')[0];
2186 return objsTela.unidades.find(u => u.categoryId == categoryUnidade) || {};
2187 }
2188
2189 async function request(url, { method = 'GET', headers = {}, body, beforeSend } = {}) {
2190 const init = { method, headers, body, credentials: 'same-origin' };
2191 const resp = await fetch(url, init);
2192 if (!resp.ok) throw new Error('Erro status ' + resp.status);
2193 return resp.text();
2194 }
2195
2196 async function loadHTMLForm () {
2197
2198 if(!ofertaSel) {
2199 console.error('Oferta não selecionada');
2200 return;
2201 }
2202
2203 if($container.querySelectorAll('form').length) {
2204 FormControl.changeCursoInfo(ofertaSel, getUnidadeSelecionada());
2205 return;
2206 }
2207
2208 const dateAvoidCache = Date.now();
2209 const url = Liferay.ThemeDisplay.getPortalURL().concat('/documents/d/global/html-formulario-aprendizagem?cb=' + dateAvoidCache);
2210
2211 const formHTML = await request(url);
2212
2213 $container.innerHTML += formHTML;
2214
2215 let script = document.createElement('script');
2216 script.src = '/documents/d/global/js-aprendizagem-formulario?cb=' + dateAvoidCache;
2217 script.async = true;
2218
2219 script.onload = () => {
2220 init(ofertaSel, getUnidadeSelecionada());
2221 };
2222
2223 script.onerror = () => {
2224 console.error(`Error loading script js-aprendizagem-formulario`);
2225 };
2226
2227 document.head.appendChild(script);
2228
2229 }
2230
2231 await loadHTMLForm();
2232
2233 $container.showModal();
2234
2235 }
2236
2237 function cloneObj(original) {
2238 return JSON.parse(JSON.stringify(original));
2239 }
2240
2241
2242 </script>