Error executing template "Designs/Swift-v2/eCom7/CartV2/Step/QuoteRequestUser.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at CompiledRazorTemplates.Dynamic.RazorEngine_60f340d2d58e47b5a82a4dd2c0a99f27.ExecuteAsync() at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.DynamicWrapperService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String templateSource, String name, Type modelType, Object model, DynamicViewBag viewBag) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) in /_/src/Application/Providers/Dynamicweb.Rendering.Providers.NetCore/Razor/RazorTemplateRenderingProvider.cs:line 110 at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) in E:\A10\_w\2\s\src\Core\Dynamicweb.Core\Rendering\TemplateRenderingService.cs:line 21 at Dynamicweb.Rendering.Template.RenderRazorTemplate() in E:\A10\_w\2\s\src\Core\Dynamicweb.Core\Rendering\Template.cs:line 749
1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using Dynamicweb 3 @using System.IO 4 5 <div class="grid gap-0 h-100"> 6 <div class="g-col-12 g-col-lg-8 p-3 p-lg-4 pe-xl-5 ps-xl-6 ps-xxl-8 order-last order-lg-first" data-dw-colorscheme="@Pageview.CurrentParagraph?.ColorSchemeId"> 7 <form name="ordersubmit" id="ordersubmit" method="post" autocomplete="off" style="max-width: 65rem; margin-left: auto;"> 8 9 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 10 @using Dynamicweb 11 @using System.IO 12 13 @{ 14 string logoLink = Pageview.CurrentParagraph?.Item["LogoLink"] != null ? Pageview.CurrentParagraph.Item["LogoLink"].ToString() : string.Empty; 15 16 string logoImage = Pageview.CurrentParagraph?.Item["Logo"] != null ? Pageview.CurrentParagraph.Item["Logo"].ToString() : string.Empty; 17 string title = Pageview.CurrentParagraph?.Item["Title"] != null ? Pageview.CurrentParagraph.Item["Title"].ToString() : Pageview.Area.Name; 18 19 string maxWidth = Pageview.CurrentParagraph?.Item["MaxWidth"] != null ? "max-width: " + Pageview.CurrentParagraph.Item["MaxWidth"].ToString() + "px" : string.Empty; 20 maxWidth = maxWidth == "max-width: 0px" ? string.Empty : maxWidth; 21 } 22 23 <div class="mb-4 text-center"> 24 @if (!string.IsNullOrWhiteSpace(logoLink)) 25 { 26 @:<a href="@logoLink" class="text-decoration-none" title="@Translate("Leave checkout")"> 27 } 28 29 @if (logoImage != "") 30 { 31 if (Path.GetExtension(logoImage).ToLower() == ".svg") 32 { 33 <div class="icon-auto" style="@maxWidth"> 34 @ReadFile(logoImage) 35 </div> 36 } 37 else 38 { 39 string imageWidth = Pageview.CurrentParagraph.Item["MaxWidth"] != null ? Pageview.CurrentParagraph.Item["MaxWidth"].ToString() : "400"; 40 string imagePath = "/Admin/Public/GetImage.ashx?width=" + imageWidth + "&image=" + logoImage; 41 42 <picture class="mx-auto d-block"> 43 <img src="@logoImage" alt="@title" style="@maxWidth"> 44 </picture> 45 } 46 } 47 else 48 { 49 <div class="fs-3 p-0">@title</div> 50 } 51 52 @if (!string.IsNullOrWhiteSpace(logoLink)) 53 { 54 @:</a> 55 } 56 </div> 57 58 59 <h1 class="h2">@Translate("Request quote")</h1> 60 <p>@Translate("Please fill out the form below to request a quote. We will get back to you within 24 hours")</p> 61 62 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 63 @using Dynamicweb.Ecommerce.Orders 64 65 @if (GetLoop("ValidationErrors").Count() != 0) 66 { 67 <div class="alert alert-warning" role="alert"> 68 <ul class="m-0 list-unstyled"> 69 @foreach (LoopItem item in GetLoop("ValidationErrors")) 70 { 71 <li>@item.GetValue("Ecom:Cart.ValidationError.ErrorMessage")</li> 72 } 73 </ul> 74 </div> 75 } 76 77 78 @* Logic to remove the voucher code error, when going to next step in checkout *@ 79 @{ 80 string voucherCodeForErrorCheck = GetString("Ecom:Order.Customer.VoucherCode"); 81 Order orderForErrorCheck = new OrderService().GetById(GetString("Ecom:Order.ID")); 82 voucherCodeForErrorCheck = orderForErrorCheck.VoucherUseType == VoucherUseCategoryType.None ? string.Empty : voucherCodeForErrorCheck; 83 } 84 85 <input type="hidden" name="EcomOrderVoucherCode" value="@voucherCodeForErrorCheck"> 86 87 88 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 89 90 @{ 91 bool summaryIsPaymentStep = GetLoop("StepButtons").Count == 0; 92 int summaryCurrentStep = !summaryIsPaymentStep ? 1 : 4; 93 int summaryCurrentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); 94 95 bool userHasDefaultAddress = false; 96 bool userAddressSelected = false; 97 98 string userSelectedAddressID = GetString("UserManagement:User.UserAddress.SelectedAddressID"); 99 100 foreach (LoopItem userAddress in GetLoop("UserManagement:User.UserAddresses")) 101 { 102 if (userAddress.GetBoolean("UserManagement:User.UserAddress.Default")) 103 { 104 userHasDefaultAddress = true; 105 } 106 if (userAddress.GetBoolean("UserManagement:User.UserAddress.SelectedForDeliveryFields")) 107 { 108 userAddressSelected = true; 109 } 110 if (!string.IsNullOrEmpty(userAddress.GetString("UserManagement:User.UserAddress.SelectedAddressID"))) 111 { 112 userSelectedAddressID = userAddress.GetString("UserManagement:User.UserAddress.SelectedAddressID"); 113 } 114 } 115 116 foreach (LoopItem step in GetLoop("StepButtons")) 117 { 118 if (step.GetBoolean("Step.Current")) 119 { 120 summaryCurrentStep = step.GetInteger("Step.Number"); 121 } 122 } 123 } 124 125 @if (!string.IsNullOrEmpty(GetString("UserManagement:User.Address")) || 126 !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID")) || 127 !string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethodID")) || 128 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name")) || 129 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company")) || 130 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address")) || 131 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2")) || 132 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip")) || 133 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City")) || 134 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Email")) || 135 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Phone")) || 136 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Name")) || 137 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Company")) || 138 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address")) || 139 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address2")) || 140 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Zip")) || 141 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.City")) || 142 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || 143 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone")) || 144 !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethod")) || 145 !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingDate")) || 146 !string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethod"))) 147 { 148 149 @* User *@ 150 if (summaryCurrentUserId != 0) 151 { 152 <div class="list-group mb-5" style="--bs-list-group-bg: rgba(var(--bs-body-color-rgb), 0.05)"> 153 154 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 155 156 @{ 157 var hideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 158 int currentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); 159 160 List<string> contact = new List<string>(); 161 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 162 { 163 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email"))) 164 { 165 contact.Add(GetString("Ecom:Order.Customer.Email")); 166 } 167 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 168 { 169 contact.Add(GetString("Ecom:Order.Customer.Phone")); 170 } 171 } 172 173 string contactString = (string.Join(",", contact.Select(x => x.ToString()).ToArray())).Replace(",", ", "); 174 string userAccountPage = Pageview.CurrentParagraph.Item["UserAccountPageLink"] != null ? Pageview.CurrentParagraph.Item["UserAccountPageLink"].ToString() + "&GoBackToPage=" + Pageview.Page.ID : ""; 175 176 if (!string.IsNullOrEmpty(contactString)) 177 { 178 <div class="list-group-item py-2 fs-7" id="ContactGroup"> 179 <dl class="grid gap-1 gap-sm-3 mb-0"> 180 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Contact")</dt> 181 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@contactString</dd> 182 183 @if (!hideEditBillingAddress) 184 { 185 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 186 @if (currentUserId == 0) 187 { 188 <button type="submit" class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" name="CartV2.GotoStep0" id="EditBillingAddressButton"> 189 <span class="text-uppercase">@Translate("Edit")</span> 190 </button> 191 } 192 else 193 { 194 <a href="@userAccountPage" class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" id="EditBillingAddressButton"> 195 <span class="text-uppercase">@Translate("Edit")</span> 196 </a> 197 } 198 </dd> 199 } 200 </dl> 201 </div> 202 } 203 204 int billingFieldCount = 0; //Helps us render addresses that contains more than just the auto set country 205 List<string> customerAddressList = new List<string>(); 206 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Company"))) 207 { 208 customerAddressList.Add(GetString("Ecom:Order.Customer.Company")); 209 billingFieldCount++; 210 } 211 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Name"))) 212 { 213 customerAddressList.Add(GetString("Ecom:Order.Customer.Name")); 214 billingFieldCount++; 215 } 216 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address"))) 217 { 218 customerAddressList.Add(GetString("Ecom:Order.Customer.Address")); 219 billingFieldCount++; 220 } 221 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address2"))) 222 { 223 customerAddressList.Add(GetString("Ecom:Order.Customer.Address2")); 224 billingFieldCount++; 225 } 226 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Zip"))) 227 { 228 customerAddressList.Add(GetString("Ecom:Order.Customer.Zip")); 229 billingFieldCount++; 230 } 231 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.City"))) 232 { 233 customerAddressList.Add(GetString("Ecom:Order.Customer.City")); 234 billingFieldCount++; 235 } 236 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Region"))) 237 { 238 string regionName = GetString("Ecom:Order.Customer.Region"); 239 foreach (LoopItem region in GetLoop("CustomerRegions")) 240 { 241 if (region.GetString("Ecom:CustomerRegion.IsCustomerRegion") == "true") 242 { 243 regionName = region.GetString("Ecom:CustomerRegion.Name"); 244 } 245 } 246 247 customerAddressList.Add(regionName); 248 billingFieldCount++; 249 } 250 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Country"))) 251 { 252 customerAddressList.Add(GetString("Ecom:Order.Customer.Country")); 253 billingFieldCount++; 254 } 255 string billingAddressString = (string.Join(",", customerAddressList.Select(x => x.ToString()).ToArray())).Trim(',').Replace(",", ", "); 256 257 if (!string.IsNullOrEmpty(billingAddressString) && billingFieldCount > 1) 258 { 259 <div class="list-group-item py-2 fs-7"> 260 <dl class="grid gap-1 gap-sm-3 mb-0"> 261 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Billing")</dt> 262 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@billingAddressString</dd> 263 264 @if (!hideEditBillingAddress) 265 { 266 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 267 @if (currentUserId == 0) 268 { 269 <button type="submit" class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" name="CartV2.GotoStep0" id="EditBillingAddressButton"> 270 <span class="text-uppercase">@Translate("Edit")</span> 271 </button> 272 } 273 else 274 { 275 <a href="@userAccountPage" class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" id="EditBillingAddressButton"> 276 <span class="text-uppercase">@Translate("Edit")</span> 277 </a> 278 } 279 </dd> 280 } 281 </dl> 282 </div> 283 } 284 } 285 286 287 @if (summaryCurrentStep != 1) 288 { 289 if(!String.Equals(summaryCurrentUserId.ToString(), userSelectedAddressID)) //Selected address 290 { 291 <text> 292 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 293 294 @{ 295 var hideEditAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 296 var selectedAddressString = string.Empty; 297 int fieldCount = 0; //Helps us render addresses that contains more than just the auto set country 298 List<string> address = new List<string>(); 299 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company"))) 300 { 301 address.Add(GetString("Ecom:Order.Delivery.Company")); 302 fieldCount++; 303 } 304 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name"))) 305 { 306 address.Add(GetString("Ecom:Order.Delivery.Name")); 307 fieldCount++; 308 } 309 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address"))) 310 { 311 address.Add(GetString("Ecom:Order.Delivery.Address")); 312 fieldCount++; 313 } 314 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2"))) 315 { 316 address.Add(GetString("Ecom:Order.Delivery.Address2")); 317 fieldCount++; 318 } 319 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip"))) 320 { 321 address.Add(GetString("Ecom:Order.Delivery.Zip")); 322 fieldCount++; 323 } 324 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City"))) 325 { 326 address.Add(GetString("Ecom:Order.Delivery.City")); 327 fieldCount++; 328 } 329 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Region"))) 330 { 331 string regionName = GetString("Ecom:Order.Delivery.Region"); 332 foreach (LoopItem region in GetLoop("DeliveryRegions")) 333 { 334 if (region.GetString("Ecom:DeliveryRegion.IsDeliveryRegion") == "true") 335 { 336 regionName = region.GetString("Ecom:DeliveryRegion.Name"); 337 } 338 } 339 340 address.Add(regionName); 341 fieldCount++; 342 } 343 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Country"))) 344 { 345 address.Add(GetString("Ecom:Order.Delivery.Country")); 346 fieldCount++; 347 } 348 selectedAddressString = (string.Join(",", address.Select(x => x.ToString()).ToArray())).Trim(',').Replace(",", ", "); 349 } 350 351 @if (!string.IsNullOrEmpty(selectedAddressString) && fieldCount > 1) 352 { 353 <div class="list-group-item py-2 fs-7"> 354 <dl class="grid gap-1 gap-sm-3 mb-0"> 355 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Selected address")</dt> 356 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@selectedAddressString</dd> 357 358 @if (!hideEditAddress) 359 { 360 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 361 <button class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" type="submit" name="CartV2.GotoStep0" id="EditDeliveryAddressButton"> 362 <span class="text-uppercase">@Translate("Edit")</span> 363 </button> 364 </dd> 365 } 366 </dl> 367 </div> 368 } 369 370 </text> 371 } 372 } 373 @if (summaryCurrentStep > 2) 374 { 375 <text> 376 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 377 @{ 378 string shippingMethod = GetString("Ecom:Order.ShippingMethod"); 379 380 if (!string.IsNullOrEmpty(shippingMethod)) 381 { 382 383 List<string> shippingDetails = new List<string>(); 384 385 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company"))) 386 { 387 shippingDetails.Add(GetString("Ecom:Order.Delivery.Company")); 388 } 389 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name"))) 390 { 391 if (GetString("Ecom:Order.Delivery.Company") != GetString("Ecom:Order.Delivery.Name")) 392 { 393 shippingDetails.Add(GetString("Ecom:Order.Delivery.Name")); 394 } 395 } 396 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address"))) 397 { 398 shippingDetails.Add(GetString("Ecom:Order.Delivery.Address")); 399 } 400 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2"))) 401 { 402 shippingDetails.Add(GetString("Ecom:Order.Delivery.Address2")); 403 } 404 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip"))) 405 { 406 shippingDetails.Add(GetString("Ecom:Order.Delivery.Zip")); 407 } 408 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City"))) 409 { 410 shippingDetails.Add(GetString("Ecom:Order.Delivery.City")); 411 } 412 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Region"))) 413 { 414 string regionName = GetString("Ecom:Order.Delivery.Region"); 415 foreach (LoopItem region in GetLoop("DeliveryRegions")) 416 { 417 if (region.GetString("Ecom:DeliveryRegion.IsDeliveryRegion") == "true") 418 { 419 regionName = region.GetString("Ecom:DeliveryRegion.Name"); 420 } 421 } 422 shippingDetails.Add(regionName); 423 } 424 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Country"))) 425 { 426 shippingDetails.Add(GetString("Ecom:Order.Delivery.Country")); 427 } 428 if (GetBoolean("Ecom:Order.Delivery.isPickupPoint")) 429 { 430 shippingDetails.Clear(); 431 var order = Dynamicweb.Ecommerce.Services.Orders.GetById(GetString("Ecom:Order.ID")); 432 if (order.ShippingProviderValues.ContainsKey("ShipmondoServicePointId")) 433 { 434 //Shipmondo provider 435 if (order.ShippingProviderValues.TryGetValue("ServiceSelectedDataCarrierName", out object CarrierName)) 436 { 437 shippingDetails.Add((string)CarrierName); 438 } 439 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataCompanyName", out object CompanyName)) 440 { 441 shippingDetails.Add((string)CompanyName); 442 } 443 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataAddress", out object Address)) 444 { 445 shippingDetails.Add((string)Address); 446 } 447 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataAddress2", out object Address2) && !string.IsNullOrEmpty((string)Address2)) 448 { 449 shippingDetails.Add((string)Address2); 450 } 451 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataZipcode", out object Zipcode)) 452 { 453 shippingDetails.Add((string)Zipcode); 454 } 455 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataCity", out object City)) 456 { 457 shippingDetails.Add((string)City); 458 } 459 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataCountry", out object Country)) 460 { 461 shippingDetails.Add((string)Country); 462 } 463 if (order.ShippingProviderValues.Any()) 464 { 465 var deliveryName = 466 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Delivery.Name")) ? GetString("Ecom:Order.Delivery.Name") : 467 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Customer.Name")) ? GetString("Ecom:Order.Customer.Name") : 468 !string.IsNullOrWhiteSpace(GetString("UserManagement:User.Name")) ? GetString("UserManagement:User.Name") : string.Empty; 469 470 <div id="hiddenParcelshopFields" class="list-group-item visually-hidden"> 471 <input type="hidden" name="EcomOrderDeliveryCompany" value="@($"{(string)CompanyName} ({(string)CarrierName})")" disabled> 472 <input type="hidden" name="EcomOrderDeliveryName" value="@(deliveryName)" disabled> 473 <input type="hidden" name="EcomOrderDeliveryAddress" value="@((string)Address)" disabled> 474 <input type="hidden" name="EcomOrderDeliveryAddress2" value="@((string)Address2)" disabled> 475 <input type="hidden" name="EcomOrderDeliveryZip" value="@((string)Zipcode)" disabled> 476 <input type="hidden" name="EcomOrderDeliveryCity" value="@((string)City)" disabled> 477 <input type="hidden" name="EcomOrderDeliveryCountry" value="@((string)Country)" disabled> 478 </div> 479 } 480 } 481 482 if (order.ShippingProviderValues.ContainsKey("ParcelShopNumber")) 483 { 484 //GLS Provider 485 if (order.ShippingProviderValues.TryGetValue("parcelShop", out object parcelShop)) 486 { 487 if (parcelShop is System.Collections.Generic.Dictionary<System.String, System.Object>) 488 { 489 var selectedShop = (System.Collections.Generic.Dictionary<System.String, System.Object>)parcelShop; 490 491 if (selectedShop.TryGetValue("CompanyName", out object CompanyName)) 492 { 493 shippingDetails.Add((string)CompanyName); 494 } 495 if (selectedShop.TryGetValue("Streetname", out object Streetname)) 496 { 497 shippingDetails.Add((string)Streetname); 498 } 499 if (selectedShop.TryGetValue("Streetname2", out object Streetname2) && !string.IsNullOrEmpty((string)Streetname2)) 500 { 501 shippingDetails.Add((string)Streetname2); 502 } 503 if (selectedShop.TryGetValue("ZipCode", out object ZipCode)) 504 { 505 shippingDetails.Add((string)ZipCode); 506 } 507 if (selectedShop.TryGetValue("CityName", out object CityName)) 508 { 509 shippingDetails.Add((string)CityName); 510 } 511 if (selectedShop.TryGetValue("CountryCodeISO3166A2", out object Country)) 512 { 513 shippingDetails.Add((string)Country); 514 } 515 if (order.ShippingProviderValues.Any()) 516 { 517 var deliveryName = 518 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Delivery.Name")) ? GetString("Ecom:Order.Delivery.Name") : 519 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Customer.Name")) ? GetString("Ecom:Order.Customer.Name") : 520 !string.IsNullOrWhiteSpace(GetString("UserManagement:User.Name")) ? GetString("UserManagement:User.Name") : string.Empty; 521 522 <div id="hiddenParcelshopFields" class="list-group-item visually-hidden"> 523 <input type="hidden" name="EcomOrderDeliveryCompany" value="@($"{(string)CompanyName}")" disabled> 524 <input type="hidden" name="EcomOrderDeliveryName" value="@(deliveryName)" disabled> 525 <input type="hidden" name="EcomOrderDeliveryAddress" value="@((string)Streetname)" disabled> 526 <input type="hidden" name="EcomOrderDeliveryAddress2" value="@((string)Streetname2)" disabled> 527 <input type="hidden" name="EcomOrderDeliveryZip" value="@((string)ZipCode)" disabled> 528 <input type="hidden" name="EcomOrderDeliveryCity" value="@((string)CityName)" disabled> 529 <input type="hidden" name="EcomOrderDeliveryCountry" value="@((string)Country)" disabled> 530 </div> 531 } 532 } 533 } 534 } 535 } 536 537 string shippingDetailsString = (string.Join(", ", shippingDetails.Select(x => x).ToArray())); 538 539 <div class="list-group-item py-2 fs-7" id="DeliveryGroup"> 540 <dl class="grid gap-1 gap-sm-3 mb-0"> 541 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery method")</dt> 542 <dd class="d-flex flex-column g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0"> 543 @if ((!string.IsNullOrEmpty(shippingDetailsString) && !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name")))) 544 { 545 <span>@shippingDetailsString</span> 546 <span class="opacity-75 fs-8"> 547 @shippingMethod 548 </span> 549 } 550 else if ((!string.IsNullOrEmpty(shippingDetailsString) && string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name")) && string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Country")))) { 551 <span>@shippingDetailsString</span> 552 <span class="opacity-75 fs-8"> 553 @shippingMethod 554 </span> 555 } 556 else 557 { 558 <span>@Translate("Same as billing address")</span> 559 <span class="opacity-75 fs-8"> 560 @shippingMethod 561 </span> 562 } 563 </dd> 564 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 565 <button class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" type="submit" name="CartV2.GotoStep1" id="EditDeliveryButton"> 566 <span class="text-uppercase">@Translate("Edit")</span> 567 </button> 568 </dd> 569 </dl> 570 </div> 571 } 572 } 573 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 574 575 @{ 576 string shippingDate = GetString("Ecom:Order.ShippingDate"), 577 shippingDateFormatted = GetDate("Ecom:Order.ShippingDate").ToShortDateString(); 578 } 579 580 @if (!string.IsNullOrEmpty(shippingDate)) 581 { 582 <div class="list-group-item py-2 fs-7"> 583 <dl class="grid gap-1 gap-sm-3 mb-0"> 584 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery date")</dt> 585 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@shippingDateFormatted</dd> 586 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 587 <button class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" type="submit" name="CartV2.GotoStep1" id="EditDeliveryDateButton"> 588 <span class="text-uppercase">@Translate("Edit")</span> 589 </button> 590 </dd> 591 </dl> 592 </div> 593 } 594 595 596 </text> 597 } 598 </div> 599 } 600 @* Anonymous *@ 601 else 602 { 603 if (summaryCurrentStep != 1) 604 { 605 <div class="list-group" style="--bs-list-group-bg: rgba(var(--bs-body-color-rgb), 0.05)"> 606 607 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 608 609 @{ 610 var hideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 611 int currentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); 612 613 List<string> contact = new List<string>(); 614 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 615 { 616 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email"))) 617 { 618 contact.Add(GetString("Ecom:Order.Customer.Email")); 619 } 620 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 621 { 622 contact.Add(GetString("Ecom:Order.Customer.Phone")); 623 } 624 } 625 626 string contactString = (string.Join(",", contact.Select(x => x.ToString()).ToArray())).Replace(",", ", "); 627 string userAccountPage = Pageview.CurrentParagraph.Item["UserAccountPageLink"] != null ? Pageview.CurrentParagraph.Item["UserAccountPageLink"].ToString() + "&GoBackToPage=" + Pageview.Page.ID : ""; 628 629 if (!string.IsNullOrEmpty(contactString)) 630 { 631 <div class="list-group-item py-2 fs-7" id="ContactGroup"> 632 <dl class="grid gap-1 gap-sm-3 mb-0"> 633 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Contact")</dt> 634 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@contactString</dd> 635 636 @if (!hideEditBillingAddress) 637 { 638 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 639 @if (currentUserId == 0) 640 { 641 <button type="submit" class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" name="CartV2.GotoStep0" id="EditBillingAddressButton"> 642 <span class="text-uppercase">@Translate("Edit")</span> 643 </button> 644 } 645 else 646 { 647 <a href="@userAccountPage" class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" id="EditBillingAddressButton"> 648 <span class="text-uppercase">@Translate("Edit")</span> 649 </a> 650 } 651 </dd> 652 } 653 </dl> 654 </div> 655 } 656 657 int billingFieldCount = 0; //Helps us render addresses that contains more than just the auto set country 658 List<string> customerAddressList = new List<string>(); 659 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Company"))) 660 { 661 customerAddressList.Add(GetString("Ecom:Order.Customer.Company")); 662 billingFieldCount++; 663 } 664 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Name"))) 665 { 666 customerAddressList.Add(GetString("Ecom:Order.Customer.Name")); 667 billingFieldCount++; 668 } 669 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address"))) 670 { 671 customerAddressList.Add(GetString("Ecom:Order.Customer.Address")); 672 billingFieldCount++; 673 } 674 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address2"))) 675 { 676 customerAddressList.Add(GetString("Ecom:Order.Customer.Address2")); 677 billingFieldCount++; 678 } 679 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Zip"))) 680 { 681 customerAddressList.Add(GetString("Ecom:Order.Customer.Zip")); 682 billingFieldCount++; 683 } 684 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.City"))) 685 { 686 customerAddressList.Add(GetString("Ecom:Order.Customer.City")); 687 billingFieldCount++; 688 } 689 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Region"))) 690 { 691 string regionName = GetString("Ecom:Order.Customer.Region"); 692 foreach (LoopItem region in GetLoop("CustomerRegions")) 693 { 694 if (region.GetString("Ecom:CustomerRegion.IsCustomerRegion") == "true") 695 { 696 regionName = region.GetString("Ecom:CustomerRegion.Name"); 697 } 698 } 699 700 customerAddressList.Add(regionName); 701 billingFieldCount++; 702 } 703 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Country"))) 704 { 705 customerAddressList.Add(GetString("Ecom:Order.Customer.Country")); 706 billingFieldCount++; 707 } 708 string billingAddressString = (string.Join(",", customerAddressList.Select(x => x.ToString()).ToArray())).Trim(',').Replace(",", ", "); 709 710 if (!string.IsNullOrEmpty(billingAddressString) && billingFieldCount > 1) 711 { 712 <div class="list-group-item py-2 fs-7"> 713 <dl class="grid gap-1 gap-sm-3 mb-0"> 714 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Billing")</dt> 715 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@billingAddressString</dd> 716 717 @if (!hideEditBillingAddress) 718 { 719 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 720 @if (currentUserId == 0) 721 { 722 <button type="submit" class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" name="CartV2.GotoStep0" id="EditBillingAddressButton"> 723 <span class="text-uppercase">@Translate("Edit")</span> 724 </button> 725 } 726 else 727 { 728 <a href="@userAccountPage" class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" id="EditBillingAddressButton"> 729 <span class="text-uppercase">@Translate("Edit")</span> 730 </a> 731 } 732 </dd> 733 } 734 </dl> 735 </div> 736 } 737 } 738 739 740 @if (summaryCurrentStep > 2) 741 { 742 <text> 743 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 744 @{ 745 string shippingMethod = GetString("Ecom:Order.ShippingMethod"); 746 747 if (!string.IsNullOrEmpty(shippingMethod)) 748 { 749 750 List<string> shippingDetails = new List<string>(); 751 752 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company"))) 753 { 754 shippingDetails.Add(GetString("Ecom:Order.Delivery.Company")); 755 } 756 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name"))) 757 { 758 if (GetString("Ecom:Order.Delivery.Company") != GetString("Ecom:Order.Delivery.Name")) 759 { 760 shippingDetails.Add(GetString("Ecom:Order.Delivery.Name")); 761 } 762 } 763 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address"))) 764 { 765 shippingDetails.Add(GetString("Ecom:Order.Delivery.Address")); 766 } 767 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2"))) 768 { 769 shippingDetails.Add(GetString("Ecom:Order.Delivery.Address2")); 770 } 771 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip"))) 772 { 773 shippingDetails.Add(GetString("Ecom:Order.Delivery.Zip")); 774 } 775 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City"))) 776 { 777 shippingDetails.Add(GetString("Ecom:Order.Delivery.City")); 778 } 779 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Region"))) 780 { 781 string regionName = GetString("Ecom:Order.Delivery.Region"); 782 foreach (LoopItem region in GetLoop("DeliveryRegions")) 783 { 784 if (region.GetString("Ecom:DeliveryRegion.IsDeliveryRegion") == "true") 785 { 786 regionName = region.GetString("Ecom:DeliveryRegion.Name"); 787 } 788 } 789 shippingDetails.Add(regionName); 790 } 791 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Country"))) 792 { 793 shippingDetails.Add(GetString("Ecom:Order.Delivery.Country")); 794 } 795 if (GetBoolean("Ecom:Order.Delivery.isPickupPoint")) 796 { 797 shippingDetails.Clear(); 798 var order = Dynamicweb.Ecommerce.Services.Orders.GetById(GetString("Ecom:Order.ID")); 799 if (order.ShippingProviderValues.ContainsKey("ShipmondoServicePointId")) 800 { 801 //Shipmondo provider 802 if (order.ShippingProviderValues.TryGetValue("ServiceSelectedDataCarrierName", out object CarrierName)) 803 { 804 shippingDetails.Add((string)CarrierName); 805 } 806 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataCompanyName", out object CompanyName)) 807 { 808 shippingDetails.Add((string)CompanyName); 809 } 810 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataAddress", out object Address)) 811 { 812 shippingDetails.Add((string)Address); 813 } 814 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataAddress2", out object Address2) && !string.IsNullOrEmpty((string)Address2)) 815 { 816 shippingDetails.Add((string)Address2); 817 } 818 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataZipcode", out object Zipcode)) 819 { 820 shippingDetails.Add((string)Zipcode); 821 } 822 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataCity", out object City)) 823 { 824 shippingDetails.Add((string)City); 825 } 826 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataCountry", out object Country)) 827 { 828 shippingDetails.Add((string)Country); 829 } 830 if (order.ShippingProviderValues.Any()) 831 { 832 var deliveryName = 833 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Delivery.Name")) ? GetString("Ecom:Order.Delivery.Name") : 834 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Customer.Name")) ? GetString("Ecom:Order.Customer.Name") : 835 !string.IsNullOrWhiteSpace(GetString("UserManagement:User.Name")) ? GetString("UserManagement:User.Name") : string.Empty; 836 837 <div id="hiddenParcelshopFields" class="list-group-item visually-hidden"> 838 <input type="hidden" name="EcomOrderDeliveryCompany" value="@($"{(string)CompanyName} ({(string)CarrierName})")" disabled> 839 <input type="hidden" name="EcomOrderDeliveryName" value="@(deliveryName)" disabled> 840 <input type="hidden" name="EcomOrderDeliveryAddress" value="@((string)Address)" disabled> 841 <input type="hidden" name="EcomOrderDeliveryAddress2" value="@((string)Address2)" disabled> 842 <input type="hidden" name="EcomOrderDeliveryZip" value="@((string)Zipcode)" disabled> 843 <input type="hidden" name="EcomOrderDeliveryCity" value="@((string)City)" disabled> 844 <input type="hidden" name="EcomOrderDeliveryCountry" value="@((string)Country)" disabled> 845 </div> 846 } 847 } 848 849 if (order.ShippingProviderValues.ContainsKey("ParcelShopNumber")) 850 { 851 //GLS Provider 852 if (order.ShippingProviderValues.TryGetValue("parcelShop", out object parcelShop)) 853 { 854 if (parcelShop is System.Collections.Generic.Dictionary<System.String, System.Object>) 855 { 856 var selectedShop = (System.Collections.Generic.Dictionary<System.String, System.Object>)parcelShop; 857 858 if (selectedShop.TryGetValue("CompanyName", out object CompanyName)) 859 { 860 shippingDetails.Add((string)CompanyName); 861 } 862 if (selectedShop.TryGetValue("Streetname", out object Streetname)) 863 { 864 shippingDetails.Add((string)Streetname); 865 } 866 if (selectedShop.TryGetValue("Streetname2", out object Streetname2) && !string.IsNullOrEmpty((string)Streetname2)) 867 { 868 shippingDetails.Add((string)Streetname2); 869 } 870 if (selectedShop.TryGetValue("ZipCode", out object ZipCode)) 871 { 872 shippingDetails.Add((string)ZipCode); 873 } 874 if (selectedShop.TryGetValue("CityName", out object CityName)) 875 { 876 shippingDetails.Add((string)CityName); 877 } 878 if (selectedShop.TryGetValue("CountryCodeISO3166A2", out object Country)) 879 { 880 shippingDetails.Add((string)Country); 881 } 882 if (order.ShippingProviderValues.Any()) 883 { 884 var deliveryName = 885 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Delivery.Name")) ? GetString("Ecom:Order.Delivery.Name") : 886 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Customer.Name")) ? GetString("Ecom:Order.Customer.Name") : 887 !string.IsNullOrWhiteSpace(GetString("UserManagement:User.Name")) ? GetString("UserManagement:User.Name") : string.Empty; 888 889 <div id="hiddenParcelshopFields" class="list-group-item visually-hidden"> 890 <input type="hidden" name="EcomOrderDeliveryCompany" value="@($"{(string)CompanyName}")" disabled> 891 <input type="hidden" name="EcomOrderDeliveryName" value="@(deliveryName)" disabled> 892 <input type="hidden" name="EcomOrderDeliveryAddress" value="@((string)Streetname)" disabled> 893 <input type="hidden" name="EcomOrderDeliveryAddress2" value="@((string)Streetname2)" disabled> 894 <input type="hidden" name="EcomOrderDeliveryZip" value="@((string)ZipCode)" disabled> 895 <input type="hidden" name="EcomOrderDeliveryCity" value="@((string)CityName)" disabled> 896 <input type="hidden" name="EcomOrderDeliveryCountry" value="@((string)Country)" disabled> 897 </div> 898 } 899 } 900 } 901 } 902 } 903 904 string shippingDetailsString = (string.Join(", ", shippingDetails.Select(x => x).ToArray())); 905 906 <div class="list-group-item py-2 fs-7" id="DeliveryGroup"> 907 <dl class="grid gap-1 gap-sm-3 mb-0"> 908 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery method")</dt> 909 <dd class="d-flex flex-column g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0"> 910 @if ((!string.IsNullOrEmpty(shippingDetailsString) && !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name")))) 911 { 912 <span>@shippingDetailsString</span> 913 <span class="opacity-75 fs-8"> 914 @shippingMethod 915 </span> 916 } 917 else if ((!string.IsNullOrEmpty(shippingDetailsString) && string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name")) && string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Country")))) { 918 <span>@shippingDetailsString</span> 919 <span class="opacity-75 fs-8"> 920 @shippingMethod 921 </span> 922 } 923 else 924 { 925 <span>@Translate("Same as billing address")</span> 926 <span class="opacity-75 fs-8"> 927 @shippingMethod 928 </span> 929 } 930 </dd> 931 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 932 <button class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" type="submit" name="CartV2.GotoStep1" id="EditDeliveryButton"> 933 <span class="text-uppercase">@Translate("Edit")</span> 934 </button> 935 </dd> 936 </dl> 937 </div> 938 } 939 } 940 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 941 942 @{ 943 string shippingDate = GetString("Ecom:Order.ShippingDate"), 944 shippingDateFormatted = GetDate("Ecom:Order.ShippingDate").ToShortDateString(); 945 } 946 947 @if (!string.IsNullOrEmpty(shippingDate)) 948 { 949 <div class="list-group-item py-2 fs-7"> 950 <dl class="grid gap-1 gap-sm-3 mb-0"> 951 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery date")</dt> 952 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@shippingDateFormatted</dd> 953 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 954 <button class="btn btn-sm btn-link fs-8 p-0" data-dw-button="link" type="submit" name="CartV2.GotoStep1" id="EditDeliveryDateButton"> 955 <span class="text-uppercase">@Translate("Edit")</span> 956 </button> 957 </dd> 958 </dl> 959 </div> 960 } 961 962 963 </text> 964 } 965 @if (summaryCurrentStep > 3) 966 { 967 <text> 968 [Include file 'Helpers/StepSummaryPaymentMethod.cshtml' not found in 'Templates/Designs/Swift-v2/eCom7/CartV2/Step/Helpers/StepSummary.cshtml'] 969 [Include file 'Helpers/StepSummaryOrderReference.cshtml' not found in 'Templates/Designs/Swift-v2/eCom7/CartV2/Step/Helpers/StepSummary.cshtml'] 970 </text> 971 } 972 </div> 973 } 974 } 975 } 976 977 978 <div class="form-floating mt-4"> 979 <textarea class="form-control" placeholder="@Translate("Add quote request here")" name="EcomOrderCustomerComment" id="EcomOrderCustomerComment" style="min-height: 100px" value="@GetString("Ecom:Order.Customer.Comment")"></textarea> 980 <label for="EcomOrderCustomerComment">@Translate("Add quote request here")</label> 981 </div> 982 983 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 984 985 @{ 986 string stepsIconPath = "/Files/Images/Icons/"; 987 int currentStep = 1; 988 string nextButtonName = Translate("Next"); 989 string previousButtonName = Translate("Back"); 990 991 var buttonId = GetLoop("StepButtons").Count == 0 ? "PayButton" : GetString("CartV2.NextStepButtonName"); 992 993 foreach (LoopItem step in GetLoop("StepButtons")) 994 { 995 if (step.GetBoolean("Step.Current")) 996 { 997 currentStep = step.GetInteger("Step.Number"); 998 } 999 1000 if (step.GetInteger("Step.Number") == currentStep + 1) 1001 { 1002 nextButtonName = Translate(step.GetString("Step.Name")); 1003 } 1004 1005 if (step.GetInteger("Step.Number") == currentStep + step.GetInteger("Step.Index")) 1006 { 1007 previousButtonName = Translate("Back to") + " " + Translate(step.GetString("Step.Name")); 1008 } 1009 } 1010 1011 if (currentStep == GetLoop("StepButtons").Count - 1 && Pageview.CurrentParagraph.Item.SystemName != "Swift-v2_QuoteCheckoutApp") 1012 { 1013 <text> 1014 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1015 1016 @{ 1017 string termsAndConditionsCheckboxValue = GetBoolean("Ecom:Order.Customer.Accepted").ToString(); 1018 string termsAndConditionsPageLink = Pageview.CurrentParagraph.Item["TermsAndConditionsPageLink"] != null ? Pageview.CurrentParagraph.Item["TermsAndConditionsPageLink"].ToString() : string.Empty; 1019 } 1020 1021 @if (!string.IsNullOrEmpty(termsAndConditionsPageLink)) 1022 { 1023 <div class="mt-4" id="TermsAndConditions"> 1024 <h3 class="fs-6 fw-normal mb-0">@Translate("Terms and conditions")</h3> 1025 <p class="fs-8 mb-3">@Translate("Agree to terms and conditions and that your informations are correct")</p> 1026 <div class="list-group"> 1027 <label class="list-group-item list-group-item-action d-flex justify-content-between" for="EcomOrderCustomerAccepted"> 1028 <span class="d-flex justify-content-between align-items-center gap-3"> 1029 <input class="form-check-input m-0" type="checkbox" name="EcomOrderCustomerAccepted" id="EcomOrderCustomerAccepted" value="@termsAndConditionsCheckboxValue" @if (GetString("Ecom:Order.Customer.Accepted") == "true") { <text> checked="checked" </text> }> 1030 <span>@Translate("I accept the") <a href='/@termsAndConditionsPageLink' target='_blank' rel='noopener' id="TermsAndConditionsButton">@Translate("terms and conditions")</a></span> 1031 </span> 1032 </label> 1033 </div> 1034 </div> 1035 } 1036 1037 1038 </text> 1039 1040 nextButtonName = Translate("Place Order"); 1041 } 1042 else if (GetLoop("StepButtons").Count == 0) 1043 { 1044 nextButtonName = Translate("Pay"); 1045 } 1046 } 1047 1048 <div class="mt-4 d-flex flex-column flex-md-row justify-content-end gap-3 mt-lg-4" id="StepsNavigation"> 1049 @if (currentStep == 1) 1050 { 1051 var cartLink = $"Default.aspx?id={Pageview.CurrentParagraph.Page.Parent.ID}"; 1052 1053 <a href="@cartLink" class="btn btn-link text-decoration-none order-last order-md-first" data-dw-button="link" id="BackToCartButton"> 1054 <div class="d-flex align-items-center justify-content-center position-relative"> 1055 <span class="icon-2 me-1 position-absolute position-md-static start-0"> 1056 @ReadFile(stepsIconPath + "chevron-left.svg") 1057 </span> 1058 <span>@Translate("Back to cart")</span> 1059 </div> 1060 </a> 1061 } 1062 else 1063 { 1064 <button name="@GetString("CartV2.PreviousStepButtonName")" id="@GetString("CartV2.PreviousStepButtonName")" class="btn btn-link text-decoration-none" data-dw-button="link"> 1065 <div class="d-flex align-items-center justify-content-center position-relative"> 1066 <span class="icon-2 me-1 position-absolute position-md-static start-0"> 1067 @ReadFile(stepsIconPath + "chevron-left.svg") 1068 </span> 1069 <span>@previousButtonName</span> 1070 </div> 1071 </button> 1072 } 1073 1074 <button type="submit" name="@GetString("CartV2.NextStepButtonName")" id="@buttonId" class="btn btn-primary order-first order-md-last" data-dw-button="primary" > 1075 <div class="d-flex align-items-center justify-content-center position-relative pe-none"> 1076 <span>@nextButtonName</span> 1077 <span class="icon-2 ms-1 position-absolute position-md-static end-0"> 1078 @ReadFile(stepsIconPath + "chevron-right.svg") 1079 </span> 1080 </div> 1081 </button> 1082 1083 @* // SHIPMONDO 1084 Following script prevents writing pickup point address to order.delivery 1085 before finalizing the order. 1086 *@ 1087 @if (currentStep == GetLoop("StepButtons").Count - 1) 1088 { 1089 if (GetBoolean("Ecom:Order.Delivery.isPickupPoint")) 1090 { 1091 <input type="hidden" name="@GetString("CartV2.NextStepButtonName")" /> 1092 <script> 1093 document.getElementById("@GetString("CartV2.NextStepButtonName")").addEventListener("click", function (e) { 1094 const form = e.target.closest("form"), 1095 hiddenParcelShopFields = form.querySelector("#hiddenParcelshopFields"), 1096 hiddenParcelShopFieldsDisabled = hiddenParcelShopFields.querySelectorAll("input"); 1097 1098 e.preventDefault(); 1099 1100 if (hiddenParcelShopFieldsDisabled.length > 0) { 1101 hiddenParcelShopFieldsDisabled.forEach( (input) => { 1102 input.disabled = false; 1103 }); 1104 } 1105 1106 form.submit() 1107 }); 1108 </script> 1109 } 1110 } 1111 1112 <script> 1113 if (window.history.replaceState) { 1114 window.history.replaceState(null, null, window.location.href); 1115 } 1116 </script> 1117 </div> 1118 1119 1120 <input type="hidden" id="CurrentStep"> 1121 </form> 1122 </div> 1123 1124 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1125 1126 <div class="g-col-12 g-col-lg-4 py-2 p-3 p-lg-4 p-xl-5" id="summarySidebar"> 1127 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1128 1129 @{ 1130 string iconPath = "/Files/Images/Icons/"; 1131 } 1132 1133 <button class="toggle-order-summary btn text-reset w-100 d-block d-lg-none px-0" type="button" data-bs-toggle="collapse" data-bs-target="#orderSummary" aria-expanded="false" aria-controls="orderSummary" id="OrderSummaryToggleButton"> 1134 <span class="d-flex align-items-center justify-content-between"> 1135 <span class="d-flex align-items-center gap-2"> 1136 <span class="fs-7 lh-1"> 1137 <span class="toggle-order-summary-text" id="OrderSummaryToggleButtonLabel">@Translate("Show order summary")</span> 1138 </span> 1139 <span class="icon-2" id="OrderSummaryToggleButtonIcon" style="transition: all 0.25s ease-in-out;"> 1140 @ReadFile(iconPath + "chevron-down.svg") 1141 </span> 1142 </span> 1143 <span class="fw-bold"> 1144 <span class="text-price">@GetString("Ecom:Order.Price")</span> 1145 </span> 1146 </span> 1147 </button> 1148 1149 <script> 1150 const orderSummaryToggleButton = document.getElementById("OrderSummaryToggleButton"); 1151 const orderSummaryToggleButtonLabel = document.getElementById("OrderSummaryToggleButtonLabel"); 1152 const orderSummaryToggleButtonIcon = document.getElementById("OrderSummaryToggleButtonIcon"); 1153 const orderSummaryToggleText = '@Translate("Show order summary")'; 1154 1155 orderSummaryToggleButton.addEventListener('click', function handleClick() { 1156 if (orderSummaryToggleButtonLabel.textContent.toLowerCase().includes(orderSummaryToggleText.toLowerCase())) { 1157 orderSummaryToggleButtonLabel.textContent = '@Translate("Hide order summary")'; 1158 orderSummaryToggleButtonIcon.classList.add("rotate-180"); 1159 } else { 1160 orderSummaryToggleButtonLabel.textContent = orderSummaryToggleText; 1161 orderSummaryToggleButtonIcon.classList.remove("rotate-180"); 1162 } 1163 }); 1164 </script> 1165 1166 1167 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1168 1169 <div class="d-lg-block h-lg-auto collapse pt-2 pt-lg-0" id="orderSummary"> 1170 <div class="d-flex flex-column gap-2 gap-lg-3 pb-2 pb-lg-3"> 1171 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @using Dynamicweb.Ecommerce.ProductCatalog @functions { private static string GetPrimaryImage(LoopItem orderline, string shopId) 1172 { 1173 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductID")) || !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductNumber")); //Live Cart orderlines may not return ProductId. Manually entered products may not have ProductNumber 1174 bool isProduct = orderline.GetBoolean("Ecom:Order:OrderLine.IsProduct") || (orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount") && isProductIdOrNumber); 1175 string productId = orderline.GetString("Ecom:Order:OrderLine.ProductID"); 1176 string variantId = orderline.GetString("Ecom:Order:OrderLine.ProductVariantID"); 1177 1178 if (!isProduct || string.IsNullOrEmpty(productId)) return ""; 1179 1180 ProductViewModelSettings productSetting = new ProductViewModelSettings { LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency?.Code, CountryCode = Dynamicweb.Ecommerce.Common.Context.Country?.Code2, ShopId = shopId }; 1181 ProductViewModel product = ViewModelFactory.CreateView(productSetting, productId, variantId); 1182 if (product != null && product.DefaultImage != null && !string.IsNullOrEmpty(product.DefaultImage.Value)) 1183 return product.DefaultImage.Value; 1184 return string.Empty; 1185 } } @{ var orderlines = GetLoop("OrderLines"); } @for (int i = orderlines.Count - 1; i >= 0; i--) 1186 { 1187 var orderline = orderlines[i]; 1188 string name = orderline.GetString("Ecom:Order:OrderLine.ProductName"); 1189 string orderlineImage = GetPrimaryImage(orderline, GetString("Ecom:Order.ShopID")); 1190 string image = $"/Admin/Public/GetImage.ashx?width=180&height=180&crop=5&fillcanvas=true&Background=ffffff&image={Dynamicweb.Context.Current.Server.UrlEncode(orderlineImage)}&format=webp"; 1191 image = !orderlineImage.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase) ? orderlineImage : image; 1192 string removeFromBasketLink = orderline.GetString("Ecom:Order:OrderLine.DeleteLink"); 1193 string priceTotalWithDiscounts = orderline.GetString("Ecom:Order:OrderLine.TotalPriceWithProductDiscounts.PriceFormatted"); 1194 string priceBefore = orderline.GetString("Ecom:Product.InformativePrice.PriceFormatted"); 1195 string unitPrice = orderline.GetString("Ecom:Order:OrderLine.UnitPrice.PriceFormatted"); 1196 string discountPrice = orderline.GetString("Ecom:Order:OrderLine.UnitPriceWithProductDiscount.PriceFormatted"); 1197 string discountTotal = orderline.GetString("Ecom:Order:OrderLine.TotalDiscount.PriceFormatted"); 1198 string variantText = orderline.GetString("Ecom:Order:OrderLine.ProductVariantText"); 1199 var orderlineId = orderline.GetValue("Ecom:Order:OrderLine.Id"); 1200 var quantity = orderline.GetDouble("Ecom:Order:OrderLine.Quantity"); 1201 var unitName = orderline.GetString("Ecom:Order:OrderLine.UnitName"); 1202 string primaryGroupId = orderline.GetString("Ecom:Order:OrderLine.PrimaryOrDefaultGroupId"); 1203 string productId = orderline.GetString("Ecom:Order:OrderLine.ProductID"); 1204 string variantId = orderline.GetString("Ecom:Order:OrderLine.ProductVariantID"); 1205 1206 string link = "Default.aspx?ID=" + GetPageIdByNavigationTag("Shop"); 1207 link += $"&GroupID={System.Net.WebUtility.UrlEncode(primaryGroupId)}"; 1208 link += $"&ProductID={System.Net.WebUtility.UrlEncode(productId)}"; 1209 link += !string.IsNullOrEmpty(variantId) ? $"&VariantID={System.Net.WebUtility.UrlEncode(variantId)}" : ""; 1210 1211 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductID")) || !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductNumber")); //Live Cart orderlines may not return ProductId. Manually entered products may not have ProductNumber 1212 bool isProduct = orderline.GetBoolean("Ecom:Order:OrderLine.IsProduct") || (orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount") && isProductIdOrNumber); 1213 1214 if (isProduct) 1215 { 1216 var bomItems = orderline.GetLoop("BOMItems"); <article class="grid grid-12"> <div class="g-col-2"> <a href="@link" class="ratio ratio-1x1 d-block " title="@name"> <img src="@image" style="object-fit: contain;" alt="@name"> </a> </div> <div class="g-col-10"> <div class="d-flex flex-column gap-1"> @* Title *@ <h3 class="h6 fs-7 m-0"> <a href="@link" class="text-decoration-none" title="@name">@name</a> </h3> @* Variants *@ @if (!string.IsNullOrEmpty(variantText)) 1217 { <p class="fs-8 m-0">@variantText</p> } @if (orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount")) 1218 { @* Free product notice *@ <p class="fs-8 m-0">@Translate("Free product")</p> } 1219 else 1220 { @* Unit price *@ <p class="fs-8 m-0"> @if (!string.IsNullOrEmpty(unitName)) 1221 { <span>@unitName: </span> } @if (discountPrice == unitPrice) 1222 { <span class="text-price">@unitPrice</span> } 1223 else 1224 { <span class="text-price">@discountPrice</span> <span class="text-decoration-line-through"> <span class="text-price">@unitPrice</span> </span> } </p> } <div class="d-flex flex-row justify-content-between"> @* Quantity *@ <span class="fs-8 d-block">@Translate("Qty"): @quantity</span> <div class="text-end flex-fill"> @* Total *@ <div class="fs-7 m-0"> <span class="text-price">@priceTotalWithDiscounts</span> </div> @if (orderline.GetDouble("Ecom:Order:OrderLine.TotalDiscount.Price.Value") != 0.0) { <div class="fs-8"> <span class="text-price">@discountTotal</span> </div> } </div> </div> </div> </div> @if (bomItems.Count > 0) 1225 { @* BOM items *@ @foreach (var bomItem in bomItems) 1226 { 1227 string bomImage = bomItem.GetString("Ecom:Product.PrimaryImage"); 1228 bomImage = !bomImage.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase) ? bomImage : $"/Admin/Public/GetImage.ashx?width=120&height=100&image={bomImage}&format=webp"; 1229 1230 string bomPriceTotalWithDiscounts = bomItem.GetString("Ecom:Order:OrderLine.TotalPriceWithProductDiscounts.PriceFormatted"); 1231 string bomDiscountTotal = bomItem.GetString("Ecom:Order:OrderLine.TotalDiscount.PriceFormatted"); <div class="g-col-3 g-col-lg-2 d-flex align-items-center gap-2"> <div class="icon-1 opacity-25"> @ReadFile("/Files/Images/Icons/arrow-turn-down-right.svg") </div> @if (!string.IsNullOrEmpty(bomImage)) 1232 { <div class="ratio ratio-1x1 d-block" title="@name"> <img class="cart-item-img" src="@bomImage" style="object-fit: contain;" alt="@name"> </div> } </div> <div class="g-col-9 g-col-lg-10 grid" style="row-gap: 0.5rem; --bs-gap:0;"> <div class="g-col-12 g-col-md-8"> <h3 class="fs-7 m-0">@bomItem.GetString("Ecom:Product.Name")</h3> <p class="fs-8 mb-0">@Translate("Qty"): @bomItem.GetDouble("Ecom:Order:OrderLine.Quantity")</p> </div> <div class="g-col-12 g-col-md-4 text-end"> @* Total - Hide when PriceType = Fixed *@ @if (orderline.GetInteger("Ecom:Product.PriceType") != 1) 1233 { <div class="fs-7"> <span class="text-price">@bomPriceTotalWithDiscounts</span> </div> if (bomItem.GetDouble("Ecom:Order:OrderLine.TotalDiscount.Price.Value") != 0) 1234 { <div class="fs-8"> <span class="text-price">@bomDiscountTotal</span> </div> } 1235 } </div> </div> } } </article> } 1236 } 1237 </div> 1238 1239 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1240 1241 @{ 1242 double totalPriceWithoutOrderDiscountsFeesAndTaxesValue = 1243 GetDouble("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Value") + 1244 GetDouble("Ecom:Order.TotalProductDiscount.Price.Value"); 1245 var orderCurrency = Dynamicweb.Ecommerce.Services.Currencies.GetCurrency(GetString("Ecom:Order.Currency.Code")); 1246 string totalPriceWithoutOrderDiscountsFeesAndTaxes = Dynamicweb.Ecommerce.Services.Currencies.Format(orderCurrency, 1247 totalPriceWithoutOrderDiscountsFeesAndTaxesValue); 1248 1249 bool showPricesWithVat = Dynamicweb.Ecommerce.Common.Context.DisplayPricesWithVat; 1250 bool renderVatMessage = (GetString("Ecom:Order.OrderLines.Total.PriceWithVAT") != GetString("Ecom:Order.OrderLines.Total.PriceWithoutVAT")) || Dynamicweb.Ecommerce.Common.Context.Country?.Vat != null; 1251 1252 bool disableVouchers = Pageview.CurrentParagraph?.Item["DisableVouchers"] != null ? 1253 (Boolean)Pageview.CurrentParagraph.Item["DisableVouchers"] : false; 1254 disableVouchers = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("CompletedOrderId")) ? true : 1255 disableVouchers; 1256 1257 <div class="d-flex flex-column gap-2 gap-lg-3 pb-3 bottom-0 sticky-receipt" id="orderSummaryFooter"> 1258 1259 @if (!disableVouchers && Pageview.CurrentParagraph?.Item.SystemName != "Swift-v2_QuoteCheckoutApp") 1260 { 1261 <text> 1262 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1263 @using Dynamicweb.Ecommerce.Orders 1264 1265 @{ 1266 string voucherCode = GetString("Ecom:Order.Customer.VoucherCode"); 1267 string voucherCodeError = GetString("Ecom:Cart.ValidationError.EcomOrderVoucherCode.ErrorMessage"); 1268 string validState = string.Empty; 1269 bool vouchersAppliedAsDiscounts = false; 1270 1271 IEnumerable<string> voucherCodes = new List<string>(); 1272 Order order = new OrderService().GetById(GetString("Ecom:Order.ID")); 1273 1274 if (!string.IsNullOrWhiteSpace(voucherCode)) 1275 { 1276 if (order.VoucherUseType.HasFlag(VoucherUseCategoryType.Discount)) 1277 { 1278 voucherCodes = voucherCode.Split(new string[] { ",", ";", " " }, StringSplitOptions.RemoveEmptyEntries); 1279 vouchersAppliedAsDiscounts = true; 1280 } 1281 else 1282 { 1283 voucherCodes = new string[] { voucherCode.Trim() }; 1284 } 1285 } 1286 1287 var voucherErrors = new List<string>(); 1288 if(!vouchersAppliedAsDiscounts) 1289 { 1290 foreach (string code in voucherCodes) 1291 { 1292 Dynamicweb.Ecommerce.Orders.Vouchers.Voucher vouch = Dynamicweb.Ecommerce.Services.Vouchers.GetVoucherByCode(code); 1293 if (vouch == null) 1294 { 1295 validState = "is-invalid"; 1296 voucherErrors.Add(Translate("Voucher") + " <span class='fw-bold'>" + code + "</span> " + Translate("not found")); 1297 continue; 1298 } 1299 if (vouch.DateUsed.HasValue) 1300 { 1301 validState = "is-invalid"; 1302 voucherErrors.Add(Translate("Voucher") + " <span class='fw-bold'>" + code + "</span> " + Translate("already used")); 1303 continue; 1304 } 1305 } 1306 } 1307 1308 var voucherErrorMessage = string.Join(",", voucherErrors); 1309 1310 <div class="py-3 border-top" id="orderVoucherForm"> 1311 <form method="post" id="VoucherForm"> 1312 <div class="input-group input-primary-button-group has-validation"> 1313 <input type="text" class="form-control @(validState)" name="EcomOrderVoucherCodeField" placeholder="@Translate("Add voucher here")" id="EcomOrderVoucherCodeField" value="" aria-label="@Translate("Voucher input")" oninput="document.querySelector('#EcomOrderVoucherCode').value = this.value;" onkeyup="document.querySelector('#EcomOrderVoucherCode').value = this.value;"> 1314 <button class="btn btn-sm btn-primary d-inline-flex align-items-center justify-content-center" data-dw-button="primary" type="submit" id="EcomOrderVoucherApply" style="min-width: 100px;"> 1315 <span>@Translate("Apply")</span> 1316 </button> 1317 1318 <div class="invalid-feedback"> 1319 @voucherErrorMessage 1320 </div> 1321 </div> 1322 <input type="hidden" name="EcomOrderVoucherCode" id="EcomOrderVoucherCode" value="@voucherCode"> 1323 <label for="EcomOrderVoucherCodeField" class="visually-hidden">@Translate("Add voucher here")</label> 1324 </form> 1325 1326 @if (!string.IsNullOrWhiteSpace(voucherCode)) 1327 { 1328 <div class="d-flex flex-wrap gap-2 pt-3"> 1329 1330 @foreach (string code in voucherCodes) 1331 { 1332 <form method="post"> 1333 <input type="hidden" name="EcomOrderVoucherCode" value="@voucherCode.Replace(code+",", "").Replace(","+code, "").Replace(code, "")"> 1334 <span class="badge fw-normal d-inline-flex align-items-center justify-content-center opacity-50 opacity-100-hover" style="background-color:var(--dw-color-foreground);color:var(--dw-color-background);"> 1335 <button type="submit" class="text-reset bg-transparent border-0 p-0" aria-label="@Translate("Remove voucher")" id="RemoveVoucherButton"> 1336 <span class="icon-2"> 1337 @ReadFile("/Files/Images/Icons/xmark.svg") 1338 </span> 1339 <span class="mx-2">@code</span> 1340 </span> 1341 </form> 1342 } 1343 </div> 1344 } 1345 @voucherCodeError 1346 </div> 1347 } 1348 1349 </text> 1350 } 1351 1352 <div class="fs-8 border-top pt-2 pt-lg-3"> 1353 @* Subtotal *@ 1354 <div class="d-flex justify-content-between fw-bold"> 1355 <span>@Translate("Subtotal")</span> 1356 <span class="text-end"> 1357 <span class="d-block"> 1358 @if (GetDouble("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Value") != 1359 totalPriceWithoutOrderDiscountsFeesAndTaxesValue) 1360 { 1361 <span 1362 class="text-price fw-normal text-decoration-line-through">@GetString("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.PriceFormatted")</span> 1363 } 1364 <span class="text-price">@totalPriceWithoutOrderDiscountsFeesAndTaxes</span> 1365 </span> 1366 1367 @if (renderVatMessage && !showPricesWithVat) 1368 { 1369 <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span> 1370 } 1371 else if (renderVatMessage) 1372 { 1373 <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span> 1374 } 1375 </span> 1376 </div> 1377 1378 @* Discounts (only order discounts) *@ 1379 @foreach (LoopItem orderline in GetLoop("OrderLines")) 1380 { 1381 bool isDiscount = orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount"); 1382 bool isProductIdOrNumber = !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductID")) || 1383 !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductNumber")); //Live Cart orderlines may not 1384 bool isOrderAmountDiscount = orderline.GetInteger("Ecom:Order:OrderLine.Type") == 1 && !isProductIdOrNumber; 1385 if (isDiscount && isOrderAmountDiscount) 1386 { 1387 <div class="d-flex justify-content-between"> 1388 <span>@orderline.GetString("Ecom:Order:OrderLine.ProductName")</span><span 1389 class="text-price">@orderline.GetString("Ecom:Order:OrderLine.TotalPriceWithProductDiscounts.PriceFormatted")</span> 1390 </div> 1391 } 1392 } 1393 1394 @* Delivery *@ 1395 @if (!string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID"))) 1396 { 1397 if (GetDouble("Ecom:Order.ShippingFee.Price.Value") != 0.0) 1398 { 1399 <div class="d-flex justify-content-between"> 1400 <span>@Translate("Delivery")</span> 1401 <span>@GetString("Ecom:Order.ShippingFee.PriceFormatted")</span> 1402 </div> 1403 } 1404 } 1405 else 1406 { 1407 <div class="d-flex justify-content-between"> 1408 <span>@Translate("Delivery")</span> 1409 <span>@Translate("Calculated in next step")</span> 1410 </div> 1411 } 1412 1413 @* Payment *@ 1414 @if (!string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethodID"))) 1415 { 1416 if (GetDouble("Ecom:Order.PaymentFee.Price.Value") != 0) 1417 { 1418 <div class="d-flex justify-content-between"> 1419 <span>@Translate("Payment")</span> 1420 <span class="text-price">@GetString("Ecom:Order.PaymentFee.PriceFormatted")</span> 1421 </div> 1422 } 1423 } 1424 else 1425 { 1426 <div class="d-flex justify-content-between"> 1427 <span>@Translate("Payment")</span> 1428 <span>@Translate("Calculated in next step")</span> 1429 </div> 1430 } 1431 1432 @* Taxes *@ 1433 @if (GetDouble("Ecom:Order.Taxes.Total.Price.Value") != 0) 1434 { 1435 <div class="d-flex justify-content-between mb-2"> 1436 <span>@Translate("Sales tax")</span> 1437 <span>@GetString("Ecom:Order.Taxes.Total.PriceFormatted")</span> 1438 </div> 1439 } 1440 </div> 1441 <div class="fs-8 border-top pt-2 pt-lg-3"> 1442 <div class="d-flex justify-content-between fs-6 fw-bold"> 1443 <span>@Translate("Total")</span> 1444 @if (renderVatMessage && !showPricesWithVat) 1445 { 1446 <span class="text-price text-end"> 1447 <span class="fs-5 d-block">@GetString("Ecom:Order.Price.PriceFormatted")</span> 1448 <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span> 1449 </span> 1450 } 1451 else if (renderVatMessage) 1452 { 1453 <span class="text-price text-end"> 1454 <span class="fs-5 d-block">@GetString("Ecom:Order.Price.PriceFormatted")</span> 1455 <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span> 1456 </span> 1457 } 1458 else 1459 { 1460 <span class="text-price fs-5">@GetString("Ecom:Order.Price.PriceFormatted")</span> 1461 } 1462 </div> 1463 1464 @if (renderVatMessage) 1465 { 1466 <div class="d-flex justify-content-between"><span>@Translate("VAT")</span><span 1467 class="text-price">@GetString("Ecom:Order.Price.VATFormatted")</span></div> 1468 if (!showPricesWithVat) 1469 { 1470 <div class="d-flex justify-content-between"><span>@Translate("Total incl. VAT")</span><span 1471 class="text-price">@GetString("Ecom:Order.OrderLines.Total.PriceWithVAT")</span></div> 1472 } 1473 } 1474 1475 @if (GetDouble("Ecom:Order.TotalDiscount.Price.Value") != 0) 1476 { 1477 <div class="d-flex justify-content-between"><span>@Translate("Discount")</span><span 1478 class="text-price">@GetString("Ecom:Order.TotalDiscount.PriceFormatted")</span></div> 1479 } 1480 </div> 1481 </div> 1482 } 1483 1484 </div> 1485 1486 </div> 1487 1488 1489 </div> 1490 1491 <script> 1492 function submitForm() { 1493 document.querySelector("#CurrentStep").name = "@GetString("CartV2.CurrentStepButtonName")"; 1494 swift.PageUpdater.Update(document.querySelector("#ordersubmit")); 1495 } 1496 </script> 1497