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_61cf0f960e4a44d2b17b9664d64b9b49.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","StorageImages" }; 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, remoteStock, true)); 47 convertedSelectedModel.Product.DefaultPrice.CurrencyCode = Pageview.Area.EcomCurrencyId; 48 var convertedMasterModel = new AsyncProductWithSpecification(new SimpleProduct(Model, null, stockInformation, inspirationGroupIds, remoteStock, 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"> 306 {{ unit.stockLocation.description }} {{ GetStockAmountString(unit.quantity) }} @Translate("PDP In Stock", "In Stock") 307 <template v-if="stocksHasNoQuantity"> 308 <br/><span style="font-size: small;">{{earliestHarborArrivalDate}}</span> 309 </template> 310 </label> 311 <label v-else :for="unit.stockLocation.name" class="custom-control-label"> 312 {{ unit.stockLocation.description }} {{ unit.quantity }} @Translate("PDP In Stock", "In Stock") 313 <template v-if="stocksHasNoQuantity"> 314 <br/><span style="font-size: small;">{{earliestHarborArrivalDate}}</span> 315 </template> 316 </label> 317 </div> 318 </template> 319 <br/> 320 <template v-else-if="loading"> 321 <span class="spinner-sm-default"></span> 322 </template> 323 <template v-if="remoteStockUnits.length > 0 && !loading"> 324 <div v-for="unit in remoteStockUnits" class="custom-control "> 325 <span style="font-size: 1px">{{unit.Quantity}}</span> 326 @*<input type="radio" v-model="selectedVal" name="stocks" :id="unit.StockLocation.Description" :value="unit.StockLocation.Description" class="custom-control-input" :disabled="true">*@ 327 @*<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>*@ 328 <label v-if="!@userInTefcoldUserGroup.ToString().ToLower()" :for="unit.StockLocation.Description" class=""> 329 {{ unit.StockLocation.Description }} {{ GetStockAmountString(unit.Quantity) }} @Translate("PDP In Stock", "In Stock") 330 <br /><span style="font-size: small;">@Translate("Back In Stock Again Text", "Stock due on")</span> 331 </label> 332 <label v-else :for="unit.StockLocation.Description" class="custom-control"> 333 {{ unit.StockLocation.Description }} {{ unit.Quantity }} @Translate("PDP In Stock", "In Stock") 334 <br/><span style="font-size: small;">@Translate("Back In Stock Again Text", "Stock due on")</span> 335 </label> 336 337 </div> 338 </template> 339 </div> 340 </stock-location-component> 341 } 342 @if (!Pageview.IsAllowedToShop()) 343 { 344 <buying-component inline-template :initial-product='@selectedMasterProductModel' :selected-product='@selectedMasterProductModel'> 345 <div class="basic_pim-buying"> 346 347 @if (!string.IsNullOrEmpty(energyArrow)) 348 { 349 string name = Regex.Replace(selectedModel.Name.Trim(), "[^A-Za-z0-9_. ]+", ""); 350 //var lang = languageService.GetLanguage(selectedModel.LanguageId)?.Code2; 351 352 //string filePattern = $"[[type]]-{selectedModel.Number}-{name}-{lang}"; 353 <div class="pdp-energy"> 354 <div class="pdp-energy-data"> 355 <a href="@energyLabel" target="_blank" class="pdp-energy-label"> 356 <img src="/Admin/Public/GetImage.ashx?Height=40&amp;Crop=5&amp;Image=@energyArrow" /> 357 </a> 358 <a href="#" v-on:click="getProductReport($event,'@selectedModel.Number', '@name','@selectedModel.LanguageId')" target="_blank" class="pdp-energy-link"> 359 360 @Translate(basicPimPrefix + "product sheet", "Product Sheet") 361 362 </a> 363 </div> 364 </div> 365 } 366 367 <ul class="basic_pim-variants" v-if="initialProduct.product.simpleVariants && initialProduct.product.simpleVariants.length > 0"> 368 <li> 369 @{ 370 FieldValueViewModel productImg; 371 FieldValueViewModel productColor; 372 Model.ProductFields.TryGetValue("productVariantColorImage", out productImg); 373 Model.ProductFields.TryGetValue("productVariantValue", out productColor); 374 } 375 <a href="Default.aspx?ID=@Pageview.ID&ProductId=@Model.Id" class="@(Model.Number == selectedModel.Number ? "active" : "")" :style="getImageOrColor('@(productImg?.Value)','@(productColor?.Value)')"></a> 376 </li> 377 378 @if (Model.Variants != null) 379 { 380 foreach (var variant in Model.Variants) 381 { 382 FieldValueViewModel variantImg; 383 FieldValueViewModel variantColor; 384 variant.ProductFields.TryGetValue("productVariantColorImage", out variantImg); 385 variant.ProductFields.TryGetValue("productVariantValue", out variantColor); 386 387 <li> 388 <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> 389 </li> 390 391 } 392 } 393 </ul> 394 </div> 395 </buying-component> 396 <p itemprop="sku"> 397 @Translate(basicPimPrefix + "Product number", "Product number"): @selectedModel.Number @(string.IsNullOrEmpty(selectedModel.GetNavItemNumber()) ? "" : "("+Translate("Substition for","Substitution for ")+ $"{selectedModel.GetNavItemNumber()})") 398 </p> 399 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("contact")" class="btn btn-outline-secondary btn-sm mt-3"> 400 @Translate("create account", "Create account") 401 </a> 402 } 403 else 404 { 405 <buying-component inline-template @@discount="onDiscount($event)" :initial-product='@selectedMasterProductModel' :selected-product='@selectedMasterProductModel' :chosen-warranty-code="chosenWarrantyCode" :warranty-info="warrantyInfo"> 406 <div class="basic_pim-buying" itemprop="offers" itemscope="" itemtype="https://schema.org/Offer"> 407 <div class="pdp-energy"> 408 <async-price class-type="asyncprice-pdp" 409 :product='@selectedJsonModel' 410 :default-price="@selectedModel.Price.PriceWithoutVat.ToString(CultureInfo.InvariantCulture)" 411 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 412 list-price="true" 413 :should-emit-warranties="true" 414 language-id="@languageId" 415 standard-customer="@standardCustomer" 416 @@discount="onDiscount($event)"> 417 </async-price> 418 @if (!string.IsNullOrEmpty(energyArrow)) 419 { 420 string name = Regex.Replace(selectedModel.Name.Trim(), "[^A-Za-z0-9_. ]+", ""); 421 //var lang = languageService.GetLanguage(selectedModel.LanguageId)?.Code2; 422 423 //string filePattern = $"[[type]]-{selectedModel.Number}-{name}-{lang}"; 424 <div class="pdp-energy-data"> 425 <a href="@energyLabel" target="_blank" class="pdp-energy-label"> 426 <img src="/Admin/Public/GetImage.ashx?Height=40&amp;Crop=5&amp;Image=@energyArrow" /> 427 </a> 428 <a href="#" v-on:click="getProductReport($event,'@selectedModel.Number', '@name','@selectedModel.LanguageId')" target="_blank" class="pdp-energy-link"> 429 430 @Translate(basicPimPrefix + "product sheet", "Product Sheet") 431 432 </a> 433 </div> 434 } 435 </div> 436 <ul class="basic_pim-variants" v-if="initialProduct.product.simpleVariants && initialProduct.product.simpleVariants.length > 0"> 437 <li> 438 @{ 439 FieldValueViewModel productImg; 440 FieldValueViewModel productColor; 441 Model.ProductFields.TryGetValue("productVariantColorImage", out productImg); 442 Model.ProductFields.TryGetValue("productVariantValue", out productColor); 443 } 444 <a href="Default.aspx?ID=@Pageview.ID&ProductId=@Model.Id" class="@(Model.Number == selectedModel.Number ? "active" : "")" :style="getImageOrColor('@(productImg?.Value)','@(productColor?.Value)')"></a> 445 </li> 446 447 @if (Model.Variants != null) 448 { 449 foreach (var variant in Model.Variants) 450 { 451 FieldValueViewModel variantImg; 452 FieldValueViewModel variantColor; 453 variant.ProductFields.TryGetValue("productVariantColorImage", out variantImg); 454 variant.ProductFields.TryGetValue("productVariantValue", out variantColor); 455 456 <li> 457 <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> 458 </li> 459 460 } 461 } 462 </ul> 463 <div class="pdp-btn-group"> 464 <add-to-basket-simple class="addtobasketsimple-pdp" 465 :product='@selectedJsonModel' 466 :price-without-vat="currentItemPriceWithoutVat" 467 button-class="btn btn-primary" 468 :group-warranty-code="chosenWarrantyCode" 469 :warranty-info="warrantyInfo" 470 :unit-of-measure="'PCS'" 471 language-id="@languageId" 472 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 473 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 474 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 475 standard-customer="@standardCustomer"> 476 </add-to-basket-simple> 477 @if (Pageview.IsCurrentlyB2B()) 478 { 479 <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> 480 } 481 <add-to-compare :product-number="selectedProduct.product.number"></add-to-compare> 482 </div> 483 </div> 484 </buying-component> 485 <p itemprop="sku"> 486 @Translate(basicPimPrefix + "Product number", "Product number"): @selectedModel.Number @(string.IsNullOrEmpty(selectedModel.GetNavItemNumber()) ? "" : "(" + Translate("Substition for", "Substitution for ") + $"{selectedModel.GetNavItemNumber()})") 487 488 </p> 489 if (isCZShop && !string.IsNullOrEmpty(specs.GetByKey("PhdCode")?.Value)) 490 { 491 <p class="phdCode">@Translate(basicPimPrefix + "PhdCode", "PhdCode") @(specs.GetByKey("PhdCode")?.Value)</p> 492 } 493 if (!isSparePart && (Pageview.IsCurrentlyB2B() && Pageview.User.AllowWarranty() || Pageview.IsCurrentlyB2C())) 494 { 495 <div class="basic_pim-warranty" v-if="@((!isSparePart).ToString().ToLower()) && warranties?.length>0"> 496 <div v-for="(warranty,index) in warranties" class="custom-control custom-radio"> 497 <input type="radio" name="warranty" :id="'warranty' + index" v-model="chosenWarranty" :value="warranty" class="custom-control-input" /> 498 <label :for="'warranty' + index" class="custom-control-label"> 499 {{getDescription(warranty.itemNo) +' - ' + product.product.defaultPrice.currencyCode + ' ' + warranty.price.priceWithoutVat + ',-'}} 500 </label> 501 </div> 502 @*<template v-if="warrantyLoading"> 503 <div class="basic_listview-loader text-center">http://localhost:55277/http://localhost:55277/ 504 <span class="spinner-lg-default"></span> 505 </div> 506 </template>*@ 507 </div> 508 } 509 } 510 @if (isSparePart && specs.GetByGroup("NIQSpecifications").Any()) 511 { 512 <ul class="list-unstyled spare-specs mt-3"> 513 @foreach (var group in specs.GetByGroup("NIQSpecifications").Where(x => x.Key != "EcoIcon").OrderBy(x => x.Group2Order).ThenBy(x => x.ValueSortOrder).GroupBy(x => x.Group2)) 514 { 515 516 517 foreach (var spec in group) 518 { 519 520 <li> 521 522 <span>@spec.Caption</span> 523 <span> 524 @spec.Value 525 @spec.Unit 526 </span> 527 </li> 528 } 529 530 } 531 </ul> 532 } 533 </div> 534 </section> 535 @if (!isSparePart) 536 { 537 <section class="basic_pim-collapse"> 538 @if (!string.IsNullOrEmpty(selectedModel.LongDescription) || !string.IsNullOrEmpty(shortSellingText) || specs.GetByGroup("NIQSpecifications").Any()) 539 { 540 <div class="basic_pim-col" visible id="specs1"> 541 @if (!string.IsNullOrEmpty(selectedModel.LongDescription) || !string.IsNullOrEmpty(shortSellingText)) 542 { 543 <button class="btn-collapse" id="description" v-b-toggle.long-description> 544 @Translate(basicPimPrefix + "product description", "Product description") 545 </button> 546 <b-collapse id="long-description" appear accordion="specs1"> 547 <template> 548 <div class="body-collapse"> 549 @if (!string.IsNullOrEmpty(shortSellingText)) 550 { 551 <p>@shortSellingText</p> 552 } 553 @if (!string.IsNullOrEmpty(selectedModel.LongDescription)) 554 { 555 <p>@selectedModel.LongDescription</p> 556 } 557 </div> 558 </template> 559 </b-collapse> 560 } 561 @if (specs.GetByGroup("NIQSpecifications").Any()) 562 { 563 <button class="btn-collapse" id="specs" v-b-toggle.specs-list> 564 @Translate(basicPimPrefix + "Product Specs", "Product Specifications") 565 </button> 566 <b-collapse id="specs-list" accordion="specs1"> 567 <template> 568 <div class="body-collapse full"> 569 <table class="table table-specs"> 570 571 <tbody> 572 573 @foreach (var group in specs.GetByGroup("NIQSpecifications").Where(x => x.Key != "EcoIcon").OrderBy(x => x.Group2Order).ThenBy(x => x.ValueSortOrder).GroupBy(x => x.Group2)) 574 { 575 var test = specs; 576 577 <tr> 578 <th>@group.Key</th> 579 <th></th> 580 </tr> 581 foreach (var spec in group) 582 { 583 if (spec.Key == "EnergyArrow") 584 { 585 continue; 586 } 587 if (spec.Key == "EnergyArrowText" && !string.IsNullOrEmpty(energyArrow)) 588 { 589 <tr> 590 <td> 591 @spec.Caption 592 </td> 593 <td valign="middle" style="vertical-align:middle;"> 594 <a href="@energyLabel" target="_blank" style="display:flex;"> 595 <img src="/Admin/Public/GetImage.ashx?Height=18&amp;Crop=5&amp;Image=@energyArrow" /> 596 </a> 597 </td> 598 </tr> 599 } 600 else 601 { 602 <tr> 603 <td> 604 @spec.Caption 605 </td> 606 <td valign="middle" style="vertical-align:middle;"> 607 @spec.Value 608 @spec.Unit 609 </td> 610 </tr> 611 } 612 } 613 } 614 <tr> 615 <th></th> 616 <th></th> 617 </tr> 618 </tbody> 619 </table> 620 621 </div> 622 </template> 623 </b-collapse> 624 } 625 </div> 626 } 627 <div class="basic_pim-col" id="specs2"> 628 629 <button class="btn-collapse" id="download" v-b-toggle.download-documents> 630 @Translate(basicPimPrefix + "downloads", "Downloads") 631 </button> 632 <b-collapse id="download-documents" accordion="specs2"> 633 <template> 634 <div class="body-collapse"> 635 <ul class="basic_pim-downloads"> 636 @{ 637 638 string name = Regex.Replace(selectedModel.Name.Trim(), "[^A-Za-z0-9_. ]+", ""); 639 var lang = languageService.GetLanguage(selectedModel.LanguageId)?.Code2; 640 641 } 642 @{ string filePattern = $"[[type]]-{selectedModel.Number}-{name}-{lang}"; } 643 <li> 644 <a href="#" v-on:click="getProductReport($event,'@selectedModel.Number', '@name','@lang')" target="_blank"> 645 <svg> 646 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 647 </svg> 648 @Translate(basicPimPrefix + "product sheet", "Product Sheet") 649 </a> 650 </li> 651 @if (!string.IsNullOrEmpty(@specs.GetByKey("Usermanual").Value)) 652 { 653 <li> 654 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("Usermanual").Value','@filePattern.Replace("[[type]]","Usermanual")','Usermanual')" target="_blank"> 655 <svg> 656 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 657 </svg> 658 @Translate(basicPimPrefix + "User manual", "User manual") 659 </a> 660 </li> 661 } 662 663 <template v-if="sparePartReportExist"> 664 <li> 665 <a href="#" v-on:click="getProductReport($event,'@selectedModel.Number', '@name','@lang', 'true')" target="_blank"> 666 <svg> 667 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 668 </svg> 669 @Translate(basicPimPrefix + "spare part list", "Spare part list") 670 </a> 671 </li> 672 </template> 673 @if (!string.IsNullOrEmpty(energyLabel)) 674 { 675 <li> 676 <a href="#" v-on:click="downloadProductFile($event,'@name','@energyLabel','@filePattern.Replace("[[type]]","EnergyClassification")','EnergyClassification')" target="_blank"> 677 <svg> 678 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 679 </svg> 680 @Translate(basicPimPrefix + "Energy Classification", "Energy Classification") 681 </a> 682 </li> 683 } 684 @if (Pageview.User != null && Pageview.User.AllowDownloadDocuments()) 685 { 686 if (!string.IsNullOrEmpty(specs.GetByKey("WiringDiagrams").Value)) 687 { 688 <li> 689 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("WiringDiagrams").Value','@filePattern.Replace("[[type]]","WiringDiagrams")','WiringDiagrams')" target="_blank"> 690 <svg> 691 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 692 </svg> 693 @Translate(basicPimPrefix + "Wiring diagram", "Wiring diagram") 694 </a> 695 </li> 696 } 697 if (!string.IsNullOrEmpty(specs.GetByKey("Drawings").Value)) 698 { 699 <li> 700 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("Drawings").Value','@filePattern.Replace("[[type]]","Drawings")','Drawings')" target="_blank"> 701 <svg> 702 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 703 </svg> 704 @Translate(basicPimPrefix + "Drawings", "Drawings") 705 </a> 706 </li> 707 } 708 if (!string.IsNullOrEmpty(specs.GetByKey("BrandingFile").Value)) 709 { 710 <li> 711 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("BrandingFile").Value','@filePattern.Replace("[[type]]","Branding")','BrandingFile')" target="_blank"> 712 <svg> 713 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 714 </svg> 715 @Translate(basicPimPrefix + "Branding File", "Branding drawing") 716 </a> 717 </li> 718 } 719 if (!string.IsNullOrEmpty(specs.GetByKey("QuickGuide").Value)) 720 { 721 <li> 722 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("QuickGuide").Value','@filePattern.Replace("[[type]]","QuickGuide")','QuickGuide')" target="_blank"> 723 <svg> 724 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 725 </svg> 726 @Translate(basicPimPrefix + "QuickGuide", "Quick Guide") 727 </a> 728 </li> 729 } 730 if (!string.IsNullOrEmpty(specs.GetByKey("AssemblyGuide").Value)) 731 { 732 <li> 733 <a href="#" v-on:click="downloadProductFile($event,'@name','@specs.GetByKey("AssemblyGuide").Value','@filePattern.Replace("[[type]]","AssemblyGuide")','AssemblyGuide')" target="_blank"> 734 <svg> 735 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/files/dist/icons/icons.svg#download"></use> 736 </svg> 737 @Translate(basicPimPrefix + "AssemblyGuide", "Assembly Guide") 738 </a> 739 </li> 740 } 741 } 742 </ul> 743 </div> 744 745 </template> 746 </b-collapse> 747 748 @if (!isSparePart) 749 { 750 <product-spare-parts-view :page-view-id="@Pageview.ID" 751 :language-id="'@selectedModel.LanguageId'" 752 :product-number="@selectedModel.Number" 753 :exploded-drawing="'@(specs.GetByKey("ExplodedDrawing")?.Value)'" 754 :spare-part-report-exist="sparePartReportExist" 755 product-name="@name" 756 language-code="@lang" 757 :sparepart-location="product.product.defaultStockLocationName"> 758 </product-spare-parts-view> 759 } 760 761 </div> 762 </section> 763 } 764 @if (accessories != null && accessories.Any()) 765 { 766 767 <section class="basic_related"> 768 <template> 769 <header class="basic_related-header" id="accessories-header"> 770 <h2 class="text-center"> 771 @Translate(basicPimPrefix + "Accessories", "Accessories") 772 </h2> 773 </header> 774 <slick ref="slick" 775 class="basic_related-grid" 776 :options="slickAccessoriesOptions"> 777 @foreach (var accessory in accessories) 778 { 779 var converted = new AsyncProductWithSpecification(new SimpleProduct(accessory.ToViewModel(), null, stockInformation, inspirationGroupIds, remoteStock, true)); 780 var accessoryJson = JsonConvert.SerializeObject(converted, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); 781 accessoryJson = accessoryJson.Replace("'", "&#39;"); 782 <article class="basic_related-product"> 783 <a href="/Default.aspx?ID=@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("plp")&amp;ProductID=@accessory.Id" class="basic_related-url"> 784 <figure> 785 @{ 786 var image = string.IsNullOrEmpty(accessory.ImageLarge) ? "/Files/Images/default.jpg" : "/Files/" + accessory.ImageLarge; 787 } 788 <img src="/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;Image=@image" 789 alt="@accessory.Name" 790 class="img-fluid" /> 791 </figure> 792 <header> 793 <h1>@accessory.Name</h1> 794 <p class="basic_related-category">@accessory.ShortDescription</p> 795 <p class="basic_related-sku">@Translate(basicPimPrefix + "Product Number", "Product Number") @accessory.Number</p> 796 </header> 797 </a> 798 @if (Pageview.IsCurrentlyB2B()) 799 { 800 <buying-component inline-template :initial-product='@accessoryJson'> 801 <footer> 802 <async-price class-type="asyncprice-plp" 803 :default-price="@accessory.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 804 :product='@accessoryJson' 805 only-price="true" 806 standard-customer="@standardCustomer"> 807 </async-price> 808 <add-to-basket-simple :product='@accessoryJson' 809 button-class="btn btn-primary" 810 class="addtobasketsimple-plp ml-auto" 811 language-id="@languageId" 812 :price-without-vat="@accessory.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 813 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 814 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 815 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 816 standard-customer="@standardCustomer"> 817 </add-to-basket-simple> 818 </footer> 819 </buying-component> 820 821 } 822 else 823 { 824 <footer> 825 <async-price class-type="asyncprice-plp" 826 :default-price="@accessory.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 827 :product='@accessoryJson' 828 only-price="true" 829 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 830 standard-customer="@standardCustomer" /> 831 832 <div class="asyncprice-plp"> 833 <div class="price-withoutvat"> 834 <span class="price-label">@Translate(basicPimPrefix + "price without vat", "Price without VAT")</span> 835 <p class="price"> 836 <span class="unit-price"> 837 @accessory.Price.PriceWithoutVATFormattedNoSymbol @accessory.Price.Currency.Code 838 </span> 839 </p> 840 </div> 841 </div> 842 <add-to-basket-simple :product='@accessoryJson' 843 button-class="btn btn-primary" 844 class="addtobasketsimple-plp ml-auto" 845 language-id="@languageId" 846 :price-without-vat="@accessory.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 847 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 848 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 849 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 850 standard-customer="@standardCustomer"> 851 </add-to-basket-simple> 852 </footer> 853 } 854 </article> 855 } 856 </slick> 857 </template> 858 </section> 859 } 860 @if (relatedProducts != null && relatedProducts.RelatedProducts.Any()) 861 { 862 <section class="basic_related"> 863 <template> 864 <header class="basic_related-header" id="related-header"> 865 <h2 class="text-center"> 866 @Translate(basicPimPrefix + "Related Products", "Related Products") 867 </h2> 868 </header> 869 <slick ref="slick" 870 class="basic_related-grid" 871 :options="slickRelatedOptions"> 872 @foreach (var relProduct in relatedProducts.RelatedProducts) 873 { 874 875 //var relProduct = productService.GetProductById(rel.Id, rel.VariantId, rel.LanguageId); 876 var converted = new AsyncProductWithSpecification(new SimpleProduct(relProduct.ToViewModel(), null, stockInformation, inspirationGroupIds, remoteStock, true)); 877 var relProductJson = JsonConvert.SerializeObject(converted, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); 878 relProductJson = relProductJson.Replace("'", "&#39;"); 879 <article class="basic_related-product"> 880 <a href="/Default.aspx?ID=@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("plp")&amp;ProductID=@relProduct.Id" class="basic_related-url"> 881 <figure style="min-height: 1px;"> 882 @{ 883 var image = string.IsNullOrEmpty(relProduct.ImageLarge) ? "/Files/Images/default.jpg" : "/Files/" + relProduct.ImageLarge; 884 } 885 <img src="/Admin/Public/GetImage.ashx?Width=427&amp;Height=427&amp;Compression=85&amp;Crop=5&amp;fillcanvas=true&amp;Image=@image" 886 alt="@relProduct.Name" 887 class="img-fluid" /> 888 </figure> 889 <header> 890 <h1>@relProduct.Name</h1> 891 <p class="basic_related-category">@relProduct.ShortDescription</p> 892 <p class="basic_related-sku">@Translate(basicPimPrefix + "Product Number", "Product Number") @relProduct.Number</p> 893 </header> 894 </a> 895 896 @if (Pageview.IsCurrentlyB2B()) 897 { 898 899 <buying-component @@discount="onDiscount($event)" inline-template :initial-product='@relProductJson' :selected-product='@relProductJson'> 900 <footer> 901 <async-price class-type="asyncprice-plp" 902 :default-price="@relProduct.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 903 :product='@relProductJson' 904 unit-of-measure="PCS" 905 only-price="true" 906 should-emit-warranties="true" 907 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 908 standard-customer="@standardCustomer" 909 @@discount="onDiscount($event)"> 910 </async-price> 911 <add-to-basket-simple :product='@relProductJson' 912 button-class="btn btn-primary" 913 :unit-of-measure="'PCS'" 914 class="addtobasketsimple-plp ml-auto" 915 :price-without-vat="currentItemPriceWithoutVat" 916 language-id="@languageId" 917 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 918 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 919 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 920 standard-customer="@standardCustomer" 921 @@discount="onDiscount($event)"> 922 </add-to-basket-simple> 923 </footer> 924 </buying-component> 925 926 } 927 else 928 { 929 <footer> 930 <async-price class-type="asyncprice-plp" 931 :default-price="@relProduct.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 932 :product='@relProductJson' 933 only-price="true" 934 :only-standard-price="@(Pageview.IsCurrentlyB2C().ToString().ToLower())" 935 standard-customer="@standardCustomer" /> 936 937 <add-to-basket-simple :product='@relProductJson' 938 :unit-of-measure="'PCS'" 939 button-class="btn btn-primary" 940 class="addtobasketsimple-plp ml-auto" 941 language-id="@languageId" 942 :price-without-vat="@relProduct.Price.PriceWithoutVAT.ToString(CultureInfo.InvariantCulture)" 943 :only-spare-parts="@((Pageview.User.OnlySpareParts() && !isSparePart).ToString().ToLower())" 944 :is-marketing-user="@(Pageview.User.OnlyView().ToString().ToLower())" 945 :ishvasuser="@(Pageview.User.IsHVACUser().ToString().ToLower())" 946 standard-customer="@standardCustomer"> 947 </add-to-basket-simple> 948 </footer> 949 } 950 </article> 951 } 952 </slick> 953 </template> 954 </section> 955 } 956 957 </div> 958 </product-details-simple-pim> 959