Error executing template "Designs/Tefcold/eCom/ProductCatalog/basic_Pim.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at Tefcold.Web.CustomCode.Razor.ProductViewModelExtensions.GetSpecifications(ProductViewModel product)
   at Tefcold.Web.CustomCode.Extensions.ProductExtensions.GetAsseccoriesList(ProductViewModel viewModel, String shopId)
   at CompiledRazorTemplates.Dynamic.RazorEngine_2da63e6facb5427c8d71f5f5d2420506.Execute() in E:\Solutions\Live\Tefcold.Web\Files\Templates\Designs\Tefcold\eCom\ProductCatalog\basic_Pim.cshtml:line 36
   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.b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @using System.Globalization 2 @using NLWI.Platforms.Dynamicweb9.Specs 3 @using NLWI.Core.Factory 4 @using System.Linq; 5 @using System.Text.RegularExpressions 6 @using Dynamicweb.Ecommerce.International 7 @using Dynamicweb.Ecommerce.ProductCatalog 8 @using Dynamicweb.Ecommerce.Products 9 @using Dynamicweb.Ecommerce.Stocks 10 @using Dynamicweb.Security.UserManagement 11 @using NORRIQ.Common8.Ecom 12 @using Newtonsoft.Json 13 @using Newtonsoft.Json.Serialization 14 @using NORRIQ.SalesPersonLogin.Services 15 @using NORRIQ.Seo.Canonical 16 @using Tefcold.Web.CustomCode.AsyncProductList.Models 17 @using Tefcold.Web.CustomCode.Extensions 18 @using Tefcold.Web.CustomCode.Items 19 @using Tefcold.Web.CustomCode.Items.Properties 20 @using Tefcold.Web.CustomCode.Items.Settings 21 @*@using Tefcold.Web.CustomCode.ProductHelper*@ 22 @using Tefcold.Web.CustomCode.Razor 23 @using Tefcold.Web.CustomCode.Stocks 24 @using Tefcold.Web.CustomCode.Stocks.Helpers 25 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Ecommerce.ProductCatalog.ProductViewModel> 26 @{ 27 var websiteSettings = Dynamicweb.Services.Items.GetItem(Pageview.Area.ItemType, Pageview.Area.ItemId) 28 .ToCodeFirstItem<Websites>(); 29 30 var stockInformation = StockLocationHelper.GetShopStockInformation(Pageview.ID); 31 32 //Dynamicweb.Ecommerce.Services.StockService.GetStockUnits("34024-at-SHOP2", ""); 33 //var stockInformation = StockLocationHelper.GetShopStockInformation(Pageview.ID); 34 var variantId = System.Web.HttpContext.Current.Request.QueryString["VariantID"]; 35 var selectedModel = (!string.IsNullOrEmpty(variantId) ? Model.Variants?.FirstOrDefault(a => string.Equals(a.VariantId, variantId)) : null) ?? Model; 36 var accessories = selectedModel.GetAsseccoriesList(Pageview.Area.EcomShopId); 37 var relatedProducts = Model.GetProductRelationGroup("Related Products");// Configuration 38 var perfionImageNames = new string[] { "PrimaryImage", "DetailImage1", "DetailImage2", "BrandedImage", "PackedImage", "OtherImages", "WithContentImage", "OpenImage", "ImageRange", "ImageOnLocation" }; 39 //var specsToList = new HashSet<string>() { "Fitting", "Features", "USP", "Gender", "Season", "Year" }; @*Leave empty for all *@ 40 41 var remoteStock = StockUnitHelper.GetRemoteStock(selectedModel, Pageview, websiteSettings.ExternalShopIds); 42 43 var inspirationGroupIds = websiteSettings.InspirationGroupIds ?? new List<string>(); 44 selectedModel.StockUnits = selectedModel.StockUnits.GetShopStocks(Pageview.Area.EcomShopId).ToList(); 45 46 var convertedSelectedModel = new AsyncProductWithSpecification(new SimpleProduct(selectedModel, null, stockInformation, inspirationGroupIds, true)); 47 convertedSelectedModel.Product.DefaultPrice.CurrencyCode = Pageview.Area.EcomCurrencyId; 48 var convertedMasterModel = new AsyncProductWithSpecification(new SimpleProduct(Model, null, stockInformation, inspirationGroupIds, true)); 49 50 var selectedJsonModel = JsonConvert.SerializeObject(convertedSelectedModel, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); 51 var selectedMasterProductModel = JsonConvert.SerializeObject(convertedMasterModel, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); 52 selectedMasterProductModel = selectedMasterProductModel.Replace("'", "&#39;"); 53 selectedJsonModel = selectedJsonModel.Replace("'", "&#39;"); 54 55 string asyncPrefix = "Async "; 56 var userInTefcoldUserGroup = ImpersonationService.IsCurrentlyImpersonating(); 57 FieldValueViewModel isSpareField; 58 selectedModel.ProductFields.TryGetValue("IsSparePart", out isSpareField); 59 var isSparePart = (bool)isSpareField.Value; 60 61 62 var isCZShop = Pageview.Area.EcomShopId.Equals("SHOP2", StringComparison.InvariantCultureIgnoreCase) || 63 Pageview.Area.EcomShopId.Equals("SHOP3", StringComparison.InvariantCultureIgnoreCase); 64 65 if (isSparePart) 66 { 67 68 Pageview.Meta.AddTag("robots", "noindex,nofollow"); 69 } 70 71 // Specs 72 var specs = ProductViewModelExtensions.GetSpecifications(selectedModel); 73 var images = perfionImageNames.SelectMany(a => specs.GetAllByKey(a)); 74 var imageAlt = specs.GetByKey("ProductName"); 75 76 var ecoIcon = specs.GetByKey("EcoIcon"); 77 78 var trueString = true.ToString().ToLower(); 79 80 string basicPimPrefix = "PDP "; 81 var languageId = Model.LanguageId; 82 83 var productService = ObjectFactory.GetInstance<ProductService>(); 84 LanguageService languageService = new LanguageService(); 85 //ProductFields 86 87 DateTime result; 88 string earliestHarborArrival = selectedModel.ProductFields.FirstOrDefault(f => f.Value.SystemName == "EarliestArrivalFromHarbor").Value?.Value?.ToString() ?? string.Empty; 89 90 if (DateTime.TryParseExact(earliestHarborArrival, "yyyy-mm-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) 91 { 92 var earliestArrivalTranslateString = Translate(basicPimPrefix + "stock arriving soon. Due", "Stock arriving soon. Due"); 93 earliestHarborArrival = result.ToString("dd/mm/yyyy"); 94 earliestHarborArrival = earliestArrivalTranslateString + " " + earliestHarborArrival; 95 } 96 97 //websiteSettings = Pageview.GetWebsiteSettings(); 98 string shortSellingText = specs.GetByKey("SellingTextShort")?.Value; 99 string energyArrow = specs.GetByKey("EnergyArrow")?.Value; 100 string energyLabel = specs.GetByKey("EnergyLabel")?.Value; 101 var marketingMessage = specs.GetByKey("MarketingMessage")?.Value; 102 string sticker = specs.GetByKey("Stickers")?.Value; 103 string stickerNews = specs.GetByKey("StickersDKNews")?.Value; 104 string stickerCz = specs.GetByKey("StickersCZ")?.Value; 105 string stickerCzNews = specs.GetByKey("StickersCZNews")?.Value; 106 string netVolumeEnergyRating = specs.GetByKey("NetVolumeEnergyRating")?.Value; 107 string totalDisplayArea = specs.GetByKey("TotalDisplayArea")?.Value; 108 var standardCustomer = Pageview.AreaSettings.GetString("StandardCustomer"); 109 standardCustomer = string.IsNullOrEmpty(standardCustomer) ? "" : standardCustomer; 110 string detailImage1Text = specs.GetByKey("DetailImage1Text")?.Value; 111 string detailImage2Text = specs.GetByKey("DetailImage2Text")?.Value; 112 } 113 <product-details-simple-pim :product='@selectedJsonModel' 114 :images='@Newtonsoft.Json.JsonConvert.SerializeObject(images.Select(a => a.Value))' 115 inline-template 116 language-id="@Model.LanguageId"> 117 <div class="basic_pim" v-bind:class="{'initialized': initialized }"> 118 <section class="basic_pim-pdp" itemscope="" itemtype="https://schema.org/Product"> 119 <div class="basic_pim-media"> 120 <div class="@(images.Count() > 1 ? "basic_pim-pictos thumbs" : "basic_pim-pictos")"> 121 <div class="stickers"> 122 @if (!isCZShop && !string.IsNullOrEmpty(stickerNews)) 123 { 124 <img src="/Admin/Public/GetImage.ashx?Height=58&amp;Compression=85&amp;Image=@stickerNews" alt="@Translate(basicPimPrefix + "Sticker", "Sticker")" class="img-fluid"/> 125 } 126 else if ((!isCZShop && !string.IsNullOrEmpty(sticker))) 127 { 128 <img src="/Admin/Public/GetImage.ashx?Height=58&amp;Compression=85&amp;Image=@sticker" alt="@Translate(basicPimPrefix + "Sticker", "Sticker")" class="img-fluid"/> 129 } 130 else if (isCZShop && !string.IsNullOrEmpty(stickerCzNews)) 131 { 132 <img src="/Admin/Public/GetImage.ashx?Height=40&amp;Compression=85&amp;Image=@stickerCzNews" alt="@Translate(basicPimPrefix + "Sticker", "Sticker")" class="img-fluid"/> 133 } 134 else if (isCZShop && !string.IsNullOrEmpty(stickerCz)) 135 { 136 <img src="/Admin/Public/GetImage.ashx?Height=40&amp;Compression=85&amp;Image=@stickerCz" alt="@Translate(basicPimPrefix + "Sticker", "Sticker")" class="img-fluid"/> 137 } 138 @if (websiteSettings.ShowPriceWitVatAndDiscount) 139 { 140 <span v-if="ShowDiscount" class="sticker discount"> 141 -{{discount}}% 142 </span> 143 } 144 145 </div> 146 @if (!string.IsNullOrEmpty(ecoIcon?.Value)) 147 { 148 <img src="@(ecoIcon?.Value)" alt="@Translate(basicPimPrefix + "eco product", "Eco product")" class="img-fluid" style="margin-left:auto;" /> 149 } 150 151 </div> 152 <gallery :items="images" 153 :index="index" 154 @@close="index = null"> 155 </gallery> 156 <template v-if="images.length > 1"> 157 <slick ref="slick" 158 class="basic_pim-thumbs" 159 id="pdp-thumbs" 160 :options="slickPimOptionsThumbs"> 161 <figure v-for="thumb in images" class="basic_pim-thumb"> 162 <img :src="'/Admin/Public/GetImage.ashx?Width=50&amp;Height=50&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;fillcanvas=True&amp;Image=' + thumb" 163 alt="@selectedModel.Name" 164 class="img-fluid" /> 165 </figure> 166 </slick> 167 <slick ref="slick" 168 class="basic_pim-images" 169 id="pdp-images" 170 :options="slickPimOptionsImages"> 171 <figure class="basic_pim-image" 172 v-for="(image, imageIndex) in images" 173 :key="imageIndex" 174 @@click="setIndex(imageIndex)" 175 title="@Translate(basicPimPrefix + "show image", "Show image")"> 176 <picture> 177 <source media="(max-width:767.98px)" :srcset="'/Admin/Public/GetImage.ashx?Width=400&amp;Height=400&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;fillcanvas=True&amp;Image=' + image"> 178 <source media="(max-width:991.98px)" :srcset="'/Admin/Public/GetImage.ashx?Width=530&amp;Height=530&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;fillcanvas=True&amp;Image=' + image"> 179 <img :src="'/Admin/Public/GetImage.ashx?Width=530&amp;Height=530&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;fillcanvas=True&amp;Image=' + image" 180 alt="@selectedModel.Name" 181 class="img-fluid" 182 itemprop="image" /> 183 </picture> 184 @if (!string.IsNullOrEmpty(detailImage1Text) || !string.IsNullOrEmpty(detailImage2Text)) 185 { 186 <figcaption class="alert bg-white" v-if="imageIndex < 3"> 187 @if (!string.IsNullOrEmpty(detailImage1Text)) 188 { 189 <template v-if="imageIndex == 1"> 190 @detailImage1Text 191 </template> 192 } 193 @if (!string.IsNullOrEmpty(detailImage2Text)) 194 { 195 <template v-if="imageIndex == 2"> 196 @detailImage2Text 197 </template> 198 } 199 </figcaption> 200 } 201 </figure> 202 </slick> 203 </template> 204 <template v-if="images.length == 1"> 205 <div class="basic_pim-images"> 206 <figure class="basic_pim-image" 207 v-for="(image, imageIndex) in images" 208 :key="imageIndex" 209 @@click="setIndex(imageIndex)" 210 title="@Translate(basicPimPrefix + "show image", "Show image")"> 211 <picture> 212 <source media="(max-width:767.98px)" :srcset="'/Admin/Public/GetImage.ashx?Width=300&amp;Height=250&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;fillcanvas=True&amp;Image=' + image"> 213 <source media="(max-width:991.98px)" :srcset="'/Admin/Public/GetImage.ashx?Width=400&amp;Height=350&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;fillcanvas=True&amp;Image=' + image"> 214 <img :src="'/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;fillcanvas=True&amp;Image=' + image" 215 alt="@selectedModel.Name" 216 class="img-fluid" 217 itemprop="image"> 218 </picture> 219 @if (!string.IsNullOrEmpty(detailImage1Text) || !string.IsNullOrEmpty(detailImage2Text)) 220 { 221 <figcaption class="alert bg-white"> 222 @if (!string.IsNullOrEmpty(detailImage1Text)) 223 { 224 <template v-if="imageIndex == 1"> 225 @detailImage1Text 226 </template> 227 } 228 @if (!string.IsNullOrEmpty(detailImage2Text)) 229 { 230 <template v-if="imageIndex == 2"> 231 @detailImage2Text 232 </template> 233 } 234 </figcaption> 235 } 236 </figure> 237 </div> 238 </template> 239 <template v-if="images.length == 0"> 240 @{ 241 var pdpImage = "/Files/Images/default.jpg"; 242 } 243 <div class="basic_pim-image"> 244 <picture class="basic_pim-image"> 245 <source media="(max-width:1199.98px)" srcset="/Admin/Public/GetImage.ashx?Width=630&amp;Height=630&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;Image=@(pdpImage)"> 246 <source media="(max-width:991.98px)" srcset="/Admin/Public/GetImage.ashx?Width=530&amp;Height=530&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;Image=@(pdpImage)"> 247 <source media="(max-width:767.98px)" srcset="/Admin/Public/GetImage.ashx?Width=400&amp;Height=400&amp;Compression=85&amp;Crop=5&amp;Format=webp&amp;Quality=85&amp;Image=@(pdpImage)"> 248 <img src="@(pdpImage)" 249 alt="@Translate(basicPimPrefix + "No product picture", "No product picture")" 250 class="img-fluid" 251 itemprop="image"> 252 </picture> 253 </div> 254 </template> 255 </div> 256 <div class="basic_pim-content"> 257 <header> 258 <h1 itemprop="name"> 259 @selectedModel.Name 260 </h1> 261 <p itemprop="category">@(selectedModel?.ShortDescription ?? "")</p> 262 </header> 263 @if (specs.GetAllByKey("BulletPoints").Any()) 264 { 265 <ul class="basic_pim-specs"> 266 @foreach (var bp in specs.GetAllByKey("BulletPoints")) 267 { 268 <li> 269 @bp.Value 270 </li> 271 } 272 </ul> 273 } 274 275 @* 276 <template name="item-stock-state" v-if="stockLocationState!=0"> 277 <p :class="'stock out-of-stock'" v-if="stockLocationState==5"> 278 <link itemprop="availability" href="http://schema.org/SoldOut" /> 279 @Translate(asyncPrefix + "Out Of Stock", "Out Of Stock") 280 </p> 281 <p :class="'stock few-in-stock'" v-if="stockLocationState==7"> 282 <link itemprop="availability" href="http://schema.org/LimitedAvailability" /> 283 @Translate(asyncPrefix + "Few In Stock", "Few In Stock") 284 </p> 285 <p :class="'stock in-stock'" v-if="stockLocationState==8"> 286 <link itemprop="availability" href="http://schema.org/InStock" /> 287 @Translate(asyncPrefix + "In Stock", "In Stock") 288 </p> 289 </template> 290 *@ 291 292 @if (!string.IsNullOrEmpty(marketingMessage) && Pageview.IsCurrentlyB2B()) 293 { 294 <span class="basic_pim-marketing-message">@marketingMessage</span> 295 } 296 297 @if (Pageview.IsAllowedToShop()) 298 { 299 <stock-location-component inline-template :remote-stock-shop-ids='@JsonConvert.SerializeObject(websiteSettings.ExternalShopIds)' not-in-stock-text="@Translate(basicPimPrefix + "not in stock text", "N/A")" :default-stock-units='product.product.stockUnits' :default-remote-stock-units='@Newtonsoft.Json.JsonConvert.SerializeObject(remoteStock)' :product='product' earliest-harbor-arrival-date="@earliestHarborArrival"> 300 <div class="basic_pim-stocks"> 301 <template v-if="stockUnits.length > 0 && !loading"> 302 <div v-for="unit in stockUnits" class="custom-control custom-radio"> 303 <span style="font-size: 1px">{{unit.quantity}}</span> 304 <input type="radio" v-model="selectedVal" name="stocks" :id="unit.stockLocation.name" :value="unit.stockLocation.name" class="custom-control-input" :disabled="unit.quantity <=0 || getStockLocation!=''" :checked="getStockLocation == unit.stockLocation.name"> 305 <label v-if="!@userInTefcoldUserGroup.ToString().ToLower()" :for="unit.stockLocation.name" class="custom-control-label">{{ unit.stockLocation.description }} {{ GetStockAmountString(unit.quantity) }} @Translate("PDP In Stock", "In Stock")</label> 306 <label v-else :for="unit.stockLocation.name" class="custom-control-label">{{ unit.stockLocation.description }} {{ unit.quantity }} @Translate("PDP In Stock", "In Stock")</label> 307 </div> 308 </template> 309 <template v-if="stocksHasNoQuantity"> 310 <div class="custom-control custom-radio">{{earliestHarborArrivalDate}}</div> 311 </template> 312 <template v-else-if="loading"> 313 <span class="spinner-sm-default"></span> 314 </template> 315 <template v-if="remoteStockUnits.length > 0 && !loading"> 316 <div v-for="unit in remoteStockUnits" class="custom-control custom-radio"> 317 <span style="font-size: 1px">{{unit.Quantity}}</span> 318 <input type="radio" v-model="selectedVal" name="stocks" :id="unit.StockLocation.Description" :value="unit.StockLocation.Description" class="custom-control-input" :disabled="true"> 319 <label v-if="!@userInTefcoldUserGroup.ToString().ToLower()" :for="unit.StockLocation.Description" class="custom-control-label">{{ unit.StockLocation.Description }} {{ GetStockAmountString(unit.Quantity) }} @Translate("PDP In Stock", "In Stock")</label> 320 <label v-else :for="unit.StockLocation.Description" class="custom-control-label">{{ unit.StockLocation.Description }} {{ unit.Quantity }} @Translate("PDP In Stock", "In Stock")</label> 321 <template v-if="unit.Quantity <= 0"> 322 <div class="custom-control custom-radio">{{unit.EarliestArrivalFromHarbor}}</div> 323 </template> 324 </div> 325 </template> 326 </div> 327 </stock-location-component> 328 } 329 @if (!Pageview.IsAllowedToShop()) 330 { 331 <buying-component inline-template :initial-product='@selectedMasterProductModel' :selected-product='@selectedMasterProductModel'> 332 <div class="basic_pim-buying"> 333 334 @if (!string.IsNullOrEmpty(energyArrow)) 335 { 336 string name = Regex.Replace(selectedModel.Name.Trim(), "[^A-Za-z0-9_. ]+", ""); 337 //var lang = languageService.GetLanguage(selectedModel.LanguageId)?.Code2; 338 339 //string filePattern = $"[[type]]-{selectedModel.Number}-{name}-{lang}"; 340 <div class="pdp-energy"> 341 <div class="pdp-energy-data"> 342 <a href="@energyLabel" target="_blank" class="pdp-energy-label"> 343 <img src="/Admin/Public/GetImage.ashx?Height=40&amp;Crop=5&amp;Image=@energyArrow" /> 344 </a> 345 <a href="#" v-on:click="getProductReport($event,'@selectedModel.Number', '@name','@selectedModel.LanguageId')" target="_blank" class="pdp-energy-link"> 346 347 @Translate(basicPimPrefix + "product sheet", "Product Sheet") 348 349 </a> 350 </div> 351 </div> 352 } 353 354 <ul class="basic_pim-variants" v-if="initialProduct.product.simpleVariants && initialProduct.product.simpleVariants.length > 0"> 355 <li> 356 @{ 357 FieldValueViewModel productImg; 358 FieldValueViewModel productColor; 359 Model.ProductFields.TryGetValue("productVariantColorImage", out productImg); 360 Model.ProductFields.TryGetValue("productVariantValue", out productColor); 361 } 362 <a href="Default.aspx?ID=@Pageview.ID&ProductId=@Model.Id" class="@(Model.Number == selectedModel.Number ? "active" : "")" :style="getImageOrColor('@(productImg?.Value)','@(productColor?.Value)')"></a> 363 </li> 364 365 @if (Model.Variants != null) 366 { 367 foreach (var variant in Model.Variants) 368 { 369 FieldValueViewModel variantImg; 370 FieldValueViewModel variantColor; 371 variant.ProductFields.TryGetValue("productVariantColorImage", out variantImg); 372 variant.ProductFields.TryGetValue("productVariantValue", out variantColor); 373 374 <li> 375 <a href="/Default.aspx?ID=@Pageview.ID&ProductId=@variant.Id&VariantId=@variant.VariantId" class="@(variant.Number == selectedModel.Number ? "active" : "")" :style="getImageOrColor('@(variantImg?.Value)','@(variantColor?.Value)')"></a> 376 </li> 377 378 } 379 } 380 </ul> 381 </div> 382 </buying-component> 383 <p itemprop="sku"> 384 @Translate(basicPimPrefix + "Product number", "Product number"): @selectedModel.Number @(string.IsNullOrEmpty(selectedModel.GetNavItemNumber()) ? "" : "("+Translate("Substition for","Substitution for ")+ $"{selectedModel.GetNavItemNumber()})") 385 </p> 386 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("contact")" class="btn btn-outline-secondary btn-sm mt-3"> 387 @Translate("create account", "Create account") 388 </a> 389 } 390 else 391 { 392 <buying-component inline-template @@discount="onDiscount($event)" :initial-product='@selectedMasterProductModel' :selected-product='@selectedMasterProductModel' :chosen-warranty-code="chosenWarrantyCode" :warranty-info="warrantyInfo"> 393 <div class="basic_pim-buying" itemprop="offers" itemscope="" itemtype="https://schema.org/Offer"> 394 <div class="pdp-energy"> 395 <async-price class-type="asyncprice-pdp" 396 :product='@selectedJsonModel' 397 :default-price="@selectedModel.Price.PriceWithoutVat.ToString(CultureInfo.InvariantCulture)" 398 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 399 list-price="true" 400 :should-emit-warranties="true" 401 language-id="@languageId" 402 standard-customer="@standardCustomer" 403 @@discount="onDiscount($event)"> 404 </async-price> 405 @if (!string.IsNullOrEmpty(energyArrow)) 406 { 407 string name = Regex.Replace(selectedModel.Name.Trim(), "[^A-Za-z0-9_. ]+", ""); 408 //var lang = languageService.GetLanguage(selectedModel.LanguageId)?.Code2; 409 410 //string filePattern = $"[[type]]-{selectedModel.Number}-{name}-{lang}"; 411 <div class="pdp-energy-data"> 412 <a href="@energyLabel" target="_blank" class="pdp-energy-label"> 413 <img src="/Admin/Public/GetImage.ashx?Height=40&amp;Crop=5&amp;Image=@energyArrow" /> 414 </a> 415 <a href="#" v-on:click="getProductReport($event,'@selectedModel.Number', '@name','@selectedModel.LanguageId')" target="_blank" class="pdp-energy-link"> 416 417 @Translate(basicPimPrefix + "product sheet", "Product Sheet") 418 419 </a> 420 </div> 421 } 422 </div> 423 <ul class="basic_pim-variants" v-if="initialProduct.product.simpleVariants && initialProduct.product.simpleVariants.length > 0"> 424 <li> 425 @{ 426 FieldValueViewModel productImg; 427 FieldValueViewModel productColor; 428 Model.ProductFields.TryGetValue("productVariantColorImage", out productImg); 429 Model.ProductFields.TryGetValue("productVariantValue", out productColor); 430 } 431 <a href="Default.aspx?ID=@Pageview.ID&ProductId=@Model.Id" class="@(Model.Number == selectedModel.Number ? "active" : "")" :style="getImageOrColor('@(productImg?.Value)','@(productColor?.Value)')"></a> 432 </li> 433 434 @if (Model.Variants != null) 435 { 436 foreach (var variant in Model.Variants) 437 { 438 FieldValueViewModel variantImg; 439 FieldValueViewModel variantColor; 440 variant.ProductFields.TryGetValue("productVariantColorImage", out variantImg); 441 variant.ProductFields.TryGetValue("productVariantValue", out variantColor); 442 443 <li> 444 <a href="/Default.aspx?ID=@Pageview.ID&ProductId=@variant.Id&VariantId=@variant.VariantId" class="@(variant.Number == selectedModel.Number ? "active" : "")" :style="getImageOrColor('@(variantImg?.Value)','@(variantColor?.Value)')"></a> 445 </li> 446 447 } 448 } 449 </ul> 450 <div class="pdp-btn-group"> 451 <add-to-basket-simple class="addtobasketsimple-pdp" 452 :product='@selectedJsonModel' 453 :price-without-vat="currentItemPriceWithoutVat" 454 button-class="btn btn-primary" 455 :group-warranty-code="chosenWarrantyCode" 456 :warranty-info="warrantyInfo" 457 :unit-of-measure="'PCS'" 458 language-id="@languageId" 459 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 460 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 461 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 462 standard-customer="@standardCustomer"> 463 </add-to-basket-simple> 464 @if (Pageview.IsCurrentlyB2B()) 465 { 466 <favorite-lists ui-error-message-translation="@Translate(basicPimPrefix + " Error while retrieving favorite list", "Error while retrieving favorite list")" :is-favorite-mode="@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("favorites") == @Pageview.ID" :product='@selectedJsonModel'></favorite-lists> 467 } 468 <add-to-compare :product-number="selectedProduct.product.number"></add-to-compare> 469 </div> 470 </div> 471 </buying-component> 472 <p itemprop="sku"> 473 @Translate(basicPimPrefix + "Product number", "Product number"): @selectedModel.Number @(string.IsNullOrEmpty(selectedModel.GetNavItemNumber()) ? "" : "(" + Translate("Substition for", "Substitution for ") + $"{selectedModel.GetNavItemNumber()})") 474 475 </p> 476 if (isCZShop && !string.IsNullOrEmpty(specs.GetByKey("PhdCode")?.Value)) 477 { 478 <p class="phdCode">@Translate(basicPimPrefix + "PhdCode", "PhdCode") @(specs.GetByKey("PhdCode")?.Value)</p> 479 } 480 if (!isSparePart && (Pageview.IsCurrentlyB2B() && Pageview.User.AllowWarranty() || Pageview.IsCurrentlyB2C())) 481 { 482 <div class="basic_pim-warranty" v-if="@((!isSparePart).ToString().ToLower()) && warranties?.length>0"> 483 <div v-for="(warranty,index) in warranties" class="custom-control custom-radio"> 484 <input type="radio" name="warranty" :id="'warranty' + index" v-model="chosenWarranty" :value="warranty" class="custom-control-input" /> 485 <label :for="'warranty' + index" class="custom-control-label"> 486 {{getDescription(warranty.itemNo) +' - ' + product.product.defaultPrice.currencyCode + ' ' + warranty.price.priceWithoutVat + ',-'}} 487 </label> 488 </div> 489 @*<template v-if="warrantyLoading"> 490 <div class="basic_listview-loader text-center">http://localhost:55277/http://localhost:55277/ 491 <span class="spinner-lg-default"></span> 492 </div> 493 </template>*@ 494 </div> 495 } 496 } 497 @if (isSparePart && specs.GetByGroup("Specifications").Any()) 498 { 499 <ul class="list-unstyled spare-specs mt-3"> 500 @foreach (var group in specs.GetByGroup("Specifications").Where(x => x.Key != "EcoIcon").OrderBy(x => x.Group2Order).ThenBy(x => x.ValueSortOrder).GroupBy(x => x.Group2)) 501 { 502 503 504 foreach (var spec in group) 505 { 506 507 <li> 508 509 <span>@spec.Caption</span> 510 <span> 511 @spec.Value 512 @spec.Unit 513 </span> 514 </li> 515 } 516 517 } 518 </ul> 519 } 520 </div> 521 </section> 522 @if (!isSparePart) 523 { 524 <section class="basic_pim-collapse"> 525 @if (!string.IsNullOrEmpty(selectedModel.LongDescription) || !string.IsNullOrEmpty(shortSellingText) || specs.GetByGroup("Specifications").Any()) 526 { 527 <div class="basic_pim-col" visible id="specs1"> 528 @if (!string.IsNullOrEmpty(selectedModel.LongDescription) || !string.IsNullOrEmpty(shortSellingText)) 529 { 530 <button class="btn-collapse" id="description" v-b-toggle.long-description> 531 @Translate(basicPimPrefix + "product description", "Product description") 532 </button> 533 <b-collapse id="long-description" appear accordion="specs1"> 534 <template> 535 <div class="body-collapse"> 536 @if (!string.IsNullOrEmpty(shortSellingText)) 537 { 538 <p>@shortSellingText</p> 539 } 540 @if (!string.IsNullOrEmpty(selectedModel.LongDescription)) 541 { 542 <p>@selectedModel.LongDescription</p> 543 } 544 </div> 545 </template> 546 </b-collapse> 547 } 548 @if (specs.GetByGroup("Specifications").Any()) 549 { 550 <button class="btn-collapse" id="specs" v-b-toggle.specs-list> 551 @Translate(basicPimPrefix + "Product Specs", "Product Specifications") 552 </button> 553 <b-collapse id="specs-list" accordion="specs1"> 554 <template> 555 <div class="body-collapse full"> 556 <table class="table table-specs"> 557 558 <tbody> 559 560 @foreach (var group in specs.GetByGroup("Specifications").Where(x => x.Key != "EcoIcon").OrderBy(x => x.Group2Order).ThenBy(x => x.ValueSortOrder).GroupBy(x => x.Group2)) 561 { 562 563 <tr> 564 <th>@group.Key</th> 565 <th></th> 566 </tr> 567 foreach (var spec in group) 568 { 569 if (spec.Key == "EnergyArrow") 570 { 571 continue; 572 } 573 if (spec.Key == "EnergyArrowText" && !string.IsNullOrEmpty(energyArrow)) 574 { 575 <tr> 576 <td> 577 @spec.Caption 578 </td> 579 <td valign="middle" style="vertical-align:middle;"> 580 <a href="@energyLabel" target="_blank" style="display:flex;"> 581 <img src="/Admin/Public/GetImage.ashx?Height=18&amp;Crop=5&amp;Image=@energyArrow" /> 582 </a> 583 </td> 584 </tr> 585 } 586 else 587 { 588 <tr> 589 <td> 590 @spec.Caption 591 </td> 592 <td valign="middle" style="vertical-align:middle;"> 593 @spec.Value 594 @spec.Unit 595 </td> 596 </tr> 597 } 598 } 599 } 600 <tr> 601 <th></th> 602 <th></th> 603 </tr> 604 </tbody> 605 </table> 606 607 </div> 608 </template> 609 </b-collapse> 610 } 611 </div> 612 } 613 <div class="basic_pim-col" id="specs2"> 614 615 <button class="btn-collapse" id="download" v-b-toggle.download-documents> 616 @Translate(basicPimPrefix + "downloads", "Downloads") 617 </button> 618 <b-collapse id="download-documents" accordion="specs2"> 619 <template> 620 <div class="body-collapse"> 621 <ul class="basic_pim-downloads"> 622 @{ 623 624 string name = Regex.Replace(selectedModel.Name.Trim(), "[^A-Za-z0-9_. ]+", ""); 625 var lang = languageService.GetLanguage(selectedModel.LanguageId)?.Code2; 626 627 } 628 @{ string filePattern = $"[[type]]-{selectedModel.Number}-{name}-{lang}"; } 629 <li> 630 <a href="#" v-on:click="getProductReport($event,'@selectedModel.Number', '@name','@lang')" target="_blank"> 631 <svg> 632 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 633 </svg> 634 @Translate(basicPimPrefix + "product sheet", "Product Sheet") 635 </a> 636 </li> 637 @if (!string.IsNullOrEmpty(@specs.GetByKey("Usermanual").Value)) 638 { 639 <li> 640 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("Usermanual").Value','@filePattern.Replace("[[type]]","Usermanual")','Usermanual')" target="_blank"> 641 <svg> 642 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 643 </svg> 644 @Translate(basicPimPrefix + "User manual", "User manual") 645 </a> 646 </li> 647 } 648 649 <template v-if="sparePartReportExist"> 650 <li> 651 <a href="#" v-on:click="getProductReport($event,'@selectedModel.Number', '@name','@lang', 'true')" target="_blank"> 652 <svg> 653 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 654 </svg> 655 @Translate(basicPimPrefix + "spare part list", "Spare part list") 656 </a> 657 </li> 658 </template> 659 @if (!string.IsNullOrEmpty(energyLabel)) 660 { 661 <li> 662 <a href="#" v-on:click="downloadProductFile($event,'@name','@energyLabel','@filePattern.Replace("[[type]]","EnergyClassification")','EnergyClassification')" target="_blank"> 663 <svg> 664 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 665 </svg> 666 @Translate(basicPimPrefix + "Energy Classification", "Energy Classification") 667 </a> 668 </li> 669 } 670 @if (Pageview.User != null) 671 { 672 if (!string.IsNullOrEmpty(specs.GetByKey("WiringDiagrams").Value)) 673 { 674 <li> 675 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("WiringDiagrams").Value','@filePattern.Replace("[[type]]","WiringDiagrams")','WiringDiagrams')" target="_blank"> 676 <svg> 677 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 678 </svg> 679 @Translate(basicPimPrefix + "Wiring diagram", "Wiring diagram") 680 </a> 681 </li> 682 } 683 if (!string.IsNullOrEmpty(specs.GetByKey("Drawings").Value)) 684 { 685 <li> 686 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("Drawings").Value','@filePattern.Replace("[[type]]","Drawings")','Drawings')" target="_blank"> 687 <svg> 688 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 689 </svg> 690 @Translate(basicPimPrefix + "Drawings", "Drawings") 691 </a> 692 </li> 693 } 694 if (!string.IsNullOrEmpty(specs.GetByKey("BrandingFile").Value)) 695 { 696 <li> 697 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("BrandingFile").Value','@filePattern.Replace("[[type]]","Branding")','BrandingFile')" target="_blank"> 698 <svg> 699 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 700 </svg> 701 @Translate(basicPimPrefix + "Branding File", "Branding drawing") 702 </a> 703 </li> 704 } 705 if (!string.IsNullOrEmpty(specs.GetByKey("QuickGuide").Value)) 706 { 707 <li> 708 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("QuickGuide").Value','@filePattern.Replace("[[type]]","QuickGuide")','QuickGuide')" target="_blank"> 709 <svg> 710 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 711 </svg> 712 @Translate(basicPimPrefix + "QuickGuide", "Quick Guide") 713 </a> 714 </li> 715 } 716 if (!string.IsNullOrEmpty(specs.GetByKey("AssemblyGuide").Value)) 717 { 718 <li> 719 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("AssemblyGuide").Value','@filePattern.Replace("[[type]]","AssemblyGuide")','AssemblyGuide')" target="_blank"> 720 <svg> 721 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 722 </svg> 723 @Translate(basicPimPrefix + "AssemblyGuide", "Assembly Guide") 724 </a> 725 </li> 726 } 727 } 728 729 730 731 </ul> 732 </div> 733 734 </template> 735 </b-collapse> 736 737 @if (!isSparePart) 738 { 739 <product-spare-parts-view :page-view-id="@Pageview.ID" 740 :language-id="'@selectedModel.LanguageId'" 741 :product-number="@selectedModel.Number" 742 :exploded-drawing="'@(specs.GetByKey("ExplodedDrawing")?.Value)'" 743 :spare-part-report-exist="sparePartReportExist" 744 product-name="@name" 745 language-code="@lang" 746 :sparepart-location="product.product.defaultStockLocationName"> 747 </product-spare-parts-view> 748 } 749 750 </div> 751 </section> 752 } 753 @if (accessories != null && accessories.Any()) 754 { 755 756 <section class="basic_related"> 757 <template> 758 <header class="basic_related-header" id="accessories-header"> 759 <h2 class="text-center"> 760 @Translate(basicPimPrefix + "Accessories", "Accessories") 761 </h2> 762 </header> 763 <slick ref="slick" 764 class="basic_related-grid" 765 :options="slickAccessoriesOptions"> 766 @foreach (var accessory in accessories) 767 { 768 var converted = new AsyncProductWithSpecification(new SimpleProduct(accessory.ToViewModel(), null, stockInformation, inspirationGroupIds, true)); 769 var accessoryJson = JsonConvert.SerializeObject(converted, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); 770 accessoryJson = accessoryJson.Replace("'", "&#39;"); 771 <article class="basic_related-product"> 772 <a href="/Default.aspx?ID=@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("plp")&amp;ProductID=@accessory.Id" class="basic_related-url"> 773 <figure> 774 @{ 775 var image = string.IsNullOrEmpty(accessory.ImageLarge) ? "/Files/Images/default.jpg" : "/Files/" + accessory.ImageLarge; 776 } 777 <img src="/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;Image=@image" 778 alt="@accessory.Name" 779 class="img-fluid" /> 780 </figure> 781 <header> 782 <h1>@accessory.Name</h1> 783 <p class="basic_related-category">@accessory.ShortDescription</p> 784 <p class="basic_related-sku">@Translate(basicPimPrefix + "Product Number", "Product Number") @accessory.Number</p> 785 </header> 786 </a> 787 @if (Pageview.IsCurrentlyB2B()) 788 { 789 <buying-component inline-template :initial-product='@accessoryJson'> 790 <footer> 791 <async-price class-type="asyncprice-plp" 792 :default-price="@accessory.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 793 :product='@accessoryJson' 794 only-price="true" 795 standard-customer="@standardCustomer"> 796 </async-price> 797 <add-to-basket-simple :product='@accessoryJson' 798 button-class="btn btn-primary" 799 class="addtobasketsimple-plp ml-auto" 800 language-id="@languageId" 801 :price-without-vat="@accessory.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 802 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 803 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 804 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 805 standard-customer="@standardCustomer"> 806 </add-to-basket-simple> 807 </footer> 808 </buying-component> 809 810 } 811 else 812 { 813 <footer> 814 <async-price class-type="asyncprice-plp" 815 :default-price="@accessory.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 816 :product='@accessoryJson' 817 only-price="true" 818 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 819 standard-customer="@standardCustomer" /> 820 821 <div class="asyncprice-plp"> 822 <div class="price-withoutvat"> 823 <span class="price-label">@Translate(basicPimPrefix + "price without vat", "Price without VAT")</span> 824 <p class="price"> 825 <span class="unit-price"> 826 @accessory.Price.PriceWithoutVATFormattedNoSymbol @accessory.Price.Currency.Code 827 </span> 828 </p> 829 </div> 830 </div> 831 <add-to-basket-simple :product='@accessoryJson' 832 button-class="btn btn-primary" 833 class="addtobasketsimple-plp ml-auto" 834 language-id="@languageId" 835 :price-without-vat="@accessory.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 836 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 837 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 838 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 839 standard-customer="@standardCustomer"> 840 </add-to-basket-simple> 841 </footer> 842 } 843 </article> 844 } 845 </slick> 846 </template> 847 </section> 848 } 849 @if (relatedProducts != null && relatedProducts.RelatedProducts.Any()) 850 { 851 <section class="basic_related"> 852 <template> 853 <header class="basic_related-header" id="related-header"> 854 <h2 class="text-center"> 855 @Translate(basicPimPrefix + "Related Products", "Related Products") 856 </h2> 857 </header> 858 <slick ref="slick" 859 class="basic_related-grid" 860 :options="slickRelatedOptions"> 861 @foreach (var relProduct in relatedProducts.RelatedProducts) 862 { 863 864 //var relProduct = productService.GetProductById(rel.Id, rel.VariantId, rel.LanguageId); 865 var converted = new AsyncProductWithSpecification(new SimpleProduct(relProduct.ToViewModel(), null, stockInformation, inspirationGroupIds, true)); 866 var relProductJson = JsonConvert.SerializeObject(converted, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); 867 relProductJson = relProductJson.Replace("'", "&#39;"); 868 <article class="basic_related-product"> 869 <a href="/Default.aspx?ID=@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("plp")&amp;ProductID=@relProduct.Id" class="basic_related-url"> 870 <figure style="min-height: 1px;"> 871 @{ 872 var image = string.IsNullOrEmpty(relProduct.ImageLarge) ? "/Files/Images/default.jpg" : "/Files/" + relProduct.ImageLarge; 873 } 874 <img src="/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;fillcanvas=true&amp;Image=@image" 875 alt="@relProduct.Name" 876 class="img-fluid" /> 877 </figure> 878 <header> 879 <h1>@relProduct.Name</h1> 880 <p class="basic_related-category">@relProduct.ShortDescription</p> 881 <p class="basic_related-sku">@Translate(basicPimPrefix + "Product Number", "Product Number") @relProduct.Number</p> 882 </header> 883 </a> 884 885 @if (Pageview.IsCurrentlyB2B()) 886 { 887 888 <buying-component @@discount="onDiscount($event)" inline-template :initial-product='@relProductJson' :selected-product='@relProductJson'> 889 <footer> 890 <async-price class-type="asyncprice-plp" 891 :default-price="@relProduct.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 892 :product='@relProductJson' 893 unit-of-measure="PCS" 894 only-price="true" 895 should-emit-warranties="true" 896 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 897 standard-customer="@standardCustomer" 898 @@discount="onDiscount($event)"> 899 </async-price> 900 <add-to-basket-simple :product='@relProductJson' 901 button-class="btn btn-primary" 902 :unit-of-measure="'PCS'" 903 class="addtobasketsimple-plp ml-auto" 904 :price-without-vat="currentItemPriceWithoutVat" 905 language-id="@languageId" 906 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 907 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 908 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 909 standard-customer="@standardCustomer" 910 @@discount="onDiscount($event)"> 911 </add-to-basket-simple> 912 </footer> 913 </buying-component> 914 915 } 916 else 917 { 918 <footer> 919 <async-price class-type="asyncprice-plp" 920 :default-price="@relProduct.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 921 :product='@relProductJson' 922 only-price="true" 923 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 924 standard-customer="@standardCustomer" /> 925 926 <add-to-basket-simple :product='@relProductJson' 927 :unit-of-measure="'PCS'" 928 button-class="btn btn-primary" 929 class="addtobasketsimple-plp ml-auto" 930 language-id="@languageId" 931 :price-without-vat="@relProduct.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 932 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 933 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 934 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 935 standard-customer="@standardCustomer"> 936 </add-to-basket-simple> 937 </footer> 938 } 939 </article> 940 } 941 </slick> 942 </template> 943 </section> 944 } 945 946 </div> 947 </product-details-simple-pim> 948