Error executing template "Designs/Swift/eCom7/CartV2/Step/QuoteRequestUser.cshtml" System.ArgumentNullException: Value cannot be null. (Parameter 'currency') at System.ArgumentNullException.Throw(String paramName) at Dynamicweb.Ecommerce.International.CurrencyService.Format(Currency currency, Double value, Boolean showSymbol) at CompiledRazorTemplates.Dynamic.RazorEngine_65db33ba1a824a6b8ffd0d6234288010.RenderOrderSummary(Boolean renderVoucher) at CompiledRazorTemplates.Dynamic.RazorEngine_65db33ba1a824a6b8ffd0d6234288010.RenderOrderSummaryContent() at CompiledRazorTemplates.Dynamic.RazorEngine_65db33ba1a824a6b8ffd0d6234288010.RenderSummarySidebar() at CompiledRazorTemplates.Dynamic.RazorEngine_65db33ba1a824a6b8ffd0d6234288010.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>> @using Dynamicweb @using System.IO @{ var themeRaw = Pageview.CurrentParagraph.Item["Theme"]?.ToString(); string theme = !string.IsNullOrEmpty(themeRaw) ? " theme " + themeRaw.Replace(" ", "").Trim().ToLower() : ""; } <div class="grid gap-0 h-100"> <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)"> <form name="ordersubmit" id="ordersubmit" method="post" autocomplete="off" style="max-width: 65rem; margin-left: auto;"> @{ @RenderLogo() } <h1 class="h2">@Translate("Request quote")</h1> <p>@Translate("Please fill out the form below to request a quote. We will get back to you within 24 hours")</p> @{ @RenderErrors() @RenderStepSummary() } <div class="form-floating mt-4"> <textarea class="form-control" placeholder="@Translate("Add quote request here")" name="QuoteRequest" id="QuoteRequest" style="min-height: 100px" value="@GetString("QuoteRequest.Clean")"></textarea> <label for="QuoteRequest">@Translate("Add quote request here")</label> </div> @{ @RenderStepsNavigation() } <input type="hidden" id="CurrentStep"> </form> </div> @{ @RenderSummarySidebar() } </div> <script> function submitForm() { document.querySelector("#CurrentStep").name = "@GetString("CartV2.CurrentStepButtonName")"; swift.PageUpdater.Update(document.querySelector("#ordersubmit")); } </script> @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @using System.IO @functions { string RenderLogo() { string logoLink = Pageview.CurrentParagraph.Item["LogoLink"] != null ? Pageview.CurrentParagraph.Item["LogoLink"].ToString() : ""; <div class="mb-4 text-center"> @if (!string.IsNullOrWhiteSpace(logoLink)) { <a href="@logoLink" class="text-decoration-none" title="@Translate("Leave checkout")"> @RenderLogoImage() </a> } else { <text>@RenderLogoImage()</text> } </div> return string.Empty; } string RenderLogoImage() { string logoImage = Pageview.CurrentParagraph.Item["Logo"] != null ? Pageview.CurrentParagraph.Item["Logo"].ToString() : ""; string maxWidth = Pageview.CurrentParagraph.Item["MaxWidth"] != null ? "max-width: " + Pageview.CurrentParagraph.Item["MaxWidth"].ToString() + "px" : ""; string title = Pageview.CurrentParagraph.Item["Title"] != null ? Pageview.CurrentParagraph.Item["Title"].ToString() : Pageview.Area.Name; maxWidth = maxWidth == "max-width: 0px" ? "" : maxWidth; if (logoImage != "") { if (Path.GetExtension(logoImage).ToLower() == ".svg") { <div class="icon-auto" style="@maxWidth"> @ReadFile(logoImage) </div> } else { string imageWidth = Pageview.CurrentParagraph.Item["MaxWidth"] != null ? Pageview.CurrentParagraph.Item["MaxWidth"].ToString() : "400"; string imagePath = "/Admin/Public/GetImage.ashx?width=" + imageWidth + "&image=" + logoImage; <picture class="mx-auto d-block"> <img src="@logoImage" alt="@title" style="@maxWidth"> </picture> } } else { <div class="fs-3 p-0">@title</div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @using Dynamicweb.Ecommerce.Orders @functions { string RenderErrors(){ if (GetLoop("ValidationErrors").Count() != 0) { <div class="alert alert-warning" role="alert"> <ul class="m-0 list-unstyled"> @foreach (LoopItem item in GetLoop("ValidationErrors")) { <li>@item.GetValue("Ecom:Cart.ValidationError.ErrorMessage")</li> } </ul> </div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions{ string RenderStepSummary() { bool isPaymentStep = GetLoop("StepButtons").Count == 0; int currentStep = !isPaymentStep ? 1 : 4; int currentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); foreach (LoopItem step in GetLoop("StepButtons")) { if (step.GetBoolean("Step.Current")) { currentStep = step.GetInteger("Step.Number"); } } if (!string.IsNullOrEmpty(GetString("UserManagement:User.Address")) || !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID")) || !string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethodID")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Email")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Phone")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Name")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Company")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Address2")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Zip")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.City")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Phone")) || !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethod")) || !string.IsNullOrEmpty(GetString("Ecom:Order.ShippingDate")) || !string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethod"))) { @* User *@ if (currentUserId != 0) { <div class="list-group mb-5"> @{ @RenderStepSummaryOrderCustomer() @RenderStepSummaryUser() } @if (currentStep != 1) { { @RenderStepSummaryOrderDelivery() @RenderStepSummaryDeliveryMethod() @RenderStepSummaryDeliveryDate() } } </div> } @* Anonymous *@ else { if (currentStep != 1) { <div class="list-group"> @{ @RenderStepSummaryOrderCustomer() @RenderStepSummaryOrderDelivery() } @if (currentStep > 2) { { @RenderStepSummaryDeliveryMethod() @RenderStepSummaryDeliveryDate() } } @if (currentStep > 3) { { @RenderStepSummaryPaymentMethod() @RenderStepSummaryOrderReference() } } </div> } } } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderStepSummaryOrderCustomer() { var hideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; int currentUserId = Dynamicweb.Core.Converter.ToInt32(GetGlobalValue("Global:Extranet.UserID")); List<string> contact = new List<string>(); if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email")) || !string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Phone"))) { if (!string.IsNullOrEmpty(GetString("Ecom:Order.Customer.Email"))) { contact.Add(GetString("Ecom:Order.Customer.Email")); } if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Phone"))) { contact.Add(GetString("Ecom:Order.Delivery.Phone")); } } string contactString = (string.Join(",", contact.Select(x => x.ToString()).ToArray())).Replace(",", ", "); string userAccountPage = Pageview.CurrentParagraph.Item["UserAccountPageLink"] != null ? Pageview.CurrentParagraph.Item["UserAccountPageLink"].ToString() + "&GoBackToPage=" + Pageview.Page.ID : ""; if (!string.IsNullOrEmpty(contactString)) { <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)" id="ContactGroup"> <dl class="grid gap-1 gap-sm-3 mb-0"> <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Contact")</dt> <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@contactString</dd> @if (!hideEditBillingAddress) { <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> @if (currentUserId == 0) { <button type="submit" class="btn btn-small btn-link fs-8 p-0" name="CartV2.GotoStep0" id="EditBillingAddressButton"> <span class="text-uppercase">@Translate("Edit")</span> </button> } else { <a href="@userAccountPage" class="btn btn-small btn-link fs-8 p-0" id="EditBillingAddressButton"> <span class="text-uppercase">@Translate("Edit")</span> </a> } </dd> } </dl> </div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderStepSummaryOrderDelivery() { var hideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; int fieldCount = 0; //Helps us render addresses that contains more than just the auto set country bool isStandardSwiftTemplates = Pageview.AreaSettings.GetString("AddressFieldsBasedOn", "swift") == "swift"; string addressString = ""; if (isStandardSwiftTemplates) { List<string> address = new List<string>(); if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Company"))) { address.Add(GetString("Ecom:Order.Delivery.Company")); fieldCount++; } if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Name"))) { address.Add(GetString("Ecom:Order.Delivery.Name")); fieldCount++; } if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address"))) { address.Add(GetString("Ecom:Order.Delivery.Address")); fieldCount++; } if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Address2"))) { address.Add(GetString("Ecom:Order.Delivery.Address2")); fieldCount++; } if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Zip"))) { address.Add(GetString("Ecom:Order.Delivery.Zip")); fieldCount++; } if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.City"))) { address.Add(GetString("Ecom:Order.Delivery.City")); fieldCount++; } if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Region"))) { string regionName = GetString("Ecom:Order.Delivery.Region"); foreach (LoopItem region in GetLoop("DeliveryRegions")) { if (region.GetString("Ecom:DeliveryRegion.IsDeliveryRegion") == "true") { regionName = region.GetString("Ecom:DeliveryRegion.Name"); } } address.Add(regionName); fieldCount++; } if (!string.IsNullOrEmpty(GetString("Ecom:Order.Delivery.Country"))) { address.Add(GetString("Ecom:Order.Delivery.Country")); fieldCount++; } addressString = (string.Join(",", address.Select(x => x.ToString()).ToArray())).Replace(",", ", "); } else { addressString = GetDeliveryAddressString(); } string editStep = "CartV2.GotoStep0"; if (!string.IsNullOrEmpty(addressString) && ((isStandardSwiftTemplates && fieldCount > 1) || !isStandardSwiftTemplates)) { <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> <dl class="grid gap-1 gap-sm-3 mb-0"> <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Send to")</dt> <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@addressString</dd> @if (!hideEditBillingAddress) { <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="@editStep" id="EditDeliveryAddressButton"> <span class="text-uppercase">@Translate("Edit")</span> </button> </dd> } </dl> </div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @using Dynamicweb @functions { string RenderStepSummaryUser() { var hideEditBillingAddress = Pageview.CurrentParagraph?.Item["HideEditBillingAddress"] != null ? Convert.ToBoolean(Pageview.CurrentParagraph.Item["HideEditBillingAddress"].ToString()) : false; int fieldCount = 0; //Helps us render addresses that contains more than just the auto set country bool isStandardSwiftTemplates = Pageview.AreaSettings.GetString("AddressFieldsBasedOn", "swift") == "swift"; string addressString = ""; if (isStandardSwiftTemplates) { Dynamicweb.Security.UserManagement.User user = Pageview.User; List<string> address = new List<string>(); if (!string.IsNullOrEmpty(user.Company)) { address.Add(user.Company); fieldCount++; } if (!string.IsNullOrEmpty(user.Name)) { address.Add(user.Name); fieldCount++; } if (!string.IsNullOrEmpty(user.Address)) { address.Add(user.Address); fieldCount++; } if (!string.IsNullOrEmpty(user.Address2)) { address.Add(user.Address2); fieldCount++; } if (!string.IsNullOrEmpty(user.Zip)) { address.Add(user.Zip); fieldCount++; } if (!string.IsNullOrEmpty(user.City)) { address.Add(user.City); fieldCount++; } if (!string.IsNullOrEmpty(user.State)) { var countryCode = user.CountryCode; string stateName = Dynamicweb.Ecommerce.Services.Countries.GetRegion(countryCode, user.State)?.GetName(Dynamicweb.Ecommerce.Common.Context.LanguageID) ?? string.Empty; address.Add(stateName); fieldCount++; } if (!string.IsNullOrEmpty(user.CountryCode)) { string country = user.Region.DisplayName; address.Add(country); fieldCount++; } addressString = (string.Join(",", address.Select(x => x.ToString()).ToArray())).Replace(",", ", "); } else { addressString = GetUserAddressString(); } string editStep = Pageview.CurrentParagraph.Item["UserAccountPageLink"] != null ? Pageview.CurrentParagraph.Item["UserAccountPageLink"].ToString() + "&GoBackToPage=" + Pageview.Page.ID : ""; if (!string.IsNullOrEmpty(addressString) && ((isStandardSwiftTemplates && fieldCount > 1) || !isStandardSwiftTemplates)) { <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> <dl class="grid gap-1 gap-sm-3 mb-0"> <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Billing address")</dt> <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@addressString</dd> @if (!hideEditBillingAddress) { <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> <a href="@editStep" class="btn btn-small btn-link fs-8 p-0" id="EditBillingAddressButton"> <span class="text-uppercase">@Translate("Edit")</span> </a> </dd> } </dl> </div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderStepSummaryDeliveryMethod() { string shippingMethod = GetString("Ecom:Order.ShippingMethod"), editStep = "CartV2.GotoStep1"; if (!string.IsNullOrEmpty(shippingMethod)) { <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> <dl class="grid gap-1 gap-sm-3 mb-0"> <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery")</dt> <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@shippingMethod</dd> <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="@editStep" id="EditDeliveryButton"> <span class="text-uppercase">@Translate("Edit")</span> </button> </dd> </dl> </div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderStepSummaryPaymentMethod() { string PaymentMethodID = GetString("Ecom:Order.ShippingMethodID"); string paymentMethod = GetString("Ecom:Order.PaymentMethod"); string editStep = "CartV2.GotoStep2"; if (!string.IsNullOrEmpty(PaymentMethodID)) { <div class="list-group-item d-flex gap-3 align-items-baseline py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> <div class="flex-grow-1"> <dl class="grid mb-0"> <dt class="g-col-12 g-col-md-4 mb-lg-0 lh-base fw-normal">@Translate("Payment")</dt> <dd class="g-col-12 g-col-md-8 mb-0"> @paymentMethod </dd> </dl> </div> <button class="btn btn-small btn-link fs-8" type="submit" name="@editStep" id="EditPaymentButton"> <span class="text-uppercase">@Translate("Edit")</span> </button> </div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderStepSummaryDeliveryDate() { string shippingDate = GetString("Ecom:Order.ShippingDate"), shippingDateFormatted = GetDate("Ecom:Order.ShippingDate").ToShortDateString(), editStep = "CartV2.GotoStep1"; if (!string.IsNullOrEmpty(shippingDate)) { <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> <dl class="grid gap-1 gap-sm-3 mb-0"> <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Delivery date")</dt> <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@shippingDateFormatted</dd> <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="@editStep" id="EditDeliveryDateButton"> <span class="text-uppercase">@Translate("Edit")</span> </button> </dd> </dl> </div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderStepSummaryOrderReference() { string orderReference = !string.IsNullOrWhiteSpace(GetString("Ecom:Order.Reference")) ? GetString("Ecom:Order.Reference") : "", editStep = "CartV2.GotoStep2"; if (!string.IsNullOrEmpty(orderReference)) { <div class="list-group-item py-2 fs-7" style="background-color: rgba(var(--swift-foreground-color-rgb), 0.05)"> <dl class="grid gap-1 gap-sm-3 mb-0"> <dt class="g-col-8 g-col-sm-4 fw-normal">@Translate("Order reference")</dt> <dd class="g-col-12 g-col-sm-7 order-2 order-sm-1 mb-0">@orderReference</dd> <dd class="g-col-4 g-col-sm-1 order-1 order-sm-2 mb-0 text-end"> <button class="btn btn-small btn-link fs-8 p-0" type="submit" name="@editStep" id="EditorderReferenceButton"> <span class="text-uppercase">@Translate("Edit")</span> </button> </dd> </dl> </div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderSummarySidebar() { <div class="g-col-12 g-col-lg-4 py-2 p-3 p-lg-4 p-xl-5" id="summarySidebar"> @RenderOrderSummaryToggleButton() @RenderOrderSummaryContent() </div> return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderOrderSummaryContent() { <div class="d-lg-block h-lg-auto collapse pt-2 pt-lg-0" id="orderSummary"> <div class="d-flex flex-column gap-2 gap-lg-3 pb-2 pb-lg-3"> @foreach (LoopItem orderline in GetLoop("OrderLines")) { @RenderOrderSummaryOrderLineItem(orderline) } </div> @RenderOrderSummary() </div> return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using Dynamicweb.Ecommerce.ProductCatalog 3 4 @functions { 5 6 private static string GetPrimaryImage(LoopItem orderline, string shopId) 7 { 8 bool isProduct = orderline.GetBoolean("Ecom:Order:OrderLine.IsProduct") || (orderline.GetInteger("Ecom:Order:OrderLine.Type") == 3 && !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductNumber"))); 9 string productId = orderline.GetString("Ecom:Order:OrderLine.ProductID"); 10 string variantId = orderline.GetString("Ecom:Order:OrderLine.ProductVariantID"); 11 12 if (!isProduct || string.IsNullOrEmpty(productId)) return ""; 13 14 ProductViewModelSettings productSetting = new ProductViewModelSettings 15 { 16 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 17 CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code, 18 CountryCode = Dynamicweb.Ecommerce.Common.Context.Country.Code2, 19 ShopId = shopId 20 }; 21 ProductViewModel product = ViewModelFactory.CreateView(productSetting, productId, variantId); 22 return product.DefaultImage.Value; 23 } 24 25 26 string RenderOrderSummaryOrderLineItem(LoopItem orderline) 27 { 28 29 string name = orderline.GetString("Ecom:Order:OrderLine.ProductName"); 30 // string image = "/Admin/Public/GetImage.ashx?width=" + 180 + "&height=" + 180 + "&crop=5&fillcanvas=true&Background=ffffff&image=" + orderline.GetString("Ecom:Product.PrimaryImage") + "&format=webp"; 31 32 string image = "/Admin/Public/GetImage.ashx?width=" + 180 + "&height=" + 180 + "&image=" + orderline.GetString("Ecom:Product.PrimaryImage") + "&format=webp"; 33 34 35 string removeFromBasketLink = orderline.GetString("Ecom:Order:OrderLine.DeleteLink"); 36 string priceTotalWithDiscounts = orderline.GetString("Ecom:Order:OrderLine.TotalPriceWithProductDiscounts.PriceFormatted"); 37 string priceBefore = orderline.GetString("Ecom:Product.InformativePrice.PriceFormatted"); 38 string unitPrice = orderline.GetString("Ecom:Order:OrderLine.UnitPrice.PriceFormatted"); 39 string discountPrice = orderline.GetString("Ecom:Order:OrderLine.UnitPriceWithProductDiscount.PriceFormatted"); 40 string discountTotal = orderline.GetString("Ecom:Order:OrderLine.TotalDiscount.PriceFormatted"); 41 string variantText = orderline.GetString("Ecom:Order:OrderLine.ProductVariantText"); 42 var orderlineId = orderline.GetValue("Ecom:Order:OrderLine.Id"); 43 var quantity = orderline.GetDouble("Ecom:Order:OrderLine.Quantity"); 44 var unitName = orderline.GetString("Ecom:Order:OrderLine.UnitName"); 45 string primaryGroupId = orderline.GetString("Ecom:Order:OrderLine.PrimaryOrDefaultGroupId"); 46 string productId = orderline.GetString("Ecom:Order:OrderLine.ProductID"); 47 string variantId = orderline.GetString("Ecom:Order:OrderLine.ProductVariantID"); 48 49 string link = "Default.aspx?ID=" + GetPageIdByNavigationTag("Shop"); 50 link += $"&GroupID={primaryGroupId}"; 51 link += $"&ProductID={productId}"; 52 link += !string.IsNullOrEmpty(variantId) ? $"&VariantID={variantId}" : ""; 53 54 bool isProduct = orderline.GetBoolean("Ecom:Order:OrderLine.IsProduct") || (orderline.GetInteger("Ecom:Order:OrderLine.Type") == 3 && !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductNumber"))); 55 56 if (isProduct) 57 { 58 <article class="grid grid-12"> 59 60 <div class="g-col-2"> 61 <a href="@link" class="ratio ratio-1x1 d-block " title="@name"> 62 <img src="@image" style="object-fit: contain;" alt="@name"> 63 </a> 64 </div> 65 66 <div class="g-col-10"> 67 68 <div class="d-flex flex-column gap-1"> 69 @* Title *@ 70 <h3 class="h6 fs-7 m-0"> 71 72 @orderline.GetString("Ecom:Product.PrimaryImage") 73 74 75 76 <a href="@link" class="text-decoration-none" title="@name">@name</a> 77 </h3> 78 79 @* Variants *@ 80 @if (!string.IsNullOrEmpty(variantText)) 81 { 82 <p class="fs-8 m-0">@variantText</p> 83 } 84 85 @if (orderline.GetInteger("Ecom:Order:OrderLine.Type") == 3 && !string.IsNullOrEmpty(orderline.GetString("Ecom:Order:OrderLine.ProductNumber"))) 86 { 87 @* Free product notice *@ 88 <p class="fs-8 m-0">@Translate("Free product")</p> 89 } 90 else 91 { 92 @* Unit price *@ 93 <p class="fs-8 m-0"> 94 @if (!string.IsNullOrEmpty(unitName)) 95 { 96 <span>@unitName: </span> 97 } 98 @if (discountPrice == unitPrice) 99 { 100 <span class="text-price">@unitPrice</span> 101 } 102 else 103 { 104 <span class="text-price">@discountPrice</span> 105 <span class="text-decoration-line-through"> 106 <span class="text-price">@unitPrice</span> 107 </span> 108 } 109 </p> 110 } 111 <div class="d-flex flex-row justify-content-between"> 112 @* Quantity *@ 113 <span class="fs-8 d-block">@Translate("Qty"): @quantity</span> 114 115 <div class="text-end flex-fill"> 116 @* Total *@ 117 <span class="h6 d-block fs-7 m-0"> 118 <span class="text-price">@priceTotalWithDiscounts</span> 119 </span> 120 @if (orderline.GetDouble("Ecom:Order:OrderLine.TotalDiscount.Price.Value") != 0.0) 121 { 122 <span class="d-block fs-8"> 123 <span class="text-price">@discountTotal</span> 124 </span> 125 } 126 </div> 127 </div> 128 </div> 129 </div> 130 </article> 131 } 132 133 return string.Empty; 134 } 135 } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderOrderSummary(bool renderVoucher = true) { double totalPriceWithoutOrderDiscountsFeesAndTaxesValue = GetDouble("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Value") + GetDouble("Ecom:Order.TotalProductDiscount.Price.Value"); var orderCurrency = Dynamicweb.Ecommerce.Services.Currencies.GetCurrency(GetString("Ecom:Order.Currency.Code")); string totalPriceWithoutOrderDiscountsFeesAndTaxes = Dynamicweb.Ecommerce.Services.Currencies.Format(orderCurrency, totalPriceWithoutOrderDiscountsFeesAndTaxesValue); string showPricesWithVat = Pageview.Area.EcomPricesWithVat.ToLower(); bool neverShowVat = string.IsNullOrEmpty(showPricesWithVat); bool disableVouchers = Pageview.CurrentParagraph.Item["DisableVouchers"] != null ? (Boolean)Pageview.CurrentParagraph.Item["DisableVouchers"] : false; <div class="d-flex flex-column gap-2 gap-lg-3 pb-3 bottom-0 sticky-receipt theme" id="orderSummaryFooter"> @if (renderVoucher && !disableVouchers && Pageview.CurrentParagraph.Item.SystemName != "Swift_QuoteCheckoutApp") { // @RenderVoucherForm() } <div class="fs-8 border-top pt-2 pt-lg-3"> @* Subtotal *@ <div class="d-flex justify-content-between fw-bold"> <span>@Translate("Subtotal")</span> <span class="text-end"> <span class="d-block"> @if (GetDouble("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.Price.Value") != totalPriceWithoutOrderDiscountsFeesAndTaxesValue) { <span class="text-price fw-normal text-decoration-line-through">@GetString("Ecom:Order.TotalPriceWithoutDiscountsFeesAndTaxes.PriceFormatted")</span> } <span class="text-price">@totalPriceWithoutOrderDiscountsFeesAndTaxes</span> </span> @if (!neverShowVat && showPricesWithVat == "false") { <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span> } else if (!neverShowVat) { <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span> } </span> </div> @* Discounts (only order discounts) *@ @foreach (LoopItem orderline in GetLoop("OrderLines")) { bool isDiscount = orderline.GetBoolean("Ecom:Order:OrderLine.IsDiscount"); bool isOrderDiscount = orderline.GetInteger("Ecom:Order:OrderLine.Type") == 1; if (isDiscount && isOrderDiscount) { <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> } } @* Delivery *@ @if (!string.IsNullOrEmpty(GetString("Ecom:Order.ShippingMethodID"))) { if (GetDouble("Ecom:Order.ShippingFee.Price.Value") != 0.0) { <div class="d-flex justify-content-between"> <span>@Translate("Delivery")</span> <span>@GetString("Ecom:Order.ShippingFee.PriceFormatted")</span> </div> } } else { <div class="d-flex justify-content-between"> <span>@Translate("Delivery")</span> <span>@Translate("Calculated in next step")</span> </div> } @* Payment *@ @if (!string.IsNullOrEmpty(GetString("Ecom:Order.PaymentMethodID"))) { if (GetDouble("Ecom:Order.PaymentFee.Price.Value") != 0) { <div class="d-flex justify-content-between"> <span>@Translate("Payment")</span> <span class="text-price">@GetString("Ecom:Order.PaymentFee.PriceFormatted")</span> </div> } } else { <div class="d-flex justify-content-between"> <span>@Translate("Payment")</span> <span>@Translate("Calculated in next step")</span> </div> } @* Taxes *@ @if (GetDouble("Ecom:Order.Taxes.Total.Price.Value") != 0) { <div class="d-flex justify-content-between mb-2"> <span>@Translate("Sales tax")</span> <span>@GetString("Ecom:Order.Taxes.Total.PriceFormatted")</span> </div> } </div> <div class="fs-8 border-top pt-2 pt-lg-3"> <div class="d-flex justify-content-between fs-6 fw-bold"> <span>@Translate("Total")</span> @if (!neverShowVat && showPricesWithVat == "false") { <span class="text-price text-end"> <span class="fs-5 d-block">@GetString("Ecom:Order.Price.PriceFormatted")</span> <span class="fs-8 fw-normal d-block">@Translate("Excl. VAT")</span> </span> } else if (!neverShowVat && showPricesWithVat == "true") { <span class="text-price text-end"> <span class="fs-5 d-block">@GetString("Ecom:Order.Price.PriceFormatted")</span> <span class="fs-8 fw-normal d-block">@Translate("Incl. VAT")</span> </span> } else { <span class="text-price fs-5">@GetString("Ecom:Order.Price.PriceFormatted")</span> } </div> @if (!neverShowVat) { <div class="d-flex justify-content-between"><span>@Translate("VAT")</span><span class="text-price">@GetString("Ecom:Order.Price.VATFormatted")</span></div> if (showPricesWithVat == "false") { <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> } } @if (GetDouble("Ecom:Order.TotalDiscount.Price.Value") != 0) { <div class="d-flex justify-content-between"><span>@Translate("Discount")</span><span class="text-price">@GetString("Ecom:Order.TotalDiscount.PriceFormatted")</span></div> } </div> </div> return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @using Dynamicweb.Ecommerce.Orders @functions { string RenderVoucherForm() { string iconPath = "/Files/Templates/Designs/Swift/Assets/icons/"; string voucherCode = GetString("Ecom:Order.Customer.VoucherCode"); string voucherCodeError = GetString("Ecom:Cart.ValidationError.EcomOrderVoucherCode.ErrorMessage"); var errors = new List<string>(); string validState = ""; bool vouchersAppliedAsDiscounts = false; IEnumerable<string> codes = new List<string>(); Order order = new OrderService().GetById(GetString("Ecom:Order.ID")); if (!string.IsNullOrWhiteSpace(voucherCode)) { if (order.VoucherUseType.HasFlag(VoucherUseCategoryType.Discount)) { codes = voucherCode.Split(new string[] { ",", ";", " " }, StringSplitOptions.RemoveEmptyEntries); vouchersAppliedAsDiscounts = true; } else { codes = new string[] { voucherCode.Trim() }; } } if (!vouchersAppliedAsDiscounts) { foreach (string code in codes) { Dynamicweb.Ecommerce.Orders.Vouchers.Voucher vouch = Dynamicweb.Ecommerce.Services.Vouchers.GetVoucherByCode(code); if (vouch == null) { validState = "is-invalid"; errors.Add(Translate("Voucher") + " <span class='fw-bold'>" + code + "</span> " + Translate("not found")); continue; } if (vouch.DateUsed.HasValue) { validState = "is-invalid"; errors.Add(Translate("Voucher") + " <span class='fw-bold'>" + code + "</span> " + Translate("already used")); continue; } } } <div class="py-3 border-top" id="orderVoucherForm"> <form method="post" id="VoucherForm"> <div class="input-group input-primary-button-group has-validation"> <input type="text" class="form-control @(validState)" name="EcomOrderVoucherCodeField" placeholder="@Translate("Add voucher here")" id="EcomOrderVoucherCodeField" value="" aria-label="@Translate("Voucher input")" onkeyup="document.querySelector('#EcomOrderVoucherCode').value = this.value;"> <button class="btn btn-sm btn-primary d-inline-flex align-items-center justify-content-center" type="submit" id="EcomOrderVoucherApply" style="min-width: 100px;"> <span>@Translate("Apply")</span> </button> <div class="invalid-feedback"> @{ var errorMessage = string.Join(",", errors); } @errorMessage </div> </div> <input type="hidden" name="EcomOrderVoucherCode" id="EcomOrderVoucherCode" value="@voucherCode"> <label for="EcomOrderVoucherCodeField" class="visually-hidden">@Translate("Add voucher here")</label> </form> @if (!string.IsNullOrWhiteSpace(voucherCode) && vouchersAppliedAsDiscounts) { <div class="d-flex flex-wrap gap-2 pt-3"> @foreach (string code in codes) { <form method="post"> <input type="hidden" name="EcomOrderVoucherCode" value="@voucherCode.Replace(code + ",", "").Replace("," + code, "").Replace(code, "")"> <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);"> <span class="icon-2"> @ReadFile(iconPath + "tag.svg") </span> <span class="mx-2">@code</span> <button type="submit" class="text-reset bg-transparent border-0 p-0" aria-label="@Translate("Remove voucher")" id="RemoveVoucherButton"> <span class="icon-2"> @ReadFile(iconPath + "x.svg") </span> </button> </span> </form> } </div> } @voucherCodeError </div> return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderOrderSummaryToggleButton() { string iconPath = "/Files/Icons/"; <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"> <span class="d-flex align-items-center justify-content-between"> <span class="d-flex align-items-center gap-2"> <span class="fs-7 lh-1"> <span class="toggle-order-summary-text" id="OrderSummaryToggleButtonLabel">@Translate("Show order summary")</span> </span> <span class="icon-2" id="OrderSummaryToggleButtonIcon" style="transition: all 0.25s ease-in-out;"> @ReadFile(iconPath + "chevron-down.svg") </span> </span> <span class="fw-bold"><span class="text-price">@GetString("Ecom:Order.Price")</span> </span> </span> </button> <script> const orderSummaryToggleButton = document.getElementById("OrderSummaryToggleButton"); const orderSummaryToggleButtonLabel = document.getElementById("OrderSummaryToggleButtonLabel"); const orderSummaryToggleButtonIcon = document.getElementById("OrderSummaryToggleButtonIcon"); const orderSummaryToggleText = '@Translate("Show order summary")'; orderSummaryToggleButton.addEventListener('click', function handleClick() { if (orderSummaryToggleButtonLabel.textContent.toLowerCase().includes(orderSummaryToggleText.toLowerCase())) { orderSummaryToggleButtonLabel.textContent = '@Translate("Hide order summary")'; orderSummaryToggleButtonIcon.classList.add("rotate-180"); } else { orderSummaryToggleButtonLabel.textContent = orderSummaryToggleText; orderSummaryToggleButtonIcon.classList.remove("rotate-180"); } }); </script> return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions { string RenderStepsNavigation() { string iconPath = "/Files/Templates/Designs/Swift/Assets/icons/"; int currentStep = 1; string nextButtonName = Translate("Next"); string previousButtonName = Translate("Back"); bool isPaymentStep = GetLoop("StepButtons").Count == 0; bool isErpConnectionDown = !Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsWebServiceConnectionAvailable"]); string erpDownCartBehavior = Pageview.AreaSettings.GetRawValueString("ErpDownCartBehavior", "none"); foreach (LoopItem step in GetLoop("StepButtons")) { if (step.GetBoolean("Step.Current")) { currentStep = step.GetInteger("Step.Number"); } if (step.GetInteger("Step.Number") == currentStep + 1) { nextButtonName = Translate(step.GetString("Step.Name")); } if (step.GetInteger("Step.Number") == currentStep + step.GetInteger("Step.Index")) { previousButtonName = Translate("Back to") + " " + Translate(step.GetString("Step.Name")); } } if (currentStep == GetLoop("StepButtons").Count - 1 && Pageview.CurrentParagraph.Item.SystemName != "Swift_QuoteCheckoutApp") { nextButtonName = Translate("Place Order"); @RenderTermsAndConditionsCheckbox() } else if (isPaymentStep) { nextButtonName = Translate("Pay"); } <div class="mt-4 d-flex flex-column flex-md-row justify-content-end gap-3 mt-lg-4" id="StepsNavigation"> @if (currentStep == 1) { var cartLink = $"Default.aspx?id={Pageview.CurrentParagraph.Page.Parent.ID}"; <a href="@cartLink" class="btn btn-link link-secondary text-decoration-none order-last order-md-first" id="BackToCartButton"> <div class="d-flex align-items-center justify-content-center position-relative"> <span class="icon-2 me-1 position-absolute position-md-static start-0"> @ReadFile(iconPath + "chevron-left.svg") </span> <span>@Translate("Back to cart")</span> </div> </a> } else { <button name="@GetString("CartV2.PreviousStepButtonName")" id="@GetString("CartV2.PreviousStepButtonName")" class="btn btn-link link-secondary text-decoration-none"> <div class="d-flex align-items-center justify-content-center position-relative"> <span class="icon-2 me-1 position-absolute position-md-static start-0"> @ReadFile(iconPath + "chevron-left.svg") </span> <span>@previousButtonName</span> </div> </button> } @if (!(currentStep == GetLoop("StepButtons").Count - 1 && isErpConnectionDown && erpDownCartBehavior == "disable")) { var buttonId = GetLoop("StepButtons").Count == 0 ? "PayButton" : GetString("CartV2.NextStepButtonName"); <button type="submit" name="@GetString("CartV2.NextStepButtonName")" id="@buttonId" class="btn btn-primary order-first order-md-last"> <div class="d-flex align-items-center justify-content-center position-relative"> <span>@nextButtonName</span> <span class="icon-2 ms-1 position-absolute position-md-static end-0"> @ReadFile(iconPath + "chevron-right.svg") </span> </div> </button> } else { <button class="btn btn-primary pe-none disabled">@Translate("Payment is temporarily disabled")</button> } <script> if (window.history.replaceState) { window.history.replaceState(null, null, window.location.href); } </script> </div> return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @functions{ string RenderTermsAndConditionsCheckbox() { string termsAndConditionsCheckboxValue = GetBoolean("Ecom:Order.Customer.Accepted").ToString(); string termsAndConditionsPageLink = Pageview.CurrentParagraph.Item["TermsAndConditionsPageLink"] != null ? Pageview.CurrentParagraph.Item["TermsAndConditionsPageLink"].ToString() : ""; if (!string.IsNullOrEmpty(termsAndConditionsPageLink)) { <div class="mt-4" id="TermsAndConditions"> <h3 class="fs-6 fw-normal mb-0">@Translate("Terms and conditions")</h3> <p class="fs-8 mb-3">@Translate("Agree to terms and conditions and that your informations are correct")</p> <div class="list-group"> <label class="list-group-item list-group-item-action d-flex justify-content-between" for="EcomOrderCustomerAccepted"> <span class="d-flex justify-content-between align-items-center gap-3"> <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> }> <span>@Translate("I accept the") <a href='@termsAndConditionsPageLink' target='_blank' rel='noopener' id="TermsAndConditionsButton">@Translate("terms and conditions")</a></span> </span> </label> </div> </div> } return string.Empty; } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @using System.Text.RegularExpressions @using System.Text @functions { public string RenderDeliveryAddressInline() { List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(GetString("Ecom:Order.Delivery.Country.Code")); var result = new StringBuilder(); foreach (List<string> addressLine in addressFormat) { for (var i = 0; i < addressLine.Count; i++) { addressLine[i] = Regex.Replace(addressLine[i], "{name}", GetString("Ecom:Order.Delivery.Name"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", GetString("Ecom:Order.Delivery.FirstName"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", GetString("Ecom:Order.Delivery.Surname"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{company}", GetString("Ecom:Order.Delivery.Company"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address1}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address2}", GetString("Ecom:Order.Delivery.Address2"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{zip}", GetString("Ecom:Order.Delivery.Zip"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{city}", GetString("Ecom:Order.Delivery.City"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", GetString("Ecom:Order.Delivery.Region"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{region}", GetDeliveryRegionName(), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", GetString("Ecom:Order.Delivery.Country.Code"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{country}", GetString("Ecom:Order.Delivery.Country"), RegexOptions.IgnoreCase); // Remove any bad placeholders the user may have submitted addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); } var completeLine = string.Join(string.Empty, addressLine.ToArray()); if (!string.IsNullOrWhiteSpace(completeLine)) { result.Append($"<span>{completeLine}</span>"); if (addressLine != addressFormat.Last()) { result.Append(" "); } } } return result.ToString(); } public string GetDeliveryAddressString() { List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(GetString("Ecom:Order.Delivery.Country.Code")); List<string> completeAddress = new List<string>(); foreach (var addressLine in addressFormat) { for (var i = 0; i < addressLine.Count; i++) { addressLine[i] = Regex.Replace(addressLine[i], "{name}", GetString("Ecom:Order.Delivery.Name"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", GetString("Ecom:Order.Delivery.FirstName"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", GetString("Ecom:Order.Delivery.LastName"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{company}", GetString("Ecom:Order.Delivery.Company"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address1}", GetString("Ecom:Order.Delivery.Address"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address2}", GetString("Ecom:Order.Delivery.Address2"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{zip}", GetString("Ecom:Order.Delivery.Zip"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{city}", GetString("Ecom:Order.Delivery.City"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", GetString("Ecom:Order.Delivery.Region"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{region}", GetDeliveryRegionName(), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", GetString("Ecom:Order.Delivery.Country.Code"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{country}", GetString("Ecom:Order.Delivery.Country"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{phone}", GetString("Ecom:Order.Delivery.Phone"), RegexOptions.IgnoreCase); // Remove any bad placeholders the user may have submitted addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); } var completeLine = string.Join(string.Empty, addressLine.ToArray()); if (!string.IsNullOrWhiteSpace(completeLine)) { completeAddress.Add(completeLine); } } return string.Join(", ", completeAddress.ToArray()); } public string GetDeliveryRegionName() { foreach (LoopItem region in GetLoop("DeliveryRegions")) { if (region.GetBoolean("Ecom:DeliveryRegion.IsDeliveryRegion")) { return region.GetString("Ecom:DeliveryRegion.Name"); } } return GetString("Ecom:Order.Delivery.Region"); } } @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> @using System.Collections.Generic @using System.Text.RegularExpressions @using Dynamicweb.Ecommerce.International @using System.Text @functions { public string RenderUserItemAddressInline(LoopItem address) { string regionCode = GetRegionCode(address.GetString("UserManagement:User.UserAddress.CountryCode"), address.GetString("UserManagement:User.UserAddress.State")); string regionName = GetRegionName(address.GetString("UserManagement:User.UserAddress.CountryCode"), address.GetString("UserManagement:User.UserAddress.State")); List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(address.GetString("UserManagement:User.UserAddress.CountryCode")); var result = new StringBuilder(); foreach (List<string> addressLine in addressFormat) { for (var i = 0; i < addressLine.Count; i++) { addressLine[i] = Regex.Replace(addressLine[i], "{name}", address.GetString("UserManagement:User.UserAddress.Name"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", address.GetString("UserManagement:User.UserAddress.FirstName"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", address.GetString("UserManagement:User.UserAddress.lastName"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{company}", address.GetString("UserManagement:User.UserAddress.Company"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address}", address.GetString("UserManagement:User.UserAddress.Address"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address1}", address.GetString("UserManagement:User.UserAddress.Address"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address2}", address.GetString("UserManagement:User.UserAddress.Address2"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{zip}", address.GetString("UserManagement:User.UserAddress.Zip"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{city}", address.GetString("UserManagement:User.UserAddress.City"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", regionCode, RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{region}", regionName, RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", address.GetString("UserManagement:User.UserAddress.Culture.CountryCode"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{country}", address.GetString("UserManagement:User.UserAddress.Culture.CountryName"), RegexOptions.IgnoreCase); // Remove any bad placeholders the user may have submitted addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); } var completeLine = string.Join(string.Empty, addressLine.ToArray()); if (!string.IsNullOrWhiteSpace(completeLine)) { result.Append($"<span>{completeLine}</span> "); } } return result.ToString(); } public string GetUserAddressString() { List<List<string>> addressFormat = Dynamicweb.Ecommerce.International.Country.GetDisplayAddress(GetString("UserManagement:User.CountryCode")); string regionCode = GetRegionCode(GetString("UserManagement:User.CountryCode"), GetString("UserManagement:User.State")); string regionName = GetRegionName(GetString("UserManagement:User.CountryCode"), GetString("UserManagement:User.State")); List<string> completeAddress = new List<string>(); foreach (var addressLine in addressFormat) { for (var i = 0; i < addressLine.Count; i++) { addressLine[i] = Regex.Replace(addressLine[i], "{name}", GetString("UserManagement:User.Name"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{firstName}", GetString("UserManagement:User.FirstName"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{lastName}", GetString("UserManagement:User.LastName"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{company}", GetString("UserManagement:User.Company"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address}", GetString("UserManagement:User.Address"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address1}", GetString("UserManagement:User.Address"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{address2}", GetString("UserManagement:User.Address2"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{zip}", GetString("UserManagement:User.Zip"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{city}", GetString("UserManagement:User.City"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{regionCode}", regionCode, RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{region}", regionName, RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{countryCode}", GetString("UserManagement:User.CountryCode"), RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{country}", GetString("UserManagement:User.Culture.CountryName"), RegexOptions.IgnoreCase); // Remove any bad placeholders the user may have submitted addressLine[i] = Regex.Replace(addressLine[i], "{phone}", "", RegexOptions.IgnoreCase); addressLine[i] = Regex.Replace(addressLine[i], "{email}", "", RegexOptions.IgnoreCase); } var completeLine = string.Join(string.Empty, addressLine.ToArray()); if (!string.IsNullOrWhiteSpace(completeLine)) { completeAddress.Add(completeLine); } } return string.Join(" ", completeAddress.ToArray()); } public string GetRegionName(string countryCode, string regionValue) { return GetRegionNameOrCode(countryCode, regionValue); } public string GetRegionCode(string countryCode, string regionValue) { return GetRegionNameOrCode(countryCode, regionValue, "code"); } public string GetRegionNameOrCode(string countryCode, string regionValue, string nameOrCode = "name") { CountryCollection allCountryRegions = Dynamicweb.Ecommerce.Services.Countries.GetRegions(countryCode); Country matchedRegion = allCountryRegions.FirstOrDefault(r => r.RegionCode == regionValue || r.GetName(Dynamicweb.Ecommerce.Common.Context.LanguageID) == regionValue); if (matchedRegion == null) return regionValue; return nameOrCode == "name" ? matchedRegion.GetName(Dynamicweb.Ecommerce.Common.Context.LanguageID) : matchedRegion.RegionCode; } }