Barros Portvin
 

Barros er grundlagt i 1913 af Manuel de Almeida, dengang under navnet Almeida & Ca. Han havde en vision om at gøre sit portvinshus til et af verdens førende, og da han døde i 1974, var drømmen blevet til virkelighed. På et tidspunkt stod Barros for cirka 6% af den samlede produktion af portvin!

Husets gode rygte er især skabt gennem deres legendariske colheitas, som er en kategori, de er særligt stærke i. Colheitas er vine fra én enkelt årgang lagret mindst 7 år på fad – men som regel meget længere.

Siden 2006 har Barros været en del af Sogevinus-gruppen, som også har en håndfuld andre højtrespekterede mærker i porteføljen, som fx Kopke og Burmester.

 

Barros er grundlagt i 1913 af Manuel de Almeida, dengang under navnet Almeida & Ca. Han havde en vision om at gøre sit portvinshus til et af verdens førende, og da han døde i 1974, var drømmen blevet til virkelighed. På et tidspunkt stod Barros for cirka 6% af den samlede produktion af portvin!

Husets gode rygte er især skabt gennem deres legendariske colheitas, som er en kategori, de er særligt stærke i. Colheitas er vine fra én enkelt årgang lagret mindst 7 år på fad – men som regel meget længere.

Siden 2006 har Barros været en del af Sogevinus-gruppen, som også har en håndfuld andre højtrespekterede mærker i porteføljen, som fx Kopke og Burmester.


Barros => False => False => True => False => Cocktailpakke => Portvin => Touriga Nacional => Portugal => Portvin => 1964 => 1974 => 1978 => 1998 => 2004 => 1999 => 2008 => 2005 => 2014 => 2007 => 2010 => 2001 => 2002 => 2015 => 2012 => 2003 => 2019 => 2020 => 2022 => False =>

Sort by

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_3964f73d6560450dac0152ce09c1408e.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") &middot; @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">&nbsp;@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>
Alle priser er inkl. moms