Developer forum

Forum » Development » API fejl på SalesDiscountProvider samtidigt med PriceProvider

API fejl på SalesDiscountProvider samtidigt med PriceProvider


Reply
 
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
 

Replies

 
Reply

Hi Kevin,

I think your price provider is the problem here.
 
eCommerce will use any price you return in your priceprovider...
 
"A PriceProvider should never return a Price if it does not have one for a particular situation. In the case that a PriceProvider cannot resolve a Price, the system will call the next PriceProvider in the Provider chain."
 
In your case... 
 
If no valid product is provided, you cannot provide a correct price and you should not return a price, but return null (nothing).
 
Try this in your price provider...
 
if (Product == null || string.IsNullOrEmpty(Product.ID)) return null;
// Now get your price (sp) and return null if no price is found.
 
BTW, there is no need to save orderline and order in your SalesDiscountProvider.
 
You can find the eCommerce Extensibility documentation here: 
http://engage.dynamicweb-cms.com/Development-200.aspx
 
 
BR.
Morten
 
Reply
Thank you very much for your reply.

But when i let my PriceProvider return null, my price just becomes 0.0. To me it's fairly logical, because I can see my PriceProvider is run after my SalesDiscountProvider and I can't see that there should be anything to fall back on?
 
Reply

I just tested this on 19.2.0.4 and it works as expected.
 
Is your discount set up correct? Have you selected the radio button for percent?
 
In your discount provider, do you check if the expected DiscountValue.Type is selected and that DiscountValue.Amount is not 0?
 
If you add a product to a percent discount orderline, that might cause problems.
 
The price is specified in your discount provider, so you don't need the price provider to do that too.
 
Avoid saving anything in your providers.
 
You didn't post the full code for your discount provider, so I can't say for shure where the problem is. I guess debugging is the way to go :)
 
/Morten

 

You must be logged in to post in the forum