Error executing template "/Designs/JVD_generated/Paragraph/JVD_Backorders.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at JVD.Tools.CreditSpace.GetCreditSpace() in C:\vso\JVD\BluedeskBaseSolution\JVD\JVD.Tools\CreditSpace.cs:line 20 at CompiledRazorTemplates.Dynamic.RazorEngine_7f3e41a1ae2147e1969bb55cbd6f046c.Execute() in D:\dynamicweb.net\Solutions\JVDgroup\Productie\files\Templates\Designs\JVD_generated\Paragraph\JVD_Backorders.cshtml:line 15 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 Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using Dynamicweb.Ecommerce.Orders; 3 @using Dynamicweb.Ecommerce.Products; 4 @using Dynamicweb.Ecommerce.Prices; 5 @using JVD.Tools; 6 @using JVD.Tools.Models; 7 8 @{ 9 string activeSortBy = Dynamicweb.Context.Current.Request.QueryString.Get("sortByField"); 10 string activeSortDirection = Dynamicweb.Context.Current.Request.QueryString.Get("sortDirection"); 11 12 List<Backorder> openBackorders = Backorders.GetAvailableBackorders(activeSortBy, activeSortDirection); 13 List<Backorder> closedBackorders = Backorders.GetClosedBackorders(activeSortBy, activeSortDirection); 14 15 CreditSpaceModel creditSpace = CreditSpace.GetCreditSpace(); 16 17 double backordersAvailable = creditSpace.BackordersAvailable; 18 double backordersNotReady = creditSpace.BackordersNotReady; 19 } 20 21 <style> 22 @@media screen and (min-width: 768px) { 23 .dashboard-table__col--sm { 24 flex-basis: 75px !important; 25 } 26 } 27 </style> 28 29 <div class="backorders"> 30 31 <div class="backorders__header"> 32 <div> 33 <h2 class="backorders__title">@Translate("Backorders.OpenBackorders.Title", "Available backorders")</h2> 34 <p class="backorders__total">@Translate("CreditSpace.AvailableForShipment", "Available for shipment") <span>@DoubleToPrice(backordersAvailable).PriceWithoutVATFormatted</span></p> 35 <p class="backorders__description">@Translate("Backorders.OpenBackorders.Description", "Duis id odio eu felis euismod aliquam vel vitae leo. In at ante lectus. Quisque ut rutrum nisl, sed varius turpis. Sed sit amet pulvinar ipsum. Etiam odio nunc, bibendum vel sodales eu, vehicula sed urna. Donec dictum faucibus mattis. Sed eros arcu, ultrices ut lectus ut, ultricies aliquet diam.")</p> 36 </div> 37 </div> 38 39 <div class="backorders__table"> 40 41 @if(openBackorders.Any()) 42 { 43 <div class="dashboard-table"> 44 <div class="dashboard-table__head dashboard-table__head--accent"> 45 <div class="dashboard-table__row"> 46 <div class="dashboard-table__col"> 47 <a href="[email protected]@getSortUrlParams("OrderLineProductNumber", activeSortBy, activeSortDirection)" class="dashboard-table__column-filterlink"> 48 <p>@Translate("Backorders.ArticleNr", "Article nr")</p> 49 @getSortingIcon("OrderLineProductNumber", activeSortBy, activeSortDirection) 50 </a> 51 </div> 52 <div class="dashboard-table__col dashboard-table__col--md"> 53 <a href="[email protected]@getSortUrlParams("OrderLineProductName", activeSortBy, activeSortDirection)" class="dashboard-table__column-filterlink"> 54 <p>@Translate("Backorders.Description", "Description")</p> 55 @getSortingIcon("OrderLineProductName", activeSortBy, activeSortDirection) 56 </a> 57 </div> 58 <div class="dashboard-table__col dashboard-table__col--sm"> 59 <p>@Translate("Backorders.Unit", "Unit")</p> 60 </div> 61 <div class="dashboard-table__col dashboard-table__col--sm"> 62 <p>@Translate("Backorders.Price", "Price")</p> 63 </div> 64 <div class="dashboard-table__col dashboard-table__col--sm"> 65 <p>@Translate("Backorders.Amount", "Amount")</p> 66 </div> 67 <div class="dashboard-table__col dashboard-table__col--sm"> 68 <p>@Translate("Backorders.Total", "Total")</p> 69 </div> 70 <div class="dashboard-table__col dashboard-table__col--md"> 71 <p>@Translate("Backorders.Status", "Status")</p> 72 </div> 73 <div class="dashboard-table__col"> 74 <a href="[email protected]@getSortUrlParams("OrderIntegrationOrderID", activeSortBy, activeSortDirection)" class="dashboard-table__column-filterlink"> 75 <p>@Translate("Backorders.OrderNr", "Order nr")</p> 76 @getSortingIcon("OrderIntegrationOrderID", activeSortBy, activeSortDirection) 77 </a> 78 </div> 79 <div class="dashboard-table__col"> 80 <a href="[email protected]@getSortUrlParams("OrderLineDate", activeSortBy, activeSortDirection)" class="dashboard-table__column-filterlink"> 81 <p>@Translate("Backorders.Date", "Date")</p> 82 @getSortingIcon("OrderLineDate", activeSortBy, activeSortDirection) 83 </a> 84 </div> 85 </div> 86 </div> 87 88 <div class="dashboard-table__body"> 89 @foreach(var i in openBackorders) 90 { 91 string articleNumber = i.OrderLineProductNumber; 92 string articleDescription = i.OrderLineProductName; 93 int articleUnit = i.OrderLineProductUnit; 94 double articleAmount = i.OrderLineQuantity; 95 string articleOrderNr = i.OrderIntegrationOrderID; 96 DateTime articleOrderDateValue = i.OrderLineDate; 97 string articleOrderDate = articleOrderDateValue.ToString("dd-MM-yyyy"); 98 var articleStatusText = i.visibleStatusText; 99 var articleStatusDescription = i.visibleStatusDescription; 100 var articleDeliveryStatus = i.visibleDeliveryStatus; 101 string articleUnitPrice = i.OrderLineUnitPriceWithoutVatInfo.PriceWithoutVATFormatted; 102 string articlePriceTotal = i.OrderLinePriceWithoutVatInfo.PriceWithoutVATFormatted; 103 var articleComment = i.OrderLineComment; 104 string stockType = i.ProductStockType; 105 106 <div class="dashboard-table__row"> 107 <div class="dashboard-table__col" data-title="@Translate("Backorders.ArticleNr", "Article nr")"> 108 <p> 109 @articleNumber 110 @if (stockType == "Non-Stock") 111 { 112 <span data-tippy-content='@Translate("Backorders.SpecialOrderToolTip", "This Product is a Special Order. This order cannot be cancelled.")'> 113 <i class="fal fa-info-circle"></i> 114 </span> 115 } 116 </p> 117 </div> 118 <div class="dashboard-table__col dashboard-table__col--md" data-title="@Translate("Backorders.Description", "Description")"> 119 <p>@articleDescription</p> 120 </div> 121 <div class="dashboard-table__col dashboard-table__col--sm" data-title="@Translate("Backorders.Unit", "Unit")"> 122 <p>@articleUnit</p> 123 </div> 124 <div class="dashboard-table__col dashboard-table__col--sm" data-title="@Translate("Backorders.Price", "Price")"> 125 <p>@articleUnitPrice</p> 126 </div> 127 <div class="dashboard-table__col dashboard-table__col--sm" data-title="@Translate("Backorders.Amount", "Amount")"> 128 <p>@articleAmount</p> 129 </div> 130 <div class="dashboard-table__col dashboard-table__col--sm" data-title="@Translate("Backorders.Total", "Total")"> 131 <p>@articlePriceTotal</p> 132 </div> 133 <div class="dashboard-table__col dashboard-table__col--md" data-title="@Translate("Backorders.Status", "Status")"> 134 <span> 135 @if (!string.IsNullOrWhiteSpace(articleDeliveryStatus.value)) 136 { 137 <span> 138 @string.Format(Translate(articleStatusText.key, articleStatusText.value), 139 string.Format(Translate(articleDeliveryStatus.key, articleDeliveryStatus.value), articleDeliveryStatus.date) 140 ) 141 </span> 142 } 143 else 144 { 145 <span> 146 @Translate(articleStatusText.key, articleStatusText.value) 147 </span> 148 } 149 150 <i class="fal fa-info-circle" data-tippy-content="@Translate(articleStatusDescription.key, articleStatusDescription.value)"> 151 </i> 152 </span> 153 </div> 154 <div class="dashboard-table__col" data-title="@Translate("Backorders.OrderNr", "Order nr")"> 155 <p>@articleOrderNr</p> 156 </div> 157 <div class="dashboard-table__col" data-title="@Translate("Backorders.Date", "Date")"> 158 <p>@articleOrderDate</p> 159 </div> 160 @if (!string.IsNullOrWhiteSpace(articleComment)) 161 { 162 <div class="dashboard-table__col dashboard-table__col--comment"> 163 <p><strong>@Translate("Backorders.Comment", "Comment")</strong></p> 164 <p>@(articleComment.Length > 255 ? articleComment.Substring(0, 255) : articleComment)</p> 165 </div> 166 } 167 </div> 168 } 169 </div> 170 </div> 171 } 172 else 173 { 174 <p>@Translate("Backorders.OpenBackorders.NotFound", "No open backorder found")</p> 175 } 176 </div> 177 178 <div class="backorders__header"> 179 <div> 180 <h2>@Translate("Backorders.ClosedBackorders.Title", "Closed backorders")</h2> 181 <p class="backorders__total">@Translate("CreditSpace.NotReadyForShipment", "Not ready for shipment") <span>@DoubleToPrice(backordersNotReady).PriceWithoutVATFormatted</span></p> 182 </div> 183 </div> 184 185 <div class="backorders__table"> 186 @if(closedBackorders.Any()) 187 { 188 <div class="dashboard-table"> 189 <div class="dashboard-table__head dashboard-table__head--accent"> 190 <div class="dashboard-table__row"> 191 <div class="dashboard-table__col"> 192 <a href="[email protected]@getSortUrlParams("OrderLineProductNumber", activeSortBy, activeSortDirection)" class="dashboard-table__column-filterlink"> 193 <p>@Translate("Backorders.ArticleNr", "Article nr")</p> 194 @getSortingIcon("OrderLineProductNumber", activeSortBy, activeSortDirection) 195 </a> 196 </div> 197 <div class="dashboard-table__col dashboard-table__col--md"> 198 <a href="[email protected]@getSortUrlParams("OrderLineProductName", activeSortBy, activeSortDirection)" class="dashboard-table__column-filterlink"> 199 <p>@Translate("Backorders.Description", "Description")</p> 200 @getSortingIcon("OrderLineProductName", activeSortBy, activeSortDirection) 201 </a> 202 </div> 203 <div class="dashboard-table__col dashboard-table__col--sm"> 204 <p>@Translate("Backorders.Unit", "Unit")</p> 205 </div> 206 <div class="dashboard-table__col dashboard-table__col--sm"> 207 <p>@Translate("Backorders.Price", "Price")</p> 208 </div> 209 <div class="dashboard-table__col dashboard-table__col--sm"> 210 <p>@Translate("Backorders.Amount", "Amount")</p> 211 </div> 212 <div class="dashboard-table__col dashboard-table__col--sm"> 213 <p>@Translate("Backorders.Total", "Total")</p> 214 </div> 215 <div class="dashboard-table__col dashboard-table__col--md"> 216 <p>@Translate("Backorders.Status", "Status")</p> 217 </div> 218 <div class="dashboard-table__col"> 219 <a href="[email protected]@getSortUrlParams("OrderIntegrationOrderID", activeSortBy, activeSortDirection)" class="dashboard-table__column-filterlink"> 220 <p>@Translate("Backorders.OrderNr", "Order nr")</p> 221 @getSortingIcon("OrderIntegrationOrderID", activeSortBy, activeSortDirection) 222 </a> 223 </div> 224 <div class="dashboard-table__col"> 225 <a href="[email protected]@getSortUrlParams("OrderLineDate", activeSortBy, activeSortDirection)" class="dashboard-table__column-filterlink"> 226 <p>@Translate("Backorders.Date", "Date")</p> 227 @getSortingIcon("OrderLineDate", activeSortBy, activeSortDirection) 228 </a> 229 </div> 230 </div> 231 </div> 232 233 <div class="dashboard-table__body"> 234 @foreach(var i in closedBackorders) 235 { 236 string articleNumber = i.OrderLineProductNumber; 237 string articleDescription = i.OrderLineProductName; 238 var productObj = Dynamicweb.Ecommerce.Services.Products.GetProductById(i.OrderLineProductId, i.OrderLineProductVariantId, Pageview.Area.EcomLanguageId); 239 int articleUnit = i.OrderLineProductUnit; 240 double articleAmount = i.OrderLineQuantity; 241 string articleOrderNr = i.OrderIntegrationOrderID; 242 DateTime articleOrderDateValue = i.OrderLineDate; 243 string articleOrderDate = articleOrderDateValue.ToString("dd-MM-yyyy"); 244 string expectedDeliveryDate = i.ExpectedDelivery?.ToString("dd-MM-yyyy"); 245 var articleStatusText = i.visibleStatusText; 246 var articleStatusDescription = i.visibleStatusDescription; 247 var articleDeliveryStatus = i.visibleDeliveryStatus; 248 string articleUnitPrice = i.OrderLineUnitPriceWithoutVatInfo.PriceWithoutVATFormatted; 249 string articlePriceTotal = i.OrderLinePriceWithoutVatInfo.PriceWithoutVATFormatted; 250 var articleComment = i.OrderLineComment; 251 string stockType = i.ProductStockType; 252 253 <div class="dashboard-table__row"> 254 <div class="dashboard-table__col" data-title="@Translate("Backorders.ArticleNr", "Article nr")"> 255 <p> 256 @articleNumber 257 @if (stockType == "Non-Stock") 258 { 259 <span data-tippy-content='@Translate("Backorders.SpecialOrderToolTip", "This Product is a Special Order. This order cannot be cancelled.")'> 260 <i class="fal fa-info-circle"></i> 261 </span> 262 } 263 </p> 264 </div> 265 <div class="dashboard-table__col dashboard-table__col--md" data-title="@Translate("Backorders.Description", "Description")"> 266 <p>@articleDescription</p> 267 </div> 268 <div class="dashboard-table__col dashboard-table__col--sm" data-title="@Translate("Backorders.Unit", "Unit")"> 269 <p>@articleUnit</p> 270 </div> 271 <div class="dashboard-table__col dashboard-table__col--sm" data-title="@Translate("Backorders.Unit", "Unit")"> 272 <p>@articleUnitPrice</p> 273 </div> 274 <div class="dashboard-table__col dashboard-table__col--sm" data-title="@Translate("Backorders.Amount", "Amount")"> 275 <p>@articleAmount</p> 276 </div> 277 <div class="dashboard-table__col dashboard-table__col--sm" data-title="@Translate("Backorders.Unit", "Unit")"> 278 <p>@articlePriceTotal</p> 279 </div> 280 <div class="dashboard-table__col dashboard-table__col--md" data-title="@Translate("Backorders.Status", "Status")"> 281 <span> 282 @if (!string.IsNullOrWhiteSpace(articleDeliveryStatus.value)) 283 { 284 <span> 285 @string.Format(Translate(articleStatusText.key, articleStatusText.value), 286 string.Format(Translate(articleDeliveryStatus.key, articleDeliveryStatus.value), articleDeliveryStatus.date) 287 ) 288 </span> 289 } 290 else 291 { 292 <span> 293 @Translate(articleStatusText.key, articleStatusText.value); 294 </span> 295 } 296 297 <i class="fal fa-info-circle" data-tippy-content="@Translate(articleStatusDescription.key, articleStatusDescription.value)"> 298 </i> 299 </span> 300 </div> 301 <div class="dashboard-table__col" data-title="@Translate("Backorders.OrderNr", "Order nr")"> 302 <p>@articleOrderNr</p> 303 </div> 304 <div class="dashboard-table__col" data-title="@Translate("Backorders.Date", "Date")"> 305 <p>@articleOrderDate</p> 306 </div> 307 @if (!string.IsNullOrWhiteSpace(articleComment)) 308 { 309 <div class="dashboard-table__col dashboard-table__col--comment"> 310 <p><strong>@Translate("Backorders.Comment", "Comment")</strong></p> 311 <p>@(articleComment.Length > 255 ? articleComment.Substring(0, 255) : articleComment)</p> 312 </div> 313 } 314 </div> 315 } 316 </div> 317 </div> 318 } 319 else 320 { 321 <p>@Translate("Backorders.ClosedBackorders.NotFound", "No closed backorder found")</p> 322 } 323 </div> 324 325 </div> 326 327 328 @functions { 329 string getSortingIcon(string sortBy, string activeSortBy, string activeSortDirection) 330 { 331 // return $"{@sortBy} | {activeSortBy} | {sortBy == activeSortBy}"; 332 if(sortBy != activeSortBy) 333 { 334 return $"<i class=\"fas fa-sort dashboard-table__sort-icon \"></i>"; 335 } 336 if(!string.IsNullOrWhiteSpace(activeSortDirection)) { 337 string sortIcon = activeSortDirection == "ASC" ? "fa-sort-up" : "fa-sort-down"; 338 return $"<i class=\"fas {sortIcon} dashboard-table__sort-icon dashboard-table__sort-icon--active \"></i>"; 339 } else { 340 return $"<i class=\"fas fa-sort-down dashboard-table__sort-icon \"></i>"; 341 } 342 } 343 344 string getSortUrlParams(string sortBy, string activeSortBy, string activeSortDirection) 345 { 346 string newSortDirection = sortBy == activeSortBy && activeSortDirection == "DESC" ? "&sortDirection=ASC" : "&sortDirection=DESC"; 347 if(sortBy == activeSortBy && activeSortDirection == "ASC") { 348 return ""; 349 } 350 return $"&sortByField={sortBy}{newSortDirection}"; 351 } 352 353 private PriceCalculated DoubleToPrice(double value) 354 { 355 var currency = Dynamicweb.Ecommerce.Services.Currencies.GetCurrency(Pageview.User.Currency) ?? Dynamicweb.Ecommerce.Common.Context.Currency; 356 PriceRaw raw = new PriceRaw(value, currency); 357 PriceCalculated calculated = PriceCalculated.Create(currency, Dynamicweb.Ecommerce.Common.Context.Country, raw); 358 calculated.Calculate(); 359 360 return calculated; 361 } 362 } 363