Champagne fra Frankrig, årgang 2018
75cl · 12% vol
Brugnon Blanc de Blancs
Rødvin fra Italien, årgang 2020
75cl · 14% vol
Cantine di Ora Valpolicella Ripasso
Error executing template "Designs/juuls/ecom/productlist/partials/item.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at CompiledRazorTemplates.Dynamic.RazorEngine_48636cbf55d14140b48b93f63fd6c700.Execute() in D:\dynamicweb.net\Solutions\twodayco3\juulsvin.cloud.dynamicweb-cms.com\Files\Templates\Designs\juuls\ecom\productlist\partials\item.cshtml:line 47 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 ViewModelTemplate<EspressoProduct> 2 @using System 3 @using System.Collections.Generic 4 @using System.Drawing 5 @using System.Globalization 6 @using System.Linq 7 @using Co3.Espresso.Website.Models 8 @using Co3.Espresso.Website.Models.FrontEnd.Ecommerce 9 @using Co3.Espresso.Website.Models.FrontEnd.Elements 10 @using Co3.Espresso.Website.Models.FrontEnd.Handlebars 11 @using Co3.Espresso.Website.Models.FrontEnd.Settings 12 @using Co3.Espresso.Website.Services 13 @using Co3.Juuls.Frontend.Models.Frontend.Ecommerce 14 @using Co3.Juuls.Website.Frontend.Helpers 15 @using Co3.Juuls.Website.Frontend.Models.Frontend.Ecommerce 16 @using Co3.Juuls.Website.Frontend.Services 17 @using Dynamicweb.Ecommerce 18 @using Dynamicweb.Ecommerce.Common 19 @using Dynamicweb.Ecommerce.CustomerExperienceCenter.Favorites 20 @using Dynamicweb.Ecommerce.Orders.Discounts 21 @using Dynamicweb.Ecommerce.Products 22 @using Dynamicweb.Ecommerce.Stocks 23 @using Dynamicweb.Frontend 24 @using Dynamicweb.Rendering 25 @using Dynamicweb.Security.UserManagement 26 @using EspressoProduct = Co3.Juuls.Website.Models.Frontend.Ecommerce.JuulsProduct 27 @using ShopType = Co3.Juuls.Website.Frontend.Helpers.ShopType 28 @using StockService = Dynamicweb.Ecommerce.Stocks.StockService 29 30 @{ 31 string quantityDiscountText = Model.QuantityDiscountText; 32 ShopType siteContext = SiteContext.CurrentSiteContext(); 33 34 bool isB2BShop = siteContext == ShopType.B2B; 35 bool isB2CShop = siteContext != ShopType.B2B; 36 37 EspressoPrice priceSavedAmount = JuulsDiscountService.Instance.GetSavedAmount(Model.Discount, Model.Price); 38 EspressoPrice priceWhenDiscounted = JuulsDiscountService.Instance.GetDiscountCalculated(Model.Discount, Model.Price); 39 40 bool hasB2CAmountDiscount = Model.Discount != null && Model.Discount.ProductQuantity > 1; 41 42 CultureInfo currencyCulture = new CultureInfo(Context.Currency.CultureInfo); 43 string ga4Price = Double.Parse(Model.Price.Value.ToString(), NumberStyles.Currency, currencyCulture).ToString("f", CultureInfo.InvariantCulture); 44 } 45 46 47 <div class="bg-white mb-2 w-100 e-block-link e-productlist-item js-e-block-link js-e-productlist-item js-e-productlist-item-@Model.Id" data-product-id="@Model.Id" data-variant-id="@Model.VariantId" data-product-name="@Model.Name" data-product-number="@Model.Number" data-product-price="@ga4Price" data-currency="@Context.Currency.Code" data-product-category="@Model.PrimaryGroup.ParentGroups.FirstOrDefault().Name" data-product-category2="@Model.PrimaryGroup.Name" data-product-list-name="@Model.PrimaryGroup.Name - @JuulsProductService.Instance.GetProductFieldValue(Product.GetProductById(Model.Id), "NavWineRegion")"> 48 <div class="e-productlist-item-container custom-product-list-item-container position-relative"> 49 <div> 50 <div class="productlist-item-image-content-container"> 51 <div class="productlist-item-image-firstpaint-outer-container"> 52 <div class="productlist-item-image-firstpaint-inner-container"> 53 <div class="container-awards"> 54 @RenderingService.Instance.PartialView("ecom/product/partials/awards.cshtml", Model) 55 </div> 56 <div class="e-productlist-item-image-container"> 57 <a class="e-productlist-item-image-wrapper" href="@Model.Link"> 58 <img class="e-productlist-item-image" src="@($"{Model.ImagePrimary.Medium}&filename={Model.Number}-{Model.Name.Trim().Replace(" ", "-")}.jpg")" alt="@Model.Name - @Model.ProductType" title="@Model.Name - @Model.ProductType"> 59 </a> 60 </div> 61 </div> 62 <div class="container-discount-badges"> 63 @RenderingService.Instance.PartialView("ecom/product/partials/part-discount-badge.cshtml", Model) 64 </div> 65 </div> 66 <div class="productlist-item-image-secondpaint-outer-container"> 67 @if (Model.TastingNotes.Any() && Model.TastingNotes != null) 68 { 69 int loopCounter = 0; 70 <div class="custom-productlist-tastenotes-container"> 71 @foreach (KeyValuePair<string, string> entry in Model.TastingNotes) 72 { 73 if (loopCounter >= 4) 74 { 75 break; 76 } 77 78 if (!string.IsNullOrEmpty(entry.Value)) 79 { 80 string smagsnoteImage = "/admin/public/getimage.ashx?Image=/Files/Images/smagsnoter/" + entry.Value + ".png&Width=130&Height=130&Format=jpg&Quality=90&Crop=0"; 81 82 <div class="custom-productlist-tastenotes-entry item"> 83 <div class="custom-productlist-tastenotes-image-container"> 84 <div class="custom-productlist-tastenotes-image"> 85 <div class="custom-productlist-tastenotes-image-canvas"> 86 <img src="@smagsnoteImage" alt="@entry.Key.Replace("/", " / ")"/> 87 </div> 88 </div> 89 </div> 90 <p>@entry.Key.Replace("/", " / ")</p> 91 </div> 92 } 93 loopCounter++; 94 } 95 </div> 96 } 97 <div class="custom-productlist-points-container"> 98 @Model.RenderDisplayGroup("Frontend_RatingSummary") 99 </div> 100 </div> 101 <div class="container-awards container-awards-mobile"> 102 @RenderingService.Instance.PartialView("ecom/product/partials/awards.cshtml", Model) 103 </div> 104 <div class="container-discount-badges discount-badges-mobile"> 105 @RenderingService.Instance.PartialView("ecom/product/partials/part-discount-badge.cshtml", Model) 106 </div> 107 </div> 108 <div class="e-productlist-item-text-container-header custom-item-padding-x-1 pt-1"> 109 <div class="d-flex custom-item-padding-x-1 custom-item-padding-y-1 mb-1 bg-light justify-content-between custom-product-list-item-spiritinfo-container"> 110 <div> 111 <p class="mb-0"> 112 @Model.ProductType 113 @if (!string.IsNullOrEmpty(Model.Country)) 114 { 115 <span>@Translate("fra") @Model.Country</span> 116 } 117118 @if (!string.IsNullOrEmpty(Model.Year) && Model.PrimaryGroup.PrimaryParentGroupId == "GROUP332") 119 { 120 <span>, @Translate( "årgang") @Model.Year</span> 121 } 122 </p> 123 </div> 124 <div> 125 <p class="mb-0 text-nowrap">@Model.RenderDisplayGroup("Frontend_Spiritinfo") · @Model.Ethanol% vol</p> 126 </div> 127 </div> 128 <h3 class="e-productlist-item-name my-0 custom-item-padding-1"> 129 <a href="@Model.Link">@Model.Name</a> 130 </h3> 131 @RenderingService.Instance.PartialView("ecom/product/partials/add-to-favorites.cshtml", Model) 132 @using System 133134 @if (!string.IsNullOrEmpty(Model.JuulsRating1Score)) 135 { 136 <div class="custom-product-list-item-ratings-container custom-item-padding-x-1 position-relative"> 137 <table class="table table-condensed mb-0"> 138 <tbody> 139 @if (!string.IsNullOrEmpty(Model.JuulsRating1Score) && !string.IsNullOrEmpty(Model.JuulsRating1By) && !string.IsNullOrEmpty(Model.JuulsRating1Scale)) 140 { 141 <tr> 142 <td> 143 <p class="text-muted mb-0">@Model.JuulsRating1By</p> 144 </td> 145 <td> 146 @if (Model.JuulsRating1Scale.Contains("star")) 147 { 148 string numberOfStars = Model.JuulsRating1Scale; 149 numberOfStars = numberOfStars.Replace("-star", ""); 150 if (int.TryParse(numberOfStars, out int intNumberOfStars) && int.TryParse(Model.JuulsRating1Score, out int score)) 151 { 152 for (int i = 0; i < intNumberOfStars; i++) 153 { 154 string ratings = i < score ? "text-primary" : string.Empty; 155 <span class="material-icons @ratings"> 156 star 157 </span> 158 } 159 } 160 } 161 else 162 { 163 <span class="font-weight-bold"> @Model.JuulsRating1Score @Translate("point")</span> 164 } 165 </td> 166 </tr> 167 } 168 @if (!string.IsNullOrEmpty(Model.JuulsRating2Score) && !string.IsNullOrEmpty(Model.JuulsRating2By) && !string.IsNullOrEmpty(Model.JuulsRating2Scale)) 169 { 170 <tr> 171 <td> 172 <p class="text-muted mb-0">@Model.JuulsRating2By</p> 173 </td> 174 <td> 175 @if (Model.JuulsRating2Scale.Contains("star")) 176 { 177 string numberOfStars = Model.JuulsRating2Scale; 178 numberOfStars = numberOfStars.Replace("-star", ""); 179 if (int.TryParse(numberOfStars, out int intNumberOfStars) && int.TryParse(Model.JuulsRating2Score, out int score)) 180 { 181 for (int i = 0; i < intNumberOfStars; i++) 182 { 183 string ratings = i < score ? "text-primary" : string.Empty; 184 <span class="material-icons @ratings"> 185 star 186 </span> 187 } 188 } 189 } 190 else 191 { 192 <span class="font-weight-bold"> @Model.JuulsRating2Score @Translate("point")</span> 193 } 194 </td> 195 </tr> 196 } 197 @if (!string.IsNullOrEmpty(Model.JuulsRating3Score) && !string.IsNullOrEmpty(Model.JuulsRating3By) && !string.IsNullOrEmpty(Model.JuulsRating3Scale)) 198 { 199 <tr> 200 <td> 201 <p class="text-muted mb-0">@Model.JuulsRating3By</p> 202 </td> 203 <td> 204 @if (Model.JuulsRating3Scale.Contains("star")) 205 { 206 string numberOfStars = Model.JuulsRating3Scale; 207 numberOfStars = numberOfStars.Replace("-star", ""); 208 if (int.TryParse(numberOfStars, out int intNumberOfStars) && int.TryParse(Model.JuulsRating3Score, out int score)) 209 { 210 for (int i = 0; i < intNumberOfStars; i++) 211 { 212 string ratings = i < score ? "text-primary" : string.Empty; 213 <span class="material-icons @ratings"> 214 star 215 </span> 216 } 217 } 218 } 219 else 220 { 221 <span class="font-weight-bold"> @Model.JuulsRating3Score @Translate("point")</span> 222 } 223 </td> 224 </tr> 225 } 226 @if (!string.IsNullOrEmpty(Model.JuulsRating4Score) && !string.IsNullOrEmpty(Model.JuulsRating4By) && !string.IsNullOrEmpty(Model.JuulsRating4Scale)) 227 { 228 <tr> 229 <td> 230 <p class="text-muted mb-0">@Model.JuulsRating4By</p> 231 </td> 232 <td> 233 @if (Model.JuulsRating4Scale.Contains("star")) 234 { 235 string numberOfStars = Model.JuulsRating4Scale; 236 numberOfStars = numberOfStars.Replace("-star", ""); 237 if (int.TryParse(numberOfStars, out int intNumberOfStars) && int.TryParse(Model.JuulsRating4Score, out int score)) 238 { 239 for (int i = 0; i < intNumberOfStars; i++) 240 { 241 string ratings = i < score ? "text-primary" : string.Empty; 242 <span class="material-icons @ratings"> 243 star 244 </span> 245 } 246 } 247 } 248 else 249 { 250 <span class="font-weight-bold"> @Model.JuulsRating4Score @Translate("point")</span> 251 } 252 </td> 253 </tr> 254 } 255 </tbody> 256 </table> 257 </div> 258 } 259260 </div> 261 </div> 262263 <div class="custom-item-padding-1 small"> 264 @if (isB2CShop) 265 { 266 if (Model.HasBeforePrice) 267 { 268 <div class="juuls-before-price-block d-flex flex-wrap justify-content-between align-items-center custom-item-padding-x-1 custom-item-padding-y-1"> 269 <div class="text-nowrap mr-1"> 270 <a href="@Model.Link" class="e-product-price text-dark my-0"> 271 @Model.Price.Formatted 272 </a> 273 </div> 274 <span class="text-success"> 275 @Translate("eCom - Product - Discount - Saved - Text", "Spar") <strong>@Model.SavedAmount.Formatted</strong> 276 </span> 277 </div> 278 <small class="d-block custom-item-padding-x-1 mt-half mb-0 text-muted text-dark text-line-through small">@Translate("eCom - Product - Discount - Before Price - Text", "Før pris") @Model.BeforePrice.Formatted</small> 279 } 280 else if (hasB2CAmountDiscount) 281 { 282 <div class="juuls-before-price-block d-flex flex-wrap justify-content-between align-items-center custom-item-padding-x-1 custom-item-padding-y-1"> 283 <div class="text-nowrap mr-1"> 284 <a href="@Model.Link" class="e-product-price text-dark my-0"> 285 @priceWhenDiscounted.Format() 286 </a> 287 <span class="text-dark">v/ @Model.Discount.ProductQuantity stk.</span> 288 </div> 289 <p class="mb-0 text-nowrap"> 290 @Translate("Spar") <strong>@priceSavedAmount.Format()</strong> 291 </p> 292 </div> 293 <small class="d-block custom-item-padding-x-1 mt-half mb-0 text-muted text-dark small">@Model.Price.Formatted @Translate("v/ 1 stk.")</small> 294 } 295 else 296 { 297 <hr class="m-0 pt-1"/> 298 <div class="e-productlist-item-price custom-item-padding-x-1"> 299 <a href="@Model.Link" class="e-product-price text-dark my-0"> 300 @Model.Price.Formatted 301 </a> 302 </div> 303 } 304 } 305306 @if (isB2BShop) 307 { 308 if (Model.SalesDiscount != null && string.IsNullOrEmpty(Model.SalesDiscount.CampaignName) == false) 309 { 310 <div class="juuls-before-price-block d-flex flex-wrap justify-content-center align-items-center custom-item-padding-x-1 custom-item-padding-y-1 font-weight-bold mb-1"> 311 <p class="mb-0">@Model.SalesDiscount.CampaignName</p> 312 </div> 313 } 314 else 315 { 316 <hr class="m-0 pt-1"/> 317 } 318319 EspressoPrice userDiscountedPrice = JuulsProductService.Instance.GetUserDiscountedPrice(Model); 320321 <div class="e-productlist-item-price custom-item-padding-x-1"> 322 @if (userDiscountedPrice.Value > 0) 323 { 324 <div class="d-flex flex-wrap justify-content-between align-items-start"> 325 <a href="@Model.Link" class="e-product-price text-dark my-0"> 326 @userDiscountedPrice.Formatted 327 </a> 328329 <small class="d-block mb-0 text-muted text-dark text-line-through small"> 330 @Translate("eCom - Product - Discount - Before Price - Text", "Før pris") @Model.Price.Formatted 331 </small> 332 </div> 333 } 334 else 335 { 336 <a href="@Model.Link" class="e-product-price text-dark my-0"> 337 @Model.Price.Formatted 338 </a> 339 } 340 <small class="d-block text-muted mt-0"> @Translate("eCom - Product - Ex VAT - Text", "ex. moms")</small> 341 </div> 342 } 343344 @*STOCK STATE*@ 345346 <div class="custom-stock-and-addtocart-wrapper d-flex flex-wrap align-items-center justify-content-between pt-1"> 347348 @if (Model.Stock.Quantity > 0) 349 { 350 if (Model.Stock.State != null) 351 { 352 <div class="custom-productlist-stock-state custom-item-padding-1 mr-2"> 353 <p class="@(Model.Stock.State.Contains("Få på lager") || Model.Stock.State.Contains("Ukendt tilgængelighed") ? "few-in-stock" : "in-stock") mb-0"> 354 @Model.Stock.State 355 </p> 356 </div> 357 } 358 } 359360 @if (Model.IsStoreOnly == false && Model.CanPurchaseByContext) 361 { 362 if (Model.Stock.Quantity > 0) 363 { 364 <div class="flex-grow-1"> 365 @RenderingService.Instance.PartialView("ecom/product/partials/custom-add-to-cart-productlist.cshtml", Model) 366 </div> 367 } 368 else 369 { 370 if (Model.Stock.State != null) 371 { 372 <div class="custom-productlist-stock-state custom-item-padding-1 mr-2"> 373 <p class="not-in-stock mb-0"> 374 @Model.Stock.State 375 </p> 376 </div> 377 } 378 } 379 } 380 </div> 381 </div> 382 </div> 383 </div>
Rye Whiskey fra Tyskland
70cl · 43% vol
STORK CLUB Rye Whiskey Sauvignon Blanc Barrel
Whisky fra Skotland
70cl · 59,7% vol
Talisker The Wild Explorador Special Release 2023
Blended Malt fra Skotland
70cl · 46% vol
Campbeltown Loch Blended Malt Scotch Whisky
Raicilla fra Mexico
70cl · 44,3% vol
La Venenosa Raicilla Sierra del Tigre Lote 42
Whisky fra Frankrig
70cl · 46% vol
Kornog Tauoarch Eilvet
Hvidvin fra Frankrig, årgang 2022
75cl · 12% vol
Chateau Bousquet Blanc
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 519
- 520
Alle priser er inkl. moms

























