Error executing template "Designs/juuls/eCom7/CartV2/Step/espresso-checkout.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_51a961399a2d4703a9969fc5a80fcae9.Execute() in D:\dynamicweb.net\Solutions\twodayco3\juulsvin.cloud.dynamicweb-cms.com\Files\Templates\Designs\juuls\eCom7\CartV2\Step\espresso-checkout.cshtml:line 28
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, 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 Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Co3.Espresso.Website.TemplateBases.Paragraphs.Module 2 @using System.Collections 3 @using System.Globalization 4 @using System.Web 5 @using Co3.Espresso.Base.Extensions 6 @using Co3.Espresso.Website.Models.FrontEnd.Settings 7 @using Co3.Espresso.Website.Services 8 @using Co3.Juuls.Website.Frontend.Helpers 9 @using Co3.Juuls.Website.Frontend.Models 10 @using Co3.Juuls.Website.Frontend.Models.Frontend.Ecommerce 11 @using Co3.Juuls.Website.Frontend.Models.Frontend.Settings 12 @using Co3.Juuls.Website.Frontend.Services 13 @using Dynamicweb.Ecommerce.Common 14 @using Dynamicweb.Ecommerce.Orders 15 @using Dynamicweb.Frontend 16 @using Dynamicweb.Modules 17 @using Dynamicweb.Security.UserManagement 18 @using Namotion.Reflection 19 @using OrderService = Dynamicweb.Ecommerce.Orders.OrderService 20 21 @{ 22 int orderLineCounter = 0; 23 string cartUrl = "/shop/cart"; 24 CultureInfo currencyCulture = new CultureInfo(Context.Currency.CultureInfo); 25 string orderContext = SiteContext.CurrentOrderContext(); 26 ShopType siteContext = SiteContext.CurrentSiteContext(); 27 User currentUser = User.GetCurrentUser(); 28 JuulsOrder juulsOrder = JuulsOrderService.Instance.GetJuulsOrder(new JuulsOrderSettings() 29 { 30 OrderId = Context.Cart.Id 31 }); 32 33 HttpContext.Current.Response.AddHeader("Location", "Checkout"); 34 35 if ( juulsOrder.OrderChangeInfo.Any() ) 36 { 37 HttpContext.Current.Response.Redirect(cartUrl); 38 } 39 40 } 41 42 <div class="row"> 43 <div class="col-12 mx-xl-auto"> 44 <div class="e-checkout js-e-checkout js-e-require"data-require="checkout" data-cart-url="@cartUrl"> 45 <form class="e-checkout-form js-e-checkout-form initial-load" method="post"> 46 <input class="js-e-checkout-shipping-id-gls" name="EspressoGlsShippingMethodId" type="hidden" value="@Espresso.Item.GlsShippingMethodId"> 47 <input class="js-e-checkout-shipping-id-postnord" name="EspressoPostnordShippingMethodId" type="hidden" value="@Espresso.Item.PostnordShippingMethodId"> 48 <input type="hidden" name="EspressoContext" value="@orderContext"> 49 <div style="opacity:0;position: absolute;width: 1px;height: 1px;overflow: hidden;"> 50 <input type="checkbox" name="CustomIdVerificationIsOver18" checked="@(juulsOrder.DynamicwebOrder.GetOrderFieldValue<bool>("CustomIdVerificationIsOver18"))"> 51 </div> 52 @if (siteContext == ShopType.B2B) 53 { 54 string salesPersonEmail = currentUser.GetCustomFieldValue<string>("SalesMail"); 55 <input type="hidden" name="SalesPersonEmail" value="@salesPersonEmail"/> 56 57 if (string.IsNullOrEmpty(juulsOrder.DynamicwebOrder.CustomerEmail)) 58 { 59 <input type="hidden" name="EcomOrderCustomerEmail" value="@currentUser.Email"/> 60 } 61 } 62 63 64 <div class="no-gutters row"> 65 <div class="col-12 col-lg-8 mb-2 mb-lg-0"> 66 <div class="e-checkout-main js-e-checkout-main"> 67 <div class="card shadow-none small"> 68 <div id="e-checkout-steps"> 69 @if (siteContext == ShopType.B2B) 70 { 71 <div class="e-checkout-block-customer js-e-checkout-block-container" data-key="customer"> 72 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/b2b/part-customer.cshtml", juulsOrder) 73 </div> 74 <div class="e-checkout-block-shipping js-e-checkout-block-container" data-key="shipping"> 75 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/b2b/part-shipping.cshtml", juulsOrder) 76 </div> 77 <div class="e-checkout-block-payment js-e-checkout-block-container" data-key="payment"> 78 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/b2b/part-payment.cshtml", juulsOrder) 79 </div> 80 <div class="e-checkout-block-payment js-e-checkout-block-container" data-key="information"> 81 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/b2b/part-information.cshtml", juulsOrder) 82 </div> 83 } 84 else 85 { 86 <div class="mb-2 js-e-checkout-block-container" data-key="verification"> 87 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/part-age-verification.cshtml", juulsOrder) 88 </div> 89 <div class="e-checkout-block-customer js-e-checkout-block-container" data-key="customer"> 90 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/b2c/part-customer.cshtml", juulsOrder) 91 </div> 92 <div class="e-checkout-block-shipping js-e-checkout-block-container" data-key="shipping"> 93 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/b2c/part-shipping.cshtml", juulsOrder) 94 </div> 95 <div class="e-checkout-block-payment js-e-checkout-block-container" data-key="payment"> 96 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/b2c/part-payment.cshtml", juulsOrder) 97 </div> 98 <div class="mb-2 js-e-checkout-block-container" data-key="verification"> 99 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/part-age-verification.cshtml", juulsOrder) 100 </div> 101102 } 103 </div> 104 </div> 105 </div> 106 <div class="e-loading-overlay js-e-loading-overlay"> 107 @RenderingService.Instance.PartialView("_partials/loading-spinner.cshtml") 108 </div> 109 </div> 110111 <div class="col-12 col-lg-4 pl-lg-2"> 112 <div class="e-checkout-aside js-e-checkout-aside border"> 113 <div class="card small"> 114 <div class="card-header bg-white"> 115 <h3>@Translate("eCom Checkout - Your Order - Heading", "Your order")</h3> 116 </div> 117 <div class="card-body bg-white pt-0"> 118 <div class="js-e-cart-block-container" data-key="orderSummery"> 119 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/part-order-summery.cshtml", juulsOrder) 120 </div> 121 <hr> 122 <div class="e-checkout-block-approve-aside js-e-checkout-block-container" data-key="approve"> 123 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/part-approve.cshtml", juulsOrder) 124 </div> 125 <div class="js-e-cart-block-container" data-key="orderlineSummery"> 126 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/part-orderlines-summery.cshtml", juulsOrder) 127 </div> 128 </div> 129 </div> 130 </div> 131 <div class="e-loading-overlay js-e-loading-overlay"> 132 @RenderingService.Instance.PartialView("_partials/loading-spinner.cshtml") 133 </div> 134 </div> 135 </div> 136 <div class="no-gutters row part-approve-sticky"> 137 <div class="col-12 col-lg-4 pl-lg-2 offset-lg-8"> 138 <div class="alert alert-dismissible mb-0 alert-danger bg-white juuls-checkout-error-box js-juuls-checkout-error-box small d-none" role="alert"> 139 <h4> 140 <i class="material-icons">error</i> Du mangler at udfylde følgende felter: 141 </h4> 142 <ul class="mb-0"></ul> 143 <button type="button" class="close" data-dismiss="alert" aria-label="Close"> 144 <span aria-hidden="true">&times;</span> 145 </button> 146 </div> 147 </div> 148 <div class="col-12 mb-2 mb-lg-0"> 149 <div class="e-checkout-block-approve js-e-checkout-block-container" data-key="approve"> 150 <div class="e-checkout-step-form border"> 151 <div class="form-group mr-auto checkout-back-link"> 152 <a class="btn btn-secondary px-4" href="@cartUrl"> 153 <i class="material-icons ml-1">west</i>@Translate("eCom Checkout - Edit cart - link", "Edit cart") 154 </a> 155 </div> 156 <div class="form-group"> 157 <div class="form-check m-0"> 158 <label class="form-check-label e-checkout-customer-accept-label" for="EcomOrderCustomerAccepted2"> 159 <input class="form-check-input js-e-checkout-customer-accept mr-1 required" id="EcomOrderCustomerAccepted2" name="EcomOrderCustomerAccepted2" type="checkbox" value="1"> @Translate("eCom Checkout Approve - Customer Accept - Text", "I accept the") <a data-target=".modal.e-checkout-modal-term-and-conditions" data-toggle="modal" tabindex> @Translate("eCom Checkout Approve - Customer Accept - Link", "terms and conditions")</a> 160 </label> 161 </div> 162 </div> 163 <div class="form-group mb-0 js-e-checkout-block-container" data-key="verificationBtn"> 164 @if (juulsOrder!=null &&((juulsOrder.ShouldAgeVerify() && juulsOrder.IsAgeVerified()) || !juulsOrder.ShouldAgeVerify())) 165 { 166 <button type="submit" name="CartV2.GotoStep1" class="btn btn-success btn-block arrow-right e-checkout-next-step px-4"> 167 @Translate("eCom Checkout Approve - Next - Button", "Checkout") <i class="material-icons ml-1">east</i> 168 </button> 169 } 170 else 171 { 172 <button type="button" class="btn btn-success btn-block arrow-right e-checkout-next-step px-4" data-toggle="popover" data-trigger="focus" data-placement="top" data-html="true" data-template="@(HttpUtility.HtmlAttributeEncode("<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><div class=\"popover-body small p-0\"></div></div>"))" data-content="@(HttpUtility.HtmlAttributeEncode(RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/part-age-verification.cshtml", juulsOrder)))"> 173 @Translate("eCom Checkout Approve - Next - Button", "Checkout") <i class="material-icons ml-1">east</i> 174 </button> 175 } 176177 </div> 178 </div> 179 </div> 180 </div> 181 </div> 182183 </form> 184185 @* <!-- MODALS --> *@ 186 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/part-terms-and-conditions-modal.cshtml") 187 @RenderingService.Instance.PartialView("eCom7/CartV2/Step/partials/part-opening-hours-modal.cshtml") 188189190 </div> 191 </div> 192 </div> 193194 <script> 195 var objVirtualPageview = { 196 'event': 'VirtualPageview', 197 'vpevent': 'VirtualPageview', 198 'virtualPageURL': '/shop/cart/checkout?step=1 Checkout', 199 'virtualPageTitle': 'Order Step 1 Checkout', 200 'UserContext': '@siteContext.ToString()' 201 }; 202 if ( window.dataLayer !== undefined ) { 203 window.dataLayer.push( objVirtualPageview ); 204 // Note: GA3 'checkout' event removed – begin_checkout (GA4) is pushed below via objOrderlineItems 205 } 206207 var objOrderlineItems = { 208 event : 'begin_checkout', 209 ecommerce: { 210 currency: "@Context.Currency.Code", 211 value: @Double.Parse( juulsOrder.DynamicwebOrder.Price.Price.ToString(), NumberStyles.Currency, currencyCulture ).ToString( "f", CultureInfo.InvariantCulture ), 212 items: [ 213 @if (juulsOrder.DynamicwebOrder.ProductOrderLines.Any() == true) 214 { 215 foreach (OrderLine orderLine in juulsOrder.DynamicwebOrder.ProductOrderLines.Where(ol => ol.ProductId != "A" && ol.ProductId != "R" && ol.ProductId != "A MIXED")) 216 { 217 string parentGroupId = String.Empty; 218 string parentGroupName = String.Empty; 219 string groupId = String.Empty; 220 string groupName = String.Empty; 221222 parentGroupId = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(orderLine.Product.PrimaryGroupId).PrimaryParentGroupId; 223 parentGroupName = string.IsNullOrEmpty(parentGroupId) ? "" : Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(parentGroupId).Name; 224225 groupId = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(orderLine.Product.PrimaryGroupId).Id; 226 groupName = string.IsNullOrEmpty(groupId) ? "" : Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(groupId).Name; 227228 if (orderLineCounter > 0) 229 { 230 @Raw(",") 231 } 232 <text> 233 { 234 item_name: "@orderLine.Product.Name", 235 item_id: "@orderLine.Product.Number", 236 price: @Double.Parse(Co3.Juuls.Website.Frontend.Services.JuulsOrderService.Instance.GetJuulsOrderLineUnitPrice(juulsOrder, orderLine).Value.ToString(), NumberStyles.Currency, currencyCulture).ToString("f", CultureInfo.InvariantCulture), 237 item_category: "@parentGroupName", 238 item_category2: "@groupName", 239 quantity: @orderLine.Quantity 240 } 241 </text> 242243 orderLineCounter++; 244 } 245 } 246 ] 247 } 248 } 249250 dataLayer.push( objOrderlineItems ); 251252 // address_added tracking auto-initialiseres af juuls.datalayer.js (bundlet i default.js) 253254 </script> 255256 @{ 257 var orderlinesData = juulsOrder.DynamicwebOrder.ProductOrderLines.Select(ol => 258 { 259 return new 260 { 261 ProductID = ol.ProductId, 262 ProductName = ol.ProductName, 263 SKU = ol.ProductNumber, 264 ProductCategories = new string[] { ol.Product.Groups.FirstOrDefault(g => g.Id == ol.Product.PrimaryGroupId)?.Name }, 265 ImageURL = ProductService.Instance.GetImagePrimary(ol.Product), 266 ProductURL = ProductService.Instance.GetLink(ol.Product.PrimaryGroupId, ol.ProductId, ol.ProductVariantId), 267 ItemPrice = Co3.Espresso.Website.Services.OrderService.Instance.GetOrderLineUnitPrice(ol.Id).Value, 268 Quantity = ol.Quantity 269 }; 270 }); 271 IEnumerable<string> orderlineCategories = juulsOrder.DynamicwebOrder.ProductOrderLines.Select(ol => 272 { 273 var categoryName = ol.Product.Groups.FirstOrDefault(g => g.Id == ol.Product.PrimaryGroupId)?.Name; 274 return categoryName; 275 }); 276 } 277278 <script type="text/javascript"> 279 @{ 280 string baseUrl = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host; 281 } 282 var _learnq = _learnq || []; 283 _learnq.push(["track", "Started Checkout", { 284 "$event_id": "@juulsOrder.DynamicwebOrder.Id", 285 "$value": @PriceService.Instance.GetPrice(new PriceSettings() 286 { 287 Value = SiteContext.CurrentSiteContext() == ShopType.B2B ? juulsOrder.DynamicwebOrder.TotalPriceWithoutOrderDiscountsAndFees.PriceWithoutVAT : juulsOrder.DynamicwebOrder.TotalPriceWithoutOrderDiscountsAndFees.Price 288 }).Value.ToString("f", System.Globalization.CultureInfo.InvariantCulture), 289 "ItemNames": @JsonService.Instance.ToJson(juulsOrder.DynamicwebOrder.ProductOrderLines.Select(ol => ol.ProductName)), 290 "CheckoutURL": "@($"{baseUrl}/shop/cart/checkout")", 291 "Categories": @JsonService.Instance.ToJson(orderlineCategories), 292 "Items": @JsonService.Instance.ToJson(orderlinesData.ToArray()) 293 }]); 294 </script> 295296 <style> 297 .initial-load{ 298 .form-group{ 299300 input, label{ 301 cursor: wait; 302 pointer-events: none; 303 opacity: 1; 304 transition: opacity .5s ease; 305 animation: opacityPulse .5s infinite alternate; 306 } 307 &::after{ 308309 } 310 } 311312 } 313 @@keyframes opacityPulse { 314 0% { opacity:.5; } 315 100% { opacity:.8; } 316 } 317 </style>