Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing: ==> cpCatalogEntry [in template "20097#20123#51764" at line 10, column 140] ---- 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: #assign CPDefinitionSpecificationOpti... [in template "20097#20123#51764" at line 10, column 1] ----
1<#assign pricesService = serviceLocator.findService("com.bti.commerce.integration.api.services.ext.PricesServiceExt")>
2<#assign CPDefinitionLocalService = serviceLocator.findService("com.liferay.commerce.product.service.CPDefinitionLocalService")>
3<#assign dlurlHelper = serviceLocator.findService("com.liferay.document.library.util.DLURLHelper")>
4<#assign cPDefinitions = []>
5<#assign PortalUtil = serviceLocator.findService("com.liferay.portal.kernel.util.PortalUtil")>
6<#assign httpServletRequest = PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(renderRequest))>
7<#assign commerceContext = renderRequest.getAttribute("COMMERCE_CONTEXT")>
8<#assign commerceOrderId = (commerceContext.getCommerceOrder().commerceOrderId)!0>
9<#assign CPDefinitionSpecificationOptionValueLocalService = serviceLocator.findService("com.liferay.commerce.product.service.CPDefinitionSpecificationOptionValueLocalService")>
10<#assign CPDefinitionSpecificationOptionValues = CPDefinitionSpecificationOptionValueLocalService.getCPDefinitionSpecificationOptionValues(cpCatalogEntry.getCPDefinitionId(),0)>
11<#assign cPDefinition1 = CPDefinitionLocalService.getCPDefinition(cpCatalogEntry.getCPDefinitionId())>
12<#assign fileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService")>
13<#assign jsonFactoryUtil = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactoryUtil")>
14
15<#assign jsessionId = "">
16<#if themeDisplay.isSignedIn()>
17 <#list request.getCookies() as cookie>
18 <#if cookie.getName() == "JSESSIONID">
19 <#assign jsessionId = cookie.getValue()>
20 </#if>
21 </#list>
22</#if>
23
24<#assign blocked = renderRequest.getAttribute("COMMERCE_CONTEXT").getAccountEntry().getExpandoBridge().getAttribute("Blocked")/>
25
26<#assign cPDefinitions = [CPDefinitionLocalService.getCPDefinition(cpCatalogEntry.getCPDefinitionId())]>
27
28<#if themeDisplay.isSignedIn()>
29 <#assign priceSimple = pricesService.getPricesWithDiscount(cPDefinitions, false, renderRequest.getAttribute("COMMERCE_CONTEXT"))?values[0]>
30</#if>
31
32<#assign diameterMessage = languageUtil.get(locale, "widget-template-product-detail-message-diameter") />
33<#assign lengthMessage = languageUtil.get(locale, "widget-template-product-detail-message-length")/>
34<#assign typeOfRestorationMessage = languageUtil.get(locale, "widget-template-product-detail-message-type-of-restoration")/>
35
36
37<div class="page_content">
38 <section class="detail_catalogo container">
39 <div class="row">
40 <div class="col-12 col-md-6 left">
41 <div class="image">
42 <#assign productImage = cPDefinitions[0].getCPAttachmentFileEntries(0, -1)>
43 <#assign fileEntry = ""/>
44
45 <#if productImage?has_content>
46 <#assign sortedProductImage = productImage?sort_by("createDate")?last>
47 <#assign fileEntry = fileEntryLocalService.getFileEntry(sortedProductImage.getFileEntryId())>
48
49 <img src="${dlurlHelper.getDownloadURL(fileEntry, fileEntry.getFileVersion(), themeDisplay, "")}"
50 alt="Imagen de producto">
51 <#else>
52 <img src="${cpContentHelper.getDefaultImageFileURL(commerceContext.getAccountEntry().getAccountEntryId(), cPDefinitions[0].getCPDefinitionId())}"
53 alt="Imagen de producto">
54 </#if>
55 </div>
56 </div>
57 <div class="col-12 col-md-6 right">
58 <div class="actions">
59 <@liferay_commerce_ui["compare-checkbox"] CPCatalogEntry = cpCatalogEntry label = "Comparar"/>
60 <#if themeDisplay.isSignedIn()>
61 <@liferay_commerce_ui["add-to-wish-list"] CPCatalogEntry = cpCatalogEntry />
62 </#if>
63 </div>
64 <div class="content_product">
65 <h2 class="heading_80">${cpCatalogEntry.getName()}</h2>
66 <p class="reference">
67 <b><@liferay_ui["message"] key="widget-template-product-detail-message-reference-short"/></b> ${cPDefinitions[0].getCProduct().getExternalReferenceCode()}
68 </p>
69 <div class="content_text_small">
70 <p>${cpCatalogEntry.getShortDescription()}</p>
71 </div>
72 <#if themeDisplay.isSignedIn()>
73 <#if cpCatalogEntry.getProductTypeName() ="simple" && (priceSimple.getUnitValue() > 0)>
74 <div class="block_price">
75 <#if priceSimple.getUnitValueOriginal() gt priceSimple.getUnitValue()>
76 <p class="price_old">${pricesService.formatValue(priceSimple.getUnitValueOriginal())}</p>
77 </#if>
78 <p class="price heading_80">${pricesService.formatValue(priceSimple.getUnitValue())}</p>
79 </div>
80 </#if>
81 </#if>
82 <div class="add_info content_text_small">
83 <p>
84 <svg class="svg-inline--fa fa-truck" aria-hidden="true" focusable="false" data-prefix="fas"
85 data-icon="truck" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"
86 data-fa-i2svg="">
87 <path fill="currentColor"
88 d="M368 0C394.5 0 416 21.49 416 48V96H466.7C483.7 96 499.1 102.7 512 114.7L589.3 192C601.3 204 608 220.3 608 237.3V352C625.7 352 640 366.3 640 384C640 401.7 625.7 416 608 416H576C576 469 533 512 480 512C426.1 512 384 469 384 416H256C256 469 213 512 160 512C106.1 512 64 469 64 416H48C21.49 416 0 394.5 0 368V48C0 21.49 21.49 0 48 0H368zM416 160V256H544V237.3L466.7 160H416zM160 368C133.5 368 112 389.5 112 416C112 442.5 133.5 464 160 464C186.5 464 208 442.5 208 416C208 389.5 186.5 368 160 368zM480 464C506.5 464 528 442.5 528 416C528 389.5 506.5 368 480 368C453.5 368 432 389.5 432 416C432 442.5 453.5 464 480 464z"></path>
89 </svg>
90
91 <@liferay_ui["message"] key="widget-template-product-detail-message-24h-shipping"/>
92 </p>
93 <p>
94 <svg class="svg-inline--fa fa-clock" aria-hidden="true" focusable="false" data-prefix="fas"
95 data-icon="clock" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
96 data-fa-i2svg="">
97 <path fill="currentColor"
98 d="M256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512zM232 256C232 264 236 271.5 242.7 275.1L338.7 339.1C349.7 347.3 364.6 344.3 371.1 333.3C379.3 322.3 376.3 307.4 365.3 300L280 243.2V120C280 106.7 269.3 96 255.1 96C242.7 96 231.1 106.7 231.1 120L232 256z"></path>
99 </svg>
100 <@liferay_ui["message"] key="widget-template-product-detail-message-shipping-before"/>
101 </p>
102 </div>
103
104 <#if cpCatalogEntry.getProductTypeName() ="grouped">
105 <#attempt>
106 <div class="cantidad_compleja">
107 <div class="content_tabla_01">
108 <div class="table-responsive table_bti">
109 <table class="table table-hover">
110 <thead>
111 <#assign childCPDefinitionsGroupedEntries = groupedCPTypeHelper.getCPDefinitionGroupedEntry(commerceContext.getAccountEntry().getAccountEntryId(), commerceContext.getCommerceChannelGroupId(),cpCatalogEntry.getCPDefinitionId())>
112 <#assign diameterValues = {}>
113 <#assign lengthValuesHash = {}>
114 <#assign cPDefinitionsGroupedEntryHash = {}>
115 <#assign lengthValuesArray = []>
116 <#assign filterValues = {}>
117 <#assign childCpDefinitions = []>
118 <#assign error = false >
119 <#assign duplicateError = false>
120 <#list childCPDefinitionsGroupedEntries as cpDefinitionGroupedEntry>
121 <#assign childCpDefinitions = childCpDefinitions + [CPDefinitionLocalService.getCPDefinition(cpDefinitionGroupedEntry.getEntryCProduct().getPublishedCPDefinitionId())]>
122 <#assign CPDefinitionSpecificationOptionValuesChilds = CPDefinitionSpecificationOptionValueLocalService.getCPDefinitionSpecificationOptionValues(cpDefinitionGroupedEntry.getEntryCProduct().getPublishedCPDefinitionId(),0)>
123 <#list CPDefinitionSpecificationOptionValuesChilds as CPDefinitionSpecificationOptionValuesChild>
124 <#assign key = CPDefinitionSpecificationOptionValuesChild.getCPSpecificationOption().getKey()>
125 <#if key == "diameter">
126 <#assign diameterValues = diameterValues + {cpDefinitionGroupedEntry : CPDefinitionSpecificationOptionValuesChild.getValueCurrentValue()}>
127 </#if>
128 <#if key == "length">
129 <#assign lengthValuesHash = lengthValuesHash + {cpDefinitionGroupedEntry : CPDefinitionSpecificationOptionValuesChild.getValueCurrentValue()}>
130 <#assign cPDefinitionsGroupedEntryHash = cPDefinitionsGroupedEntryHash + {CPDefinitionSpecificationOptionValuesChild.getValueCurrentValue() : cpDefinitionGroupedEntry}>
131 <#assign lengthValuesArray = lengthValuesArray + [CPDefinitionSpecificationOptionValuesChild.getValueCurrentValue()]>
132 </#if>
133 <#if key == "filter">
134 <#assign filterValues = filterValues + {cpDefinitionGroupedEntry : CPDefinitionSpecificationOptionValuesChild.getValueCurrentValue()}>
135 </#if>
136 </#list>
137 </#list>
138 <#assign cpDefinitionGroupedEntrySorted = []>
139 <#if (lengthValuesArray?size > 0)>
140 <#assign lengthValuesArraySorted = lengthValuesArray?map(s -> s?number)?sort?map(s -> s?string)>
141 <#list lengthValuesArraySorted as length>
142 <#assign cpDefinitionGroupedEntrySorted = cpDefinitionGroupedEntrySorted + [cPDefinitionsGroupedEntryHash[length]]>
143 </#list>
144 </#if>
145 <#if (childCPDefinitionsGroupedEntries?size > 0)>
146 <tr>
147 <th scope="col">
148 <label class="checkbox">
149 <span class="sr-only"><@liferay_ui["message"] key="widget-template-product-detail-message-select-all"/></span>
150 <input type="checkbox" id="selectAllCheckBox"
151 onclick="toggleSelectAll()">
152 <span class="check"></span>
153 </label>
154 </th>
155 <th scope="col"><@liferay_ui["message"] key="widget-template-product-detail-message-reference"/></th>
156 <#if (diameterValues?size > 0)>
157 <th scope="col"><@liferay_ui["message"] key="widget-template-product-detail-message-diameter"/></th>
158 </#if>
159 <#if (lengthValuesArray?size > 0)>
160 <th scope="col"><@liferay_ui["message"] key="widget-template-product-detail-message-length"/></th>
161 </#if>
162 <#if (filterValues?size > 0)>
163 <th scope="col"><@liferay_ui["message"] key="widget-template-product-detail-message-type-of-restoration"/></th>
164 </#if>
165 <th scope="col"><@liferay_ui["message"] key="widget-template-product-detail-message-quantity"/> </th>
166 <#if themeDisplay.isSignedIn()>
167 <th scope="col"><@liferay_ui["message"] key="widget-template-product-detail-message-price"/> </th>
168 </#if>
169 </tr>
170 </#if>
171 </thead>
172 <tbody>
173 <#if themeDisplay.isSignedIn()>
174 <#assign pricesGrouped = pricesService.getPricesWithDiscount(childCpDefinitions, false, renderRequest.getAttribute("COMMERCE_CONTEXT"))>
175 </#if>
176 <#if (cpDefinitionGroupedEntrySorted?size > 0)>
177 <#assign cpDefinitionERC = [] />
178 <#assign duplicateError = false />
179
180 <#list cpDefinitionGroupedEntrySorted as cpDefitionGroupedEntry>
181 <#assign erc = cpDefitionGroupedEntry.getEntryCProduct().getExternalReferenceCode()>
182 <#if cpDefinitionERC?seq_contains(erc)>
183 <#assign duplicateError = true />
184 <#else>
185 <#assign cpDefinitionERC = cpDefinitionERC + [erc]>
186 </#if>
187 </#list>
188 <#if (duplicateError == false) >
189 <#assign childCPDefinitionsGroupedEntries = cpDefinitionGroupedEntrySorted>
190 </#if>
191 </#if>
192 <#list childCPDefinitionsGroupedEntries as cpDefinitionGroupedEntry>
193 <#assign
194 cProduct = cpDefinitionGroupedEntry.getEntryCProduct()
195 ExtRefCode = cProduct.getExternalReferenceCode()
196 CPDefinition = cpDefinitionGroupedEntry.getEntryCPDefinition()
197 CPDefinitionSpecificationOptionValuesChilds = CPDefinitionSpecificationOptionValueLocalService.getCPDefinitionSpecificationOptionValues(CPDefinition.getCPDefinitionId(),0)>
198 <tr>
199 <td>
200 <label class="checkbox">
201 <span class="sr-only"><@liferay_ui["message"] key="widget-template-product-detail-message-select"/></span>
202 <input type="checkbox" class="groupedItem"
203 data-atc="${CPDefinition.getCPInstances()[0].getCPInstanceId()}">
204 <span class="check"></span>
205 </label>
206 </td>
207 <td>${ExtRefCode}</td>
208 <#if (diameterValues?size > 0)>
209 <td>
210 <#if (diameterValues[cpDefinitionGroupedEntry]?has_content)>
211 ${diameterValues[cpDefinitionGroupedEntry]}
212 <#else>
213 ${"-"}
214 </#if>
215 </td>
216 </#if>
217 <#if (lengthValuesHash?size > 0)>
218 <td>
219 <#if (lengthValuesHash[cpDefinitionGroupedEntry]?has_content)>
220 ${lengthValuesHash[cpDefinitionGroupedEntry]}
221 <#else>
222 ${"-"}
223 </#if>
224 </td>
225 </#if>
226 <#if (filterValues?size > 0)>
227 <td>
228 <#if (filterValues[cpDefinitionGroupedEntry]?has_content)>
229 ${filterValues[cpDefinitionGroupedEntry]}
230 <#else>
231 ${"-"}
232 </#if>
233 </td>
234 </#if>
235 <td class="quantity atc${CPDefinition.getCPInstances()[0].getCPInstanceId()}">
236 <input max="10000" min="1" step=""
237 class="form-control form-control-md quantity-selector"
238 id="qty${CPDefinition.getCPInstances()[0].getCPInstanceId()}"
239 type="number" value="1">
240 </td>
241 <#if themeDisplay.isSignedIn()>
242 <td class="text_nowrap">
243 <#assign unitValue = pricesGrouped?values[cpDefinitionGroupedEntry?index].unitValue>
244 <#assign unitValueOriginal = pricesGrouped?values[cpDefinitionGroupedEntry?index].unitValueOriginal>
245 <#if (unitValue < unitValueOriginal)>
246 <span class="precio_old">
247 ${pricesService.formatValue(unitValueOriginal)}
248 </span>
249 <span class="precio_sale">
250 ${pricesService.formatValue(unitValue)}
251 </span>
252 <#else>
253 <span class="precio_sale">
254 ${pricesService.formatValue(unitValueOriginal)}
255 </span>
256 </#if>
257 </td>
258 </#if>
259 </tr>
260 </#list>
261 </tbody>
262 </table>
263 </div>
264 </div>
265 </div>
266 <#recover>
267 <p><@liferay_ui["message"] key="guided-purchase-message-product-not-available"/></p>
268 <#assign error = true >
269 </#attempt>
270 </div>
271
272 <#if cPDefinition1.getExpandoBridge().getAttribute("notes")?has_content && cPDefinition1.getExpandoBridge().getAttribute("notes") != '{"de":"","pt":"","en":"","it":"","fr":"","es":""}'>
273 <#attempt>
274 <#assign notes = cPDefinition1.getExpandoBridge().getAttribute("notes")?eval>
275 <div class="aviso">
276 <div class="content_text_small">
277 ${notes[locale?split("_")[0]]}
278 </div>
279 </div>
280 <#recover>
281 </#attempt>
282 </#if>
283
284
285 <div class="actions_select" <#if cpCatalogEntry.getProductTypeName() ="grouped" && (childCPDefinitionsGroupedEntries?size = 0) || error> style="display: none"</#if> >
286 <div class="add-to-cart mb-2 lfr-tooltip-scope" id="addToCartButton">
287 <div class="add-to-cart-wrapper align-items-center d-flex flex-column">
288 <button class="mt-3 btn-md btn-add-to-cart btn btn-primary" type="button"
289 onclick="addToCart()">
290 <span class="text-truncate-inline">
291 <span class="text-truncate"><@liferay_ui["message"] key="widget-template-product-detail-message-add-to-cart"/></span>
292 </span>
293 <span class="cart-icon">
294 <svg class="lexicon-icon lexicon-icon-shopping-cart" role="presentation">
295 <use xlink:href="https://shop.bti-biotechnologyinstitute.com/o/bti-theme/images/clay/icons.svg#shopping-cart"></use>
296 </svg>
297 </span>
298 </button>
299 </div>
300 </div>
301 </div>
302
303 <#elseif cpCatalogEntry.getProductTypeName() = "simple">
304 <#if cPDefinition1.getExpandoBridge().getAttribute("notes")?has_content && cPDefinition1.getExpandoBridge().getAttribute("notes") != '{"de":"","pt":"","en":"","it":"","fr":"","es":""}'>
305 <#attempt>
306 <#assign notes = cPDefinition1.getExpandoBridge().getAttribute("notes")?eval>
307 <div class="aviso">
308 <div class="content_text_small">
309 ${notes[locale?split("_")[0]]}
310 </div>
311 </div>
312 <#recover>
313 </#attempt>
314 </#if>
315 <#if themeDisplay.isSignedIn()>
316 <#if (priceSimple.getUnitValue() <= 0)>
317 <div class="actions_button">
318 <a href="#" class="button_first_small disabled">
319 <span class="text"><@liferay_ui["message"] key="widget-template-product-detail-message-product-not-available"/></span>
320 </a>
321 </div>
322 <#else>
323 <div class="actions_select">
324 <#if !blocked>
325 <@liferay_commerce_ui["add-to-cart"] CPCatalogEntry = cpCatalogEntry
326 cPInstanceId = CPDefinitionLocalService.getCPDefinition(cpCatalogEntry.CPDefinitionId).getCPInstances()[0].getCPInstanceId()
327 />
328 </#if>
329 </div>
330 </#if>
331 </#if>
332 </#if>
333 </div>
334 </div>
335 </section>
336
337 <#if cpCatalogEntry.getDescription()?has_content || CPDefinitionSpecificationOptionValues?has_content || cPDefinition1.getExpandoBridge().getAttribute("clinicalIndications")?has_content && cPDefinition1.getExpandoBridge().getAttribute("clinicalIndications") != '{"de":"","pt":"","en":"","it":"","fr":"","es":""}'>
338 <section class="tabs_info">
339 <div class="container">
340 <div id="accordion" class="content_tabs">
341 <ul class="list_tabs">
342 <#if cpCatalogEntry.getDescription()?has_content>
343 <li class="item">
344 <button class="button_tab" data-toggle="collapse" data-target="#tab-01"
345 aria-expanded="true"
346 aria-controls="tab-01">
347 <@liferay_ui["message"] key="widget-template-product-detail-message-description"/>
348 </button>
349 </li>
350 </#if>
351 <#if CPDefinitionSpecificationOptionValues?has_content && cpCatalogEntry.getProductTypeName() != "grouped">
352 <li class="item">
353 <button class="button_tab collapsed" data-toggle="collapse" data-target="#tab-02"
354 aria-expanded="false" aria-controls="tab-02">
355 <@liferay_ui["message"] key="widget-template-product-detail-message-specification"/>
356 </button>
357 </li>
358 </#if>
359 <#if cPDefinition1.getExpandoBridge().getAttribute("clinicalIndications")?has_content && cPDefinition1.getExpandoBridge().getAttribute("clinicalIndications") != '{"de":"","pt":"","en":"","it":"","fr":"","es":""}'>
360 <#attempt>
361 <#assign clinicalIndicationsJson = cPDefinition1.getExpandoBridge().getAttribute("clinicalIndications")>
362 <#assign clinicalIndications = jsonFactoryUtil.createJSONObject(clinicalIndicationsJson)>
363 <li class="item">
364 <button class="button_tab collapsed" data-toggle="collapse" data-target="#tab-03"
365 aria-expanded="false" aria-controls="tab-03">
366 <@liferay_ui["message"] key="widget-template-product-detail-message-more-info"/>
367 </button>
368 </li>
369 <#recover>
370 </#attempt>
371 </#if>
372 </ul>
373
374 <div id="tab-01" class="content_tab collapse show" aria-labelledby="tab-01"
375 data-parent="#accordion">
376 <div class="content_tab">
377 <div class="content_text_small">
378 <#if cpCatalogEntry.getDescription()?has_content>
379 <p>${cpCatalogEntry.getDescription()}</p>
380 </#if>
381 </div>
382 </div>
383 </div>
384 <#if CPDefinitionSpecificationOptionValues?has_content >
385 <div id="tab-02" class="content_tab collapse" aria-labelledby="tab-02"
386 data-parent="#accordion">
387 <div class="content_tab">
388 <div class="content_text_small table-responsive table_bti">
389 <table class="table table-hover">
390 <thead>
391 <tr>
392 <th scope="col"><@liferay_ui["message"] key="widget-template-product-detail-message-description"/></th>
393 <th scope="col"
394 style="text-align: right"><@liferay_ui["message"] key="widget-template-product-detail-message-value"/></th>
395 </tr>
396 </thead>
397 <tbody>
398 <#assign textValue = "">
399 <#list CPDefinitionSpecificationOptionValues as CPDefinitionSpecificationOptionValue>
400 <#if textValue = "">
401 <#assign textValue = CPDefinitionSpecificationOptionValue.getValueCurrentValue()>
402 </#if>
403 <#if CPDefinitionSpecificationOptionValue_index < CPDefinitionSpecificationOptionValues?size-1 >
404 <#assign nextCPDefinitionSpecificationOptionValue = CPDefinitionSpecificationOptionValues[CPDefinitionSpecificationOptionValue_index + 1]>
405 <#if CPDefinitionSpecificationOptionValue.getCPSpecificationOption().getTitleCurrentValue() = nextCPDefinitionSpecificationOptionValue.getCPSpecificationOption().getTitleCurrentValue() >
406 <#assign textValue = textValue +", "+ nextCPDefinitionSpecificationOptionValue.getValueCurrentValue()>
407 <#else>
408 <tr>
409 <td>
410 ${CPDefinitionSpecificationOptionValue.getCPSpecificationOption().getTitleCurrentValue()}
411 </td>
412 <td style="text-align: right">
413 ${textValue}
414 </td>
415 </tr>
416 <#assign textValue = "">
417 </#if>
418 <#else>
419 <tr>
420 <td>
421 ${CPDefinitionSpecificationOptionValue.getCPSpecificationOption().getTitleCurrentValue()}
422 </td>
423 <td style="text-align: right">
424 ${textValue}
425 </td>
426 </tr>
427 </#if>
428
429 </#list>
430
431 </tbody>
432 </table>
433
434 </div>
435 </div>
436 </div>
437 </#if>
438 <#if cPDefinition1.getExpandoBridge().getAttribute("clinicalIndications")?has_content && cPDefinition1.getExpandoBridge().getAttribute("clinicalIndications") != '{"de":"","pt":"","en":"","it":"","fr":"","es":""}'>
439 <#attempt>
440 <#assign clinicalIndicationsJson = cPDefinition1.getExpandoBridge().getAttribute("clinicalIndications")>
441 <#assign clinicalIndications = jsonFactoryUtil.createJSONObject(clinicalIndicationsJson)>
442 <div id="tab-03" class="content_tab collapse" aria-labelledby="tab-03"
443 data-parent="#accordion">
444 <div class="content_tab">
445 <div class="content_text_small">
446 <p><@liferay_ui["message"] key="widget-template-product-detail-message-clinical-indication"/>
447 :
448 <#assign localeParts = locale?split("_")>
449 <#assign shortLocale = localeParts[0]>
450 ${clinicalIndications[shortLocale]}</p>
451 </div>
452 </div>
453 </div>
454 <#recover>
455 </#attempt>
456 </#if>
457 </div>
458 </div>
459 </section>
460 </#if>
461</div>
462
463<script>
464 var isBusy = false;
465 var skus = [];
466
467 function addToCart() {
468 isBusy = false;
469 var time = 0;
470 var noProductos = 0;
471
472 $.each($(".groupedItem"), function () {
473 //var selector = ".atc" + $(this).attr("data-atc") + "> .add-to-cart > .add-to-cart-wrapper > button";
474 if ($(this).is(":checked")) {
475 var sku = $(this).attr("data-atc")
476 skus.push(sku);
477 }
478 });
479
480 //console.log(skus);
481
482 addToCartCall()
483 }
484
485 async function addToCartCall() {
486 let myHeaders = new Headers();
487 myHeaders.append("Content-Type", "application/json");
488 myHeaders.append("Cookie", "${jsessionId}");
489 myHeaders.append("x-csrf-token", Liferay.authToken);
490
491 for (const skuId of skus) {
492 var quantity = $("#qty" + skuId).val();
493
494 console.log("skuIdR:" + skuId);
495 console.log("qty:" + quantity);
496 var body = JSON.stringify({"options": "[]", "skuId": skuId, "quantity": quantity});
497
498 let requestOptions = {
499 method: 'POST',
500 headers: myHeaders,
501 body: body,
502 redirect: 'follow'
503 };
504
505 console.log(body);
506 const response = await fetch("/o/headless-commerce-delivery-cart/v1.0/carts/" + ${commerceOrderId} + "/items/", requestOptions);
507 const data = await response.json();
508 console.log(data);
509 }
510
511 alert("Productos agregados")
512 }
513
514 $(document).ready(function () {
515 $('.groupedItem').change(function () {
516 var allSelected = true;
517
518 if ($(this).prop("checked") == false) {
519 $('#selectAllCheckBox').prop('checked', false);
520 } else {
521 $.each($('.groupedItem'), function (i, l) {
522 allSelected = $(l).is(':checked') && allSelected;
523 });
524 $("#selectAllCheckBox").prop('checked', allSelected);
525 }
526 });
527 });
528
529 function toggleSelectAll() {
530 $(".groupedItem").prop('checked', $("#selectAllCheckBox").is(':checked'));
531 }
532
533 var step = 100;
534
535 var countDownDate = new Date();
536 countDownDate.setUTCHours(16);
537 countDownDate.setUTCMinutes(0);
538
539 setCountDownDate();
540 setInterval(function () {
541 setCountDownDate()
542 }, 60000);
543
544 function setCountDownDate() {
545 let nowUser = new Date(); // 1:45
546 let nowMadrid = new Date(new Date().toLocaleString("en-US", {timeZone: "Europe/Madrid"}));
547 let countDownDate = new Date(nowMadrid);
548 countDownDate.setHours(17, 0, 0, 0);
549
550 let distance = countDownDate.getTime() - nowMadrid.getTime();
551
552 if (distance < 0) {
553 countDownDate.setDate(countDownDate.getDate() + 1);
554 distance = countDownDate.getTime() - nowMadrid.getTime();
555 }
556
557 let hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); //15:15
558 let minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
559
560 let userHours = nowUser.getHours();
561 let userMinutes = nowUser.getMinutes();
562
563 if (userHours >= 17) {
564 let diff = userHours - nowMadrid.getHours();
565 if ((17 + diff) > 24) {
566 $("#hours").text((24 - (17 + diff)).toString().substring(1) + ":00");
567 } else {
568 $("#hours").text((17 + diff) + ":00");
569 }
570 } else {
571 if (userMinutes > 0 || minutes > 0) {
572 userHours++;
573 }
574 $("#hours").text(userHours + hours + ":00");
575 }
576 $("#countdown").text(hours + "h " + minutes + "m");
577 }
578
579</script>