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