Error executing template "Designs/junckers/eCom/Product/junckers-outlet.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_8250e67e6e514dcb8e947db2cb562a52.Execute() in D:\dynamicweb.net\Solutions\junckers.espresso4.dk\Files\Templates\Designs\junckers\eCom\Product\junckers-outlet.cshtml:line 1037
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Co3.Espresso.Website.TemplateBases.Pages.PageBase 2 @using Dynamicweb.Ecommerce.Prices; 3 @using Co3.Espresso.Base.Extensions; 4 @using Co3.Espresso.Base.Models; 5 @using System.Web 6 @using System 7 @using System.Collections.Generic 8 @using System.Globalization 9 @using Dynamicweb.Ecommerce.Prices 10 @using Co3.Espresso.Base.Extensions 11 @using Co3.Espresso.Base.Models 12 @using Co3.Espresso.Website.Models.FrontEnd 13 @using Co3.Espresso.Website.Services 14 @using Dynamicweb.Ecommerce.Common.eCom7 15 @using Dynamicweb.Rendering 16 @using System.Linq 17 @using Dynamicweb.Ecommerce 18 @using Dynamicweb.Ecommerce.Notifications 19 @using Dynamicweb.Ecommerce.Stocks 20 @using Dynamicweb.Security.UserManagement 21 @using Dynamicweb.Ecommerce.Variants 22 @using Dynamicweb.Frontend 23 @using Dynamicweb.Ecommerce.Products; 24 @using ProductService = Co3.Espresso.Website.Services.ProductService 25 @using System.Text.RegularExpressions 26 @using Dynamicweb.Ecommerce.Common 27 @using Dynamicweb.Ecommerce.International 28 @using System.Globalization 29 @using Co3.Espresso.Base.Extensions 30 @using Co3.Espresso.DownloadManager.Models 31 @using Co3.Espresso.Website.Models.FrontEnd 32 @using Co3.Espresso.Website.Services 33 @using Dynamicweb.Content 34 @using Dynamicweb.Frontend 35 @using Dynamicweb.Rendering 36 @using EcomContext = Dynamicweb.Ecommerce.Common.Context 37 38 @functions { 39 40 public string getCountryCodeFromArea( Area area ) 41 { 42 RegionInfo regionInfo = new RegionInfo( area.CultureInfo.LCID ); 43 return regionInfo.TwoLetterISORegionName; 44 } 45 46 public dynamic GetPriceInfo( string beforePrice = "", string basicPrice = "" ) 47 { 48 double vat = EcomContext.Country.Vat; 49 double dblBeforePrice = 0; 50 double.TryParse( beforePrice, out dblBeforePrice ); 51 double dblBasicPrice = 0; 52 double.TryParse( basicPrice, out dblBasicPrice ); 53 double dblBeforePriceWithVat = 0; 54 double dblDiffPrice = 0; 55 int pct = 0; 56 57 if ( dblBeforePrice > 0 ) 58 { 59 dblBeforePriceWithVat = dblBeforePrice * ( ( vat / 100d ) + 1 ); 60 if ( dblBeforePriceWithVat > dblBasicPrice ) 61 { 62 dblDiffPrice = dblBeforePriceWithVat - dblBasicPrice; 63 pct = (int)Math.Ceiling((( 100d / dblBeforePriceWithVat ) * dblDiffPrice)); 64 } 65 } 66 67 dynamic returnValue = new 68 { 69 beforePriceWithVat = dblBeforePriceWithVat, 70 beforePriceWithVatFormatted = ProductService.Instance.GetPriceFormatted(dblBeforePriceWithVat), 71 basicPrice = dblBasicPrice, 72 basicPriceFormatted = ProductService.Instance.GetPriceFormatted(dblBasicPrice), 73 diffPrice = dblDiffPrice, 74 diffPriceFormatted = ProductService.Instance.GetPriceFormatted(dblDiffPrice), 75 pct = pct, 76 vat = vat 77 }; 78 return returnValue; 79 } 80 81 } 82 83 84 @helper ProductDescription(string sectionClasses = "e-section", bool sectionCollapse = false, string contentClasses = null, string heading = null, string content = null) 85 { 86 if ( string.IsNullOrEmpty( content ) == false ) 87 { 88 ClassList headingClassList = new ClassList(); 89 headingClassList.AddClasses( "col-12" ); 90 ClassList contentClassList = new ClassList(); 91 contentClassList.AddClasses( "col-12" ); 92 93 @sectionStart( sectionClasses: sectionClasses, sectionCollapse: sectionCollapse, contentClasses: contentClasses ) 94 95 if ( string.IsNullOrEmpty( heading ) == false ) 96 { 97 <div class="@headingClassList"> 98 <h2>@heading</h2> 99 </div> 100 } 101 <div class="@contentClassList"> 102 @content 103 </div> 104 105 @sectionEnd() 106 } 107 } 108 109 110 @helper ProductVideo(string sectionClasses = "e-section", string contentClasses = null, string heading = null, string videoURL = null) 111 { 112 if ( string.IsNullOrEmpty( videoURL ) == false ) 113 { 114 ClassList headingClassList = new ClassList(); 115 headingClassList.AddClasses( "col-12" ); 116 ClassList contentClassList = new ClassList(); 117 contentClassList.AddClasses( "col-12" ); 118 119 120 @sectionStart( sectionClasses: sectionClasses, contentClasses: contentClasses ) 121 122 if ( string.IsNullOrEmpty( heading ) == false ) 123 { 124 <div class="@headingClassList"> 125 <h2>@heading</h2> 126 </div> 127 } 128 129 <div class="@contentClassList"> 130 <div class="embed-responsive embed-responsive-16by9 mb-2"> 131 <iframe class="embed-responsive-item" src="@videoURL" width="1080" height="608" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> 132 </div> 133 </div> 134 @sectionEnd() 135 } 136 } 137 138 @helper ProductRelatedProducts(string sectionClasses = "e-section p-section p-section-bg-white pt-3 border-bottom", string contentClasses = null, string heading = null, 139 IEnumerable<RazorTemplateBase<RazorTemplateModel<Template>>.LoopItem> productLoop = null) 140 { 141 if ( productLoop != null && productLoop.Any() == true ) 142 { 143 ClassList headingClassList = new ClassList(); 144 headingClassList.AddClasses( "col-10 mx-auto" ); 145 ClassList contentClassList = new ClassList(); 146 contentClassList.AddClasses( "col-10 mx-auto" ); 147 148 @sectionStart( sectionClasses: sectionClasses, contentClasses: contentClasses ) 149 150 if ( string.IsNullOrEmpty( heading ) == false ) 151 { 152 <div class="@headingClassList"> 153 <h2>@heading</h2> 154 </div> 155 } 156 157 158 <div class="@contentClassList"> 159 <div class="e-products mb-2"> 160 <div class="row"> 161 @{ 162 string productlistItemClassList = ProductlistService.Instance.GetGridItemWidth( null ).ToResponsiveClasses(); 163 } 164 @foreach ( RazorTemplateBase<RazorTemplateModel<Template>>.LoopItem product in productLoop ) 165 { 166 @ProductlistItem( product, productlistItemClassList ) 167 } 168 </div> 169 </div> 170 </div> 171 172 @sectionEnd() 173 } 174 } 175 176 @helper ProductlistItem(RazorTemplateBase<RazorTemplateModel<Template>>.LoopItem product, string productlistItemClassList = null) 177 { 178 if ( product != null ) 179 { 180 dynamic productData = new 181 { 182 id = product.GetString( "Ecom:Product.ID" ), 183 url = ProductService.Instance.GetProductLink( product.GetString( "Ecom:Product.PrimaryOrFirstGroupID" ), product.GetString( "Ecom:Product.ID" ) ), 184 number = product.GetString( "Ecom:Product.Number" ), 185 name = product.GetString( "Ecom:Product.Name" ), 186 imageLarge = ImageService.Instance.GetImageURL( product.GetString( "Ecom:Product.ImageLarge.Clean" ), 450, 350, 5 ), 187 price = ProductService.Instance.GetPriceFormatted( product.GetDouble( "Ecom:Product.Price.Price" ) ), 188 descriptionShortExtra01 = product.GetString( "Ecom:Product:Field.DescriptionShortExtra01" ), 189 descriptionShort = product.GetString( "Ecom:Product.ShortDescription" ), 190 stock = new 191 { 192 id = product.GetString( "Ecom:Product:Stock.ID" ), 193 quantity = product.GetString( "Ecom:Product.Stock" ), 194 text = product.GetString( "Ecom:Product:Stock.Text" ), 195 delivery = product.GetString( "Ecom:Product:Stock.DeliveryText" ) 196 } 197 }; 198 199 <div class="@productlistItemClassList"> 200 <div class="e-products-item js-e-products-item"> 201 <div class="e-products-item-container"> 202 <div class="junckers-relatedproducts-item-image-container" style="background: url(@productData.imageLarge)"> 203 @if ( string.IsNullOrEmpty( productData.descriptionShort ) == false ) 204 {<div class="junckers-relatedproducts-item-text-container py-1"> 205 <p class="e-products-item-text mb-0 px-2 small"> 206 <strong>Package Size</strong> 207 </p> 208 <p class="e-products-item-text mb-0 text-muted px-2 small"> 209 @productData.descriptionShort 210 </p> 211 </div> 212 } 213 </div> 214 <div class="e-products-item-text-container text-center"> 215 <h3 class="e-products-item-name mb-0"> 216 @productData.name 217 </h3> 218 @* <p class="e-products-item-text mb-0"> *@ 219 @* <small class="e-products-item-price small text-muted"> *@ 220 @* <a href="@productData.url"> *@ 221 @* @productData.price *@ 222 @* </a> *@ 223 @* </small> *@ 224 @* </p> *@ 225 </div> 226 </div> 227 </div> 228 </div> 229 } 230 } 231 232 233 @helper sectionStart(string sectionClasses = "e-section", string contentClasses = null, bool sectionCollapse = false, string collapseToggleTextExpand = "Se mere", string collapseToggleTextCollapse = "Se mindre") 234 { 235 ClassList sectionClassList = new ClassList(); 236 sectionClassList.AddClasses( sectionClasses ); 237 ClassList contentClassList; 238 string collapseId = Guid.NewGuid().ToString( "N" ); 239 ClassList collapseToggleClassList = new ClassList(); 240 if ( contentClasses == null ) 241 { 242 contentClassList = Co3.Espresso.Website.Services.PageService.Instance.GetResponsiveClassesFromPageItem( PageView.Current().Page.Item ); 243 } 244 else 245 { 246 contentClassList = new ClassList(); 247 contentClassList.AddClasses( contentClasses ); 248 } 249 if ( sectionCollapse == true ) 250 { 251 sectionClassList.AddClasses( "p-section-collapse js-p-section-collapse" ); 252 collapseToggleClassList.AddClasses( contentClasses ); 253 collapseToggleClassList.AddClasses( "p-section-collapse-toggle collapsed order-last text-center" ); 254 contentClassList.AddClasses( "p-section-collapse-content collapse is-md" ); 255 } 256 @:<section class="@sectionClassList"> 257 @:<div class="container-fluid"> 258 @:<div class="row"> 259 260 if ( sectionCollapse == true ) 261 // TODO: SplitPattern into seperate heler function 262 { 263 <div class="@collapseToggleClassList" data-toggle="collapse" data-target="#@collapseId"> 264 <button class="btn btn-primary p-section-collapse-toggle-btn" type="button"> 265 <i class="material-icons p-section-collapse-toggle-icon">keyboard_arrow_down</i> 266 </button> 267 <small class="p-section-collapse-toggle-text h4" data-expand-text="@collapseToggleTextExpand" data-collapse-text="@collapseToggleTextCollapse"></small> 268 </div> 269 } 270 271 @:<div class="@contentClassList" id="@collapseId"> 272 @:<div class="row"> 273 } 274 275 @helper sectionEnd() 276 { 277 @:</div> 278 @:</div> 279 @:</div> 280 @:</div> 281 @:</section> 282 } 283 284 285 286 287 @{ 288 string productType = GetString( "Ecom:Product.CategoryField.OutletShop.ShopProductType.Value" ); 289 string beforePrice = !string.IsNullOrEmpty( GetString( "Ecom:Product.CategoryField.OutletShop.BeforePrice.Value" ) ) ? ProductService.Instance.GetPriceFormatted( GetDouble( "Ecom:Product.CategoryField.OutletShop.BeforePrice.Value" ) ) : ""; 290 int stock = GetInteger( "Ecom:Product.Stock" ); 291 string colliNumber = GetString( "Ecom:Product.CategoryField.OutletShop.ColliNumber.Value" ); 292 string colliUnit = GetString( "Ecom:Product.CategoryField.OutletShop.ColliUnit.Value" ); 293 string salesUnit = GetString( "Ecom:Product.CategoryField.OutletShop.SalesUnit.Value" ); 294 string aAccCalculationDesc = GetString( "Ecom:Product.CategoryField.OutletShop.AccCalculationDesc.Value" ); 295 string accM2Number = GetString( "Ecom:Product.CategoryField.OutletShop.AccM2Number.Value" ); 296 string accM2Waste = GetString( "Ecom:Product.CategoryField.OutletShop.AccM2Waste.Value" ); 297 string price = ProductService.Instance.GetPriceFormatted( GetDouble( "Ecom:Product.Price.Price" ) ); 298 double basicPrice = GetDouble( "Ecom:Product.Price.PriceWithVAT.Value" ); // GetDouble( "Ecom:Product.Price.Price" ); 299 dynamic priceInfo = GetPriceInfo( GetString( "Ecom:Product.CategoryField.OutletShop.BeforePrice.Value" ), GetString( "Ecom:Product.Price.Price" ) ); 300 string colliUnitTranslateKey = string.Format( "eCom Product - Configurator - Unit - {0} - Text", colliUnit ); 301 302 string primaryGroupID = GetString( "Ecom:Product.PrimaryGroupID" ); 303 GroupService groupService = new GroupService(); 304 int AccessoriesProductCounter = 0; 305 306 CultureInfo currencyCulture = new CultureInfo( Context.Currency.CultureInfo ); 307 string currencyDecimalSeparator = currencyCulture.NumberFormat.CurrencyDecimalSeparator; // NumberDecimalSeparator; 308 string currencyGroupSeparator = currencyCulture.NumberFormat.CurrencyGroupSeparator; // .NumberGroupSeparator; 309 string currencyCode = Context.Currency.Code; 310 string currencySymbol = Context.Currency.Symbol; 311 int currencySymbolPlace = Context.Currency.SymbolPlace; 312 313 string orderLineGroupID = Guid.NewGuid().ToString(); 314 string orderLineGroupIDSample = Guid.NewGuid().ToString(); 315 316 List<LoopItem> relatedGroups = GetLoop( "ProductRelatedGroups" ); 317 List<string> groupIds = new List<string>(); 318 groupIds.Add( "RELGRP4" ); //Basic Installation Package: Concrete subfloor 319 groupIds.Add( "RELGRP9" ); //Basic installation package (Board length 189cm) 320 groupIds.Add( "RELGRP5" ); //Underfloor Heating package: Concrete subfloor 321 groupIds.Add( "RELGRP6" ); //Subfloor package for: Concrete without underfloor heating 322 groupIds.Add( "RELGRP7" ); //Subfloor package: Wood based subfloor 323 } 324 325 @inherits Co3.Espresso.Website.TemplateBases.Pages.PageBase 326 327 @{ 328 string eComProductCanonical = string.Empty; 329 string globalValueUrl = GetGlobalValue( "Global:Pageview.Url" ); 330 331 if ( GetGlobalValue( "Global:Pageview.Url" ).IndexOf( "?" ) > -1 ) 332 { 333 globalValueUrl = GetGlobalValue( "Global:Pageview.Url" ).Substring( 0, GetGlobalValue( "Global:Pageview.Url" ).IndexOf( "?" ) ); 334 } 335 336 if ( string.IsNullOrEmpty( GetString( "Ecom:Product.Canonical" ) ) == false ) 337 { 338 eComProductCanonical = String.Format( "{0}://{1}{2}", GetGlobalValue( "Global:Request.Scheme" ), GetGlobalValue( "Global:Request.Host" ), GetString( "Ecom:Product.Canonical" ) ); 339 } 340 else 341 { 342 eComProductCanonical = String.Format( "{0}://{1}{2}", GetGlobalValue( "Global:Request.Scheme" ), GetGlobalValue( "Global:Request.Host" ), globalValueUrl ); 343 } 344 string metaTitle = @GetString( "Ecom:Product.MetaTitle" ); 345 string metaDescription = @GetString( "Ecom:Product.MetaDescription" ); 346 } 347 348 @SnippetStart( "productMetaTags" ) 349 350 @{ 351 if (string.IsNullOrEmpty( metaTitle ) ) 352 { 353 metaTitle = GetString( "Ecom:Product.Name" ); 354 } 355 356 } 357 358 <title>@metaTitle</title> 359 <meta title="@metaTitle" /> 360 <meta name="description" content="@metaDescription" /> 361 <link rel="canonical" href="@eComProductCanonical"> 362 @SnippetEnd( "productMetaTags" ) 363 364 @sectionEnd() 365 366 <div class="e-product j-outlet-product js-e-outlet-product js-e-product" data-pdf="@GetString( "Ecom:Product:Field.DocumentationPdf.Value" )" data-productid="@GetString( "Ecom:Product.ID" )"> 367 @sectionStart( "e-section pb-3 p-section-bg-white pt-6 pdf-first-section" ) 368 369 <div class="col-12"> 370 <div class="row"> 371 <div class="align-self-center col-12 col-md-6"> 372 @if ( priceInfo.pct > 0 ) 373 { 374 <span class="d-inline-block junckers-price-percentage-splash position-relative" style="transform: translate(10px, -80%);">@Translate( "eCom Product - Outlet - Save text", "Save" )<br />@priceInfo.pct %</span> 375 } 376 <div class="e-product-text-container"> 377 <h1 class="e-product-name"> 378 @GetString( "Ecom:Product.Name" ) 379 </h1> 380 381 <div class="e-product-text mb-2 small"> 382 @GetString( "Ecom:Product.LongDescription" ) 383 </div> 384 <hr /> 385 @if ( stock > 0 ) 386 { 387 bool purchaseAllowed = true; 388 string campaignDescription = string.Empty; 389 string afterPurchasePeriodDescription = string.Empty; 390 string saleStartsText = string.Empty; 391 string campaignLabel = string.Empty; 392 string dkBuyPeriodStart = string.Empty; 393 394 if ( GetBoolean( "Ecom:Product.CategoryField.OutletShop.IsCampaignProduct.Value.Clean" ) ) 395 { 396 Dynamicweb.Ecommerce.Products.Product dwProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById( GetString("Ecom:Product.ID"), string.Empty, false ); 397 Dynamicweb.Ecommerce.Products.Group groupWithCampaignPeriod = dwProduct.Groups.FirstOrDefault( pg => pg.GetProductGroupFieldValue<DateTime?>( "CampaignBuyPeriodStart" ) != null && pg.GetProductGroupFieldValue<DateTime?>( "CampaignBuyPeriodEnd" ) != null ); 398 if ( groupWithCampaignPeriod != null ) 399 { 400 DateTime nowDateTime = DateTime.Now; 401 DateTime buyPeriodStart = groupWithCampaignPeriod.GetProductGroupFieldValue<DateTime>( "CampaignBuyPeriodStart" ); 402 DateTime buyPeriodEnd = groupWithCampaignPeriod.GetProductGroupFieldValue<DateTime>( "CampaignBuyPeriodEnd" ); 403 DateTime displayBuyPeriodStart = buyPeriodStart; 404 405 int differenceToDanishTimezone = PageView.Current().Area.Item.GetValue<int>( "EcommerceDifferenceToDanishTimezone" ); 406 if (differenceToDanishTimezone != 0 ) 407 { 408 differenceToDanishTimezone = -Math.Sign(differenceToDanishTimezone) * Math.Abs(differenceToDanishTimezone); 409 buyPeriodStart = buyPeriodStart.AddHours( differenceToDanishTimezone ); 410 buyPeriodEnd = buyPeriodEnd.AddHours( differenceToDanishTimezone ); 411 } 412 413 dkBuyPeriodStart = buyPeriodStart.ToString("f"); 414 415 campaignLabel = !string.IsNullOrEmpty( GetString( "Ecom:Product.CategoryField.OutletShop.CampaignLabel.Value.Clean" ) ) ? GetString( "Ecom:Product.CategoryField.OutletShop.CampaignLabel.OptionLabel" ) : string.Empty; 416 417 if ( buyPeriodStart.Ticks > 0 ) 418 { 419 purchaseAllowed = false; 420 if ( nowDateTime >= buyPeriodStart ) 421 { 422 purchaseAllowed = true; 423 if ( buyPeriodEnd.Ticks > 0 ) 424 { 425 purchaseAllowed = false; 426 if ( buyPeriodEnd >= nowDateTime ) 427 { 428 purchaseAllowed = true; 429 } 430 else 431 { 432 afterPurchasePeriodDescription = Translate( "Product Campaign - After Purchase Period - Text", "Salgsperioden af dette produkt er desværre overskredet" ); 433 } 434 } 435 } 436 else 437 { 438 campaignDescription = GetString( "Ecom:Product.CategoryField.OutletShop.CampaignDescription.Value.Clean" ); 439 saleStartsText = string.Format( "{0}: <b>{1:f}</b>", Translate( "Product Campaign - Sale Starts - Text", "Sale Starts" ), displayBuyPeriodStart ); 440 } 441 } 442 } 443 } 444 445 <div class="align-items-baseline d-flex mb-1"> 446 <p class="d-flex flex-column mb-1 mr-auto"> 447 <span class="mr-1 text-muted" style="text-decoration: line-through">@priceInfo.beforePriceWithVatFormatted</span> 448 <span class="h2 m-0 mr-1"> 449 @price <span class="small">@Translate( "eCom Product - Outlet - per sqm", "per sqm" )</span> 450 </span> <span class="text-primary">@Translate( "eCom Product - Outlet - Save text", "Save" ) @priceInfo.diffPriceFormatted @Translate( "eCom Product - Outlet - per sqm", "per sqm" )</span> <span class="small">@Translate( "eCom Product - Outlet - Tax included - Text", "(Tax included)" )</span> 451 </p> 452 <p class="mb-0 text-right"> 453 @Translate( "eCom Product - Outlet - Stock Text Start", "We have" ) <br class="d-lg-none" /> @stock @salesUnit <br class="d-lg-none" /> @Translate( "eCom Product - Outlet - Stock Text - In", "in" ) @Translate( "eCom Product - Stock - Text", "Stock" ) 454 </p> 455 </div> 456 457 if ( !purchaseAllowed ) 458 { 459 if ( !string.IsNullOrEmpty( campaignDescription ) ) 460 { 461 <div class="bg-light border p-1 mb-2"> 462 @if ( !string.IsNullOrEmpty( campaignLabel ) ) 463 { 464 <h2>@campaignLabel</h2> 465 } 466 <p>@campaignDescription</p> 467 @if ( !string.IsNullOrEmpty( saleStartsText ) ) 468 { 469 <p class="mb-0 small" data-dk-buy-period-start="@dkBuyPeriodStart">@saleStartsText</p> 470 } 471 </div> 472 } 473 else if ( !string.IsNullOrEmpty( afterPurchasePeriodDescription ) ) 474 { 475 <div class="bg-light border p-1 mb-2"> 476 @if ( !string.IsNullOrEmpty( campaignLabel ) ) 477 { 478 <h2>@campaignLabel</h2> 479 } 480 <p>@campaignLabel</p> 481 <p>@afterPurchasePeriodDescription</p> 482 </div> 483 } 484 } 485 486 <div class="d-flex flex-column-reverse"> 487 @if ( purchaseAllowed ) 488 { 489 <button aria-controls="accessories" aria-expanded="false" class="btn btn-flex btn-success collapsed flex-grow-1" data-toggle="collapse" href="#accessories" role="button"> 490 @Translate( "eCom Product - Configure - Text", "Configure" ) 491 </button> 492 } 493 494 @foreach ( LoopItem group in GetLoop( "ProductRelatedGroups" ) ) 495 { 496 if ( group.GetValue( "Ecom:Product:RelatedGroup.GroupID" ).ToString().Contains( "RELGRP8" ) ) 497 { 498 foreach ( LoopItem product in group.GetLoop( "RelatedProducts" ) ) 499 { 500 <form action="/system/data/samples-cart" class="border-bottom d-flex e-product-form flex-grow-1 js-junckers-sample-form junckers-sample-form mt-2 pb-3" method="post"> 501 @if ( product.GetLoop( "VariantCombinations" ).Any() ) 502 { 503 <input name="ProductID" type="hidden" value="@product.GetString( "Ecom:Product.ID" )"> 504 <select class="js-variantid-picker" id="VariantID" name="VariantID"> 505 <option value="">@Translate( "eCom Product - Order a sample - Button", "Order a sample" )</option> 506 <option value="">@Translate( "eCom Product - Choose nothing - Text", "Choose nothing ..." )</option> 507 @foreach ( LoopItem variantCombination in product.GetLoop( "VariantCombinations" ) ) 508 { 509 <option value="@variantCombination.GetString( "Ecom:VariantCombination.VariantID" )">@variantCombination.GetString( "Ecom:VariantCombination.VariantText" )</option> 510 } 511 </select> 512 } 513 else 514 { 515 <select class="js-variantid-picker" id="ProductID" name="ProductID"> 516 <option value="">@Translate( "eCom Product - Order a sample - Button", "Order a sample" )</option> 517 <option value="">@Translate( "eCom Product - Choose nothing - Text", "Choose nothing ..." )</option> 518 <option value="@product.GetString( "Ecom:Product.ID" )">@product.GetString("Ecom:Product.Name")</option> 519 </select> 520 } 521 522 <input name="CartCmd" type="hidden" value="Add"> 523 <input name="OrderContext" type="hidden" value="ORDERCONTEXT3"> 524 <input name="UnitID" type="hidden" value=""> 525 <input name="Redirect" type="hidden" value="false"> 526 <input name="Quantity" type="hidden" value="1"> 527 <input id="EcomOrderLineFieldInput_OrderlineGroupID" name="EcomOrderLineFieldInput_OrderlineGroupID" type="hidden" value="sample"> 528 <button class="border btn btn-success d-none flex-shrink-0 js-sample-buy-btn m-0 p-0 px-2" type="submit"> 529 @Translate( "eCom Product - Add To Cart - Button" ) 530 </button> 531 <button class="border btn btn-primary flex-shrink-0 js-junckers-open-sample-checkout-modal d-none m-0 p-0 px-2" type="button"> 532 <i class="e-nav-pageicon material-icons" style="transform: scale(1.4);">shopping_cart</i> 533 </button> 534 </form> 535 536 <div aria-hidden="true" aria-labelledby="sampleCheckoutModal" class="fade modal" id="sampleCheckoutModal" role="dialog" tabindex="-1"> 537 <div class="modal-dialog modal-sm" role="document"> 538 <div class="modal-content"> 539 <div class="modal-header"> 540 <h2 class="modal-title" id="sampleCheckoutModal">@Translate( "eCom Sample Checkout - Order - Text", "Bestilling" )</h2> 541 <button aria-label="Close" class="close" data-dismiss="modal" type="button"> 542 <span aria-hidden="true">&times;</span> 543 </button> 544 </div> 545 <div class="modal-body"> 546 @{ 547 string activeCampaignId = string.Empty; 548 if ( PageView.Current().AreaID == 17 ) //DK 549 { 550 activeCampaignId = "229"; 551 } 552 else if (PageView.Current().AreaID == 24 ) //IE 553 { 554 activeCampaignId = "238"; 555 } 556 else if (PageView.Current().AreaID == 53 ) //UK 557 { 558 activeCampaignId = "235"; 559 } 560 561 if (!string.IsNullOrEmpty(activeCampaignId) ) 562 { 563 <div class="junckers-active-campaign _form_@activeCampaignId js-junckers-active-campaign-modal" style="overflow: hidden; width: 0; height: 0;"></div><script src="https://junckersdk.activehosted.com/f/embed.php?id=@activeCampaignId" type="text/javascript" charset="utf-8"></script> 564 } 565 } 566 567 <div class="js-junckers-sample-checkout-orderlines"> 568 <script id="js-e-handlebars-tmpl-junckers-sample-checkout-orderlines" type="text/x-handlebars-template"> 569 {{#if orderIsCompleted}} 570 <h2>@Translate( "eCom Sample Checkout - Thank you - Text", "Tak for din bestilling!" )</h2> 571 {{else}} 572 <div class="js-junckers-modal-samples-checkout-step row" data-step="1"> 573 <div class="col-12"> 574 <h3 class="pb-1">@Translate( "eCom Sample Checkout - Sample is added - Text", "Din sample er nu lagt i kurven." )</h3> 575 <div class="d-flex justify-content-between"> 576 <button class="btn btn-lg btn-success e-checkout-next-step js-junckers-sample-checkout-next-step">@Translate( "eCom Sample Checkout - Checkout - Text", "Checkout" )</button> 577 <button class="btn btn-lg btn-link e-checkout-next-step js-junckers-sample-checkout-close-modal-btn px-0">@Translate( "eCom Sample Checkout - Continue Shopping - Text", "Shop videre" )</button> 578 </div> 579 </div> 580 </div> 581 <div class="js-junckers-modal-samples-checkout-step row d-none" data-step="2"> 582 {{#each cart.orderlines}} 583 <div class="col-12"> 584 <div class="row"> 585 <div class="col-10 small"> 586 <p class="font-weight-bold mb-0">{{product.name}} (x{{quantity}})</p> 587 <span class="small">{{product.number}}</span> 588 </div> 589 <div class="col-2 text-right"> 590 <form action="/system/data/samples-cart" class="js-junckers-samples-orderline-delete-form" method="post"> 591 <input name="CartCmd" type="hidden" value="DelOrderLine"> 592 <input name="OrderContext" type="hidden" value="ORDERCONTEXT3"> 593 <input name="Key" type="hidden" value="{{id}}"> 594 <input name="Redirect" type="hidden" value="false"> 595 <button class="btn btn-link" type="submit">fjern</button> 596 </form> 597 </div> 598 </div> 599 <hr style="margin: .25em 0;"> 600 </div> 601 {{/each}} 602 </div> 603 {{/if}} 604 </script> 605 </div> 606 607 <form class="d-none js-junckers-modal-samples-checkout-step js-junckers-samples-checkout-form" data-step="2" data-validate="true"> 608 <h3 class="mt-2">@Translate( "eCom Checkout - Shipping Address - Heading", "Shipping address" )</h3> 609 <input name="CartV2.GotoStep1" type="hidden"> 610 <input name="EcomOrderDeliveryCountry" type="hidden" value="@PageView.Current().Area.EcomCountryCode"> 611 <fieldset class="form-group"> 612 <label class="form-control-label" for="EcomOrderDeliveryName"> 613 @Translate( "eCom Checkout - Name - Heading", "Name" ) 614 </label> 615 <input class="form-control required" id="EcomOrderDeliveryName" name="EcomOrderDeliveryName" type="text" value=""> 616 </fieldset> 617 618 <fieldset class="form-group"> 619 <label class="form-control-label" for="EcomOrderDeliveryCompany">@Translate( "eCom Checkout - Company - Heading", "Company" ) </label> 620 <input class="form-control" id="EcomOrderDeliveryCompany" name="EcomOrderDeliveryCompany" type="text" value=""> 621 </fieldset> 622 623 <fieldset class="form-group"> 624 <div class="row"> 625 <div class="col-12 col-sm-9"> 626 <label class="form-control-label" for="EcomOrderDeliveryAddress">@Translate( "eCom Checkout - Address - Text", "Address" )</label> 627 <input class="form-control required" id="EcomOrderDeliveryAddress" name="EcomOrderDeliveryAddress" type="text" value=""> 628 </div> 629 <div class="col-12 col-sm-3"> 630 <label class="form-control-label" for="EcomOrderDeliveryHouseNumber">@Translate( "eCom Checkout - HouseNumber - Text", "Nummer" )</label> 631 <input class="form-control required" id="EcomOrderDeliveryHouseNumber" name="EcomOrderDeliveryHouseNumber" type="text" value=""> 632 </div> 633 </div> 634 635 <div class=""> 636 <div class="checkbox-toggle form-check mb-0 mt-1 small"> 637 <label class="form-check-label" for="ToggleEcomOrderDeliveryAddress2"> 638 <input class="form-check-input js-e-checkout-toggle-field" id="ToggleEcomOrderDeliveryAddress2" type="checkbox" value="EcomOrderDeliveryAddress2"> 639 @Translate( "eCom Checkout - Add Address2 - Text Toggle", "Add another address" ) 640 </label> 641 </div> 642 </div> 643 644 </fieldset> 645 646 <fieldset class="e-checkout-toggle-target form-group js-e-checkout-toggle-target" data-target="EcomOrderDeliveryAddress2" style="display: none;"> 647 <label class="form-control-label" for="EcomOrderDeliveryAddress2"> 648 @Translate( "eCom Checkout - Address2 - Text", "Address 2" ) 649 </label> 650 <input class="form-control" id="EcomOrderDeliveryAddress2" name="EcomOrderDeliveryAddress2" type="text" value=""> 651 </fieldset> 652 653 <fieldset class=""> 654 <div class="row"> 655 <div class="col-12 col-sm-3 form-group"> 656 <label class="form-control-label" for="EcomOrderDeliveryZip">@Translate( "eCom Checkout - Zip - Heading", "Zip" )</label> 657 <input class="form-control required" id="EcomOrderDeliveryZip" name="EcomOrderDeliveryZip" type="text" value=""> 658 </div> 659 <div class="col-12 col-sm-9 form-group"> 660 <label class="form-control-label" for="EcomOrderDeliveryCity">@Translate( "eCom Checkout - City - Heading", "City" )</label> 661 <input class="form-control required" id="EcomOrderDeliveryCity" name="EcomOrderDeliveryCity" type="text" value=""> 662 </div> 663 </div> 664 </fieldset> 665 <fieldset class="form-group"> 666 <label class="form-control-label" for="EcomOrderDeliveryPhone">@Translate( "eCom Checkout - Phone - Heading", "Phone" )</label> 667 <input class="form-control required" id="EcomOrderDeliveryPhone" name="EcomOrderDeliveryPhone" type="text" value=""> 668 <small class="">@Translate( "eCom Checkout - Call Help - Text", "We won't call you unless we have questions regarding your delivery" )</small> 669 </fieldset> 670 671 <fieldset class="form-group"> 672 <label class="form-control-label" for="EcomOrderCustomerEmail">@Translate( "eCom Checkout - Email - Heading", "Email" )</label> 673 <input class="email form-control required" id="EcomOrderCustomerEmail" name="EcomOrderCustomerEmail" type="email" value=""> 674 <small class="">@Translate( "eCom Checkout - Email Help - Text", "Your receipt will be send to this e-mail." )</small> 675 </fieldset> 676 677 @*Vi værdsætter dit privatliv og ønsker at give dig den bedste oplevelse. Ved at bestille en gratis gulvprøve giver du samtidig samtykke til at lade Junckers A/S behandle dine personoplysninger til kommercielle formål. Du kan til enhver tid trække dit samtykke tilbage. Læs vores privatlivspolitik. (link: https://www.junckers.dk/om-junckers/privatlivspolitik-disclaimer)*@ 678 <fieldset class="form-group small"> 679 <div class="form-check"> 680 <label class="form-check-label" for="EcomOrderCustomerAccepted"> 681 <input class="form-check-input mr-1 required" id="EcomOrderCustomerAccepted" name="EcomOrderCustomerAccepted" type="checkbox" value="1"> @Translate( "eCom Checkout Approve - We value your privacy - Text", "We value your privacy" ) <a data-target=".modal.e-checkout-modal-privacy-policy" data-toggle="modal" tabindex> @Translate( "eCom Checkout Approve - Read our privacy policy - Link", "Read our privacy policy" )</a> 682 </label> 683 </div> 684 </fieldset> 685 686 <div class="align-items-center d-flex e-checkout-actions form-group"> 687 <button class="btn btn-lg btn-success e-checkout-next-step js-e-checkout-approve-order">@Translate( "eCom Checkout - Order - Button", "Bestil" )</button> 688 </div> 689 </form> 690 </div> 691 </div> 692 </div> 693 </div> 694 695 <div class="modal fade e-checkout-modal e-checkout-modal-privacy-policy js-e-checkout-modal-privacy-policy" data-backdrop="false"> 696 <div class="modal-dialog modal-lg mt-0"> 697 <div class="modal-content"> 698 <button type="button" class="close" data-dismiss="modal"> 699 <i class="material-icons">close</i> 700 </button> 701 <div class="modal-body"> 702 <div class="js-e-checkout-modal-privacy-policy-body"></div> 703 </div> 704 <div class="modal-footer bg-info border-top-0"> 705 <button type="button" class="btn btn-success js-e-accept-privacy-policy" data-dismiss="modal"> 706 @Translate("eCom Checkout - I accept the privacy policy - Text", "I accept the privacy policy") 707 </button> 708 </div> 709 </div> 710 </div> 711 </div> 712 713 } 714 } 715 } 716 </div> 717 } 718 else 719 { 720 <p class="mb-0">@Translate( "eCom Product - Outlet - Stock Text Start", "We have" ) @stock @salesUnit @Translate( "eCom Product - Outlet - Stock Text - In", "in" ) @Translate( "eCom Product - Stock - Text", "Stock" )</p> 721 } 722 </div> 723 </div> 724 <div class="col-12 col-md-6 order-first"> 725 <div class="e-product-image-container"> 726 @using Co3.Espresso.Base.Extensions 727 @using Co3.Espresso.Base.Models 728 @using Co3.Espresso.Website.Services 729 @using Dynamicweb.Ecommerce.Products 730 731 @{ 732 string extraAltText = string.IsNullOrEmpty( GetString( "Ecom:Product.CategoryField.ProductsCategoryGenerel.FloorCategoryName.Value" ) ) ? GetString( "Ecom:Product.ShortDescription" ).StripHtml() : GetString( "Ecom:Product.CategoryField.ProductsCategoryGenerel.FloorCategoryName.Value" ); 733 734 Product dynamicwebProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById(GetString( "Ecom:Product.ID" ), GetString( "Ecom:Product.VariantID" ), Dynamicweb.Ecommerce.Common.Context.LanguageID, false); 735 IEnumerable< Detail > detailsImages = Dynamicweb.Ecommerce.Services.Details.GetDetails( dynamicwebProduct, "0" ).Where( d => d.GroupId == 1 ); 736 737 List< Detail > details = new List< Detail >(); 738 if ( Dynamicweb.Ecommerce.Services.Details.GetDefaultDetail( dynamicwebProduct ) != null ) 739 { 740 details.Add(Dynamicweb.Ecommerce.Services.Details.GetDefaultDetail( dynamicwebProduct )); 741 } 742 if ( detailsImages.Any() ) 743 { 744 details.AddRange(detailsImages); 745 } 746 } 747 748 <div class="e-product-image-container my-2 my-lg-5"> 749 <div class="carousel" data-interval="false" data-ride="carousel" id="js-e-product-image-carousel"> 750 <div class="e-product-image-wrapper"> 751 @{ 752 var variantOption = GetLoop( "VariantGroups" ).Any( vg => vg.GetLoop( "VariantAvailableOptions" ).Any() ); 753 string variantGroupName = string.Empty; 754 755 } 756 <div class="carousel-inner fade d-flex align-items-center"> 757 758 @if ( variantOption ) 759 { 760 foreach ( LoopItem variantGroup in GetLoop( "VariantGroups" ) ) 761 { 762 variantGroupName = variantGroup.GetString( "Ecom:VariantGroup.Name" ); 763 if ( variantGroup.GetString( "Ecom:VariantGroup.Name" ) != "Gloss" ) 764 { 765 <img class="j-product-image-detail-image js-chosen-variant-image" src=""> 766 } 767 } 768 } 769 770 @if ( !details.Any() ) 771 { 772 <div class="active carousel-item" data-target="#js-e-product-image-modal" data-toggle="modal"> 773 <img src="/admin/public/getimage.ashx?Crop=0&Image=@dynamicwebProduct.ImageLarge&Format=jpg&Width=1000&Height=&Quality=90" alt="@GetString( "Ecom:Product.Name" ) @extraAltText" class="e-product-image" data-target="#js-e-product-image-modal-carousel" data-slide-to="0" @(variantOption ? "" : "style='left:0'")> 774 </div> 775 } 776 777 @foreach ( ElementWithIndex<Detail> image in details.WithIndex() ) 778 { 779 string activeClass = image.Index == 0 ? "active" : string.Empty; 780 <div class="carousel-item pdf-hidden @activeClass" data-target="#js-e-product-image-modal" data-toggle="modal"> 781 <img style="@(variantGroupName == "Gloss" ? "left:0" : "")" src="/admin/public/getimage.ashx?Crop=0&Image=@(image.Element.Value)&Format=jpg&Width=1000&Height=&Quality=90" alt="@GetString( "Ecom:Product.Name" )" class="e-product-image" data-target="#js-e-product-image-modal-carousel" data-slide-to="@( image.Index )" > 782 </div> 783 } 784 785 @{ 786 int loopCounter = 0; 787 } 788 @foreach ( ElementWithIndex<Detail> imageDetails in details.WithIndex() ) 789 { 790 if ( loopCounter == 1 && details.WithIndex().Count() > 1 ) 791 { 792 if ( !string.IsNullOrEmpty( imageDetails.Element.Value ) ) 793 { 794 <a class="carousel-control-prev pdf-hidden" data-slide="prev" data-target="#js-e-product-image-carousel"></a> 795 <a class="carousel-control-next pdf-hidden" data-slide="next" data-target="#js-e-product-image-carousel"></a> 796 } 797 } 798 loopCounter++; 799 } 800 </div> 801 </div> 802 803 @{ int CarouselItemLoopCounter = 1; } 804 805 @foreach ( ElementWithIndex<Detail> imageDetails in details.WithIndex() ) 806 { 807 if ( CarouselItemLoopCounter == 1 && details.WithIndex().Count() > 1 ) 808 { 809 810 if ( !string.IsNullOrEmpty( imageDetails.Element.Value ) ) 811 { 812 813 <ol class="carousel-indicators pdf-hidden"> 814 @if ( !details.Any() ) 815 { 816 <li class="active" data-slide-to="0" data-target="#js-e-product-image-carousel"> 817 <span style="background-size: cover; background-image: url(/admin/public/getimage.ashx?Crop=0&Image=@( imageDetails.Element.Value )&Format=jpg&Width=50&Height=&Quality=90)"></span> 818 </li> 819 } 820 @foreach ( ElementWithIndex<Detail> image in details.WithIndex() ) 821 { 822 string activeClass = image.Index == 0 ? "active" : string.Empty; 823 824 <li class="@activeClass" data-target="#js-e-product-image-carousel" data-slide-to="@( image.Index )"> 825 <span style="background-size: cover; background-image: url(/admin/public/getimage.ashx?Crop=0&Image=@(image.Element.Value)&Format=jpg&Width=50&Height=&Quality=75)"></span> 826 </li> 827 } 828 </ol> 829 } 830 CarouselItemLoopCounter++; 831 } 832 } 833 </div> 834 </div> 835 836 837 @*<section id="js-e-product-banner-carousel" class="e-section p-0 carousel slide junckers-carousel" data-keyboard="false" data-interval="0">*@ 838 @* <div class="carousel slide" data-interval="false" data-ride="carousel" id="js-e-product-image-carousel">*@ 839 @* <div class="carousel-inner">*@ 840 @* <div class="active carousel-item" data-target="#js-e-product-image-modal" data-toggle="modal">*@ 841 @* <img style="width: 100%;" src="/admin/public/getimage.ashx?Crop=0&Image=@GetValue( "Ecom:Product.ImageLarge.Clean" )&Format=jpg&Width=2000&Height=&Quality=90" alt="" class="e-product-image" data-target="#js-e-product-image-modal-carousel" data-slide-to="0">*@ 842 @* </div>*@ 843 @* @foreach ( ElementWithIndex<LoopItem> image in GetLoop( "Details" ).WithIndex() )*@ 844 @* {*@ 845 @* <div class="carousel-item" data-target="#js-e-product-image-modal" data-toggle="modal">*@ 846 @* <img style="width: 100%;" src="/admin/public/getimage.ashx?Crop=0&Image=@image.Element.GetString( "Ecom:Product:Detail.Image.Clean" )&Format=jpg&Width=2000&Height=&Quality=90" alt="" class="e-product-image" data-target="#js-e-product-image-modal-carousel" data-slide-to="@( image.Index + 1 )">*@ 847 @* </div>*@ 848 @* }*@ 849 @* <a class="carousel-control-prev" data-slide="prev" data-target="#js-e-product-image-carousel"></a>*@ 850 @* <a class="carousel-control-next" data-slide="next" data-target="#js-e-product-image-carousel"></a>*@ 851 @* </div>*@ 852 @* </div>*@ 853 @*</section>*@ 854 855 </div> 856 <div class="modal modal-fullscreen fade e-product-image-modal" id="js-e-product-image-modal" data-backdrop="false" data-keyboard="true"> 857 <div class="modal-dialog"> 858 <div class="modal-content"> 859 <div class="modal-body"> 860 861 <button type="button" class="close" data-dismiss="modal"> 862 <i class="material-icons">close</i> 863 </button> 864 865 <div id="js-e-product-image-modal-carousel" class="carousel slide" data-keyboard="true" data-interval="false"> 866 <div class="carousel-inner"> 867 @if ( !details.Any() ) 868 { 869 <div class="carousel-item active" style="background-image:url(/admin/public/getimage.ashx?Crop=0&Image=@GetValue( "Ecom:Product.ImageLarge.Clean" )&Format=jpg&Width=&Height=1800&Quality=90)"> 870 </div> 871 } 872 @foreach ( ElementWithIndex<Detail> image in details.WithIndex() ) 873 { 874 string activeClass = image.Index == 0 ? "active" : string.Empty; 875 <div class="carousel-item @activeClass" style="background-image:url(/admin/public/getimage.ashx?Crop=0&Image=@(image.Element.Value)&Format=jpg&Width=&Height=1800&Quality=90)"> 876 </div> 877 } 878 </div> 879 @{ int CarouselModalItemLoopCounter = 1; } 880 881 @foreach ( ElementWithIndex<Detail> imageIndicator in details.WithIndex() ) 882 { 883 if ( CarouselModalItemLoopCounter == 1 ) 884 { 885 if ( !string.IsNullOrEmpty( imageIndicator.Element.Value ) ) 886 { 887 <ol class="carousel-indicators"> 888 @if ( !details.Any() ) 889 { 890 <li data-target="#js-e-product-image-modal-carousel" data-slide-to="0" class="active"> 891 <span style="background-image: url(/admin/public/getimage.ashx?Crop=0&Image=@( imageIndicator.Element.Value )&Format=jpg&Width=50&Height=&Quality=90)"></span> 892 </li> 893 } 894 @foreach ( ElementWithIndex<Detail> image in details.WithIndex() ) 895 { 896 string activeClass = image.Index == 0 ? "active" : string.Empty; 897 <li class="@activeClass" data-target="#js-e-product-image-modal-carousel" data-slide-to="@( image.Index + 1 )"> 898 <span style="background-image: url(/admin/public/getimage.ashx?Crop=0&Image=@(image.Element.Value)&Format=jpg&Width=50&Height=&Quality=75)"></span> 899 </li> 900 } 901 </ol> 902 <a class="carousel-control-prev" data-target="#js-e-product-image-modal-carousel" data-slide="prev"></a> 903 <a class="carousel-control-next" data-target="#js-e-product-image-modal-carousel" data-slide="next"></a> 904 } 905 CarouselModalItemLoopCounter++; 906 } 907 } 908 </div> 909 910 </div> 911 </div> 912 </div> 913 </div> 914 915 </div> 916 </div> 917 </div> 918 919 @sectionEnd() 920 921 <div class="collapse" id="accessories"> 922 923 @sectionStart( 924 contentClasses: "col-12 col-md-10 col-lg-8 col-xl-7 mx-auto pt-6 pb-3", 925 sectionClasses: "e-section col-12 p-section-bg-light pb-4" 926 ) 927 928 <form action="/system/data/cart" class="e-product-form js-e-product-form js-outlet-form w-100" data-currencyCode="@currencyCode" data-currencyDecimalSeparator="@currencyDecimalSeparator" data-currencyGroupSeparator="@currencyGroupSeparator" data-currencySymbol="@currencySymbol" data-currencySymbolPlace="@currencySymbolPlace" method="post"> 929 <input id="CartCmd" name="CartCmd" type="hidden" value="addmulti"> 930 <input id="ProductLoopCounter@( AccessoriesProductCounter )" name="ProductLoopCounter0" type="hidden" value="@AccessoriesProductCounter"> 931 <input id="ProductID@( AccessoriesProductCounter )" name="ProductID@( AccessoriesProductCounter )" type="hidden" value="@GetString( "Ecom:Product.ID" )"> 932 <input id="VariantID@( AccessoriesProductCounter )" name="VariantID@( AccessoriesProductCounter )" type="hidden" value="@GetString( "Ecom:Product.VariantID" )"> 933 <input id="UnitID@( AccessoriesProductCounter )" name="UnitID@( AccessoriesProductCounter )" type="hidden" value=""> 934 <input id="EcomOrderLineFieldInput_OrderlineGroupID@( AccessoriesProductCounter )" name="EcomOrderLineFieldInput_OrderlineGroupID@( AccessoriesProductCounter )" type="hidden" value="@orderLineGroupID"> 935 <input class="js-outlet-mainproduct-orderline-floorsqm" id="EcomOrderLineFieldInput_OrderlineFloorUnitQuantity@( AccessoriesProductCounter )" name="EcomOrderLineFieldInput_OrderlineFloorUnitQuantity@( AccessoriesProductCounter )" type="hidden" value=""> 936 <input name="Redirect" type="hidden" value=""> 937 938 <div class="align-items-center d-flex flex-column mb-1 w-100"> 939 <div class="d-flex flex-row mb-1 mb-lg-0"> 940 <h2>@Translate( "eCom Product - How many sqm do you need - Heading", "How many sqm do you need?" )</h2> 941 </div> 942 <div class="d-flex flex-row mb-1 mb-lg-0"> 943 <input class="js-junckers-goal-sqm pl-1" data-accm2number="@GetString( "AccM2Number.Clean" ).Replace( ',', '.' )" data-colliNumber="@GetString( "ColliNumber.Clean" ).Replace( ',', '.' )" data-colliUnit="@colliUnit" data-m2waste="@GetString( "AccM2Waste.Clean" ).Replace( ',', '.' )" max="@stock" min="0" style="max-width: 4em;" type="number" value="1" /> 944 <input class="js-junckers-quantity" id="Quantity@( AccessoriesProductCounter )" max="@stock" min="0" name="Quantity@( AccessoriesProductCounter )" type="hidden" value="1" /> 945 @*<input class="js-junckers-quantity pl-1" id="Quantity@(AccessoriesProductCounter)" max="@stock" min="0" name="Quantity@(AccessoriesProductCounter)" style="max-width: 4em;" type="number" value="1">*@ 946 <span class="border border-dark mr-1 p-1" style="transform: translateX(-1px);">@salesUnit</span> 947 </div> 948 </div> 949 950 <div class="card col-12 d-flex flex-column flex-md-row mb-5 p-2" style="border-bottom: 5px solid #a80000;"> 951 <div class="align-items-baseline d-flex"> 952 <h2 class="mb-0">@Translate( "eCom Product - Configurator - Floor - Label", "Floor" )</h2> 953 </div> 954 <div class="align-items-baseline d-flex ml-auto"> 955 <h2 class="js-main-product-quantity mb-0 text-right"></h2> 956 <span class="pl-1 small text-muted">@Translate( colliUnitTranslateKey, colliUnit )</span> 957 </div> 958 </div> 959 960 @if ( relatedGroups.Any( rg => !rg.GetValue( "Ecom:Product:RelatedGroup.GroupID" ).ToString().Contains( "RELGRP8" ) ) ) 961 { 962 <div class="align-items-center d-flex flex-column flex-md-row justify-content-between"> 963 <p class="js-total-outlet-price mb-1 mt-0 order-md-last small" data-basicPrice="@basicPrice.ToString().Replace( ',', '.' )">@Translate( "eCom Checkout - Total - Text", "Total incl. VAT" ) @price</p> 964 965 <span class="d-flex"> 966 <h2 class="float-left mb-1 mt-0 small">@Translate( "eCom Product - Add accessories - Text", "Add accessories" )</h2> 967 <span class="d-none form-group js-remove-accessories-container mb-0 small"> 968 <span class="form-check"> 969 <label class="form-check-label text-primary" for="remove-accessories" style="transform: translateY(5px);"> 970 <input class="d-none form-check-input js-remove-accessories mr-1" id="remove-accessories" name="remove-accessories" type="checkbox" value="1"> (@Translate( "eCom Product - Outlet Remove Accessories - Checkbox", "Remove Accessories" )) 971 </label> 972 </span> 973 </span> 974 </span> 975 </div> 976 } 977 978 <div class="js-outlet-choose-accessory-container outlet-choose-accessory-container"> 979 @foreach ( LoopItem group in relatedGroups.OrderBy( rg => groupIds.IndexOf( rg.GetString( "Ecom:Product:RelatedGroup.GroupID" ) ) ) ) 980 { 981 if ( !group.GetValue( "Ecom:Product:RelatedGroup.GroupID" ).ToString().Contains( "RELGRP8" ) ) 982 { 983 <div class="card col-12 d-flex flex-column flex-md-row js-outlet-choose-accessory mb-1 outlet-choose-accessory p-2 small"> 984 <div class="d-flex"> 985 <div class="align-self-start d-flex"> 986 <input class="j-outlet-checkbox js-outlet-checkbox" id="@group.GetValue( "Ecom:Product:RelatedGroup.GroupID" )" name="accessories" type="radio" /> 987 <label for="accessories"> 988 <span></span> 989 </label> 990 </div> 991 <div class="mr-2"> 992 <h3>@group.GetValue( "Ecom:Product:RelatedGroup.Name" )</h3> 993 <div class="js-calc-part-products"> 994 @foreach ( LoopItem product in group.GetLoop( "RelatedProducts" ) ) 995 { 996 ++AccessoriesProductCounter; 997 <div class="js-calc-part-product mb-1" data-calculation="@product.GetString( "AccCalculationDesc.Clean" )" data-colliNumber="@product.GetString( "ColliNumber.Clean" ).Replace( ',', '.' )" data-colliUnit="@product.GetString( "ColliUnit.Clean" )" data-colliVolume="@product.GetString( "ColliVolume.Clean" ).Replace( ',', '.' )" data-m2waste="@product.GetString( "AccM2Waste.Clean" ).Replace( ',', '.' )" data-name="@product.GetString( "Ecom:Product.Name" )" data-perm2="@product.GetString( "AccM2Number.Clean" ).Replace( ',', '.' )" data-price="@product.GetDouble( "Ecom:Product.Price.Price" ).ToString().Replace( ',', '.' )" data-stock="@product.GetDouble( "Ecom:Product.Stock" )"> 998 @product.GetString( "Ecom:Product.Name" ) 999 <input id="ProductLoopCounter@( AccessoriesProductCounter )" name="ProductLoopCounter@( AccessoriesProductCounter )" type="hidden" value="@( AccessoriesProductCounter )"> 1000 <input id="ProductID@( AccessoriesProductCounter )" name="ProductID@( AccessoriesProductCounter )" type="hidden" value="@product.GetString( "Ecom:Product.ID" )"> 1001 <input id="VariantID@( AccessoriesProductCounter )" name="VariantID@( AccessoriesProductCounter )" type="hidden" value="@product.GetString( "Ecom:Product.VariantID" )"> 1002 <input id="UnitID@( AccessoriesProductCounter )" name="UnitID@( AccessoriesProductCounter )" type="hidden" value=""> 1003 <input class="js-junckers-accessories-quantity" id="Quantity@( AccessoriesProductCounter )" name="Quantity@( AccessoriesProductCounter )" type="hidden" value="0"> 1004 <input id="EcomOrderLineFieldInput_OrderlineGroupID@( AccessoriesProductCounter )" name="EcomOrderLineFieldInput_OrderlineGroupID@( AccessoriesProductCounter )" type="hidden" value="@orderLineGroupID"> 1005 </div> 1006 } 1007 </div> 1008 </div> 1009 </div> 1010 <div class="flex-shrink-0 ml-5 ml-md-auto mt-2 mt-md-0"> 1011 <p class="align-self-end h2 js-outlet-choose-accessory-calcprice m-0 ml-auto"></p> 1012 </div> 1013 </div> 1014 } 1015 } 1016 </div> 1017 1018 <div class="d-flex justify-content-center mt-3 w-100"> 1019 <div class="d-flex flex-row mb-1 mb-lg-0"> 1020 <span class="align-self-center mr-2">@Translate( "eCom Checkout - Total - Text", "Total incl. VAT" )</span> 1021 <p class="align-self-center h2 js-total-outlet-price m-0 mr-1" data-basicPrice="@basicPrice.ToString().Replace( ',', '.' )">@price</p> 1022 </div> 1023 <div class="d-flex flex-row mb-1 mb-lg-0"> 1024 <button class="bg-primary border-primary btn btn-primary" id="add-to-cart-button" type="submit">@Translate( "eCom Product - Add To Cart - Button", "Add to cart" )</button> 1025 </div> 1026 </div> 1027 1028 </form> 1029 @sectionEnd() 1030 </div> 1031 1032 1033 <script type="application/ld+json"> 1034 { 1035 "@@context" : "http://schema.org", 1036 "@@type" : "Product", 1037 "category" : "@groupService.GetGroup(primaryGroupID).Name", 1038 "description" : "@GetString("Ecom:Product.LongDescription").StripHtml()", 1039 "mpn" : "@GetString("Ecom:Product.Number").StripHtml()", 1040 "name" : "@GetString("Ecom:Product.Name").StripHtml()", 1041 "image" : "@( GetGlobalValue( "Global:Request.Scheme" ) + "://" + GetGlobalValue( "Global:Request.Host" ) + GetString("Ecom:Product.ImageLarge.Clean") )", 1042 "offers" : { 1043 "@@type" : "Offer", 1044 "availability" : "http://schema.org/InStock", 1045 "price" : "@GetDouble("Ecom:Product.Price.Price")", 1046 "priceCurrency" : "@EcomContext.Currency.Code" 1047 } 1048 } 1049 </script> 1050 1051 1052 <code class="js-e-breadcrumb-item-append" data-link="@HttpUtility.HtmlAttributeEncode( ProductService.Instance.GetProductLink( GetString( "Ecom:Product.PrimaryOrFirstGroupID" ), GetString( "Ecom:Product.ID" ) ) )" data-text="@HttpUtility.HtmlAttributeEncode( GetString( "Ecom:Product.Name" ) )"></code> 1053 1054 </div> 1055 <script> 1056 dataLayer.push({ 1057 event: 'view_item', 1058 ecommerce: { 1059 items: [ 1060 { 1061 item_name: "@GetString( "Ecom:Product.Name" )", 1062 item_id: "@GetString( "Ecom:Product.ID" )", 1063 item_category: "@groupService.GetGroup(primaryGroupID).Name", 1064 } 1065 ] 1066 } 1067 }); 1068 </script> 1069 @sectionStart()

6 gode grunde til at købe et massivt trægulv fra Junckers outlet shop

Gode tilbud på Massive trægulve 

Priserne er skruet i bund, men kvaliteten af trægulvene er fortsat af højeste karakter.
Vores tilbud på trægulve er ofte specialdesignede gulve til specifikke arkitekter eller store kommercielle projekter. Af den årsag er mængden tit begrænset og bliver derfor tilbudt til favorable priser.

En anden årsag er vores produktion af kortlængder. Når Junckers indkøber råtræ, benyttes størstedelen af træet til vores standardlængder. Naturligvis opstår der en mindre mængde af træ, som er for kort til at passe til vores standardlængder. For at anvende så meget af råtræet som muligt, bruges dette træ til at producere trægulve i kortlængder. Kvaliteten af træet er af samme høje karakter, men længderne er forskellige.

en vigtig investering

Dit gulv er formentlig dén genstand i dit hjem, der på daglig basis er udsat for størst slid. Ikke desto mindre er det også en af de genstande i dit hjem, der udskiftes færrest gange. Dérfor giver det rigtig god mening at vælge et trægulv med optimal holdbarhed og på den måde sikre at dine penge er godt investeret….

Når du vælger et massivt trægulv, kan du slibe gulvet igen og igen og opnå samme udtryk og fornemmelse som da gulvet var helt nyt. 

et bæredygtigt valg

Træ, som materiale, er i sig selv et bæredygtigt valg, der positivt bidrager til et bedre klima og er samtidig en vedvarende og fuldt genanvendelig ressource.

hurtig og nem vedligeholdelse

Junckers trægulve er lette at rengøre og vedligeholde. Vi tilbyder en bred vifte af rengørings- og vedligeholdelsesprodukter, specielt udviklet til trægulve.  

Vedligeholdelse er nøglen til et vedvarende stærkt og smukt trægulv. Passer du godt på dit trægulv, vil det holde endnu længere og samtidig se rent og nyt ud.

massive trægulve og dit indeklima

Junckers har et bredt sortiment af trægulve og træplejeprodukter, som er Indeklimamærket. Et indeklimamærket produkt har gennemgået omfattende prøvning for afgasning og lugt. Det sikrer, at der ikke er kemiske stoffer i gulvet eller produkterne, der negativt kan påvirke luftkvaliteten i rummet.

Ofte stillede spørgsmål | Webshop

Her kan du finde svar på ofte stillede spørgsmål

Generel information om Junckers massive trægulve

Ja, det kan du helt bestemt. Du kan besøge en af vores forhandlere eller showroomet i Køge og opleve gulvene i virkeligheden.

Du kan finde din nærmeste Junckers' forhandler eller booke en tid i vores showroom

Hvis du har et specifikt gulv i tankerne, anbefaler vi, at du kontakter forhandleren først og sikrer dig, at de har gulvet udstillet. 

 

Alle ordrer tillægges et ekspeditionsgebyr på kr. 75,-.

Tidsbestemtlevering mellem kl. 0800-1200 / 1200-1600 koster 1250,-

Afhentning hos Junckers Industrier A/S, Værftsvej 4, 4600 Køge, er gratis

Overstående er gældende for Jylland og brofaste Danske øer.

Du kan finde yderligere information under vores handelsbetingelser

Ja, selvfølgelig! Junckers massive trægulve er særdeles velegnede til gulvvarme, og da træs overflade aldrig bliver ubehagelig varm, holdes en stabil lun rumtemperatur.

Vælger du at installere på gulvvarme, skal du sikre dig, at gulvvarmesystemet er konstrueret således, at der er en jævn temperaturfordeling på undergulvets overside. 

Temperaturen ved trægulvets overflade må højst være 27 grader. Overholdes dette ikke er der risiko for, at der i perioder med meget varmepåvirkning, kan opstå synlige fuger mellem de enkelte gulvbrædder.

Du kan finde mere information om Junckers og gulvvarme i vores tekniske dokumentation

Du kan altid kontakte os og spørge om vejledning til lægning af gulv.

Vi anbefaler at du kontakter os inden du endeligt træffer beslutning om hvilket gulv. På den måde kan vi sammen sikre os at lægning af udvalgte gulv, er muligt. 

Junckers trægulve kan lægges på 3 forskellige måder, find vejledning til lægning.

Ønsker du at tale med os, så kontakt teknisk service

Junckers tilbyder ikke lægning af gulv. 

Et lameltrægulv består oftest af en sammenlimet trelagskonstruktion; Et top lag af træ på ca. 3,6 mm eller mindre, kernen er en træbaseret plade, f.eks. spånplade eller krydsfinér og bunden er typisk nåletræ.

Et massivt trægulv består 100% massivt træ.. 

Der er mange forskelligheder mellem de to typer gulve; en af dem er at massivt trægulv kan slibes og behandles mange gange - modsat et lamelgulv som typisk kun kan få gange - hvilket betyder lang holdbarhed.

 

Specielt om trægulve på tilbud

Specialtilbuddene er ofte ikke tilgængelige hos vores distributører på grund af produktets særlige karakter, f.eks. på grund af farve eller dimensioner.

Vores standardsortiment og nogle specialtilbud sælges gennem vores forhandlere. Find forhandler og se hvor du kan købe et Junckers trægulv.

Tidsbestemtlevering mellem kl. 08:00-12:00 eller kl. 12:00-16:00 koster 1250,-

Afhentning hos Junckers Industrier A/S, Værftsvej 4, 4600 Køge, er gratis

Overstående er gældende for Jylland og brofaste Danske øer.

Du kan finde yderligere information under vores handelsbetingelser

Alle ordrer tillægges et ekspeditionsgebyr på kr. 75,-.

Vores massive trægulve er eksempelvis nedsat grundet følgende grunde - ingen af disse påvirker kvaliteten af vores gulve.

  • Indimellem oplever vi at have produceret for meget gulv til et stort projekt. Derfor kan vi ende op med et lager af netop dette gulv, som så sælges til reduceret pris.  
  • Når vi køber træ ind, kommer træet i forskellige dimensioner. Det hænder indimellem at råtræet ikke passer til dimensionerne i vores standard produktsortiment. For at anvende mest muligt af træet, produceres der gulve i eksempelvis kortlængder, smallere bredder eller mindre tykkelser. 
  • Gulve der har været slebet og genbehandlet. Vi sliber sommetider gulve, hvis de har været overfladisk beskadiget. 

Vi gør en stor indsats for at anvende 100 % af det råtræ vi køber hjem.
Resttræ såsom bark, flis og savsmuld der er tilovers fra produktion af gulve, leveres til et lokalt kraftværk, der til gengæld returnerer elektricitet til det offentlige danske el-net, heriblandt Junckers. 

I langt de fleste tilfælde kan du betille mere af samme gulv, hvis gulvet du har købt, indgår i vores standard sortiment.

Dog er der nogle specielle varer, som muligvis ikke kan leveres i samme dimensioner eller til samme pris på et senere tidspunkt. 

Er du i tvivl, så spørg os endelig om gulvet, du påtænker at købe, kan suppleres op.

Salgs- og leveringsbetingelser

Alle ordrer tillægges et ekspeditionsgebyr på kr. 75,-.

Tidsbestemtlevering mellem kl. 0800-1200 / 1200-1600 koster 1250,-

Afhentning hos Junckers Industrier A/S, Værftsvej 4, 4600 Køge, er gratis

Overstående er gældende for Jylland, brofaste Danske øer.

Kontakt bestilling@junckers.com for levering til ikke bro,- og landfaste øer samt levering i særlige miljøzoner – fragten aftales særskilt.

Levering vil foregå i dagtimerne på hverdage, medmindre andet er aftalt. Afsendelse af ordre sker i henhold til leveringsdato på ordrebekræftelsen, med mindre varerne er i restordre eller skal hjemtages specielt til din ordre.

Trægulve er modtagelige over for fugt, og det er derfor en forudsætning, at du er hjemme, når levering finder sted, og at gulvene bæres ind og opbevares tørt og lunt straks efter levering. Det er rent praktisk ikke muligt at oplyse en præcis leveringstid, men du kan ved bestilling oplyse dit telefonnr., så ringer transportøren en time før ankomst.

Du skal kvittere for modtagelse, når varerne leveres. Ansvaret for varerne overgår til dig, når vi har leveret på din adresse. Ved modtagelse af varerne skal du kontrollere, at det leverede er i overensstemmelse med din ordrebekræftelse. Hvis du finder fejl og mangler, skal dette straks meddeles transportøren. Evt. transport- og fragtskader skal bemærkes skriftligt på transportfirmaets fragtbrev og derefter meddeles Junckers kundeservice, for at krav efterfølgende kan gøres gældende.

Ved forgæves kørsel med vores vognmand, (ingen til at modtage gulvet) kontakt venligst kundeservice på bestilling@junckers.dk for aftale af ny leveringsdag.

Du vil blive opkrævet et gebyr for returkørsel.

Varerne leveres til fortovskant.

Du kan betale med: Dankort/VISA, Visa Electron, Mastercard & Maestro.
Du afholder selv evt. kortgebyr.
Når transaktionen er gennemført, modtager du herefter en automatisk besked om, at vi har modtaget din ordre. Du vil inden for 24 timer på hverdage modtage en endelig ordrebekræftelse.
For alle betalingsformer gælder det, at alle informationer sendes krypteret, hvilket vil sige, at vi ikke modtager informationer om din konto, kortoplysninger eller lign. Vi modtager udelukkende besked om, at transaktionen er gennemført.

Pengene trækkes først på kortet når varen afsendes, eller ved afhentning, når varerne er klar i henhold til ordrebekræftelsen.

Du bør modtage en ordrebekræftelse inden for 24 timer efter betaling for din ordre.

Du vil modtage en detaljeret salgsordrebekræftelse, når vores kundeservice har fået al bekræftelse fra produktionen på varernes leveringstid.

Hvis du har problemer i forbindelse med dette, bedes du kontakte bestilling@junckers.com

Du har 2 års reklamationsret på varer købt hos Junckers.dk.

Ved modtagelse af gulvet skal man være opmærksom på flg.:

Er gulvet beskadiget ved modtagelse, da venligst beskriv udførligt skaden på fragtbrevet og kvittere for modtagelse. Ring herefter til Junckers kundeservice på tlf. +45 70 80 30 30. Således at vi kan afsende erstatning for det beskadigede. 

Oplysning om klagemulighed for forbrugere:

En klage over en vare eller tjenesteydelse købt hos os kan indgives til Konkurrence- og Forbrugerstyrelsens Center for Klageløsning, Carl Jacobsens Vej 35, 2500 Valby. Du kan klage til Center for Klageløsning via www.forbrug.dk.

EU-Kommissionens online klageportal kan også anvendes ved indgivelse af en klage. Det er særlig relevant, hvis du er forbruger med bopæl i et andet EU-land. Klage indgives her – http://ec.europa.eu/odr. Ved indgivelse af en klage skal du angive vores e-mail adresse bestilling@junckers.dk

Du har altid 14 dages fortrydelsesret, når du handler på www.junckers.dk.
Fortrydelsesretten gælder fra modtagelsesdato.
Fortrydelsesretten kan udnyttes, hvis varen tilbageleveres i samme stand og mængde som leveret. Fortrydelsesretten bortfalder hvis du bruger varen på en måde, som helt åbenbart forringer salgsværdien væsentligt.
Udnyttes fortrydelsesretten, afholder du selv returfragten.

Returvarerne sendes til: Junckers Industrier A/S, Værftsvej 4, 4600 Køge.

Hvis du ønsker at gøre brug af din fortrydelsesret, kan du få hjælp på bestilling@junckers.com eller på tlf. +45 70 80 30 30, hvor vi kan guide dig igennem.

Når vi har modtaget varen retur og kontrolleret, at den lever op til betingelserne for, at fortrydelsesretten kan benyttes, refunderes den fulde købesum til dig via den samme betalingsmåde, som anvendt ved købet, hvilken kan tage op til 7 hverdage.

Mener vi, at betingelserne ikke er opfyldt, for at du kan udnytte fortrydelsesretten, kontakter vi dig med en begrundelse herfor.
Du skal altid vedlægge kopi af faktura samt kopi af evt. forudgående korrespondance m.v. Bemærk: Vi modtager ikke pakker sendt pr. efterkrav.

keyboard_arrow_up



picture_as_pdf