Error executing template "Designs/Swift/eCom7/CartV2/Step/Custom_InformationAnonymous_v2.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_ceccd81a1e934afcb4b39784d0e76df6.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)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using Dynamicweb 3 4 @{ 5 var themeRaw = Pageview.CurrentParagraph.Item["Theme"]?.ToString(); 6 string theme = !string.IsNullOrEmpty(themeRaw) ? " theme " + themeRaw.Replace(" ", "").Trim().ToLower() : ""; 7 } 8 9 <div class="grid gap-0 h-100"> 10 <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@(theme)"> 11 <form name="ordersubmit" id="ordersubmit" method="post" autocomplete="off" style="max-width: 65rem; margin-left: auto;"> 12 13 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 14 @using Dynamicweb 15 @using System.IO 16 17 @{ 18 string logoLink = Pageview.CurrentParagraph?.Item["LogoLink"] != null ? Pageview.CurrentParagraph.Item["LogoLink"].ToString() : string.Empty; 19 20 string logoImage = Pageview.CurrentParagraph?.Item["Logo"] != null ? Pageview.CurrentParagraph.Item["Logo"].ToString() : string.Empty; 21 string title = Pageview.CurrentParagraph?.Item["Title"] != null ? Pageview.CurrentParagraph.Item["Title"].ToString() : Pageview.Area.Name; 22 23 string maxWidth = Pageview.CurrentParagraph?.Item["MaxWidth"] != null ? "max-width: " + Pageview.CurrentParagraph.Item["MaxWidth"].ToString() + "px" : string.Empty; 24 maxWidth = maxWidth == "max-width: 0px" ? string.Empty : maxWidth; 25 } 26 27 <div class="mb-4 text-center"> 28 @if (!string.IsNullOrWhiteSpace(logoLink)) 29 { 30 @:<a href="@logoLink" class="text-decoration-none" title="@Translate("Leave checkout")"> 31 } 32 33 @if (logoImage != "") 34 { 35 if (Path.GetExtension(logoImage).ToLower() == ".svg") 36 { 37 <div class="icon-auto" style="@maxWidth"> 38 @ReadFile(logoImage) 39 </div> 40 } 41 else 42 { 43 string imageWidth = Pageview.CurrentParagraph.Item["MaxWidth"] != null ? Pageview.CurrentParagraph.Item["MaxWidth"].ToString() : "400"; 44 string imagePath = "/Admin/Public/GetImage.ashx?width=" + imageWidth + "&image=" + logoImage; 45 46 <picture class="mx-auto d-block"> 47 <img src="@logoImage" alt="@title" style="@maxWidth"> 48 </picture> 49 } 50 } 51 else 52 { 53 54 } 55 56 @if (!string.IsNullOrWhiteSpace(logoLink)) 57 { 58 @:</a> 59 } 60 </div> 61 62 63 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 64 @using Dynamicweb.Ecommerce.Cart 65 66 <nav aria-label="breadcrumb" class="mb-3 mb-md-4 fs-8" id="StepsBreadcrumbs"> 67 <ol class="breadcrumb"> 68 @foreach (LoopItem step in GetLoop("StepButtons")) 69 { 70 if (step.GetString("Step.Name").ToLower() != "checkout") 71 { 72 if (step.GetBoolean("Step.Current")) 73 { 74 <li class="breadcrumb-item fw-bold" aria-current="location">@step.Index @Translate(step.GetString("Step.Name"))</li> 75 } 76 else 77 { 78 <li class="breadcrumb-item">@step.Index @Translate(step.GetString("Step.Name"))</li> 79 } 80 } 81 } 82 83 @if (GetLoop("StepButtons").Count == 0) 84 { 85 var cartSettings = new ModuleSettings(Pageview.CurrentParagraph.ModuleProperties); 86 87 foreach (CartStepInfo step in cartSettings.Steps) 88 { 89 if (step.IsCheckout) 90 { 91 <li class="breadcrumb-item fw-bold" aria-current="location">@Translate(step.Name)</li> 92 break; 93 } 94 else 95 { 96 <li class="breadcrumb-item">@Translate(step.Name)</li> 97 } 98 } 99 } 100 </ol> 101 </nav> 102103104 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 105 @using Dynamicweb.Ecommerce.Orders 106107 @if (GetLoop("ValidationErrors").Count() != 0) 108 { 109 <div class="alert alert-warning" role="alert"> 110 <ul class="m-0 list-unstyled"> 111 @foreach (LoopItem item in GetLoop("ValidationErrors")) 112 { 113 <li>@item.GetValue("Ecom:Cart.ValidationError.ErrorMessage")</li> 114 } 115 </ul> 116 </div> 117 } 118119120 @* Logic to remove the voucher code error, when going to next step in checkout *@ 121 @{ 122 string voucherCodeForErrorCheck = GetString("Ecom:Order.Customer.VoucherCode"); 123 Order orderForErrorCheck = new OrderService().GetById(GetString("Ecom:Order.ID")); 124 voucherCodeForErrorCheck = orderForErrorCheck.VoucherUseType == VoucherUseCategoryType.None ? string.Empty : voucherCodeForErrorCheck; 125 } 126127 <input type="hidden" name="EcomOrderVoucherCode" value="@voucherCodeForErrorCheck"> 128129130 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 131132 @{ 133 bool summaryIsPaymentStep = GetLoop("StepButtons").Count == 0; 134 int summaryCurrentStep = !summaryIsPaymentStep ? 1 : 4; 135 int summaryCurrentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); 136137 bool userHasDefaultAddress = false; 138 bool userAddressSelected = false; 139140 string userSelectedAddressID = GetString("UserManagement:User.UserAddress.SelectedAddressID"); 141142 foreach (LoopItem userAddress in GetLoop("UserManagement:User.UserAddresses")) 143 { 144 if (userAddress.GetBoolean("UserManagement:User.UserAddress.Default")) 145 { 146 userHasDefaultAddress = true; 147 } 148 if (userAddress.GetBoolean("UserManagement:User.UserAddress.SelectedForDeliveryFields")) 149 { 150 userAddressSelected = true; 151 } 152 if (!string.IsNullOrEmpty(userAddress.GetString("UserManagement:User.UserAddress.SelectedAddressID"))) 153 { 154 userSelectedAddressID = userAddress.GetString("UserManagement:User.UserAddress.SelectedAddressID"); 155 } 156 } 157158 foreach (LoopItem step in GetLoop("StepButtons")) 159 { 160 if (step.GetBoolean("Step.Current")) 161 { 162 summaryCurrentStep = step.GetInteger("Step.Number"); 163 } 164 } 165 } 166167 @if (!string.IsNullOrEmpty(GetString("UserManagement:User.Address")) || 168 !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID")) || 169 !string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethodID")) || 170 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name")) || 171 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company")) || 172 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address")) || 173 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2")) || 174 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip")) || 175 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City")) || 176 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Email")) || 177 !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Phone")) || 178 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Name")) || 179 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Company")) || 180 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address")) || 181 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address2")) || 182 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Zip")) || 183 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.City")) || 184 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || 185 !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone")) || 186 !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethod")) || 187 !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingDate")) || 188 !string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethod"))) 189 { 190 if (summaryCurrentStep != 1) 191 { 192 <div class="list-group"> 193194 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 195196 @{ 197 var hideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 198 int currentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); 199200 List<string> contact = new List<string>(); 201 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 202 { 203 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email"))) 204 { 205 contact.Add(GetString("Ecom:Order.Customer.Email")); 206 } 207 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone"))) 208 { 209 contact.Add(GetString("Ecom:Order.Customer.Phone")); 210 } 211 } 212213 string contactString = (string.Join(",", contact.Select(x => x.ToString()).ToArray())).Replace(",", ", "); 214 string userAccountPage = Pageview.CurrentParagraph.Item["UserAccountPageLink"] != null ? Pageview.CurrentParagraph.Item["UserAccountPageLink"].ToString() + "&GoBackToPage=" + Pageview.Page.ID : ""; 215216 if (!string.IsNullOrEmpty(contactString)) 217 { 218 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)" id="ContactGroup"> 219 <dl class="grid gap-1 gap-sm-3 mb-0"> 220 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Contact")</dt> 221 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@contactString</dd> 222223 @if (!hideEditBillingAddress) 224 { 225 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 226 <button type="submit" class="btn btn-small btn-link fs-8 p-0 checkout-back-button" name="CartV2.GotoStep0" id="EditBillingAddressButton"> 227 <span class="text-uppercase">@Translate("Edit")</span> 228 </button> 229 </dd> 230 } 231 </dl> 232 </div> 233 } 234 } 235236 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 237238239 @{ 240 var billingHideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; 241242 int billingFieldCount = 0; //Helps us render addresses that contains more than just the auto set country 243 List<string> address = new List<string>(); 244 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Company"))) 245 { 246 address.Add(GetString("Ecom:Order.Customer.Company")); 247 billingFieldCount++; 248 } 249 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Name"))) 250 { 251 address.Add(GetString("Ecom:Order.Customer.Name")); 252 billingFieldCount++; 253 } 254 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address"))) 255 { 256 address.Add(GetString("Ecom:Order.Customer.Address")); 257 billingFieldCount++; 258 } 259 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address2"))) 260 { 261 address.Add(GetString("Ecom:Order.Customer.Address2")); 262 billingFieldCount++; 263 } 264 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Zip"))) 265 { 266 address.Add(GetString("Ecom:Order.Customer.Zip")); 267 billingFieldCount++; 268 } 269 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.City"))) 270 { 271 address.Add(GetString("Ecom:Order.Customer.City")); 272 billingFieldCount++; 273 } 274 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Region"))) 275 { 276 string regionName = GetString("Ecom:Order.Customer.Region"); 277 foreach (LoopItem region in GetLoop("CustomerRegions")) 278 { 279 if (region.GetString("Ecom:CustomerRegion.IsCustomerRegion") == "true") 280 { 281 regionName = region.GetString("Ecom:CustomerRegion.Name"); 282 } 283 } 284285 address.Add(regionName); 286 billingFieldCount++; 287 } 288 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Country"))) 289 { 290 address.Add(GetString("Ecom:Order.Customer.Country")); 291 billingFieldCount++; 292 } 293 string billingAddressString = (string.Join(",", address.Select(x => x.ToString()).ToArray())).Trim(',').Replace(",", ", "); 294295 if (!string.IsNullOrEmpty(billingAddressString) && billingFieldCount > 1) 296 { 297 <div class="list-group-item py-2 fs-7" style="background-color:rgba(var(--swift-foreground-color-rgb), 0.05)"> 298 <dl class="grid gap-1 gap-sm-3 mb-0"> 299 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Billing")</dt> 300 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@billingAddressString</dd> 301302 @if (!billingHideEditBillingAddress) 303 { 304 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 305 <button class="btn btn-small btn-link fs-8 p-0 checkout-back-button" type="submit" name="CartV2.GotoStep0" id="EditCustomerAddressButton"> 306 <span class="text-uppercase">@Translate("Edit")</span> 307 </button> 308 </dd> 309 } 310 </dl> 311 </div> 312 } 313 } 314315316 @if (summaryCurrentStep > 2) 317 { 318 <text> 319 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 320 @{ 321 string shippingMethod = GetString("Ecom:Order.ShippingMethod"); 322 string shippingMethodID = GetString("Ecom:Order.ShippingMethodID"); 323324 if (!string.IsNullOrEmpty(shippingMethod)) 325 { 326327 List<string> shippingDetails = new List<string>(); 328329 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company"))) 330 { 331 shippingDetails.Add(GetString("Ecom:Order.Delivery.Company")); 332 } 333 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name"))) 334 { 335 if (GetString("Ecom:Order.Delivery.Company") != GetString("Ecom:Order.Delivery.Name")) 336 { 337 shippingDetails.Add(GetString("Ecom:Order.Delivery.Name")); 338 } 339 } 340 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address"))) 341 { 342 shippingDetails.Add(GetString("Ecom:Order.Delivery.Address")); 343 } 344 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2"))) 345 { 346 shippingDetails.Add(GetString("Ecom:Order.Delivery.Address2")); 347 } 348 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip"))) 349 { 350 shippingDetails.Add(GetString("Ecom:Order.Delivery.Zip")); 351 } 352 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City"))) 353 { 354 shippingDetails.Add(GetString("Ecom:Order.Delivery.City")); 355 } 356 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Region"))) 357 { 358 string regionName = GetString("Ecom:Order.Delivery.Region"); 359 foreach (LoopItem region in GetLoop("DeliveryRegions")) 360 { 361 if (region.GetString("Ecom:DeliveryRegion.IsDeliveryRegion") == "true") 362 { 363 regionName = region.GetString("Ecom:DeliveryRegion.Name"); 364 } 365 } 366 shippingDetails.Add(regionName); 367 } 368 if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Country"))) 369 { 370 shippingDetails.Add(GetString("Ecom:Order.Delivery.Country")); 371 } 372 if (GetBoolean("Ecom:Order.Delivery.isPickupPoint")) 373 { 374 shippingDetails.Clear(); 375 var order = Dynamicweb.Ecommerce.Services.Orders.GetById(GetString("Ecom:Order.ID")); 376 if (order.ShippingProviderValues.ContainsKey("ShipmondoServicePointId")) 377 { 378 //Shipmondo provider 379 if (order.ShippingProviderValues.TryGetValue("ServiceSelectedDataCarrierName", out object CarrierName)) 380 { 381 shippingDetails.Add((string)CarrierName); 382 } 383 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataCompanyName", out object CompanyName)) 384 { 385 shippingDetails.Add((string)CompanyName); 386 } 387 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataAddress", out object Address)) 388 { 389 shippingDetails.Add((string)Address); 390 } 391 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataAddress2", out object Address2) && !string.IsNullOrEmpty((string)Address2)) 392 { 393 shippingDetails.Add((string)Address2); 394 } 395 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataZipcode", out object Zipcode)) 396 { 397 shippingDetails.Add((string)Zipcode); 398 } 399 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataCity", out object City)) 400 { 401 shippingDetails.Add((string)City); 402 } 403 if (order.ShippingProviderValues.TryGetValue("ServicePointSelectedDataCountry", out object Country)) 404 { 405 shippingDetails.Add((string)Country); 406 } 407 if (order.ShippingProviderValues.Any()) 408 { 409 var deliveryName = 410 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Delivery.Name")) ? GetString("Ecom:Order.Delivery.Name") : 411 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Customer.Name")) ? GetString("Ecom:Order.Customer.Name") : 412 !string.IsNullOrWhiteSpace(GetString("UserManagement:User.Name")) ? GetString("UserManagement:User.Name") : string.Empty; 413414 <div id="hiddenParcelshopFields" class="list-group-item visually-hidden"> 415 <input type="hidden" name="EcomOrderDeliveryCompany" value="@($"{(string)CompanyName} ({(string)CarrierName})")" disabled> 416 <input type="hidden" name="EcomOrderDeliveryName" value="@(deliveryName)" disabled> 417 <input type="hidden" name="EcomOrderDeliveryAddress" value="@((string)Address)" disabled> 418 <input type="hidden" name="EcomOrderDeliveryAddress2" value="@((string)Address2)" disabled> 419 <input type="hidden" name="EcomOrderDeliveryZip" value="@((string)Zipcode)" disabled> 420 <input type="hidden" name="EcomOrderDeliveryCity" value="@((string)City)" disabled> 421 <input type="hidden" name="EcomOrderDeliveryCountry" value="@((string)Country)" disabled> 422 </div> 423 } 424 } 425426 if (order.ShippingProviderValues.ContainsKey("ParcelShopNumber")) 427 { 428 //GLS Provider 429 if (order.ShippingProviderValues.TryGetValue("parcelShop", out object parcelShop)) 430 { 431 if (parcelShop is System.Collections.Generic.Dictionary<System.String, System.Object>) 432 { 433 var selectedShop = (System.Collections.Generic.Dictionary<System.String, System.Object>)parcelShop; 434435 if (selectedShop.TryGetValue("CompanyName", out object CompanyName)) 436 { 437 shippingDetails.Add((string)CompanyName); 438 } 439 if (selectedShop.TryGetValue("Streetname", out object Streetname)) 440 { 441 shippingDetails.Add((string)Streetname); 442 } 443 if (selectedShop.TryGetValue("Streetname2", out object Streetname2) && !string.IsNullOrEmpty((string)Streetname2)) 444 { 445 shippingDetails.Add((string)Streetname2); 446 } 447 if (selectedShop.TryGetValue("ZipCode", out object ZipCode)) 448 { 449 shippingDetails.Add((string)ZipCode); 450 } 451 if (selectedShop.TryGetValue("CityName", out object CityName)) 452 { 453 shippingDetails.Add((string)CityName); 454 } 455 if (selectedShop.TryGetValue("CountryCodeISO3166A2", out object Country)) 456 { 457 shippingDetails.Add((string)Country); 458 } 459 if (order.ShippingProviderValues.Any()) 460 { 461 var deliveryName = 462 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Delivery.Name")) ? GetString("Ecom:Order.Delivery.Name") : 463 !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Customer.Name")) ? GetString("Ecom:Order.Customer.Name") : 464 !string.IsNullOrWhiteSpace(GetString("UserManagement:User.Name")) ? GetString("UserManagement:User.Name") : string.Empty; 465466 <div id="hiddenParcelshopFields" class="list-group-item visually-hidden"> 467 <input type="hidden" name="EcomOrderDeliveryCompany" value="@($"{(string)CompanyName}")" disabled> 468 <input type="hidden" name="EcomOrderDeliveryName" value="@(deliveryName)" disabled> 469 <input type="hidden" name="EcomOrderDeliveryAddress" value="@((string)Streetname)" disabled> 470 <input type="hidden" name="EcomOrderDeliveryAddress2" value="@((string)Streetname2)" disabled> 471 <input type="hidden" name="EcomOrderDeliveryZip" value="@((string)ZipCode)" disabled> 472 <input type="hidden" name="EcomOrderDeliveryCity" value="@((string)CityName)" disabled> 473 <input type="hidden" name="EcomOrderDeliveryCountry" value="@((string)Country)" disabled> 474 </div> 475 } 476 } 477 } 478 } 479 } 480481 string shippingDetailsString = (string.Join(", ", shippingDetails.Select(x => x).ToArray())); 482483 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)" id="DeliveryGroup"> 484 <dl class="grid gap-1 gap-sm-3 mb-0"> 485 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery method")</dt> 486 <dd class="d-flex flex-column g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0"> 487 @if (!string.IsNullOrEmpty(shippingDetailsString)) 488 { 489 <span>@shippingMethod</span> 490 <span>@shippingDetailsString</span> 491492 @if (shippingMethodID == "SHIP3") 493 { 494 if (Translate($"ShippingMethod_{shippingMethod}_Description") != $"ShippingMethod_{shippingMethod}_Description") 495 { 496 <span class="opacity-75 fs-8 mt-2">@Translate($"ShippingMethod_{shippingMethod}_Description")</span> 497 } 498 } 499 } 500 else 501 { 502 <span>@shippingMethod</span> 503 @if (shippingMethodID == "SHIP3") 504 { 505 if (Translate($"ShippingMethod_{shippingMethod}_Description") != $"ShippingMethod_{shippingMethod}_Description") 506 { 507 <span class="opacity-75 fs-8 mt-2">@Translate($"ShippingMethod_{shippingMethod}_Description")</span> 508 } 509 } 510 else 511 { 512 <span>@Translate("Ships to billing address")</span> 513 } 514 } 515 </dd> 516 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 517 <button class="btn btn-small btn-link fs-8 p-0 checkout-back-button" type="submit" name="CartV2.GotoStep1" id="EditDeliveryButton"> 518 <span class="text-uppercase">@Translate("Edit")</span> 519 </button> 520 </dd> 521 </dl> 522 </div> 523 } 524 } 525526 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 527528 @{ 529 string shippingDate = GetString("Ecom:Order.ShippingDate"), 530 shippingDateFormatted = GetDate("Ecom:Order.ShippingDate").ToShortDateString(); 531 } 532533 @if (!string.IsNullOrEmpty(shippingDate)) 534 { 535 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 536 <dl class="grid gap-1 gap-sm-3 mb-0"> 537 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery date")</dt> 538 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@shippingDateFormatted</dd> 539 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 540 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep1" id="EditDeliveryDateButton"> 541 <span class="text-uppercase">@Translate("Edit")</span> 542 </button> 543 </dd> 544 </dl> 545 </div> 546 } 547548549 </text> 550 } 551 @if (summaryCurrentStep > 3) 552 { 553 <text> 554 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 555556 @{ 557 string PaymentMethodID = GetString("Ecom:Order.ShippingMethodID"); 558 string paymentMethod = GetString("Ecom:Order.PaymentMethod"); 559 } 560561 @if(!string.IsNullOrEmpty(PaymentMethodID)) 562 { 563 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 564 <dl class="grid gap-1 gap-sm-3 mb-0"> 565 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Payment")</dt> 566 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@paymentMethod</dd> 567 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 568 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep2" id="EditPaymentButton"> 569 <span class="text-uppercase">@Translate("Edit")</span> 570 </button> 571 </dd> 572 </dl> 573 </div> 574 } 575576 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 577578 @{ 579 string stepSummaryOrderReference = !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Reference")) ? GetString("Ecom:Order.Reference") : ""; 580581 if (!string.IsNullOrEmpty(stepSummaryOrderReference)) 582 { 583 <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> 584 <dl class="grid gap-1 gap-sm-3 mb-0"> 585 <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Order reference")</dt> 586 <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@stepSummaryOrderReference</dd> 587 <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> 588 <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="CartV2.GotoStep2" id="EditorderReferenceButton"> 589 <span class="text-uppercase">@Translate("Edit")</span> 590 </button> 591 </dd> 592 </dl> 593 </div> 594 } 595 } 596597 </text> 598 } 599 </div> 600 } 601 } 602603604 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 605606 @{ 607 string apiKey = !string.IsNullOrEmpty(Pageview.AreaSettings.GetString("Google_APIKey")) ? Pageview.AreaSettings.GetString("Google_APIKey") : ""; 608609 string userCheckoutPage = Pageview.CurrentParagraph.Item["CheckoutUserPageLink"] != null ? Pageview.CurrentParagraph.Item["CheckoutUserPageLink"].ToString().Replace("Default.aspx?Id=", "") : ""; 610 string signInPage = Pageview.CurrentParagraph.Item["SignInPageLink"] != null ? Pageview.CurrentParagraph.Item["SignInPageLink"].ToString() + "&GoBackToPage=" + userCheckoutPage : ""; 611 bool enableAdditionalAddress = Pageview.CurrentParagraph.Item["EnableAdditionalAddress"] != null ? (Boolean)Pageview.CurrentParagraph.Item["EnableAdditionalAddress"] : false; 612 bool enableFindLocation = Pageview.CurrentParagraph.Item["EnableFindLocation"] != null ? (Boolean)Pageview.CurrentParagraph.Item["EnableFindLocation"] : false; 613614 string currentCountry = Pageview.Area?.EcomCountryCode != null ? Pageview.Area.EcomCountryCode : "dk"; 615 foreach (LoopItem country in GetLoop("Countries")) 616 { 617 if (country.GetString("Ecom:Country.IsCustomerCountryOrDefault") == "true") 618 { 619 currentCountry = country.GetString("Ecom:Country.Code2"); 620 } 621 } 622623 string countrySelectorColumnSize = "g-col-6"; 624 string customerRegionLabel = "State"; 625626 <input type="hidden" name="EcomUserCreateNew" id="EcomUserCreateNew" value="true" disabled> 627628 <div class="mb-0"> 629630 <div class="d-flex"> 631 <div class="flex-grow-1"> 632 <h3 class="fs-6 fw-normal mb-3">@Translate("Contact information")</h3> 633 </div> 634 @if (Pageview.CurrentParagraph.Item["SignInPageLink"].ToString() != string.Empty) 635 { 636 <div class="text-end d-none d-md-block"> 637 <a href="@signInPage" class="h6 fw-normal mb-3 d-block">@Translate("Already have account?") @Translate("Log in")</a> 638 </div> 639 } 640641 </div> 642643 </div> 644645 <div class="mb-4"> 646 <div class="grid"> 647 <div class="g-col-12"> 648 <div class="form-floating"> 649 <input type="email" class="form-control" name="EcomOrderCustomerEmail" id="EcomOrderCustomerEmail" value="@GetString("Ecom:Order.Customer.Email")" placeholder="@Translate("Email Address") *" required> 650 <label for="EcomOrderCustomerEmail">@Translate("Email Address") *</label> 651 </div> 652 </div> 653 @if (Pageview.CurrentParagraph.Item["SignInPageLink"].ToString() != string.Empty) 654 { 655 <div class="g-col-12 d-md-none"> 656 <a href="@signInPage">@Translate("Already have account?") @Translate("Log in")</a> 657 </div> 658 } 659 @* Use newsletter *@ 660 @if (GetString("Ecom:Cart.UseNewsletterSubscription") == "True") 661 { 662 bool? isChecked = null; 663 if (GetString("Ecom:Order.Customer.NewsletterSubscribe") == "true") 664 { 665 isChecked = true; 666 } 667668 <div class="g-col-12"> 669 <div class="form-check"> 670 <input class="form-check-input" type="checkbox" name="EcomOrderSubscribeToNewsletter" id="EcomOrderSubscribeToNewsletter" checked="@isChecked" onchange="toggleCreateUser(event);"> 671 <label class="form-check-label lh-1" for="EcomOrderSubscribeToNewsletter"> 672 <span>@Translate("Keep me updated with deals, news and offers")</span> 673 </label> 674 </div> 675 </div> 676 } 677 </div> 678 </div> 679680 <div class="mt-4"> 681682 <h3 class="fs-6 fw-normal mb-3">@Translate("Billing information")</h3> 683684 <div class="grid gap-3"> 685 <div class="g-col-12"> 686 <div class="form-floating"> 687 <input type="text" class="form-control" name="EcomOrderCustomerCompany" id="EcomOrderCustomerCompany" value="@GetString("Ecom:Order.Customer.Company")" placeholder="@Translate("Company") *" required> 688 <label for="EcomOrderCustomerCompany">@Translate("Company") *</label> 689 </div> 690 </div> 691692 <div class="g-col-12"> 693 <div class="form-floating"> 694 <input type="text" class="form-control" name="EcomOrderCustomerVatRegNumber" id="EcomOrderCustomerVatRegNumber" value="@GetString("Ecom:Order.Customer.VatRegNumber")" placeholder="@Translate("VatRegNumber") *" required> 695 <label for="EcomOrderCustomerVatRegNumber">@Translate("VatRegNumber") *</label> 696 </div> 697 </div> 698699 <div class="g-col-12"> 700 <div class="form-floating"> 701 <input type="text" class="form-control" name="EcomOrderCustomerEAN" id="EcomOrderCustomerEAN" pattern="\d{13}" value="@GetString("Ecom:Order.Customer.EAN")" placeholder="@Translate("EAN")"> 702 <label for="EcomOrderCustomerEAN">@Translate("EAN")</label> 703 </div> 704 </div> 705706 <div class="g-col-12"> 707 <div class="form-floating"> 708 <input type="text" class="form-control" name="EcomOrderReference" id="EcomOrderReference" value="@GetString("Ecom:Order.Reference")" placeholder="@Translate("Order reference")"> 709 <label for="EcomOrderReference">@Translate("Order reference")</label> 710 </div> 711 </div> 712713 <div class="g-col-12"> 714 <div class="form-floating"> 715 <input type="text" class="form-control" name="EcomOrderCustomerName" id="EcomOrderCustomerName" value="@GetString("Ecom:Order.Customer.Name")" placeholder="@Translate("Name") *" required> 716 <label for="EcomOrderCustomerName">@Translate("Name") *</label> 717 </div> 718 </div> 719720 <div class="g-col-12"> 721 <div class="form-floating"> 722 <input type="text" class="form-control" name="EcomOrderCustomerAddress" id="EcomOrderCustomerAddress" value="@GetString("Ecom:Order.Customer.Address")" placeholder="@Translate("Street & Number") *" required> 723 <label for="EcomOrderCustomerAddress">@Translate("Street & Number") *</label> 724 </div> 725 </div> 726727 @if (enableAdditionalAddress) 728 { 729 <div class="g-col-12"> 730 <div class="form-floating"> 731 <input type="text" class="form-control" name="EcomOrderCustomerAddress2" id="EcomOrderCustomerAddress2" value="@GetString("Ecom:Order.Customer.Address2")" placeholder="@Translate("Additional address") *"> 732 <label for="EcomOrderCustomerAddress">@Translate("Additional address") *</label> 733 </div> 734 </div> 735 } 736737 <div class="g-col-12"> 738 <div class="grid"> 739740 <div class="g-col-6 g-col-md-3"> 741 <div class="form-floating"> 742 <input type="text" class="form-control" name="EcomOrderCustomerZip" id="EcomOrderCustomerZip" value="@GetString("Ecom:Order.Customer.Zip")" placeholder="@Translate("Zip code") *" required> 743 <label for="EcomOrderCustomerZip">@Translate("Zip code") *</label> 744 </div> 745 </div> 746747 @if (GetLoop("CustomerRegions").Count > 0) 748 { 749 countrySelectorColumnSize = "g-col-3"; 750 } 751752 <div class="@countrySelectorColumnSize"> 753 <div class="form-floating"> 754 <input type="text" class="form-control" name="EcomOrderCustomerCity" id="EcomOrderCustomerCity" value="@GetString("Ecom:Order.Customer.City")" placeholder="@Translate("Town / City") *" required> 755 <label for="EcomOrderCustomerCity">@Translate("Town / City") *</label> 756 </div> 757 </div> 758759 @if (GetLoop("CustomerRegions").Count > 0) 760 { 761 if (currentCountry == "CA") 762 { 763 customerRegionLabel = Translate("Province"); 764 } 765 else if (currentCountry == "GB") 766 { 767 customerRegionLabel = Translate("Region"); 768 } 769 else if (currentCountry == "US") 770 { 771 customerRegionLabel = Translate("State"); 772 } 773774 <div class="g-col-3"> 775 <div class="form-floating"> 776 <select class="form-select" name="EcomOrderCustomerRegion" id="EcomOrderCustomerRegion" onchange="submitForm()"> 777 @foreach (LoopItem region in GetLoop("CustomerRegions")) 778 { 779 if (region.GetString("Ecom:CustomerRegion.IsCustomerRegion") == "true") 780 { 781 <option value="@region.GetString("Ecom:CustomerRegion.RegionCode")" selected>@region.GetString("Ecom:CustomerRegion.Name")</option> 782 } 783 else 784 { 785 <option value="@region.GetString("Ecom:CustomerRegion.RegionCode")">@region.GetString("Ecom:CustomerRegion.Name")</option> 786 } 787 } 788 </select> 789 <label for="EcomOrderCustomerRegion">@customerRegionLabel</label> 790 </div> 791 </div> 792 } 793794 <div class="g-col-12 g-col-md-3"> 795 <div class="form-floating"> 796797 <select class="form-select" name="EcomOrderCustomerCountry" id="EcomOrderCustomerCountry" onchange="submitForm()" required> 798 @foreach (LoopItem country in GetLoop("Countries")) 799 { 800 if (country.GetString("Ecom:Country.IsCustomerCountryOrDefault") == "true") 801 { 802 <option value="@country.GetString("Ecom:Country.Code2")" selected>@country.GetString("Ecom:Country.Name")</option> 803 } 804 else 805 { 806 <option value="@country.GetString("Ecom:Country.Code2")">@country.GetString("Ecom:Country.Name")</option> 807 } 808 } 809 </select> 810 <label for="EcomOrderCustomerCountry">@Translate("Country") *</label> 811 </div> 812 </div> 813814 </div> 815 </div> 816817 <div class="g-col-12"> 818 <div class="form-floating"> 819 <input type="tel" class="form-control" name="EcomOrderCustomerPhone" id="EcomOrderCustomerPhone" value="@GetString("Ecom:Order.Customer.Phone")" placeholder="@Translate("Phone number") *" required> 820 <label for="EcomOrderCustomerPhone">@Translate("Phone number") *</label> 821 </div> 822 </div> 823824 @* Create user *@ 825 @if (GetBoolean("Ecom:Cart.CreateUserInCheckout")) 826 { 827 <div class="g-col-12"> 828 <div class="form-check"> 829 <input class="form-check-input" type="checkbox" id="EcomUserCreateNewToggle" value="true" onchange="toggleCreateUser(event);"> 830 <label class="form-check-label lh-1" for="EcomUserCreateNewToggle"> 831 <span>@Translate("Create an account for easier checkout next time")</span> 832 </label> 833 </div> 834 </div> 835836 string passwordValidationPattern = null; 837 string EcomUserCreatePasswordTitle = null; 838 int minLength = Dynamicweb.Configuration.SystemConfiguration.Instance.GetInt32("/Globalsettings/Modules/Extranet/MinimumOfCharacters"); 839 if (Dynamicweb.Configuration.SystemConfiguration.Instance.GetValue("/Globalsettings/Modules/Extranet/PasswordSecurity") == "medium") 840 { 841 passwordValidationPattern = $"^(?=.*[A-z])(?=.*[0-9]).{{{minLength},32}}"; 842 EcomUserCreatePasswordTitle = Translate("Must contain letters and numbers"); 843 } 844 if (Dynamicweb.Configuration.SystemConfiguration.Instance.GetValue("/Globalsettings/Modules/Extranet/PasswordSecurity") == "high") 845 { 846 passwordValidationPattern = $"^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z])(?=.*[@#$%^&+=.-_]).{{{minLength},32}}"; 847 EcomUserCreatePasswordTitle = Translate("Must contain letters, numbers and special characters (@#$%^&+=.-_)"); 848 } 849850 <div class="d-none g-col-12 grid" id="PasswordFields"> 851 <div class="g-col-12"> 852 <div class="form-floating"> 853 <input type="password" disabled required class="form-control" name="EcomUserCreatePassword" id="EcomUserCreatePassword" placeholder="@Translate("Password")" pattern="@passwordValidationPattern" onchange="setPasswordMustMatchValidation(event)" title="@EcomUserCreatePasswordTitle" minlength="@minLength"> 854 <label for="EcomUserCreatePassword">@Translate("Password")</label> 855 </div> 856 </div> 857858 <div class="g-col-12"> 859 <div class="form-floating"> 860 <input type="password" disabled required class="form-control" name="EcomUserCreateConfirmPassword" id="EcomUserCreateConfirmPassword" placeholder="@Translate("Confirm password")" pattern="@passwordValidationPattern" title="@Translate("Passwords must match")" )" minlength="@minLength"> 861 <label for="EcomUserCreateConfirmPassword">@Translate("Confirm password")</label> 862 </div> 863 </div> 864 </div> 865866 <script> 867 toggleCreateUser = function (event) { 868 var newsletterSubscribeCheckbox = document.querySelector("#EcomOrderSubscribeToNewsletter"); 869 var createUserToggleCheckbox = document.querySelector("#EcomUserCreateNewToggle"); 870 var createUserCheckbox = document.querySelector("#EcomUserCreateNew"); 871872 if (newsletterSubscribeCheckbox.checked == true || createUserToggleCheckbox.checked == true) { 873 createUserCheckbox.disabled = false; 874 } else { 875 createUserCheckbox.disabled = true; 876 } 877878 if (createUserToggleCheckbox.checked == true) { 879 document.querySelector("#EcomUserCreatePassword").disabled = false; 880 document.querySelector("#EcomUserCreateConfirmPassword").disabled = false; 881 document.querySelector('#PasswordFields').classList.remove('d-none'); 882 } else { 883 document.querySelector("#EcomUserCreatePassword").disabled = true; 884 document.querySelector("#EcomUserCreateConfirmPassword").disabled = true; 885 document.querySelector('#PasswordFields').classList.add('d-none'); 886 } 887 } 888889 setPasswordMustMatchValidation = function (event) { 890 document.getElementById("EcomUserCreateConfirmPassword").setAttribute("pattern", document.getElementById("EcomUserCreatePassword").value); 891 } 892 </script> 893 } 894 </div> 895896 </div> 897898 if (enableFindLocation && !string.IsNullOrEmpty(apiKey)) 899 { 900 <script type="module"> 901 const assetLink = 'https://maps.googleapis.com/maps/api/js?key=@(apiKey)&libraries=places'; 902903 let assetFound = false; 904 document.head.querySelectorAll('script').forEach(element => { 905 if (assetLink == element.src) { 906 assetFound = true; 907 } 908 }); 909910 swift.AssetLoader.Load(assetLink, 'js'); 911912 if (!assetFound) { 913 document.addEventListener('load.swift.assetloader', function () { 914 var mapSettings = { currentCountry: "@currentCountry" }; 915 swift.Places.init(mapSettings); 916 }); 917 } else if (typeof google !== 'undefined') { 918 var mapSettings = { currentCountry: "@currentCountry" }; 919 swift.Places.init(mapSettings); 920 } 921 </script> 922 } 923 } 924925926 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 927928 @{ 929 string stepsIconPath = "/Files/Templates/Designs/Swift/Assets/icons/"; 930 int currentStep = 1; 931 string nextButtonName = Translate("Next"); 932 string previousButtonName = Translate("Back"); 933934 bool isErpConnectionDown = !Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsWebServiceConnectionAvailable"]); 935 string erpDownCartBehavior = Pageview.AreaSettings.GetRawValueString("ErpDownCartBehavior", "none"); 936937 foreach (LoopItem step in GetLoop("StepButtons")) 938 { 939 if (step.GetBoolean("Step.Current")) 940 { 941 currentStep = step.GetInteger("Step.Number"); 942 } 943944 if (step.GetInteger("Step.Number") == currentStep + 1) 945 { 946 nextButtonName = Translate(step.GetString("Step.Name")); 947 } 948949 if (step.GetInteger("Step.Number") == currentStep + step.GetInteger("Step.Index")) 950 { 951 previousButtonName = Translate("Back to") + " " + Translate(step.GetString("Step.Name")); 952 } 953 } 954955 if (currentStep == GetLoop("StepButtons").Count - 1 && Pageview.CurrentParagraph.Item.SystemName != "Swift_QuoteCheckoutApp") 956 { 957 <text> 958 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 959960 @{ 961 string termsAndConditionsCheckboxValue = GetBoolean("Ecom:Order.Customer.Accepted").ToString(); 962 string termsAndConditionsPageLink = Pageview.CurrentParagraph.Item["TermsAndConditionsPageLink"] != null ? Pageview.CurrentParagraph.Item["TermsAndConditionsPageLink"].ToString() : string.Empty; 963 } 964965 @if (!string.IsNullOrEmpty(termsAndConditionsPageLink)) 966 { 967 <div class="mt-4" id="TermsAndConditions"> 968 <h3 class="fs-6 fw-normal mb-0">@Translate("Terms and conditions")</h3> 969 <p class="fs-8 mb-3">@Translate("Agree to terms and conditions and that your informations are correct")</p> 970 <div class="list-group"> 971 <label class="list-group-item list-group-item-action d-flex justify-content-between" for="EcomOrderCustomerAccepted"> 972 <span class="d-flex justify-content-between align-items-center gap-3"> 973 <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> } required> 974 <span>@Translate("I accept the") <a href='@termsAndConditionsPageLink' target='_blank' rel='noopener' id="TermsAndConditionsButton">@Translate("terms and conditions")</a></span> 975 </span> 976 </label> 977 </div> 978 </div> 979 } 980981982 </text> 983984 nextButtonName = Translate("Place Order"); 985 } 986 else if (GetLoop("StepButtons").Count == 0) 987 { 988 nextButtonName = Translate("Pay"); 989 } 990 } 991992 <div class="mt-4 d-flex flex-column flex-md-row justify-content-end gap-3 mt-lg-4" id="StepsNavigation"> 993 @if (currentStep == 1) 994 { 995 var cartLink = $"Default.aspx?id={Pageview.CurrentParagraph.Page.Parent.ID}"; 996997 <a href="@cartLink" class="btn btn-link link-secondary btn-checkout text-decoration-none order-last order-md-first" id="BackToCartButton"> 998 <div class="d-flex align-items-center justify-content-center position-relative"> 999 <span class="icon-2 me-1 position-absolute position-md-static start-0"> 1000 @ReadFile(stepsIconPath + "chevron-left.svg") 1001 </span> 1002 <span>@Translate("Back to cart")</span> 1003 </div> 1004 </a> 1005 } 1006 else 1007 { 1008 <button name="@GetString("CartV2.PreviousStepButtonName")" id="@GetString("CartV2.PreviousStepButtonName")" class="btn btn-link btn-checkout link-secondary text-decoration-none checkout-back-button"> 1009 <div class="d-flex align-items-center justify-content-center position-relative"> 1010 <span class="icon-2 me-1 position-absolute position-md-static start-0"> 1011 @ReadFile(stepsIconPath + "chevron-left.svg") 1012 </span> 1013 <span>@previousButtonName</span> 1014 </div> 1015 </button> 1016 } 10171018 @if (!(currentStep == GetLoop("StepButtons").Count - 1 && isErpConnectionDown && erpDownCartBehavior == "disable")) 1019 { 1020 var buttonId = GetLoop("StepButtons").Count == 0 ? "PayButton" : GetString("CartV2.NextStepButtonName"); 1021 <button type="submit" name="@GetString("CartV2.NextStepButtonName")" id="@buttonId" class="btn btn-primary btn-checkout order-first order-md-last"> 1022 <div class="d-flex align-items-center justify-content-center position-relative pe-none"> 1023 <span>@nextButtonName</span> 1024 <span class="icon-2 ms-1 position-absolute position-md-static end-0"> 1025 @ReadFile(stepsIconPath + "chevron-right.svg") 1026 </span> 1027 </div> 1028 </button> 10291030 @* // SHIPMONDO 1031 Following script prevents writing pickup point address to order.delivery 1032 before finalizing the order. 1033 *@ 1034 if (currentStep == GetLoop("StepButtons").Count - 1) 1035 { 1036 if (GetBoolean("Ecom:Order.Delivery.isPickupPoint")) 1037 { 1038 <input type="hidden" name="@GetString("CartV2.NextStepButtonName")" /> 1039 <script> 1040 document.getElementById("@GetString("CartV2.NextStepButtonName")").addEventListener("click", function (e) { 1041 const form = e.target.closest("form"), 1042 hiddenParcelShopFields = form.querySelector("#hiddenParcelshopFields"), 1043 hiddenParcelShopFieldsDisabled = hiddenParcelShopFields.querySelectorAll("input"); 10441045 e.preventDefault(); 10461047 if (hiddenParcelShopFieldsDisabled.length > 0) { 1048 hiddenParcelShopFieldsDisabled.forEach((input) => { 1049 input.disabled = false; 1050 }); 1051 } 10521053 form.submit() 1054 }); 1055 </script> 1056 } 1057 } 1058 } 1059 else 1060 { 1061 <button class="btn btn-primary btn-checkout pe-none disabled">@Translate("Payment is temporarily disabled")</button> 1062 } 10631064 <script> 1065 if (window.history.replaceState) { 1066 window.history.replaceState(null, null, window.location.href); 1067 } 1068 </script> 1069 </div> 107010711072 <input type="hidden" id="CurrentStep"> 1073 </form> 1074 </div> 10751076 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 10771078 <div class="g-col-12 g-col-lg-4 py-2 p-3 p-lg-4 p-xl-5" id="summarySidebar" data-custom="true"> 1079 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 10801081 @{ 1082 string iconPath = "/Files/Icons/"; 1083 } 10841085 <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"> 1086 <span class="d-flex align-items-center justify-content-between"> 1087 <span class="d-flex align-items-center gap-2"> 1088 <span class="fs-7 lh-1"> 1089 <span class="toggle-order-summary-text" id="OrderSummaryToggleButtonLabel">@Translate("Show order summary")</span> 1090 </span> 1091 <span class="icon-2" id="OrderSummaryToggleButtonIcon" style="transition: all 0.25s ease-in-out;"> 1092 @ReadFile(iconPath + "chevron-down.svg") 1093 </span> 1094 </span> 1095 <span class="fw-bold"> 1096 <span class="text-price">@GetString("Ecom:Order.Price")</span> 1097 </span> 1098 </span> 1099 </button> 11001101 <script> 1102 const orderSummaryToggleButton = document.getElementById("OrderSummaryToggleButton"); 1103 const orderSummaryToggleButtonLabel = document.getElementById("OrderSummaryToggleButtonLabel"); 1104 const orderSummaryToggleButtonIcon = document.getElementById("OrderSummaryToggleButtonIcon"); 1105 const orderSummaryToggleText = '@Translate("Show order summary")'; 11061107 orderSummaryToggleButton.addEventListener('click', function handleClick() { 1108 if (orderSummaryToggleButtonLabel.textContent.toLowerCase().includes(orderSummaryToggleText.toLowerCase())) { 1109 orderSummaryToggleButtonLabel.textContent = '@Translate("Hide order summary")'; 1110 orderSummaryToggleButtonIcon.classList.add("rotate-180"); 1111 } else { 1112 orderSummaryToggleButtonLabel.textContent = orderSummaryToggleText; 1113 orderSummaryToggleButtonIcon.classList.remove("rotate-180"); 1114 } 1115 }); 1116 </script> 111711181119 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 11201121 <div class="d-lg-block h-lg-auto collapse pt-2 pt-lg-0" id="orderSummary" data-custom="true"> 1122 <div class="d-flex flex-column gap-2 gap-lg-3 pb-2 pb-lg-3"> 1123 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1124 @using Dynamicweb.Ecommerce.ProductCatalog 1125 @using Application.Constants 1126 @using System.Collections 1127 @using System.Collections.Generic 1128 @using System.Linq 11291130 @functions { 1131 private static string GetPrimaryImage(LoopItem orderline, string shopId) 1132 { 1133 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 1134 bool isProduct = orderline.GetBoolean("Ecom:Order:OrderLine.IsProduct") || (orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount") && isProductIdOrNumber); 1135 string productId = orderline.GetString("Ecom:Order:OrderLine.ProductID"); 1136 string variantId = orderline.GetString("Ecom:Order:OrderLine.ProductVariantID"); 11371138 if (!isProduct || string.IsNullOrEmpty(productId)) return ""; 11391140 ProductViewModelSettings productSetting = new ProductViewModelSettings 1141 { 1142 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 1143 CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code, 1144 CountryCode = Dynamicweb.Ecommerce.Common.Context.Country.Code2, 1145 ShopId = shopId 1146 }; 1147 ProductViewModel product = ViewModelFactory.CreateView(productSetting, productId, variantId); 1148 return product.DefaultImage.Value; 1149 } 1150 } 11511152 @{ 1153 var orderlines = GetLoop("OrderLines"); 1154 } 11551156 @for (int i = orderlines.Count - 1; i >= 0; i--) 1157 { 1158 var orderline = orderlines[i]; 1159 string name = orderline.GetString("Ecom:Order:OrderLine.ProductName"); 1160 string orderlineImage = GetPrimaryImage(orderline, GetString("Ecom:Order.ShopID")); 1161 string image = "/Admin/Public/GetImage.ashx?width=" + 180 + "&height=" + 180 + "&crop=5&fillcanvas=true&Background=ffffff&image=" + orderlineImage + "&format=webp"; 1162 image = !orderlineImage.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase) ? orderlineImage : image; 1163 string removeFromBasketLink = orderline.GetString("Ecom:Order:OrderLine.DeleteLink"); 1164 string priceTotalWithDiscounts = orderline.GetString("Ecom:Order:OrderLine.TotalPriceWithProductDiscounts.PriceFormatted"); 1165 string priceBefore = orderline.GetString("Ecom:Product.InformativePrice.PriceFormatted"); 1166 string unitPrice = orderline.GetString("Ecom:Order:OrderLine.UnitPrice.PriceFormatted"); 1167 string discountPrice = orderline.GetString("Ecom:Order:OrderLine.UnitPriceWithProductDiscount.PriceFormatted"); 1168 string discountTotal = orderline.GetString("Ecom:Order:OrderLine.TotalDiscount.PriceFormatted"); 1169 string variantText = orderline.GetString("Ecom:Order:OrderLine.ProductVariantText"); 1170 var orderlineId = orderline.GetValue("Ecom:Order:OrderLine.Id"); 1171 var quantity = orderline.GetDouble("Ecom:Order:OrderLine.Quantity"); 1172 var unitName = orderline.GetString("Ecom:Order:OrderLine.UnitName"); 1173 string primaryGroupId = orderline.GetString("Ecom:Order:OrderLine.PrimaryOrDefaultGroupId"); 1174 string productId = orderline.GetString("Ecom:Order:OrderLine.ProductID"); 1175 string variantId = orderline.GetString("Ecom:Order:OrderLine.ProductVariantID"); 11761177 var productObject = Dynamicweb.Ecommerce.Services.Products.GetProductById(productId, "", Pageview.Area.EcomLanguageId); 11781179 var customProductCondition = Convert.ToInt32(productObject?.ProductFieldValues["CustomProductCondition"]?.Value ?? "0"); 1180 var customProductType = Convert.ToInt32(productObject?.ProductFieldValues["CustomProductType"].Value ?? "0"); 11811182 string navigationTag = "ShopNewMachines"; 11831184 if (customProductType != 2) // 2 == maskiner 1185 { 1186 if (customProductCondition == 2) // 2 == nyt 1187 { 1188 navigationTag = "ShopNewEquipment"; 1189 } 1190 else 1191 { 1192 navigationTag = "ShopOldEquipment"; 1193 } 1194 } 1195 else 1196 { 1197 if (customProductCondition == 2) 1198 { 1199 navigationTag = "ShopNewMachines"; 1200 } 1201 else 1202 { 1203 navigationTag = "ShopUsedMachines"; 1204 } 1205 } 12061207 string link = "Default.aspx?ID=" + GetPageIdByNavigationTag(navigationTag); 1208 link += $"&GroupID={primaryGroupId}"; 1209 link += $"&ProductID={productId}"; 1210 link += !string.IsNullOrEmpty(variantId) ? $"&VariantID={variantId}" : ""; 12111212 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 1213 bool isProduct = orderline.GetBoolean("Ecom:Order:OrderLine.IsProduct") || (orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount") && isProductIdOrNumber); 12141215 if (isProduct) 1216 { 1217 <article class="grid grid-12" data-custom="true"> 12181219 <div class="g-col-2"> 1220 <a href="@link" class="ratio ratio-1x1 d-block " title="@name"> 1221 <img src="@image" style="object-fit: contain;" alt="@name"> 1222 </a> 1223 </div> 12241225 <div class="g-col-10"> 12261227 <div class="d-flex flex-column gap-1"> 1228 @* Title *@ 1229 <h3 class="h6 fs-7 m-0"> 1230 <a href="@link" class="text-decoration-none" title="@name">@name</a> 1231 </h3> 12321233 @* Variants *@ 1234 @if (!string.IsNullOrEmpty(variantText)) 1235 { 1236 <p class="fs-8 m-0">@variantText</p> 1237 } 12381239 @if (orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount")) 1240 { 1241 @* Free product notice *@ 1242 <p class="fs-8 m-0">@Translate("Free product")</p> 1243 } 1244 else 1245 { 1246 @* Unit price *@ 1247 <p class="fs-8 m-0"> 1248 @if (!string.IsNullOrEmpty(unitName)) 1249 { 1250 <span>@unitName: </span> 1251 } 1252 @if (discountPrice == unitPrice) 1253 { 1254 <span class="text-price">@unitPrice</span> 1255 } 1256 else 1257 { 1258 <span class="text-price">@discountPrice</span> 1259 <span class="text-decoration-line-through ps-1"> 1260 <span class="text-price">@unitPrice</span> 1261 </span> 1262 } 1263 </p> 1264 } 126512661267 @{ 1268 var customMachineConfiguratorField = orderline.GetLoop("Order.OrderLineFields").FirstOrDefault(x => x.GetString("Ecom:Order:OrderLine.OrderLineField.SystemName") == MachineConfiguratorConstants.MachineConfigrationsOrderLineField); 1269 var isConfigured = customMachineConfiguratorField != default && !string.IsNullOrEmpty(customMachineConfiguratorField.GetString("Ecom:Order:OrderLine.OrderLineField.Value")); 1270 } 127112721273 @if (isConfigured) 1274 { 1275 var configurationValue = customMachineConfiguratorField.GetString("Ecom:Order:OrderLine.OrderLineField.Value"); 1276 string configurationLink = link + "&selectedOptions=" + Uri.EscapeDataString(configurationValue); 12771278 <div class="d-flex flex-row justify-content-between"> 1279 <div class="text-start flex-fill"> 1280 <span class="fs-8 d-block"> 1281 @Translate("OrderlineItem.IsConfigured") 1282 <a href="@configurationLink">@Translate("OrderlineItem.LinkToConfiguration")</a> 1283 </span> 1284 </div> 1285 </div> 1286 } 12871288 <div class="d-flex flex-row justify-content-between"> 1289 @* Quantity *@ 1290 <span class="fs-8 d-block">@Translate("Qty"): @quantity</span> 12911292 <div class="text-end flex-fill"> 1293 @* Total *@ 1294 <span class="h6 d-block fs-7 m-0"> 1295 <span class="text-price">@priceTotalWithDiscounts</span> 1296 </span> 1297 @if (orderline.GetDouble("Ecom:Order:OrderLine.TotalDiscount.Price.Value") != 0.0) 1298 { 1299 <span class="d-block fs-8"> 1300 <span class="text-price">@discountTotal</span> 1301 </span> 1302 } 1303 </div> 1304 </div> 1305 </div> 1306 </div> 1307 </article> 1308 } 1309 } 13101311 </div> 13121313 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 13141315 @{ 13161317 double totalPriceWithoutOrderDiscountsFeesAndTaxesValue = GetDouble("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Value") + GetDouble("Ecom:Order.TotalProductDiscount.Price.Value"); 1318 var orderCurrency = Dynamicweb.Ecommerce.Services.Currencies.GetCurrency(GetString("Ecom:Order.Currency.Code")); 1319 string totalPriceWithoutOrderDiscountsFeesAndTaxes = Dynamicweb.Ecommerce.Services.Currencies.Format(orderCurrency, totalPriceWithoutOrderDiscountsFeesAndTaxesValue); 13201321 string showPricesWithVat = Pageview.Area.EcomPricesWithVat.ToLower(); 1322 bool neverShowVat = string.IsNullOrEmpty(showPricesWithVat); 13231324 bool disableVouchers = Pageview.CurrentParagraph?.Item["DisableVouchers"] != null ? (Boolean)Pageview.CurrentParagraph.Item["DisableVouchers"] : false; 1325 disableVouchers = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("CompletedOrderId")) ? true : disableVouchers; 13261327132813291330 <div class="d-flex flex-column gap-2 gap-lg-3 pb-3 bottom-0 sticky-receipt theme" id="orderSummaryFooter"> 13311332 @if (!disableVouchers && Pageview.CurrentParagraph?.Item.SystemName != "Swift_QuoteCheckoutApp") 1333 { 1334 <text> 1335 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1336 @using Dynamicweb.Ecommerce.Orders 13371338 @{ 1339 string voucherCode = GetString("Ecom:Order.Customer.VoucherCode"); 1340 string voucherCodeError = GetString("Ecom:Cart.ValidationError.EcomOrderVoucherCode.ErrorMessage"); 1341 string validState = string.Empty; 1342 bool vouchersAppliedAsDiscounts = false; 13431344 IEnumerable<string> voucherCodes = new List<string>(); 1345 Order order = new OrderService().GetById(GetString("Ecom:Order.ID")); 134613471348 if (!string.IsNullOrWhiteSpace(voucherCode)) 1349 { 1350 if (order.VoucherUseType.HasFlag(VoucherUseCategoryType.Discount)) 1351 { 1352 voucherCodes = voucherCode.Split(new string[] { ",", ";", " " }, StringSplitOptions.RemoveEmptyEntries); 1353 vouchersAppliedAsDiscounts = true; 1354 } 1355 else 1356 { 1357 voucherCodes = new string[] { voucherCode.Trim() }; 1358 } 1359 } 13601361 var voucherErrors = new List<string>(); 1362 if(!vouchersAppliedAsDiscounts) 1363 { 1364 foreach (string code in voucherCodes) 1365 { 1366 Dynamicweb.Ecommerce.Orders.Vouchers.Voucher vouch = Dynamicweb.Ecommerce.Services.Vouchers.GetVoucherByCode(code); 1367 if (vouch == null) 1368 { 1369 validState = "is-invalid"; 1370 voucherErrors.Add(Translate("Voucher") + " <span class='fw-bold'>" + code + "</span> " + Translate("not found")); 1371 continue; 1372 } 1373 if (vouch.DateUsed.HasValue) 1374 { 1375 validState = "is-invalid"; 1376 voucherErrors.Add(Translate("Voucher") + " <span class='fw-bold'>" + code + "</span> " + Translate("already used")); 1377 continue; 1378 } 1379 } 1380 } 13811382 var voucherErrorMessage = string.Join(",", voucherErrors); 13831384 <div class="py-3 border-top" id="orderVoucherForm"> 1385 <form method="post" id="VoucherForm"> 1386 <div class="input-group input-primary-button-group has-validation"> 1387 <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;"> 1388 <button class="btn btn-sm btn-primary d-inline-flex align-items-center justify-content-center" type="submit" id="EcomOrderVoucherApply" style="min-width: 100px;"> 1389 <span>@Translate("Apply")</span> 1390 </button> 13911392 <div class="invalid-feedback"> 1393 @voucherErrorMessage 1394 </div> 1395 </div> 1396 <input type="hidden" name="EcomOrderVoucherCode" id="EcomOrderVoucherCode" value="@voucherCode"> 1397 <label for="EcomOrderVoucherCodeField" class="visually-hidden">@Translate("Add voucher here")</label> 1398 </form> 13991400 @if (!string.IsNullOrWhiteSpace(voucherCode) && vouchersAppliedAsDiscounts) 1401 { 1402 <div class="d-flex flex-wrap gap-2 pt-3"> 14031404 @foreach (string code in voucherCodes) 1405 { 1406 <form method="post"> 1407 <input type="hidden" name="EcomOrderVoucherCode" value="@voucherCode.Replace(code+",", "").Replace(","+code, "").Replace(code, "")"> 1408 <span class="badge fw-normal d-inline-flex align-items-center justify-content-center opacity-50 opacity-100-hover" style="background-color:var(--swift-foreground-color);color:var(--swift-background-color);"> 1409 <span class="icon-2"> 1410 @ReadFile("/Files/Templates/Designs/Swift/Assets/icons/tag.svg") 1411 </span> 1412 <span class="mx-2">@code</span> 1413 <button type="submit" class="text-reset bg-transparent border-0 p-0" aria-label="@Translate("Remove voucher")" id="RemoveVoucherButton"> 1414 <span class="icon-2"> 1415 @ReadFile("/Files/Templates/Designs/Swift/Assets/icons/x.svg") 1416 </span> 1417 </button> 1418 </span> 1419 </form> 1420 } 1421 </div> 1422 } 1423 @voucherCodeError 1424 </div> 1425 } 14261427 </text> 1428 } 142914301431 <div class="fs-8 border-top pt-2 pt-lg-3"> 1432 @* Subtotal *@ 1433 <div class="d-flex justify-content-between fw-bold"> 1434 <span>@Translate("Subtotal")</span> 1435 <span class="text-end"> 1436 <span class="d-block"> 1437 @if (GetDouble("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Value") != totalPriceWithoutOrderDiscountsFeesAndTaxesValue) 1438 { 1439 <span class="text-price fw-normal text-decoration-line-through pe-1">@GetString("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.PriceFormatted")</span> 1440 } 1441 <span class="text-price">@totalPriceWithoutOrderDiscountsFeesAndTaxes</span> 1442 </span> 14431444 @if (!neverShowVat && showPricesWithVat == "false") 1445 { 1446 <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span> 1447 } 1448 else if (!neverShowVat) 1449 { 1450 <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span> 1451 } 1452 </span> 1453 </div> 14541455 @* Discounts (only order discounts) *@ 1456 @foreach (LoopItem orderline in GetLoop("OrderLines")) 1457 { 1458 bool isDiscount = orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount"); 1459 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 1460 bool isOrderAmountDiscount = orderline.GetInteger("Ecom:Order:OrderLine.Type") == 1 && !isProductIdOrNumber; 1461 if (isDiscount && isOrderAmountDiscount) 1462 { 1463 <div class="d-flex justify-content-between"><span>@orderline.GetString("Ecom:Order:OrderLine.ProductName")</span><span class="text-price">@orderline.GetString("Ecom:Order:OrderLine.TotalPriceWithProductDiscounts.PriceFormatted")</span></div> 1464 } 1465 } 14661467 @* Delivery *@ 1468 @if (!string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID"))) 1469 { 1470 if (GetDouble("Ecom:Order.ShippingFee.Price.Value") != 0.0) 1471 { 1472 <div class="d-flex justify-content-between"> 1473 <span>@Translate("Delivery")</span> 1474 <span>@GetString("Ecom:Order.ShippingFee.PriceFormatted")</span> 1475 </div> 1476 } 1477 } 1478 else 1479 { 1480 <div class="d-flex justify-content-between"> 1481 <span>@Translate("Delivery")</span> 1482 <span>@Translate("Calculated in next step")</span> 1483 </div> 1484 } 14851486 @* Taxes *@ 1487 @if (GetDouble("Ecom:Order.Taxes.Total.Price.Value") != 0) 1488 { 1489 <div class="d-flex justify-content-between mb-2"> 1490 <span>@Translate("Sales tax")</span> 1491 <span>@GetString("Ecom:Order.Taxes.Total.PriceFormatted")</span> 1492 </div> 1493 } 1494 </div> 1495 <div class="fs-8 border-top pt-2 pt-lg-3"> 1496 <div class="d-flex justify-content-between fs-6 fw-bold"> 1497 <span>@Translate("Total")</span> 1498 @if (!neverShowVat && showPricesWithVat == "false") 1499 { 1500 <span class="text-price text-end"> 1501 <span class="fs-5 d-block">@GetString("Ecom:Order.Price.PriceFormatted")</span> 1502 <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span> 1503 </span> 1504 } 1505 else if (!neverShowVat && showPricesWithVat == "true") 1506 { 1507 <span class="text-price text-end"> 1508 <span class="fs-5 d-block">@GetString("Ecom:Order.Price.PriceFormatted")</span> 1509 <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span> 1510 </span> 1511 } 1512 else 1513 { 1514 <span class="text-price fs-5">@GetString("Ecom:Order.Price.PriceFormatted")</span> 1515 } 1516 </div> 15171518 @if (!neverShowVat) 1519 { 1520 <div class="d-flex justify-content-between"><span>@Translate("VAT")</span><span class="text-price">@GetString("Ecom:Order.Price.VATFormatted")</span></div> 1521 if (showPricesWithVat == "false") 1522 { 1523 <div class="d-flex justify-content-between"><span>@Translate("Total incl. VAT")</span><span class="text-price">@GetString("Ecom:Order.OrderLines.Total.PriceWithVAT")</span></div> 1524 } 1525 } 15261527 @if (GetDouble("Ecom:Order.TotalDiscount.Price.Value") != 0) 1528 { 1529 <div class="d-flex justify-content-between"><span>@Translate("Discount")</span><span class="text-price">@GetString("Ecom:Order.TotalDiscount.PriceFormatted")</span></div> 1530 } 1531 </div> 1532 </div> 1533 } 15341535 </div> 15361537 </div> 153815391540 </div> 15411542 <script> 1543 function submitForm() { 1544 document.querySelector("#CurrentStep").name = "@GetString("CartV2.CurrentStepButtonName")"; 1545 swift.PageUpdater.Update(document.querySelector("#ordersubmit")); 1546 } 1547 </script> 15481549 <script> 1550 gtag("event", "begin_checkout", { 1551 currency: "@GetString("Ecom:Order.CurrencyCode")", 1552 value: @GetDouble("Ecom:Order.Price.Price.Value").ToString("0.00", System.Globalization.CultureInfo.InvariantCulture), 1553 items: [ 1554 @foreach (LoopItem orderline in GetLoop("OrderLines")) { 1555 <text> 1556 { 1557 item_id: "@orderline.GetString("Ecom:Order:OrderLine.ProductID")", 1558 item_name: "@Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(orderline.GetString("Ecom:Order:OrderLine.ProductName"))", 1559 currency: "@orderline.GetString("Ecom:Order:OrderLine.UnitPrice.CurrencyCode")", 1560 price: @orderline.GetDouble("Ecom:Order:OrderLine.UnitPrice.Price.Value").ToString("0.00", System.Globalization.CultureInfo.InvariantCulture), 1561 quantity: @orderline.GetDouble("Ecom:Order:OrderLine.Quantity").ToString("0.00", System.Globalization.CultureInfo.InvariantCulture) 1562 }, 1563 </text> 1564 } 1565 ] 1566 }); 1567 </script> 15681569 @* Address format helper methods *@ 1570 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1571 @using System.Collections.Generic 1572 @using System.Text.RegularExpressions 1573 @using Dynamicweb.Ecommerce.International 1574 @using System.Text 15751576 @functions { 1577 public string RenderUserItemAddressInline(LoopItem address) 1578 { 1579 string regionCode = GetRegionCode(address.GetString("UserManagement:User.UserAddress.CountryCode"), address.GetString("UserManagement:User.UserAddress.State")); 1580 string regionName = GetRegionName(address.GetString("UserManagement:User.UserAddress.CountryCode"), address.GetString("UserManagement:User.UserAddress.State")); 15811582 List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(address.GetString("UserManagement:User.UserAddress.CountryCode")); 15831584 var result = new StringBuilder(); 15851586 foreach (List<string> addressLine in addressFormat) 1587 { 1588 for (var i = 0; i < addressLine.Count; i++) 1589 { 1590 addressLine[i] = Regex.Replace(addressLine[i], "{name}", address.GetString("UserManagement:User.UserAddress.Name"), RegexOptions.IgnoreCase); 1591 addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", address.GetString("UserManagement:User.UserAddress.FirstName"), RegexOptions.IgnoreCase); 1592 addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", address.GetString("UserManagement:User.UserAddress.lastName"), RegexOptions.IgnoreCase); 1593 addressLine[i] = Regex.Replace(addressLine[i], "{company}", address.GetString("UserManagement:User.UserAddress.Company"), RegexOptions.IgnoreCase); 1594 addressLine[i] = Regex.Replace(addressLine[i], "{address}", address.GetString("UserManagement:User.UserAddress.Address"), RegexOptions.IgnoreCase); 1595 addressLine[i] = Regex.Replace(addressLine[i], "{address1}", address.GetString("UserManagement:User.UserAddress.Address"), RegexOptions.IgnoreCase); 1596 addressLine[i] = Regex.Replace(addressLine[i], "{address2}", address.GetString("UserManagement:User.UserAddress.Address2"), RegexOptions.IgnoreCase); 1597 addressLine[i] = Regex.Replace(addressLine[i], "{zip}", address.GetString("UserManagement:User.UserAddress.Zip"), RegexOptions.IgnoreCase); 1598 addressLine[i] = Regex.Replace(addressLine[i], "{city}", address.GetString("UserManagement:User.UserAddress.City"), RegexOptions.IgnoreCase); 1599 addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", regionCode, RegexOptions.IgnoreCase); 1600 addressLine[i] = Regex.Replace(addressLine[i], "{region}", regionName, RegexOptions.IgnoreCase); 1601 addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", address.GetString("UserManagement:User.UserAddress.Culture.CountryCode"), RegexOptions.IgnoreCase); 1602 addressLine[i] = Regex.Replace(addressLine[i], "{country}", address.GetString("UserManagement:User.UserAddress.Culture.CountryName"), RegexOptions.IgnoreCase); 16031604 // Remove any bad placeholders the user may have submitted 1605 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); 1606 addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); 1607 } 1608 var completeLine = string.Join(string.Empty, addressLine.ToArray()); 1609 if (!string.IsNullOrWhiteSpace(completeLine)) 1610 { 1611 result.Append($"<span>{completeLine}</span> "); 1612 } 1613 } 16141615 return result.ToString(); 1616 } 16171618 public string GetUserAddressString() 1619 { 1620 List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(GetString("UserManagement:User.CountryCode")); 1621 string regionCode = GetRegionCode(GetString("UserManagement:User.CountryCode"), GetString("UserManagement:User.State")); 1622 string regionName = GetRegionName(GetString("UserManagement:User.CountryCode"), GetString("UserManagement:User.State")); 1623 List<string> completeAddress = new List<string>(); 16241625 foreach (var addressLine in addressFormat) 1626 { 1627 for (var i = 0; i < addressLine.Count; i++) 1628 { 1629 addressLine[i] = Regex.Replace(addressLine[i], "{name}", GetString("UserManagement:User.Name"), RegexOptions.IgnoreCase); 1630 addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", GetString("UserManagement:User.FirstName"), RegexOptions.IgnoreCase); 1631 addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", GetString("UserManagement:User.LastName"), RegexOptions.IgnoreCase); 1632 addressLine[i] = Regex.Replace(addressLine[i], "{company}", GetString("UserManagement:User.Company"), RegexOptions.IgnoreCase); 1633 addressLine[i] = Regex.Replace(addressLine[i], "{address}", GetString("UserManagement:User.Address"), RegexOptions.IgnoreCase); 1634 addressLine[i] = Regex.Replace(addressLine[i], "{address1}", GetString("UserManagement:User.Address"), RegexOptions.IgnoreCase); 1635 addressLine[i] = Regex.Replace(addressLine[i], "{address2}", GetString("UserManagement:User.Address2"), RegexOptions.IgnoreCase); 1636 addressLine[i] = Regex.Replace(addressLine[i], "{zip}", GetString("UserManagement:User.Zip"), RegexOptions.IgnoreCase); 1637 addressLine[i] = Regex.Replace(addressLine[i], "{city}", GetString("UserManagement:User.City"), RegexOptions.IgnoreCase); 1638 addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", regionCode, RegexOptions.IgnoreCase); 1639 addressLine[i] = Regex.Replace(addressLine[i], "{region}", regionName, RegexOptions.IgnoreCase); 1640 addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", GetString("UserManagement:User.CountryCode"), RegexOptions.IgnoreCase); 1641 addressLine[i] = Regex.Replace(addressLine[i], "{country}", GetString("UserManagement:User.Culture.CountryName"), RegexOptions.IgnoreCase); 16421643 // Remove any bad placeholders the user may have submitted 1644 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); 1645 addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); 1646 } 1647 var completeLine = string.Join(string.Empty, addressLine.ToArray()); 1648 if (!string.IsNullOrWhiteSpace(completeLine)) 1649 { 1650 completeAddress.Add(completeLine); 1651 } 1652 } 16531654 return string.Join(" ", completeAddress.ToArray()); 1655 } 16561657 public string GetRegionName(string countryCode, string regionValue) 1658 { 1659 return GetRegionNameOrCode(countryCode, regionValue); 1660 } 16611662 public string GetRegionCode(string countryCode, string regionValue) 1663 { 1664 return GetRegionNameOrCode(countryCode, regionValue, "code"); 1665 } 16661667 public string GetRegionNameOrCode(string countryCode, string regionValue, string nameOrCode = "name") 1668 { 1669 CountryCollection allCountryRegions = Dynamicweb.Ecommerce.Services.Countries.GetRegions(countryCode); 1670 Country matchedRegion = allCountryRegions.FirstOrDefault(r => r.RegionCode == regionValue || r.GetName(Dynamicweb.Ecommerce.Common.Context.LanguageID) == regionValue); 16711672 if (matchedRegion == null) return regionValue; 16731674 return nameOrCode == "name" ? matchedRegion.GetName(Dynamicweb.Ecommerce.Common.Context.LanguageID) : matchedRegion.RegionCode; 1675 } 16761677 } 16781679 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1680 @using System.Text.RegularExpressions 1681 @using System.Text 16821683 @functions { 1684 public string RenderDeliveryAddressInline() 1685 { 1686 List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(GetString("Ecom:Order.Delivery.Country.Code")); 16871688 var result = new StringBuilder(); 16891690 foreach (List<string> addressLine in addressFormat) 1691 { 1692 for (var i = 0; i < addressLine.Count; i++) 1693 { 1694 addressLine[i] = Regex.Replace(addressLine[i], "{name}", GetString("Ecom:Order.Delivery.Name"), RegexOptions.IgnoreCase); 1695 addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", GetString("Ecom:Order.Delivery.FirstName"), RegexOptions.IgnoreCase); 1696 addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", GetString("Ecom:Order.Delivery.Surname"), RegexOptions.IgnoreCase); 1697 addressLine[i] = Regex.Replace(addressLine[i], "{company}", GetString("Ecom:Order.Delivery.Company"), RegexOptions.IgnoreCase); 1698 addressLine[i] = Regex.Replace(addressLine[i], "{address}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); 1699 addressLine[i] = Regex.Replace(addressLine[i], "{address1}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); 1700 addressLine[i] = Regex.Replace(addressLine[i], "{address2}", GetString("Ecom:Order.Delivery.Address2"), RegexOptions.IgnoreCase); 1701 addressLine[i] = Regex.Replace(addressLine[i], "{zip}", GetString("Ecom:Order.Delivery.Zip"), RegexOptions.IgnoreCase); 1702 addressLine[i] = Regex.Replace(addressLine[i], "{city}", GetString("Ecom:Order.Delivery.City"), RegexOptions.IgnoreCase); 1703 addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", GetString("Ecom:Order.Delivery.Region"), RegexOptions.IgnoreCase); 1704 addressLine[i] = Regex.Replace(addressLine[i], "{region}", GetDeliveryRegionName(), RegexOptions.IgnoreCase); 1705 addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", GetString("Ecom:Order.Delivery.Country.Code"), RegexOptions.IgnoreCase); 1706 addressLine[i] = Regex.Replace(addressLine[i], "{country}", GetString("Ecom:Order.Delivery.Country"), RegexOptions.IgnoreCase); 17071708 // Remove any bad placeholders the user may have submitted 1709 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); 1710 addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); 1711 } 1712 var completeLine = string.Join(string.Empty, addressLine.ToArray()); 1713 if (!string.IsNullOrWhiteSpace(completeLine)) 1714 { 1715 result.Append($"<span>{completeLine}</span>"); 17161717 if (addressLine != addressFormat.Last()) 1718 { 1719 result.Append(" "); 1720 } 1721 } 1722 } 17231724 return result.ToString(); 1725 } 17261727 public string GetDeliveryAddressString() 1728 { 1729 List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(GetString("Ecom:Order.Delivery.Country.Code")); 1730 List<string> completeAddress = new List<string>(); 17311732 foreach (var addressLine in addressFormat) 1733 { 1734 for (var i = 0; i < addressLine.Count; i++) 1735 { 1736 addressLine[i] = Regex.Replace(addressLine[i], "{name}", GetString("Ecom:Order.Delivery.Name"), RegexOptions.IgnoreCase); 1737 addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", GetString("Ecom:Order.Delivery.FirstName"), RegexOptions.IgnoreCase); 1738 addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", GetString("Ecom:Order.Delivery.LastName"), RegexOptions.IgnoreCase); 1739 addressLine[i] = Regex.Replace(addressLine[i], "{company}", GetString("Ecom:Order.Delivery.Company"), RegexOptions.IgnoreCase); 1740 addressLine[i] = Regex.Replace(addressLine[i], "{address}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); 1741 addressLine[i] = Regex.Replace(addressLine[i], "{address1}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); 1742 addressLine[i] = Regex.Replace(addressLine[i], "{address2}", GetString("Ecom:Order.Delivery.Address2"), RegexOptions.IgnoreCase); 1743 addressLine[i] = Regex.Replace(addressLine[i], "{zip}", GetString("Ecom:Order.Delivery.Zip"), RegexOptions.IgnoreCase); 1744 addressLine[i] = Regex.Replace(addressLine[i], "{city}", GetString("Ecom:Order.Delivery.City"), RegexOptions.IgnoreCase); 1745 addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", GetString("Ecom:Order.Delivery.Region"), RegexOptions.IgnoreCase); 1746 addressLine[i] = Regex.Replace(addressLine[i], "{region}", GetDeliveryRegionName(), RegexOptions.IgnoreCase); 1747 addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", GetString("Ecom:Order.Delivery.Country.Code"), RegexOptions.IgnoreCase); 1748 addressLine[i] = Regex.Replace(addressLine[i], "{country}", GetString("Ecom:Order.Delivery.Country"), RegexOptions.IgnoreCase); 1749 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", GetString("Ecom:Order.Delivery.Phone"), RegexOptions.IgnoreCase); 17501751 // Remove any bad placeholders the user may have submitted 1752 addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); 1753 addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); 1754 } 1755 var completeLine = string.Join(string.Empty, addressLine.ToArray()); 1756 if (!string.IsNullOrWhiteSpace(completeLine)) 1757 { 1758 completeAddress.Add(completeLine); 1759 } 1760 } 17611762 return string.Join(", ", completeAddress.ToArray()); 1763 } 17641765 public string GetDeliveryRegionName() 1766 { 1767 foreach (LoopItem region in GetLoop("DeliveryRegions")) 1768 { 1769 if (region.GetBoolean("Ecom:DeliveryRegion.IsDeliveryRegion")) 1770 { 1771 return region.GetString("Ecom:DeliveryRegion.Name"); 1772 } 1773 } 17741775 return GetString("Ecom:Order.Delivery.Region"); 1776 } 17771778 } 17791780

Price inquiry

Fill in the form and send your questions or comments to Scantruck.
We will get back to you with a price and answers to your questions.