Soluções para sua indústria

Audiovisual

Área

Um erro ocorreu enquanto processava o modelo.
Java method "com.sun.proxy.$Proxy155.getVocabulary(long)" threw an exception when invoked on com.sun.proxy.$Proxy155 object [freemarker.core._DelayedJQuote.toString() failed: com.liferay.portal.kernel.exception.SystemException: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute batch]; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: vocabulary = assetVocabularyLocalServ...  [in template "20098#20124#104423" in function "getVocabularyEntries" at line 7, column 5]
	- Reached through: @VocabularyList title="Área" id=46002...  [in template "20098#20124#104423" at line 98, column 1]
----
1<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") /> 
2 
3<#assign prefix = "category-filter" /> 
4 
5<#function getVocabularyEntries vocabularyId> 
6  <#local 
7    vocabulary = assetVocabularyLocalService.getVocabulary(vocabularyId) 
8    categories = vocabulary.getCategories() 
9    categoriesIds = categories?map(category -> category.getCategoryId()) 
10    filteredEntries = entries?filter(entry -> categoriesIds?seq_contains(entry.getAssetCategoryId())) 
11  /> 
12  <#return filteredEntries/> 
13</#function> 
14 
15<#macro VocabularyList title id hasCollapse = false> 
16  <#local MAX_CATEGORIES = 8 /> 
17  <#local filteredEntries = getVocabularyEntries(id) /> 
18  <#local filterGreaterThanMax = filteredEntries?size gt MAX_CATEGORIES /> 
19 
20  <div class="${prefix}"> 
21    <#if title != "" > 
22      <h4>${title}</h4> 
23    </#if> 
24 
25    <#if hasCollapse && filterGreaterThanMax> 
26      <#list filteredEntries?chunk(MAX_CATEGORIES) as row> 
27          <ul  
28            class="${(row?index gt 0)?then('collapse ', '')}list-unstyled m-0"  
29            ${(row?index gt 0)?then("id='collapse-${title}'", "")} 
30
31 
32            <#list row as entry> 
33              <@DisplayVocabularyName entry /> 
34            </#list> 
35          </ul> 
36      </#list> 
37    <#else> 
38      <ul class="list-unstyled m-0"> 
39        <#list filteredEntries as entry> 
40          <@DisplayVocabularyName entry /> 
41        </#list> 
42      </ul> 
43    </#if>			 
44    
45    <#if hasCollapse && filterGreaterThanMax> 
46      <button type="button" class="btn p-0 rounded-0 bg-transparent btn--${prefix}" data-toggle="collapse" data-target="#collapse-${title}" aria-expanded="false" aria-controls="collapseAreaFiltro" data-categories-number="${filteredEntries?size}"> 
47      </button> 
48    </#if> 
49  </div> 
50</#macro> 
51 
52<#macro DisplayVocabularyName entry> 
53  <li class="facet-value"> 
54    <div class="custom-control custom-checkbox"> 
55      <input  
56        type="checkbox"  
57        class="custom-control-input facet-term term-name" 
58        data-term-id="${entry.getAssetCategoryId()}" ${(entry.isSelected())?then('checked', '')} onClick="fiepOnClickVocabularyCheckbox(event)" 
59
60      <label class="custom-control-label"> 
61        <#switch htmlUtil.escape(entry.getDisplayName())> 
62          <#case "Educação a Distância"> 
63            EAD 
64            <#break/> 
65          <#case "Ciências naturais, matemática e estatística"> 
66            Ciências Naturais e Exatas 
67            <#break/> 
68          <#case "Computação e Tecnologias da Informação e Comunicação (TIC)"> 
69            Tecnologias da Informação e Comunicação 
70            <#break/> 
71          <#case "Negócios, administração e direito"> 
72            Negócios 
73            <#break/> 
74          <#case "Ciências sociais, comunicação e informação"> 
75            Ciências sociais 
76            <#break/> 
77          <#case "Engenharia, produção e construção"> 
78            Engenharia e Produção 
79            <#break/> 
80          <#default> 
81            ${htmlUtil.escape(entry.getDisplayName())} 
82        </#switch> 
83 
84        <#if entry.isFrequencyVisible()> 
85          <small class="term-count"> 
86            (${entry.getFrequency()}) 
87          </small> 
88           
89          <small class="term-count-null d-none"> 
90            (0) 
91          </small> 
92        </#if> 
93      </label> 
94    </div> 
95  </li> 
96</#macro> 
97 
98<@VocabularyList title = "Área" id = 46002 hasCollapse = true /> 
99<@VocabularyList title = "Instituição" id = 83388 /> 
100 
101<script> 
102  verificarCheckbox(0) 
103  verificarCheckbox(1) 
104  function verificarCheckbox(i) { 
105            const div = document.querySelectorAll('.${prefix}')[i]; 
106            const algumMarcado = [...div.querySelectorAll('input')].some(checkbox => checkbox.checked); 
107             
108            for (const checkbox of div.querySelectorAll('input')) { 
109                const label = checkbox.parentElement.querySelectorAll('label')[0] 
110                if(algumMarcado && !checkbox.checked){ 
111                    label.children[0].style.display = 'none' 
112                    label.children[1].classList.remove('d-none') 
113
114
115
116  function _getTermId(term) { 
117			return term.dataset.termId || term.id; 
118
119  function _transformNodeListToArray(nodeList) { 
120    const nodeArray = []; 
121    nodeList.forEach((node) => nodeArray.push(node)); 
122    return nodeArray; 
123
124 
125  function fiepOnClickVocabularyCheckbox(event) { 
126    event.preventDefault(); 
127    const form = event.currentTarget.form; 
128    if (!form) { 
129      return; 
130
131    const facetTerms = document.querySelectorAll( 
132      '#' + form.id + ' .facet-term' 
133    ); 
134    const selectedTerms = _transformNodeListToArray(facetTerms) 
135      .filter((term) => { 
136        if (term.type === 'checkbox') { 
137          return term.checked; 
138
139 
140        return Array.prototype.includes.call( 
141          term.classList, 
142          'facet-term-selected' 
143        ); 
144      }) 
145      .map((term) => _getTermId(term)); 
146			 selectedTerms.push(event.target.value) 
147			 var newSelectedTerms = selectedTerms.filter(function(f) { return f !== 'on' }) 
148    	 Liferay.Search.FacetUtil.selectTerms(form, newSelectedTerms) 
149
150</script> 
151 
152<style> 
153  .${prefix} { 
154    --primary-dark: #454F75; 
155    --action-default: #29C5A5; 
156    margin-bottom: 25px; 
157     
158
159 
160  .${prefix} label { 
161    padding-left: 10px; 
162    font-size: 13px; 
163    color: var(--primary-dark); 
164		margin: 25px 0 15px; 
165		font-weight: 500; 
166
167 
168  .${prefix} .custom-checkbox .custom-control-input:checked ~ .custom-control-label::before { 
169    background-color: var(--action-default); 
170    border-color: var(--action-default); 
171		border-radius: 4px; 
172
173	 
174	.${prefix} .custom-checkbox .custom-control-input ~ .custom-control-label::before { 
175		border-radius: 4px; 
176		border-color: var(--neutral-4); 
177
178	 
179	.${prefix} h4 { 
180		font-size: 15px; 
181		margin-bottom: 15px; 
182		font-weight: 600; 
183		color: var(--black); 
184
185		 
186	.collapseAreaFacet h4 { 
187		font-size: 15px; 
188		margin-bottom: 15px; 
189		font-weight: bold; 
190		color: var(--black); 
191
192	 
193	.price-range-seperator { 
194    margin-bottom: 2rem; 
195    width: 4%; 
196    color: #BFBFBF; 
197
198	 
199	small.term-count, 
200  small.term-count-null { 
201    font-size: 12px; 
202    font-weight: 500; 
203    color: #949494; 
204    padding-left: 7px; 
205
206	 
207	.custom-control:only-child { 
208    margin-bottom: 10px; 
209
210 
211  .custom-control:only-child:last-child { 
212    margin-bottom: 18px; 
213
214	 
215	.input-group input { 
216    background-color: var(--white); 
217    height: 30px; 
218    border-radius: 8px !important; 
219    border: 1px solid #D8D8D8; 
220		padding: 6px 9px; 
221
222 
223  .${prefix} .btn--${prefix}::before { 
224    content: ""; 
225    background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='10' viewBox='0 0 512 512'%3E%3Cpath fill='%23FFB73A' d='M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z'/%3E%3C/svg%3E") no-repeat center; 
226    height: 10px; 
227    width: 10px; 
228    display: inline-block; 
229    margin-right: 13px; 
230
231 
232  .${prefix} .btn--${prefix}[aria-expanded="true"]::before { 
233    rotate: 180deg; 
234
235 
236  .${prefix} .btn--${prefix}::after { 
237    content: "Ver todas as " attr(data-categories-number) " áreas"; 
238    color: var(--neutral-2); 
239    font-size: 14px; 
240    border-bottom: 2px solid var(--action-default); 
241    font-weight: 500; 
242
243 
244  .${prefix} .btn--${prefix}[aria-expanded="true"]::after { 
245    content: "Ver menos áreas"; 
246
247</style> 

Preço

Intervalo de preço
Faceta de intervalo de preço
R$
-
R$
Tipo
Um erro ocorreu enquanto processava o modelo.
Java method "com.sun.proxy.$Proxy710.fetchCPDefinition(long)" threw an exception when invoked on com.sun.proxy.$Proxy710 object [freemarker.core._DelayedJQuote.toString() failed: com.liferay.portal.kernel.exception.SystemException: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute batch]; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: currentEntry = CPDefinitionLocalServi...  [in template "20098#20124#135003" at line 76, column 50]
----
1<#assign CommercePriceListService=serviceLocator.findService("com.liferay.commerce.price.list.service.CommercePriceListLocalService") /> 
2<#assign CPInstanceLocalService=serviceLocator.findService("com.liferay.commerce.product.service.CPInstanceLocalService") /> 
3<#setting locale="pt_BR"> 
4<#assign  
5	JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") 
6	commerceContext = renderRequest.getAttribute("COMMERCE_CONTEXT") 
7	commerceChannelId = commerceContext.getCommerceChannelId() 
8	commerceAccount = commerceContext.getCommerceAccount() 
9	commerceAccountId = commerceAccount.getCommerceAccountId() 
10	CommercePriceEntryLocalService=serviceLocator.findService("com.liferay.commerce.price.list.service.CommercePriceEntryLocalService") 
11	CPDefinitionSpecificationOptionValueLocalService=serviceLocator.findService("com.liferay.commerce.product.service.CPDefinitionSpecificationOptionValueLocalService") 
12  orderType = request.getAttribute("tipo_pedido")!"pf" 
13	AssetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") 
14  AssetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") 
15	CPDefinitionLocalService = serviceLocator.findService("com.liferay.commerce.product.service.CPDefinitionLocalService") 
16/> 
17 
18<#function getCategoryFromCPDefinition cPDefinitionId vocabularyName> 
19  <#assign 
20		vocabularies = AssetVocabularyLocalService.getCompanyVocabularies(companyId) 
21		categories = AssetEntryLocalService.fetchEntry("com.liferay.commerce.product.model.CPDefinition",cPDefinitionId).getCategories() 
22	/> 
23	<#list vocabularies as tempVocabulary> 
24		 <#if tempVocabulary.getName() == vocabularyName> 
25		 	<#assign vocabulary = tempVocabulary> 
26		 </#if> 
27	</#list> 
28	<#list categories as category> 
29		 <#if category.getVocabularyId() == vocabulary.getVocabularyId()> 
30	      <#return category> 
31		 </#if> 
32	 </#list> 
33</#function> 
34<#function listCategoriesFromCPDefinition cPDefinitionId > 
35	<#assign result = [] /> 
36	<#assign 
37		vocabularies = AssetVocabularyLocalService.getCompanyVocabularies(companyId) 
38		categories = AssetEntryLocalService.fetchEntry("com.liferay.commerce.product.model.CPDefinition",cPDefinitionId).getCategories() 
39	/> 
40	<#list categories as category> 
41     <#list vocabularies as vocabulary> 
42     <#if category.getVocabularyId() == vocabulary.getVocabularyId()> 
43        <#assign result+=[ {"name":category.getName(), "vocabulary":vocabulary.getName()}] />		 
44     </#if> 
45	 </#list> 
46	</#list> 
47    <#return result /> 
48</#function> 
49 
50<#function getPrice entry orderType> 
51    <#assign price = 0 /> 
52    <#assign cpInstance = CPInstanceLocalService.getCPInstance(entry.CPDefinitionId, entry.getCPSkus()[0].getSku()).getCPInstanceUuid() /> 
53    <#assign commercePriceListId = CommercePriceListService.fetchByExternalReferenceCode("price-list-" + orderType, companyId).getCommercePriceListId() /> 
54	<#assign priceEntry = CommercePriceEntryLocalService.fetchCommercePriceEntry(commercePriceListId, cpInstance)!"" /> 
55	 
56	<#if priceEntry != ""> 
57		<#assign price=priceEntry.getPrice() /> 
58	</#if> 
59    <#return price> 
60</#function> 
61 
62<#function getTruncate text limit> 
63	<#local truncateText = text?truncate(limit)?replace(']', '')?replace('[', '') /> 
64	<#return truncateText> 
65</#function> 
66 
67<div class="resultado-buscar-commerce"> 
68<div class="display-card"> 
69	<ul class="list-unstyled d-flex flex-wrap" style="gap:15px; max-width: 864px"> 
70		<#if entries?has_content> 
71			<#list entries?chunk(3) as row> 
72				<#list row as entry> 
73					<#assign 
74						 itemID = entry.CPDefinitionId                   
75						 languageId = themeDisplay.getLanguageId()    
76						 currentEntry = CPDefinitionLocalService.fetchCPDefinition(itemID) 
77 						 friendlyURL = themeDisplay.getPortalURL() + "/web/loja/curso/" + currentEntry.getURL(languageId) 
78	           name = entry.getName() 
79             cpSkus = entry.getCPSkus() 
80             cpSku = cpSkus?first 
81             cpInstanceId = cpSku.getCPInstanceId() 
82         /> 
83			 
84				<#list cpContentHelper.getCPDefinitionSpecificationOptionValues(entry.getCPDefinitionId()) as specs> 
85					<#if specs.getCPSpecificationOption().getTitle(languageId) == "web-content"> 
86						<#assign webContent = specs.getValueCurrentValue() /> 
87					</#if>			 
88 
89					<#if specs.getCPSpecificationOption().getTitle(languageId)=="json"> 
90						<#assign 
91							json = jsonFactoryUtil.createJSONObject(specs.getValueCurrentValue()) 
92							dataUltimaAtualizacao = json.getString("data_ultima_atualizacao") 
93							cursoDisponivel = false 
94							cursoDisponivel = dataUltimaAtualizacao?contains("2024-08") 
95						/> 
96					</#if>		 
97				</#list> 
98				 
99				<#if webContent?? && webContent?has_content> 
100					<#assign journalArticle = JournalArticleLocalService.getArticle(themeDisplay.getSiteGroupId(),webContent) >				 
101				</#if> 
102				<li class="card-page-item position-relative"> 
103					<a href="${htmlUtil.escapeHREF(friendlyURL)}" class="link-card"></a> 
104					<div class="card card--product"> 
105						<div class="card__header position-relative overflow-hidden"> 
106						<#if journalArticle?? && journalArticle?has_content> 
107							<@liferay_journal["journal-article"] 
108								articleId=journalArticle.getArticleId() 
109								ddmTemplateKey="305809" 
110								groupId=journalArticle.getGroupId() 
111							/> 
112							</#if> 
113							 
114							<#if (getCategoryFromCPDefinition(entry.getCPDefinitionId(),"instituicao")).getName()?has_content> 
115								<p class="tag-instituicao"> 
116									<#-- OFENSOR PERFORMANCE --> 
117									${(getCategoryFromCPDefinition(entry.getCPDefinitionId(),"instituicao")).getName()} 
118								</p> 
119							</#if> 
120							 
121						</div> 
122						<div class="card-body"> 
123							<div class="card-row"> 
124								<div class="autofit-col autofit-col-expand"> 
125									<section class="autofit-section"> 
126										<h2 class="txt-title"> 
127											${getTruncate(htmlUtil.escape(entry.getName())?trim, 54)}								 
128										</h2>											 
129											<p class="txt-content"> 
130												${getTruncate(htmlUtil.escape(entry.getShortDescription()?trim), 125)} 
131											</p> 
132										<div class="prices"> 
133											<p> 
134												<span class="prices__currency">R$</span>${getPrice(entry, orderType)?string("0.00")} 
135											</p> 
136 
137											<p class="parcela-minima"> 
138												Até 3X, parcela mínima R$ 100 
139											</p> 
140										</div> 
141										 
142										<div class="d-flex justify-content-between align-content-center"> 
143											<#if (getCategoryFromCPDefinition(entry.getCPDefinitionId(),"modalidade")).getName()?has_content> 
144												<div class="tag-modalidade"> 
145													<#if getCategoryFromCPDefinition(entry.getCPDefinitionId(),"modalidade").getName() == "Educação a Distância"> 
146														EaD 
147													<#else> 
148														${getCategoryFromCPDefinition(entry.getCPDefinitionId(),"modalidade").getName()} 
149													</#if> 
150												</div> 
151											</#if> 
152 
153											<#if cpSku.getPromoPrice() != 0 && cursoDisponivel> 
154												<div style="float: right; background: var(--accent-14); padding: 5px; font-size: 10px;color: var(--primary-dark);">EM PROMOÇÃO</div> 
155											</#if> 
156										</div> 
157 
158										<#if journalArticle?? && journalArticle?has_content> 
159											<@liferay_journal["journal-article"] 
160													articleId=journalArticle.getArticleId() 
161													ddmTemplateKey="143781" 
162													groupId=journalArticle.getGroupId() 
163											/> 
164										</#if> 
165									</section> 
166								</div> 
167							</div> 
168						</div> 
169					</div> 
170					 
171					 
172					<div class="dropdown-contentF" <#if !cursoDisponivel>style="height:365px"</#if>> 
173					<span class="tip tip-left"></span> 
174						<a href="${htmlUtil.escapeHREF(friendlyURL)}"> 
175							<h2>${entry.getName()}</h2> 
176						</a> 
177						 
178						<#if journalArticle?? && journalArticle?has_content> 
179							<p class="txt-dropdown">O que você irá aprender:</p> 
180							<@liferay_journal["journal-article"] 
181								articleId=journalArticle.getArticleId() 
182								ddmTemplateKey="132905" 
183								groupId=journalArticle.getGroupId() 
184							/> 
185							<a href="${htmlUtil.escapeHREF(friendlyURL)}"> 
186							<span class="saiba-mais-text"> 
187								Saiba Mais 
188								<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="orange" class="bi bi-arrow-right" viewBox="0 0 16 16"> 
189								<path fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h11.793l-3.147-3.146a.5.5 0 0 1 .708-.708l4 4a.5.5 0 0 1 0 .708l-4 4a.5.5 0 0 1-.708-.708L13.293 8.5H1.5A.5.5 0 0 1 1 8z"/> 
190								</svg> 
191							</span> 
192						</#if> 
193						</a> 
194						<div> 
195						<#if cursoDisponivel> 
196							<div class="add-to-cart-container justify-content-center"> 
197							                <#attempt> 
198						                        <#assign listCategories = listCategoriesFromCPDefinition(entry.getCPDefinitionId()) /> 
199						                        <#assign defaultPrice = (getPrice(entry, orderType)?string('0.00')) />					  						                         
200					                        <#recover>						                          
201												 <#assign listCategories =[] /> 
202												 <#assign defaultPrice = "0" /> 
203					                        </#attempt> 
204                                             <input type="hidden" name="defaultPrice" value="${defaultPrice}">   
205                                             <input type="hidden" name="externalReferenceCode" value="${journalArticle.getTitle(locale)}">											  
206											 <input type="hidden" name="name" value="${entry.getName()}">	 
207                                             <#list listCategories as category> 
208   											 <input type="hidden" name="${category.vocabulary}" value="${category.name}">                                                  											   
209											 </#list>							 
210							 
211                <@liferay_commerce_ui["add-to-cart"] 
212										CPInstanceId=entry.CPSkus[0].getCPInstanceId() 
213								/> 
214							</div> 
215						</#if> 
216						</div> 
217					</div> 
218				</li> 
219				</#list> 
220			</#list> 
221		</#if> 
222	</ul> 
223</div> 
224</div> 
225 
226<script> 
227	var commerceChannelId=${commerceChannelId}; 
228	var commerceAccountId=${commerceAccountId}; 
229 
230	$(function () { 
231	$('.example-popover').popover({ 
232		container: 'body' 
233	}) 
234	const cardPopOverW = window.innerWidth; 
235	const cardPopOverWRect = document.querySelectorAll(".card-page-item"); 
236 
237	var leftCard = [] 
238	for (let i = 0; i < cardPopOverWRect.length; i++) { 
239		let cardPopOverCard = cardPopOverWRect[i].querySelector('.dropdown-contentF'); 
240		let cardPopOverLeft= cardPopOverCard.getBoundingClientRect().left; 
241		leftCard.push(parseInt(Math.round(cardPopOverLeft)))     
242
243	for (let i = 0; i < cardPopOverWRect.length; i++) { 
244		let maxValueCardLeft = Math.max.apply(null, leftCard); 
245		let cardPopOverCard2 = cardPopOverWRect[i].querySelector('.dropdown-contentF'); 
246		let cardPopOverLeft2 = cardPopOverCard2.getBoundingClientRect().left; 
247		if (cardPopOverLeft2 > maxValueCardLeft - 100) { 
248			cardPopOverCard2.classList.add("ultimo-card"); 
249
250		 
251
252	}) 
253</script> 
254 
255<style> 
256	.resultado-buscar-commerce { 
257		--primary-dark: #454F75; 
258
259 
260	.resultado-buscar-commerce .add-to-cart .add-to-cart-wrapper .btn-add-to-cart > span::before{ 
261		content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='currentColor' class='bi bi-cart2' viewBox='0 0 16 16'%3E%3Cpath d='M0 2.5A.5.5 0 0 1 .5 2H2a.5.5 0 0 1 .485.379L2.89 4H14.5a.5.5 0 0 1 .485.621l-1.5 6A.5.5 0 0 1 13 11H4a.5.5 0 0 1-.485-.379L1.61 3H.5a.5.5 0 0 1-.5-.5zM3.14 5l1.25 5h8.22l1.25-5H3.14zM5 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-2 1a2 2 0 1 1 4 0 2 2 0 0 1-4 0zm9-1a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-2 1a2 2 0 1 1 4 0 2 2 0 0 1-4 0z'/%3E%3C/svg%3E"); 
262		padding-right: 8px; 
263
264	.resultado-buscar-commerce .add-to-cart .add-to-cart-wrapper .btn-add-to-cart .text-truncate{ 
265		color: var(--neutral-1); 
266		font-size: 15px; 
267		font-weight: normal; 
268
269	.resultado-buscar-commerce .add-to-cart .add-to-cart-wrapper .btn-add-to-cart .cart-icon, 
270	.resultado-buscar-commerce .add-to-cart .add-to-cart-wrapper .quantity-selector{ 
271		display: none; 
272
273	.resultado-buscar-commerce .add-to-cart .add-to-cart-wrapper .btn-add-to-cart{ 
274		background: var(--white) 0% 0% no-repeat padding-box; 
275		border: 2px solid var(--action-default); 
276		border: 2px solid #FAE954; 
277		border-radius: 5px; 
278		color: var(--neutral-1); 
279		text-align: left; 
280		font: normal normal medium 15px/12px Open Sans; 
281	}	 
282	.resultado-buscar-commerce .display-card { 
283		margin: 0 auto; 
284		width: 100%; 
285
286 
287	.resultado-buscar-commerce .link-card{ 
288				display: block; 
289				width:100%; 
290				height:100%; 
291				position:absolute; 
292				z-index:3 
293
294	.resultado-buscar-commerce .card{ 
295		box-shadow: 0 0 10px var(--neutral-5); 
296    border: 1px solid var(--neutral-5); 
297    transition: all ease .3s; 
298
299 
300	.resultado-buscar-commerce .card--product { 
301		height: 100%; 
302		margin-bottom: 0; 
303		max-width: 278px; 
304		border-radius: 8px; 
305		overflow: hidden; 
306
307 
308	.resultado-buscar-commerce .card--product .card__header { 
309		height: 161px; 
310
311	 
312	.resultado-buscar-commerce .card--product .card-body { 
313		padding: 13px 14px; 
314
315 
316	.resultado-buscar-commerce .card-page-item:hover .card{ 
317			box-shadow: 0 0 15px var(--primary-light-2); 
318			border: 1px solid var(--primary-light-2); 
319
320	.resultado-buscar-commerce .dropdown-contentF { 
321		visibility: hidden; 
322    top: -18%; 
323    left: 90%; 
324    opacity: 0; 
325    position: absolute; 
326    background-color: var(--white); 
327    width: 352px; 
328    height: 92%; 
329    border-radius: 5px; 
330    box-shadow: 0px 0  15px #00000029; 
331    z-index: 998; 
332    transition: all 0.5s ease 0s, visibility 0s linear 0s; 
333    padding: 20px 26px; 
334
335	.resultado-buscar-commerce .dropdown-contentF.ultimo-card{ 
336		left:-90%; 
337
338	 
339.resultado-buscar-commerce .tip { 
340    width: 0px; 
341    height: 0px; 
342    position: absolute; 
343    background: transparent; 
344    border: 15px solid white; 
345
346.resultado-buscar-commerce .tip-left { 
347    top: 40%; 
348    left: -29px; 
349    border-top-color: transparent; 
350    border-left-color: transparent; 
351    border-bottom-color: transparent; 
352
353 
354	.resultado-buscar-commerce .dropdown-contentF.ultimo-card .tip-left{ 
355		left: auto; 
356		right:-29px; 
357		transform: scaleX(-1); 
358
359	 
360	.resultado-buscar-commerce .txt-title a{ 
361    line-height: 22px; 
362    text-decoration: none; 
363    font-size: 16px; 
364    color: var(--neutral-1); 
365    font-weight: 700; 
366
367 
368	.resultado-buscar-commerce .txt-content { 
369		font-size: 14px; 
370		line-height: 19px; 
371		color: var(--neutral-2); 
372		padding-left: 8px; 
373		height: 76px; 
374
375	.resultado-buscar-commerce .txt-ranking { 
376		font-size: 14px; 
377		color: var(--neutral-1); 
378
379	.resultado-buscar-commerce .txt-info { 
380		font-size: 13px; 
381    color: var(--primary-dark); 
382
383	.txt-ranking span { 
384		font-weight: bold; 
385
386	.resultado-buscar-commerce .txt-dropdown { 
387		font-size: 14px; 
388    color: var(--neutral-1); 
389    font-weight: bold; 
390    padding: 10px 0; 
391    margin: 0; 
392
393	.resultado-buscar-commerce .prices { 
394		border-top: 1px solid var(--neutral-7); 
395		border-bottom: 1px solid var(--neutral-7); 
396		padding: 5px 0; 
397		margin-bottom: 10px; 
398
399 
400	.resultado-buscar-commerce .prices__currency { 
401		font-weight: 600; 
402		font-size: 15px; 
403
404 
405	.prices p { 
406		font-size: 20px; 
407		color: var(--primary-dark); 
408		text-align: center; 
409		font-weight: bold; 
410		margin-bottom: 0; 
411
412	 
413	.dropdown-contentF h2 { 
414		font-size: 17px; 
415    color: var(--neutral-1); 
416    border-bottom: 1px solid var(--neutral-7); 
417    padding-bottom: 20px; 
418    font-weight: bold; 
419    margin-bottom: 0 
420
421	 
422	.dropdown-contentF ul { 
423		padding: 10px 18px; 
424
425	 
426	.resultado-buscar-commerce .card-page-item:hover .dropdown-contentF { 
427		visibility: visible; 
428		opacity: 1; 
429		transition-delay: 0s; 
430
431	.resultado-buscar-commerce .card-page-item:hover .btn-hoverF { 
432		visibility: visible; 
433		opacity: 1; 
434		transition-delay: 0s; 
435
436	.resultado-buscar-commerce .btn-heart { 
437		color: var(--action-secondary); 
438		margin-top: 5px; 
439
440	.resultado-buscar-commerce .btn-outline-warning { 
441		padding-top: 5px; 
442		padding-bottom: 5px; 
443		color: var(--neutral-1); 
444		border-color: var(--action-default); 
445
446	.resultado-buscar-commerce .btn-outline-warning:hover { 
447		padding-top: 5px; 
448		padding-bottom: 5px; 
449		color: var(--white); 
450		border-color: var(--action-default); 
451		background-color: var(--action-default); 
452
453	.resultado-buscar-commerce .btn-outline-warning svg { 
454		vertical-align: baseline; 
455
456	 
457	.resultado-buscar-commerce .txt-title{ 
458		text-decoration: none; 
459		font-size: 16px; 
460		color: var(--primary-dark); 
461		font-weight: bold; 
462		height: 40px; 
463		display: flex; 
464		align-items: center; 
465		padding-left: 8px; 
466
467	 
468	.pagination-items-per-page { 
469    display: none; 
470
471	 
472	.pagination-results { 
473    display: none; 
474
475	 
476	.journal-content-article ul { 
477    max-height: 206px; 
478    font-size: 14px; 
479    display: block; 
480
481	 
482	.journal-content-article li { 
483    padding: 5px 0; 
484    list-style: none; 
485
486	 
487	.journal-content-article li { 
488    padding: 5px 0; 
489    list-style: none; 
490
491	 
492	.journal-content-article li:before { 
493    position: relative; 
494    content: "✓"; 
495    left: -8px; 
496    color: #A1A1A1; 
497
498	 
499	.resultado-buscar-commerce .dropdown-contentF .journal-content-article { 
500		overflow-y: auto; 
501		max-height: 149px; 
502
503 
504	.resultado-buscar-commerce .journal-content-article img { 
505		object-fit: cover; 
506		width: 100%; 
507		position: initial; 
508		transform: none; 
509
510	 
511	.resultado-buscar-commerce .saiba-mais-text { 
512    padding: 0 0 17px 0; 
513    color: black; 
514    text-decoration: underline; 
515		border-bottom: 1px solid var(--neutral-7); 
516    display: block; 
517
518	 
519	.pagination { 
520    margin: auto; 
521		align-items: center; 
522
523	 
524	.page-item.active .page-link { 
525    background-color: #fff; 
526    width: 40px; 
527    height: 40px; 
528    border: 1px solid #C5C5C5; 
529    color: #04050C; 
530    font-weight: bold; 
531		border-radius: 8px; 
532    cursor: default; 
533    z-index: 3; 
534
535	 
536	li.page-item:first-child:after { 
537    content: "Anterior"; 
538		color:#666; 
539		padding-right: 25px; 
540
541	 
542	li.page-item:last-child:before { 
543    content: "  Próximo"; 
544		color:#666; 
545		border-left: 1px solid #666; 
546		padding-left: 25px; 
547
548	 
549	.lexicon-icon { 
550			display: inline-block; 
551			fill: orange; 
552			height: 1em; 
553			margin-top: -3px; 
554			vertical-align: middle; 
555			width: 1em; 
556	}	 
557	 
558	.pagination-bar { 
559		background: #fff; 
560		padding: 15px 0; 
561		max-width: 864px; 
562
563	 
564	.price-value{ 
565	   font-weight: 550; 
566		 margin-bottom: 0; 
567
568	 
569	p.parcela-minima { 
570    font-weight: 500; 
571    margin: 0px; 
572    font-size: 13px; 
573
574	 
575	.card-page-item .card--product .card__header:before { 
576    content: "Mais detalhes"; 
577    background: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' width='31' height='31' viewBox='0 0 31 31'%3e%3cg id='Icon_feather-plus-circle' data-name='Icon feather-plus-circle' transform='translate(-2.5 -2.5)'%3e%3cpath id='Caminho_382' data-name='Caminho 382' d='M33,18A15,15,0,1,1,18,3,15,15,0,0,1,33,18Z' fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1'/%3e%3cpath id='Caminho_383' data-name='Caminho 383' d='M18,12V24' fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1'/%3e%3cpath id='Caminho_384' data-name='Caminho 384' d='M12,18H24' fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1'/%3e%3c/g%3e%3c/svg%3e") no-repeat center; 
578    display: block; 
579    width: 100%; 
580    height: 50px; 
581    position: absolute; 
582    z-index: 2; 
583    top: 50%; 
584    margin-top: -15px; 
585    left: 0; 
586    padding-top: 41px; 
587		font-size:14px; 
588    font-weight: 700; 
589    background-position-y: 0; 
590    color: white; 
591		text-align: center; 
592		opacity:0; 
593		transition:all ease .3s; 
594
595	 
596	.card-page-item .card--product .card__header:after { 
597    content: ""; 
598		display: block; 
599    width: 100%; 
600    height: 100%; 
601    background: var(--black); 
602		opacity:0; 
603		top:0; 
604		left:0; 
605		position:absolute; 
606		z-index:1; 
607		transition:all ease .3s; 
608
609	 
610	.resultado-buscar-commerce .card-page-item:hover .card--product .card__header:before{ 
611		opacity:1 
612
613	 
614	.resultado-buscar-commerce .card-page-item:hover .card--product .card__header:after{ 
615		opacity:.5; 
616
617	 
618	.resultado-buscar-commerce .vitrine-carga-horaria:after{ 
619			content:"Hora(s)" 
620
621	 
622	.tag-instituicao { 
623    background: #fff; 
624    position: absolute; 
625    font-size: 13px; 
626     color: var(--neutral-1); 
627    padding: 2px 5px; 
628    bottom: 0; 
629    margin: 0; 
630    right: 17px; 
631    border-radius: 4px 4px 0px 0px; 
632
633	 
634	.tag-modalidade { 
635    font-size: 13px; 
636    color: var(--primary-dark); 
637
638	 
639@media(max-width: 992px) { 
640	.dropdown-contentF{ 
641		display:none 
642
643
644 
645	 
646@media(max-width: 575.98px) { 
647	.resultado-buscar-commerce .display-card { 
648			width: inherit; 
649			padding: inherit; 
650
651 
652	.resultado-buscar-commerce .dropdown-contentF { 
653		display: none; 
654
655 
656	.resultado-buscar-commerce .dropdown-contentF{ 
657			left: 10px; 
658
659 
660	.resultado-buscar-commerce .btn-hoverF{ 
661			left: initial; 
662
663 
664	.page-link{ 
665		padding-left:0px; 
666		padding-right:0px; 
667
668 
669	li.page-item:first-child:after { 
670    padding-right: 0px; 
671		padding-left: 5px; 
672
673 
674	.page-item.active .page-link{ 
675		width: 30px; 
676    height: 30px; 
677
678 
679 
680	li.page-item:last-child:before { 
681		padding-right: 5px; 
682    padding-left: 5px; 
683
684 
685	.pagination{ 
686		font-size: 12px; 
687
688 
689	.page-item{ 
690		display: flex; 
691    align-items: center; 
692
693	 
694		li.page-item:first-child:after { 
695    display: none 
696
697	 
698	li.page-item:last-child:before { 
699    display: none 
700
701 
702
703	 
704</style> 

Impulsione sua carreira na área de Audiovisual!

O mercado de trabalho na área de Tecnologia da Informação está superaquecido e a busca por cursos em TI aumentou consideravelmente, com ótimas oportunidades e boa remuneração. Com os nossos cursos, você terá a opção de aprender a planejar, projetar e aplicar de forma eficiente as soluções tecnológicas. Não perca essa chance!

É onde se planeja e promove estratégias para impulsionar o negócio

É onde se planeja e promove estratégias para impulsionar o negócio

A chance perfeita para dar o salto na sua carreira em uma área que não para de crescer

Na área de Tecnologia da Informação é necessário estar atento às mudanças tecnológicas e estar preparado para o mundo corporativo. É onde se planeja e promove estratégias para impulsionar o negócio, maximizar os resultados e alcançar os objetivos da empresa. Em uma área que não para de crescer, essa é a chance perfeita para dar o salto na sua carreira.

Confira porque somos a melhor escolha:

+

140

Cursos práticos ofertados

40.000

Alunos no último ano

+

79

Anos de experiência no mercado

+

6.400

Horas de conteúdo

Confira porque somos a melhor escolha:

Confira porque somos a melhor escolha:

+ 150
Cursos práticos ofertados
+ 5.000
Empresas atendidas no último ano
+ 79
Anos de experiência no mercado
+ 20
Áreas do Conhecimento

Confira porque somos a melhor escolha: