حصل خطأ عند معالجة القالب.
The following has evaluated to null or missing: ==> serviceLocator.findService("com.zain.commerce.order.service.ZainCommerceOrderDetailLocalService") [in template "20154#20194#28690963" at line 6, column 45] ---- 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 zainCommerceOrderDetailLocalS... [in template "20154#20194#28690963" at line 5, column 1] ----
1<#assign resourceUrl=renderResponse.createResourceURL() />
2${resourceUrl.setResourceID("clearCartURL")}<p id="resourceUrl" style="display: none;">${resourceUrl}</p>
3<#assign
4 commerceOrderItemLocalServiceUtil=serviceLocator.findService("com.liferay.commerce.service.CommerceOrderItemLocalService") />
5<#assign
6 zainCommerceOrderDetailLocalServiceUtil=serviceLocator.findService("com.zain.commerce.order.service.ZainCommerceOrderDetailLocalService") />
7<#assign
8 CPInstanceLocalServiceUtil=serviceLocator.findService("com.liferay.commerce.product.service.CPInstanceLocalService") />
9<#assign zainCPAttachmentUtil=serviceLocator.findService("com.zain.common.service.util.ZainCPAttachmentUtil") />
10<#assign ICommonService=serviceLocator.findService("com.zain.common.service.util.ICommonService") />
11<#assign zainOrderServiceUtil=serviceLocator.findService("com.zain.common.order.util.ZainOrderServiceUtil") />
12<#assign PlanDataUtil=serviceLocator.findService("com.zain.common.order.util.plan.PlanDataUtil") />
13<#assign ZainCPAttachmentUtil=serviceLocator.findService("com.zain.common.service.util.ZainCPAttachmentUtil") />
14<#assign
15 ZainProductOptionServiceUtil=serviceLocator.findService("com.zain.common.service.util.ZainProductOptionServiceUtil") />
16<#assign validator=staticUtil["com.liferay.portal.kernel.util.Validator"] />
17<#assign
18 cpDefinitionOptionRelLocalServiceUtil=serviceLocator.findService("com.liferay.commerce.product.service.CPDefinitionOptionRelLocalService") />
19<#assign CommonUtil=serviceLocator.findService("com.zain.common.service.util.ICommonService") />
20<#assign ZainIMServiceUtil=serviceLocator.findService("com.zain.common.service.util.ZainIMServiceUtil") />
21<#assign ga_Events=getterUtil.getBoolean(themeDisplay.getThemeSetting("GA-Events")) />
22<#assign
23 ZainDueTodayDuePerMonthUtil=serviceLocator.findService("com.zain.common.order.util.ZainDueTodayDuePerMonthUtil") />
24<#assign revenue=CommonUtil.getRevenue(commerceCartContentDisplayContext.getCommerceOrderId(),themeDisplay) />
25
26<#assign redirectionURL="/web${themeDisplay.getScopeGroup().getFriendlyURL()}" />
27<#if (layout.privateLayout)>
28 <#assign redirectionURL="/group${themeDisplay.getScopeGroup().getFriendlyURL()}" />
29</#if>
30<#assign
31 ZainAssetCategoryServiceUtil=serviceLocator.findService("com.zain.common.service.util.ZainAssetCategoryServiceUtil") />
32<#assign is_b2b_site=CommonUtil.isB2bSite(themeDisplay) />
33
34<#assign itemCount=0 />
35<#if commerceCartContentDisplayContext.getCommerceOrderPrice()??>
36 <#assign commerceOrderPrice=commerceCartContentDisplayContext.getCommerceOrderPrice()
37 commerceOrderTotal=commerceOrderPrice.getTotal() />
38 <#assign totalDueToday=0 />
39 <#assign totalDuePerMonth=0 />
40 <#assign deleteURL="" />
41</#if>
42
43<#assign zainCartServiceUtil=serviceLocator.findService("com.zain.common.service.util.ZainCartServiceUtil") />
44<#assign couponCode="" />
45<#if commerceCartContentDisplayContext.getCommerceOrder()??>
46 <#assign couponCode=commerceCartContentDisplayContext.getCommerceOrder().getCouponCode() />
47</#if>
48
49<#assign CheckoutPageURL=ICommonService.getPageFriendlyUrl("checkout") />
50<#assign ProductListingPageURL=ICommonService.getPageFriendlyUrl("product-listing") />
51<#assign PlanListingPageURL=ICommonService.getPageFriendlyUrl("plan-listing") />
52<#assign IMLoginURL=ZainIMServiceUtil.getIMLoginURL(request) />
53<#assign isAgent=CommonUtil.isAgentSite(themeDisplay) />
54<style>
55 .new-cart-summary-dropdown .product-sect {
56 max-height: 250px !important;
57 overflow-y: auto !important;
58 overflow-x: hidden !important;
59 }
60</style>
61
62<div class="text-center dropdown-header">
63 <h4 class="mb-0 text-left">${ZainLanguageUtil.get(locale.toString(),"cart-summary", "")}</h4>
64</div>
65
66<#if entries?has_content>
67 <#assign commerceOrder=commerceCartContentDisplayContext.getCommerceOrder()
68 totalDepositOfOrder=ZainDueTodayDuePerMonthUtil.getTotalDepositOfOrder(commerceOrder)
69 zainCommerceOrderDetail=zainCommerceOrderDetailLocalServiceUtil.findByOrderId(commerceOrder.getCommerceOrderId())
70 totalDueToday=zainCommerceOrderDetail.getTotalDueToday()
71 totalDuePerMonth=zainCommerceOrderDetail.getTotalDuePerMonth()
72 cartSectionsAndRelatedProducts=zainOrderServiceUtil.getCartSectionsAndRelatedProducts(commerceOrder,locale) />
73 <div class="card-body mobile-card-body">
74 <div class="product-sect">
75 <#list cartSectionsAndRelatedProducts?keys as sectionName>
76 <#assign relatedProducts=cartSectionsAndRelatedProducts[sectionName] />
77 <#if relatedProducts?size gt 0>
78 <#if !(relatedProducts[0]['planId'] gt 0)>
79 <#if !PlanDataUtil.isZainPlus(commerceOrder)>
80
81 <#else>
82 <h3 class="left-lbl item-title mt-0 mb-3">${ZainLanguageUtil.get(locale.toString(),
83 "zain.plus.plan.label", "Zain Plus Plan")}</h3>
84 </#if>
85 </#if>
86 <#list relatedProducts as curZainCommerceOrderItem>
87 <#assign
88 curCommerceOrderItem=commerceOrderItemLocalServiceUtil.getCommerceOrderItem(curZainCommerceOrderItem.getOrderItemId())
89 depositOfItem=ZainDueTodayDuePerMonthUtil.getTotalDepositOfOrderItem(curCommerceOrderItem) />
90 <#if CPInstanceLocalServiceUtil.fetchCPInstance(curCommerceOrderItem.getCPInstanceId())??>
91 <#assign
92 cpInstance=CPInstanceLocalServiceUtil.fetchCPInstance(curCommerceOrderItem.getCPInstanceId())
93 cpDefinition=curCommerceOrderItem.getCPDefinition()
94 name=curCommerceOrderItem.getName(themeDisplay.getLanguageId())
95 deleteURL=commerceCartContentDisplayContext.getDeleteURL(curCommerceOrderItem)
96 planPrice=cpInstance.getPrice() planPromoPrice=cpInstance.getPromoPrice() />
97 <#assign itemCount=itemCount + curCommerceOrderItem.getQuantity() />
98 <#if
99 zainCPAttachmentUtil.getCPInstanceThumbnailSrc(curCommerceOrderItem.getCPInstanceId())??>
100 <#assign
101 cpAttachmentFileEntry=zainCPAttachmentUtil.getCPInstanceThumbnailSrc(curCommerceOrderItem.getCPInstanceId())
102 productThumbnailUrl=ICommonService.getProductSkuImageURL(cpDefinition,curCommerceOrderItem.getJson())
103 productAltText=cpDefinition.getName(locale.getLanguage()) />
104 <#else>
105 <#assign
106 productThumbnailUrl=ICommonService.getCatalogImage(cpDefinition.getGroupId())
107 productAltText=cpDefinition.getName(locale.getLanguage()) />
108 </#if>
109
110
111 <#if (validator.isNotNull(curZainCommerceOrderItem.getPlanId()) &&
112 validator.isNotNull(curZainCommerceOrderItem.getPlanData())) || (
113 validator.isNotNull(cpInstance) &&
114 cpDefinition.getProductTypeName()?lower_case=="postpaid" ||
115 cpDefinition.getProductTypeName()?lower_case=="prepaid" )>
116
117 <#assign planData=PlanDataUtil.getPlanDataFromPlanDataJson(curZainCommerceOrderItem)
118 planServices=PlanDataUtil.fetchPlanServices(planData, locale)
119 planCategory=ZainAssetCategoryServiceUtil.getCPDefintionAssetCategories(curZainCommerceOrderItem.getCPDefinitionId()) />
120
121 <#if !PlanDataUtil.isZainPlus(curCommerceOrderItem)>
122 <#assign commitmentPeriod=PlanDataUtil.getCommitmentPeriod(planData) />
123 <#assign commitmentPeriodVal="No Commitment" />
124 <#if validator.isNotNull(commitmentPeriod)>
125 <#assign commitmentPeriodVal=commitmentPeriod />
126 </#if>
127 <div class="plan-sidebarhead product-item pb-2 non-zain-plus" data-category="${planCategory}"
128 data-price="${ZainLanguageUtil.get(locale.toString(), " zain.kd.text", ""
129 )}${curZainCommerceOrderItem.getDuePerMonth()}"
130 data-id="${curZainCommerceOrderItem.getPlanId()}"
131 data-qty="${curCommerceOrderItem.getQuantity()}"
132 data-commitment='${PlanDataUtil.getCommitmentType(cpDefinition, planData)}'
133 data-displaycommitment='${ZainLanguageUtil.get(locale.toString(), commitmentPeriodVal, "")}'
134 data-planprice="${planPrice}" data-planpromoprice="${planPromoPrice}">
135 <div class="row">
136
137
138 <div class="col-2 mobile-alignment">
139 <div class="product-img">
140 <#if productThumbnailUrl?has_content>
141 <img src="${themeDisplay.getPathThemeImages()}/internet.svg"
142 alt="">
143 </#if>
144 </div>
145 </div>
146
147
148
149 <div class="col payment-opts">
150 <div class="d-flex">
151 <p class="left-lbl item-title">${name}</p>
152
153 <#if !PlanDataUtil.isZainPlus(commerceOrder)>
154
155
156 <#if (curZainCommerceOrderItem.getDuePerMonth() !=0)>
157 <label for=""
158 class="right-lbl">${ZainLanguageUtil.get(locale.toString(),
159 "zain.kd.text", "")}
160 <span>${curCommerceOrderItem.getFinalPrice()}</span></label>
161 </#if>
162
163 </#if>
164
165 </div>
166 <#if validator.isNotNull(cpInstance)>
167 <#assign
168 isValidPlan=PlanDataUtil.isValidPlanData(curCommerceOrderItem,
169 curZainCommerceOrderItem) />
170 <#if isValidPlan>
171 <#assign count=1 />
172 <#list planData.getLines() as line>
173 <#assign lineClass="" />
174 <#assign existingOrNewLine="" />
175 <#if line.isNew()>
176 <#assign existingOrNewLine="zain.plan.new.line" />
177 <#if line.getMnClass()!="">
178 <#assign lineClass=" - "
179 +ZainLanguageUtil.get(locale.toString(), "zain.${line.getMnClass()}"
180 , "" ) />
181 </#if>
182 <#else>
183 <#assign
184 existingOrNewLine="zain.plan.existing.line" />
185 </#if>
186 <#if is_b2b_site>
187 <div class="d-flex existing-line">
188 <h5 class="left-lbl item-title">
189 ${ZainLanguageUtil.get(locale.toString(),
190 "zain.line", "")} ${line?index + 1}</h5>
191 <#if (line.getLineDuePerMonth() !=0)>
192 <label for=""
193 class="right-lbl">${ZainLanguageUtil.get(locale.toString(),
194 "zain.kd.text", "")}
195 ${line.getLineDuePerMonth()}</label>
196 </#if>
197 </div>
198 </#if>
199 <#if !PlanDataUtil.isZainPlus(commerceOrder)>
200 <#assign lineNumberCls="" />
201 <#if isAgent>
202 <#assign lineNumberCls="line-number-item" />
203 </#if>
204 <div class="d-flex existing-line ${lineNumberCls}">
205 <#if line.getMsisdn() !=0>
206 <h5 class="left-lbl item-title">
207 ${ZainLanguageUtil.get(locale.toString(),
208 existingOrNewLine, "")}${lineClass}
209 <span>(${line.getMsisdn()})</span>
210 </h5>
211 <#if (line.getPrice() !=0)>
212 <label for="" class="right-lbl"
213 data-lineprice="${line.getPrice()}">${ZainLanguageUtil.get(locale.toString(),
214 "zain.kd.text", "")}
215 ${line.getPrice()}</label>
216 </#if>
217 </#if>
218 </div>
219 <div class="cart-summary-link">
220 <a class="remove-item-from-cart internal-links"
221 data-order-id="${curZainCommerceOrderItem.getOrderId()}"
222 data-itemid="${curZainCommerceOrderItem.getOrderItemId()}">
223 ${ZainLanguageUtil.get(locale.toString(),
224 "zain.cart.summary.remove", "")}
225 </a>
226 </div>
227 </#if>
228
229 </#list>
230 </#if>
231 </#if>
232 <#if validator.isNotNull(cpInstance)>
233 <div class="product-details">
234
235 <#if
236 validator.isNotNull(PlanDataUtil.getCommitmentPeriod(planData))>
237
238 </#if>
239
240 </div>
241
242 </#if>
243 </div>
244 </div>
245
246
247
248
249
250
251
252
253
254 <#if validator.isNotNull(cpInstance)>
255 <#assign isValidPlan=PlanDataUtil.isValidPlanData(curCommerceOrderItem,
256 curZainCommerceOrderItem) />
257 <#if isValidPlan>
258 <#assign count=1 />
259 <#list planData.getLines() as line>
260 <#assign lineClass="" />
261 <#assign existingOrNewLine="" />
262 <#if line.isNew()>
263 <#assign existingOrNewLine="zain.plan.new.line" />
264 <#if line.getMnClass()!="">
265 <#assign lineClass=" - "
266 +ZainLanguageUtil.get(locale.toString(), "zain.${line.getMnClass()}"
267 , "" ) />
268
269 </#if>
270 <#else>
271 <#assign existingOrNewLine="zain.plan.existing.line" />
272
273 </#if>
274
275 <#if is_b2b_site>
276
277 </#if>
278 <#if !PlanDataUtil.isZainPlus(commerceOrder)>
279 <#assign lineNumberCls="" />
280 <#if isAgent>
281 <#assign lineNumberCls="line-number-item" />
282 </#if>
283
284 </#if>
285
286
287
288
289
290
291
292 <#if PlanDataUtil.isZainPlus(commerceOrder)>
293 <#assign
294 zainPlusPlanCategory=ZainAssetCategoryServiceUtil.getCPDefintionAssetCategories(curZainCommerceOrderItem.getCPDefinitionId()) />
295 <div class="product-item hide plan-sidebarhead-zainplus"
296 data-qty="${curCommerceOrderItem.getQuantity()}"
297 data-category="${zainPlusPlanCategory}"
298 data-id="${curZainCommerceOrderItem.getPlanId()}"
299 data-commitment='${PlanDataUtil.getCommitmentType(cpDefinition, planData)}'
300 data-displaycommitment='${ZainLanguageUtil.get(locale.toString(), PlanDataUtil.getCommitmentType(cpDefinition, planData), "")}'
301 data-price='${ZainLanguageUtil.get(locale.toString(), "zain.kd.text", "")} ${curZainCommerceOrderItem.getDuePerMonth()}'>
302
303 <div class="row">
304 <div class="col payment-opts">
305 <div class="d-flex">
306 <p class="left-lbl item-title">
307 ${ZainLanguageUtil.get(locale.toString(),
308 "zain.plus.plan.label", "Zain Plus Plan")}
309 </p>
310
311 <#assign
312 duePerMonthPrice=curZainCommerceOrderItem.getDuePerMonth() />
313 <#if (curZainCommerceOrderItem.getDuePerMonth()
314 !=0)>
315 <label for=""
316 class="right-lbl payment-opts plan-payment-opts hide"
317 data-price="${duePerMonthPrice}"></label>
318
319 </#if>
320 </div>
321 </div>
322 </div>
323 </#if>
324
325
326 <#list line.getItems() as item>
327
328 <#assign
329 planCPDefinitionOptionRel=cpDefinitionOptionRelLocalServiceUtil.getCPDefinitionOptionRel(item.getPlanOptionRelId()) />
330 <#assign
331 packageName=planCPDefinitionOptionRel.getName(locale) />
332
333 <#assign planOrderItems=item.getOptionValue() />
334
335 <#assign
336 packageNameAndPlanOrderItemMap=PlanDataUtil.packageNameAndPlanOrderItem(planOrderItems,packageName,themeDisplay.getLanguageId()) />
337 <#list packageNameAndPlanOrderItemMap?keys as
338 packageNameAndPlanOrderItem>
339 <#assign planPackageName=packageNameAndPlanOrderItem />
340 <#assign
341 planOrderItems=packageNameAndPlanOrderItemMap[packageNameAndPlanOrderItem] />
342 <div class="d-flex existing-line">
343 <#if !PlanDataUtil.isZainPlus(commerceOrder)>
344
345 <#else>
346 <h5 class="left-lbl item-title">
347 ${ZainLanguageUtil.get(locale.toString(),
348 "zain.plus.plan.label", "Zain Plus Plan")}
349 </h5>
350 </#if>
351 </div>
352 <#list planOrderItems as planOrderItem>
353 <#assign
354 orderItemInstance=CPInstanceLocalServiceUtil.fetchCPInstance(planOrderItem.getCpInstanceId())
355 orderItemCPDefinition=orderItemInstance.getCPDefinition()
356 productThumbnailUrl="" productAltText="" />
357
358 <#if orderItemInstance??>
359 <#if
360 ZainCPAttachmentUtil.getCPInstanceThumbnailSrc(orderItemInstance.getCPInstanceId())??>
361 <#assign
362 cpAttachmentFileEntry=ZainCPAttachmentUtil.getCPInstanceThumbnailSrc(orderItemInstance.getCPInstanceId()) />
363 <#assign
364 productThumbnailUrl=ICommonService.getProductSkuImageURL(orderItemInstance.getCPDefinition(),curCommerceOrderItem.getJson(),planOrderItem.getCpInstanceId())
365 productAltText=orderItemInstance.getCPDefinition().getName(locale.getLanguage()) />
366 <#else>
367 <#assign
368 productThumbnailUrl=ICommonService.getCatalogImage(orderItemInstance.getCPDefinition().getGroupId())
369 productAltText=orderItemInstance.getCPDefinition().getName(locale.getLanguage()) />
370 </#if>
371 </#if>
372 <div class="plan-sidebarhead product-item pb-2 no-idea"
373 data-qty="${curCommerceOrderItem.getQuantity()}"
374 data-id="${cpDefinition.getCPDefinitionId()}"
375 data-category="${ZainAssetCategoryServiceUtil.getCPDefintionAssetCategories(orderItemCPDefinition.getCPDefinitionId())}">
376 <div class="row">
377 <div class="col-2 mobile-alignment">
378 <div class="product-img">
379 <#if productThumbnailUrl??>
380 <img src="${ productThumbnailUrl }"
381 alt="${ productAltText }">
382 </#if>
383 </div>
384 </div>
385 <div class="col payment-opts">
386 <div class="d-flex">
387 <p class="left-lbl item-title">
388 ${orderItemCPDefinition.getName(locale.getLanguage())}
389 </p>
390
391 <#if planOrderItem.getPrice()??>
392
393 <#if (planOrderItem.getPrice() !=0)>
394
395
396
397 </#if>
398
399 </#if>
400
401 </div>
402
403
404 <#if
405 ZainProductOptionServiceUtil.getCPInstanceOptionAndValues(planOrderItem.getCpInstanceId())??>
406 <#attempt>
407 <#assign
408 cpDefinitionOptionRelsMap=ZainProductOptionServiceUtil.getCPInstanceOptionAndValues(planOrderItem.getCpInstanceId()) />
409 <#if cpDefinitionOptionRelsMap??>
410 <#assign
411 cpDefinitionOptionRelList=cpDefinitionOptionRelsMap?keys />
412 <#assign
413 cpDefinitionOptionValueRelList=cpDefinitionOptionRelsMap?values />
414
415 <div class="product-details">
416 <p>
417
418 <#list
419 cpDefinitionOptionRelList
420 as
421 cpDefinitionOptionRel>
422 <#assign
423 seq_index=cpDefinitionOptionRelList?seq_index_of(cpDefinitionOptionRel) />
424 <#assign
425 cpDefinitionOptionValueRel=cpDefinitionOptionValueRelList[seq_index] />
426 <span
427 data-name="${cpDefinitionOptionRel.getName(locale)}">${cpDefinitionOptionValueRel.getName(locale)}</span>
428 <#sep>|</#sep>
429 </#list>
430 </p>
431 </div>
432 </#if>
433 <#recover>
434
435 </#attempt>
436 </#if>
437 <#assign
438 commitmentPeriodType=PlanDataUtil.getCommitmentPeriod(planData) />
439 <#if
440 validator.isNotNull(commitmentPeriodType)>
441 <div class="product-details">
442
443 <p>
444 ${ZainLanguageUtil.get(locale.toString(),
445 "zain.plan.commitment", "")} :
446
447 <span
448 data-commitment="${commitmentPeriodType}"
449 class="d-span"
450 style="font-weight: 600; color: black;">
451 ${ZainLanguageUtil.get(locale.toString(),
452 commitmentPeriodType, "")}
453 </span>
454 </p>
455
456
457 </div>
458
459
460
461 </#if>
462
463 </div>
464 </div>
465 </div>
466 </#list>
467 </#list>
468 </#list>
469 </#list>
470 </#if>
471 </#if>
472
473 </div>
474 <#else>
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489 <#assign
490 zainPlusPlanCategory = ZainAssetCategoryServiceUtil.getCPDefintionAssetCategories(curZainCommerceOrderItem.getCPDefinitionId())
491 />
492
493
494
495
496
497
498 <#list planData.getLines() as line>
499 <#list line.getItems() as item>
500
501 <#assign planCPDefinitionOptionRel = cpDefinitionOptionRelLocalServiceUtil.getCPDefinitionOptionRel(item.getPlanOptionRelId())/>
502 <#assign packageName=planCPDefinitionOptionRel.getName(locale) />
503
504 <#assign planOrderItems=item.getOptionValue() />
505
506 <#assign packageNameAndPlanOrderItemMap = PlanDataUtil.packageNameAndPlanOrderItem(planOrderItems,packageName,themeDisplay.getLanguageId())/>
507 <#list packageNameAndPlanOrderItemMap?keys as packageNameAndPlanOrderItem>
508 <#assign planPackageName = packageNameAndPlanOrderItem/>
509 <#assign planOrderItems = packageNameAndPlanOrderItemMap[packageNameAndPlanOrderItem]/>
510
511
512 <#list planOrderItems as planOrderItem>
513 <#assign
514 orderItemInstance=CPInstanceLocalServiceUtil.fetchCPInstance(planOrderItem.getCpInstanceId())
515 orderItemCPDefinition=orderItemInstance.getCPDefinition()
516 productThumbnailUrl=""
517 productAltText=""
518 />
519
520 <#if orderItemInstance??>
521 <#if ZainCPAttachmentUtil.getCPInstanceThumbnailSrc(orderItemInstance.getCPInstanceId())??>
522 <#assign
523 cpAttachmentFileEntry=ZainCPAttachmentUtil.getCPInstanceThumbnailSrc(orderItemInstance.getCPInstanceId())
524 />
525 <#assign
526 productThumbnailUrl=ICommonService.getProductSkuImageURL(orderItemInstance.getCPDefinition(),curCommerceOrderItem.getJson(),planOrderItem.getCpInstanceId())
527 productAltText=orderItemInstance.getCPDefinition().getName(locale.getLanguage())
528 />
529 <#else>
530 <#assign
531 productThumbnailUrl = ICommonService.getCatalogImage(orderItemInstance.getCPDefinition().getGroupId())
532 productAltText = orderItemInstance.getCPDefinition().getName(locale.getLanguage())
533 />
534 </#if>
535 </#if>
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553 <div class="plan-sidebarhead product-item pb-2 zain-plus-block" data-qty="${curCommerceOrderItem.getQuantity()}" data-id="${cpDefinition.getCPDefinitionId()}" data-category="${ZainAssetCategoryServiceUtil.getCPDefintionAssetCategories(orderItemCPDefinition.getCPDefinitionId())}" data-price='${ZainLanguageUtil.get(locale.toString(), "zain.kd.text", "")} ${curZainCommerceOrderItem.getDuePerMonth()}'>
554 <div class="row">
555 <div class="col-2 mobile-alignment">
556 <div class="product-img">
557 <#if productThumbnailUrl??>
558 <img src="${ productThumbnailUrl }" alt="${ productAltText }">
559 </#if>
560 </div>
561 </div>
562
563 <div class="col payment-opts">
564 <div class="d-flex">
565 <p class="left-lbl item-title">${orderItemCPDefinition.getName(locale.getLanguage())}</p>
566 </div>
567
568 <#if ZainProductOptionServiceUtil.getCPInstanceOptionAndValues(planOrderItem.getCpInstanceId())??>
569 <#attempt>
570 <#assign
571 cpDefinitionOptionRelsMap = ZainProductOptionServiceUtil.getCPInstanceOptionAndValues(planOrderItem.getCpInstanceId())
572 />
573 <#if cpDefinitionOptionRelsMap??>
574 <#assign cpDefinitionOptionRelList = cpDefinitionOptionRelsMap?keys/>
575 <#assign cpDefinitionOptionValueRelList = cpDefinitionOptionRelsMap?values/>
576
577 <div class="product-details">
578 <p>
579
580 <#list cpDefinitionOptionRelList as cpDefinitionOptionRel>
581 <#assign seq_index = cpDefinitionOptionRelList?seq_index_of(cpDefinitionOptionRel) />
582 <#assign cpDefinitionOptionValueRel = cpDefinitionOptionValueRelList[seq_index]/>
583 <span data-name="${cpDefinitionOptionRel.getName(locale)}">${cpDefinitionOptionValueRel.getName(locale)}</span>
584 <#sep>|</#sep>
585 </#list>
586 </p>
587 </div>
588
589
590 </#if>
591 <#recover>
592
593 </#attempt>
594 </#if>
595
596 <#assign commitmentPeriodType=PlanDataUtil.getPackageCommitmentPeriod(item)/>
597 <#if validator.isNotNull(commitmentPeriodType)>
598
599
600 <div class="product-details">
601
602 <p>
603 ${ZainLanguageUtil.get(locale.toString(), "zain.plan.commitment", "")} :
604 <span data-commitment="${commitmentPeriodType}" class="d-span" style="font-weight: 600; color: black;">
605 ${ZainLanguageUtil.get(locale.toString(), commitmentPeriodType, "")}
606 </span>
607 </p>
608
609
610 </div>
611 </#if>
612 <div class="cart-summary-link">
613 <a class="remove-item-from-cart internal-links"
614 data-order-id="${curZainCommerceOrderItem.getOrderId()}"
615 data-itemid="${curZainCommerceOrderItem.getOrderItemId()}"
616 data-mParticleQty="${curCommerceOrderItem.getQuantity()}"
617 >
618 ${ZainLanguageUtil.get(locale.toString(), "zain.cart.summary.remove", "")}
619
620 </a>
621 </div>
622
623 </div>
624 </div>
625 </div>
626
627 </#list>
628 </#list>
629 </#list>
630
631 </#list>
632
633
634 </#if>
635
636
637
638 <#else>
639
640
641 <div class="product-item pb-2" data-qty="${curCommerceOrderItem.getQuantity()}"
642 data-id="${cpDefinition.getCPDefinitionId()}"
643 data-category="${ZainAssetCategoryServiceUtil.getCPDefintionAssetCategories(curCommerceOrderItem.getCPDefinitionId())}">
644 <div class="row">
645 <div class="col-2 mobile-alignment">
646 <div class="product-img">
647 <#if productThumbnailUrl?has_content>
648 <img src="${productThumbnailUrl}" alt="${productAltText}">
649 </#if>
650 </div>
651 </div>
652 <div class="col payment-opts">
653 <div class="d-flex">
654
655 <p class="left-lbl item-title mparticle-productName">${name}</p>
656
657 <#if (curZainCommerceOrderItem.getDuePerMonth() !=0)>
658
659 <label class="right-lbl mparticle-productPrice">
660 ${ZainLanguageUtil.get(locale.toString(), "zain.kd.text",
661 "")}
662 <span>${(curZainCommerceOrderItem.getDuePerMonth())!0}</span>
663 </label>
664
665
666 <#else>
667
668 <label class="right-lbl mparticle-productPrice">
669 ${ZainLanguageUtil.get(locale.toString(),
670 "zain.kd.text", "")}
671 <span>${(curZainCommerceOrderItem.getDuePerToday())!0}</span>
672 </label>
673
674 </#if>
675
676 </div>
677
678 <#if validator.isNotNull(cpDefinition)>
679 <#assign
680 keyValuePairs=commerceCartContentDisplayContext.getKeyValuePairs(cpDefinition.getCPDefinitionId(),curCommerceOrderItem.getJson(),
681 locale) />
682 <#if keyValuePairs??>
683 <div class="product-details">
684 <p>
685 <#list keyValuePairs as keyValuePair>
686 <span
687 data-name="${keyValuePair.getKey()}">${keyValuePair.getValue()}</span>
688 <#sep>|</#sep>
689 </#list>
690 </p>
691 </div>
692 </#if>
693 </#if>
694 <#if cpDefinition.getProductTypeName()?lower_case=="simple">
695 <div class="product-details">
696
697 <p>
698
699 <span class="d-span"
700 style="font-weight: 600; color: black;">
701 ${ZainLanguageUtil.get(locale.toString(),
702 "zain-no-commitment", "")}
703 </span>
704 </p>
705
706 </div>
707
708
709
710 </#if>
711
712 <div class="cart-summary-link">
713 <a class="remove-item-from-cart internal-links"
714 data-order-id="${curZainCommerceOrderItem.getOrderId()}"
715 data-itemid="${curZainCommerceOrderItem.getOrderItemId()}"
716 data-mParticleQty="${curCommerceOrderItem.getQuantity()}">
717 ${ZainLanguageUtil.get(locale.toString(),
718 "zain.cart.summary.remove", "")}
719
720 </a>
721 </div>
722
723
724
725
726 </div>
727 </div>
728 </div>
729 </#if>
730 </#if>
731
732
733
734 </#list>
735
736 </#if>
737
738 </#list>
739 </div>
740 </div>
741
742
743 <#else>
744 <div class="card-body mobile-card-body">
745 <div class="product-sect">
746 <div class="product-item pb-2">
747 <h5 class="sect-title text-center p-4">${ZainLanguageUtil.get(locale.toString(),
748 "zain.cart.summary.dropdown.your.cart.is.empty", "")}</h5>
749 </div>
750 </div>
751 </div>
752</#if>
753<div class="card-footer">
754
755
756 <div class="product-item main-total">
757 <div class="row">
758 <div class="col">
759
760
761 </div>
762 </div>
763 </div>
764
765 <div class="cf-button">
766 <#if entries?has_content>
767 <#if PlanDataUtil.isZainPlus(commerceOrder) && !ZainIMServiceUtil.isSIMVerifiedUser(request) &&
768 !themeDisplay.isSignedIn()>
769 <a href="${IMLoginURL}">${ZainLanguageUtil.get(locale.toString(),
770 "zain.cart.summary.dropdown.view.cart.checkout", "")}</a>
771
772 <#else>
773 <a href="${redirectionURL}${CheckoutPageURL}">${ZainLanguageUtil.get(locale.toString(),
774 "zain.cart.summary.dropdown.view.cart.checkout", "")}</a>
775
776 </#if>
777 <#else>
778 <a href="${redirectionURL}${ProductListingPageURL}">${ZainLanguageUtil.get(locale.toString(),
779 "zain.cart.summary.dropdown.continue.shopping", "")}</a>
780 </#if>
781
782 <p>${ZainLanguageUtil.get(locale.toString(),
783 "zain.cart.summary.dropdown.tagline", "")} </p>
784 </div>
785
786</div>
787
788<script>
789 /* Clear Cart functionality */
790 var b2b = '${is_b2b_site?string('true', 'false')}';
791 var curCommerceOrderId = "${commerceCartContentDisplayContext.getCommerceOrderId()}";
792 var resourceURL = $("#resourceUrl").text();
793 var cpDefinitionIdNameSpace = '&${renderResponse.getNamespace()}'
794 + 'commerceOrderId='
795 + curCommerceOrderId
796 + '&${renderResponse.getNamespace()}'
797 + 'clearCommerceOrder=true';
798 resourceURL += cpDefinitionIdNameSpace;
799 function clearcartrefreshfunction() {
800 $.ajax({
801 type: "POST",
802 url: resourceURL,
803 data: {
804 clearCommerceOrder: true,
805 commerceOrderId: curCommerceOrderId
806 },
807 dataType: "json",
808 success: function (data) {
809 Liferay.Portlet.refresh("#p_p_id_com_liferay_commerce_cart_content_web_internal_portlet_CommerceCartContentPortlet_");
810 window.location.href = window.location.href;
811 },
812 error: function (data) {
813 }
814 });
815 }
816 $('.clear-cart-btn-dropdown').on('click', function () {
817 var buttonObj = $(this);
818 AUI().use('aui-modal', function (Y) {
819 var modal = new Y.Modal({
820 bodyContent: '<div class="order-tracking-popup-header"><h3 class="text-center"><span><img src="${themeDisplay.getPathThemeImages()}/error-icon.svg" alt=""></span>${ZainLanguageUtil.get(locale.toString(), "zain.cart.summary.clear.cart", "")}</h3><p class="color-gray">${ZainLanguageUtil.get(locale.toString(), "zain.cart.summary.clear.cart.confirmation.message", "")}</p></div>',
821 centered: true,
822 destroyOnHide: true,
823 modal: true,
824 render: '#customModal',
825 zIndex: 100,
826 resizable: {
827 handles: 'b, r'
828 },
829 visible: true,
830 }).render();
831 modal.addToolbar([
832 {
833 label: '${ZainLanguageUtil.get(locale.toString(), "zain.clear.cart.no.button.label", "")}',
834 cssClass: 'btn-pc-3 clear-cart-no',
835 on: {
836 click: function () {
837 modal.hide();
838 }
839 }
840 },
841 {
842 label: '${ZainLanguageUtil.get(locale.toString(), "zain.clear.cart.yes.button.label", "")}',
843 cssClass: 'btn-pc-4 clear-cart-yes',
844 on: {
845 click: function () {
846 if ('${ga_Events?string}' == 'true') {
847 sendDropdownDataToGA(buttonObj);
848 }
849 clearcartrefreshfunction();
850 modal.hide();
851 }
852 }
853 }
854 ]);
855 });
856 });
857 function removeItemFromCart(itemId, orderId, buttonObject) {
858 var itemResourceURL = $("#resourceUrl").text();
859 $.ajax({
860 type: 'POST',
861 url: itemResourceURL,
862 datatype: 'json',
863 data: {
864 clearCommerceOrderItem: true,
865 commerceOrderItemId: itemId,
866 commerceOrderId: orderId,
867 },
868 success: function (data) {
869 $.when(
870 $('.manage-number-container').html(data)
871 ).then(function () {
872 window.isChangeNumberMode = true;
873 window.changeNumberFromStep = "add-ons";
874 });
875 $('.zain-checkout-form').addClass('hide');
876 $('.manage-number-screen').removeClass('hide');
877 $('.fullpage-loading').addClass('hide');
878
879 sendDropdownDataToGA(buttonObject);
880
881
882 //Liferay.Portlet.refresh("#p_p_id_com_liferay_commerce_cart_content_web_internal_portlet_CommerceCartContentPortlet_INSTANCE_headercartsummarydesktop_");
883
884
885 location.reload(true)
886
887
888 },
889 error: function (data) {
890 }
891 });
892
893
894 }
895
896
897 $('.remove-item-from-cart').on('click', function () {
898 console.log("in method of removing")
899 var orderId = $(this).attr("data-order-id");
900 var itemId = $(this).attr("data-itemid");
901 console.log("Item Id: ", itemId, " orderId: ", orderId)
902 var buttonObject = $(this); //Added By Abdullah
903 removeItemFromCart(itemId, orderId, buttonObject)
904 });
905
906 var iCount = '${itemCount}';
907 if (iCount > 0) {
908 var cString = iCount < 9 ? "0${itemCount}" : "${itemCount}";
909 $('.cart-mobile-icon,.cart-counter').find('span').html(cString);
910 $('.cart-dropdown-tag').find('span').html(cString);
911 $('.cart-mobile-icon,.cart-counter,.cart-dropdown-tag').find('span').removeClass('hide');
912 } else {
913 $('.cart-mobile-icon,.cart-counter, .cart-dropdown-tag').find('span').addClass('hide');
914 }
915</script>
916
917
918</script>
919<#if ga_Events>
920 <script>
921 function getListOfProductsInCart(elementArr, isZainPlus) {
922 var listOfProducts = [];
923 var jsonData = {};
924 elementArr.each(function () {
925 var jsonData = {};
926 var productName = $(this).find('.item-title').text().trim();
927 if (isZainPlus) {
928 //productName = "Zain Plus Plan - "+productName;
929 jsonData["planType"] = "Zain Plus Plan";
930 }
931 jsonData["name"] = productName;
932 jsonData["id"] = $(this).attr('data-id');
933 var finalPrice = 0;
934 var commitmentPeriod = 0;
935 if ($(this).find('.payment-opts .right-lbl').length > 0) {
936 var productPrice = $(this).find('.payment-opts .right-lbl').text().trim();
937 try {
938 commitmentPeriod = parseInt($(this).find('.payment-opts .left-lbl .d-span').attr('data-commitment').split("-")[0]);
939 } catch (e) {
940 console.error(e);
941 }
942 var priceArr = productPrice.split(" ");
943 if (priceArr.length > 1) {
944 productPrice = priceArr[priceArr.length - 1];
945 finalPrice = parseFloat(productPrice) * commitmentPeriod;;
946 } else {
947 finalPrice = 0;
948 }
949 }
950 //jsonData["price"] = finalPrice;
951 jsonData["analyticPrice"] = elementArr.attr("data-price");
952 jsonData["price"] = elementArr.attr("data-price");
953 jsonData["category"] = $(this).attr('data-category');
954 jsonData["payment_option"] = $(this).find('.payment-opts .left-lbl .d-span').text().trim();
955 jsonData['quantity'] = parseInt($(this).attr('data-qty'));
956
957 $(this).find('.product-details p span').each(function (i) {
958 var labelVal = $(this).attr('data-name');
959 var labelText = $(this).text();
960 jsonData[labelVal] = labelText;
961 });
962 listOfProducts.push(jsonData);
963 });
964 return listOfProducts;
965 }
966 function getCartProductObject(thisObj) {
967 var jsonData = {};
968 var finalPrice = 0;
969 if ($(thisObj).find('.payment-opts .right-lbl').length > 0) {
970 var productPrice = $(thisObj).find('.payment-opts .right-lbl').text().trim();
971 var priceArr = productPrice.split(" ");
972 if (priceArr.length > 1) {
973 productPrice = priceArr[priceArr.length - 1];
974 finalPrice = parseFloat(productPrice);
975 } else {
976 finalPrice = 0;
977 }
978 }
979 var paymentOption = "No Commitment";
980 if ($(thisObj).find('.payment-opts .left-lbl .d-span').length > 0) {
981 paymentOption = $(thisObj).find('.payment-opts .left-lbl .d-span').text().trim();
982 }
983 jsonData["name"] = $(thisObj).find('.item-title').text().trim();
984 jsonData["id"] = $(thisObj).attr('data-id');
985 jsonData["price"] = finalPrice;
986 jsonData["category"] = $(thisObj).attr('data-category');
987 jsonData["payment_option"] = paymentOption;
988 jsonData['quantity'] = parseInt($(thisObj).attr('data-qty'));
989
990 $(thisObj).find('.product-details p span').each(function (i) {
991 var labelVal = $(this).attr('data-name');
992 var labelText = $(this).text();
993 jsonData[labelVal] = labelText;
994 });
995 return jsonData;
996 }
997 function getPlanPrice(thisObj) {
998 var commitmentPeriod = 0;
999 var duePerMonthAmount = 0;
1000 var dueTodayAmount = 0;
1001 var depositAmout = 0;
1002 var linePrice = 0;
1003 duePerMonthAmount = parseFloat($(thisObj).find('.plan-sidebarhead').attr('data-planpromoprice'));
1004 if (duePerMonthAmount == 0) {
1005 duePerMonthAmount = parseFloat($(thisObj).find('.plan-sidebarhead').attr('data-planprice'));
1006 }
1007 if ($(thisObj).find('.plan-sidebarhead').attr('data-commitment') && $(thisObj).find('.plan-sidebarhead').attr('data-commitment') != "No Commitment") {
1008 commitmentPeriod = $(thisObj).find('.plan-sidebarhead').attr('data-commitment').split('-')[0].trim();
1009 }
1010 /*
1011 if($(thisObj).find('.plan-payment-opts').find('.due-per-month-amt').length > 0){
1012 duePerMonthAmount = $(thisObj).find('.plan-payment-opts').find('.due-per-month-amt .right-lbl').attr('data-price');
1013 }*/
1014 if ($(thisObj).find('.plan-payment-opts').find('.due-today-amt').length > 0) {
1015 dueTodayAmount = $(thisObj).find('.plan-payment-opts').find('.due-today-amt .right-lbl').attr('data-price');
1016 }
1017 if ($(thisObj).find('.plan-payment-opts').find('.deposit-amt').length > 0) {
1018 depositAmout = $(thisObj).find('.plan-payment-opts').find('.deposit-amt .right-lbl').attr('data-price');
1019 }
1020 if ($(thisObj).find('.line-number-item').find('.right-lbl').length > 0) {
1021 linePrice = parseFloat($(thisObj).find('.line-number-item').find('.right-lbl').attr('data-lineprice'));
1022 }
1023
1024 var planPrice = parseFloat(dueTodayAmount) + parseFloat(depositAmout) + (parseFloat(duePerMonthAmount) * parseFloat(commitmentPeriod));
1025 planPrice = planPrice + linePrice;
1026 return planPrice;
1027 }
1028
1029 function Get_Installments_Of_Plan(CurrentObj, productsJsonList) {
1030 try{
1031 $(CurrentObj).parents(".plan-sidebarhead").find('.plan-sidebarhead').each(function (i) {
1032 var jsonDevicesData = {};
1033 jsonDevicesData["name"] = $(this).find('.left-lbl.item-title').text().trim();
1034 jsonDevicesData["id"] = $(this).attr('data-id');
1035 jsonDevicesData["analyticPrice"] = 0;
1036 jsonDevicesData["price"] = 0;
1037 jsonDevicesData["category"] = $(this).attr('data-category');
1038 jsonDevicesData["payment_option"] = $(this).find('.payment-opts .d-span').text().trim();
1039 jsonDevicesData['quantity'] = parseInt($(this).attr('data-qty'));
1040
1041 productsJsonList.push(jsonDevicesData);
1042 });
1043 }catch(e){
1044 console.error(e);
1045 }
1046
1047 }
1048
1049 function sendDropdownDataToGA(thisObj) {
1050 var jsonObjForGA = {}
1051 var productsJsonList = [];
1052 console.log(thisObj.parents('.checkout-card'));
1053 thisObj.parents('#cartdropdownmenu').find('.product-sect').each(function () {
1054 var isPlan = false;
1055 var isZainPlus = thisObj.parents(".product-sect").find('.plan-sidebarhead').hasClass('zain-plus-block');
1056 if (thisObj.parents(".product-sect").find('.plan-sidebarhead').length > 0) {
1057 isPlan = true;
1058 }
1059 if (!isPlan) {
1060 $(this).find('.product-item').each(function () {
1061 productsJsonList.push(getCartProductObject(this));
1062 });
1063
1064 /****-------- mParticle Start ------------*****/
1065 sendRemoveFromCartDataToMParticle(productsJsonList);
1066 /******-------mParticle End--------------******/
1067
1068
1069 } else {
1070 var addedProducts = $(this).find('.product-item.pb-2');
1071 var productList = getListOfProductsInCart(addedProducts, isZainPlus);
1072
1073 if(!isZainPlus){
1074
1075 var planPrice = thisObj.parents(".plan-sidebarhead").find(".right-lbl").text();
1076 var paymentOption = $(this).find('.plan-sidebarhead').attr('data-displaycommitment');
1077 var jsonData = {};
1078
1079
1080 jsonData["name"] = $(this).find('.plan-sidebarhead .left-lbl.item-title').text().trim();
1081 jsonData["id"] = $(this).find('.plan-sidebarhead').attr('data-id');
1082 jsonData["analyticPrice"] = planPrice;
1083 jsonData["price"] = planPrice;
1084 jsonData["category"] = $(this).find('.plan-sidebarhead').attr('data-category');
1085 jsonData["payment_option"] = paymentOption ? paymentOption : 'No Commitment';
1086 jsonData['quantity'] = parseInt($(this).find('.plan-sidebarhead').attr('data-qty'));
1087
1088 productsJsonList.push(jsonData);
1089 Get_Installments_Of_Plan(thisObj, productsJsonList);
1090 }
1091
1092 for (var i = 0; i < productList.length; i++) {
1093 productsJsonList.push(productList[i]);
1094 }
1095
1096 /****-------- mParticle Start ------------*****/
1097 sendRemoveFromCartDataToMParticle(productsJsonList);
1098 /******-------mParticle End--------------******/
1099
1100
1101 }
1102 });
1103
1104
1105 window.dataLayer.push({
1106 'event': 'removeFromCart',
1107 'ecommerce': {
1108 'remove':
1109 {
1110 'products': productsJsonList
1111 }
1112 }
1113 });
1114 }
1115
1116 </script>
1117</#if>