Beskrivelse
Vi har på en shop gang i en løsning, hvor en voucher skal kunne udløse 20% rabat på ordren.
Løsning er baseret på Dynamicweb rabat udvidet, så vi kan lave en rabat med vores egen SalesDiscountProvider.
Problemet er prisberegningen på rabatten, som går ind og konflikter med vores PriceProvider.
Det skal siges, at der ikke ligger priser i eCom, men at de hentes i andre SQL tabeller, og vi tror lidt på, at problemet ligger der.
Problem
Så vidt vi kan se, så bliver vores SalesDiscountProvider eksekveret i det Cartv2 skal rendere kurven.
Vores SalesDiscountProvider kører flg. kode:
double vatpercent = Dynamicweb.eCommerce.Common.Context.Country.Vat;
double discountpercent = (DiscountValue.Amount / 100);
OrderLine ol = new OrderLine();
ol.ID = Dynamicweb.eCommerce.Common.NumberGenerator.GetNumber("OL");
ol.DiscountID = this.DiscountID;
ol.Order = order;
ol.ProductName = this.DiscountName;
ol.ProductNumber = this.DiscountID;
ol.Quantity = 1;
ol.Type = "1";
// Update the price
ol.UnitPrice = new Dynamicweb.eCommerce.Prices.PriceInfo();
ol.UnitPrice.Currency = Dynamicweb.eCommerce.Common.Context.Currency;
ol.UnitPrice.PriceWithoutVAT = order.PriceBeforeFees.PriceWithoutVAT * discountpercent * -1;
ol.UnitPrice.PriceWithVAT = order.PriceBeforeFees.PriceWithVAT * discountpercent * -1;
ol.UnitPrice.VATPercent = vatpercent;
ol.UnitPrice.VAT = order.PriceBeforeFees.PriceWithoutVAT * discountpercent * (vatpercent / 100);
ol.Save();
order.OrderLines.Add(ol);
order.Save();
I vores PriceProvider har vi flg. kode:
if ( sp == null )
price = 999.0;
else
price = Convert.ToDouble( sp.Price.Replace( ".", "," ) );
Hvor "sp"-objektet gerne skulle indeholde en pris, men problemet er at sp == null fordi vi får et produkt ind i vores PriceProvider med et tomt product.ID. Det ser ud som om vi for en instans af new Product("") og vores PriceProvider returnere så 999.0 og det bliver så rabat-prisen.
Forslag
I det vi laver en pris-beregning på en rabat i SalesDiscountProvideren, så bør disse OrderLines slet ikke eksekvere PriceProviders efter vores mening. Fordi, hvis vi har flere rabat, hvilket vi får, så kan vi i PriceProvideren ikke skelne dem fra hinanden, fordi vi i alle tilfælde får et new Product("") objekt at arbejde med.
Workaround
Vi har fundet et workaround på problemet.
Hvis vi opretter et produkt i ecom og i vores SalesDiscountProvider angiver dettes products ID fx.
double vatpercent = Dynamicweb.eCommerce.Common.Context.Country.Vat;
double discountpercent = (DiscountValue.Amount / 100);
OrderLine ol =new OrderLine();
ol.ID = Dynamicweb.eCommerce.Common.NumberGenerator.GetNumber("OL");
ol.DiscountID = this.DiscountID;
ol.Order = order;
ol.Product = new Dynamicweb.eCommerce.Products.Product( "PROD5", "" );
ol.ProductVariantID = "";
ol.ProductID = "PROD5";
ol.ProductName = this.DiscountName;
ol.ProductNumber = this.DiscountID;
ol.Quantity = 1;
ol.Type = "1";
// Update the price
ol.UnitPrice = new Dynamicweb.eCommerce.Prices.PriceInfo();
ol.UnitPrice.Currency = Dynamicweb.eCommerce.Common.Context.Currency;
ol.UnitPrice.PriceWithoutVAT = order.PriceBeforeFees.PriceWithoutVAT * discountpercent * -1;
ol.UnitPrice.PriceWithVAT = order.PriceBeforeFees.PriceWithVAT * discountpercent * -1;
ol.UnitPrice.VATPercent = vatpercent;
ol.UnitPrice.VAT = order.PriceBeforeFees.PriceWithoutVAT * discountpercent * (vatpercent / 100);
ol.Save();
order.OrderLines.Add(ol); order.Save();
På denne måde har vi en mulighed for at lave et produkt for hver rabat vi laver i rabat-modulet, og så kan vi gøre flg. i vores PriceProvider
if ( product.ID.Equals( "PROD5" ) ) //COMMENT: Fake produkt for joining discount orderline with a product with discount information
{
//COMMENT: Get Sales Discount price from OrderLine
price = Dynamicweb.eCommerce.Common.Context.Cart.OrderLines.Cast>().Where( ol => ol.ProductNumber.Equals( "SALESDISCNT1" ) ).FirstOrDefault().UnitPrice.PriceWithVAT;
}
else if ( sp == null )
price = 999.0;
else
price = Convert.ToDouble( sp.Price.Replace( ".", "," ) );
På denne måde har vi en mulighed for at lave et produkt for hver rabat vi laver i rabat-modulet, og så kan vi gøre flg. i vores PriceProvider