Interface IDiscountExtenderCalculateProductDiscount
- Namespace
- Dynamicweb.Ecommerce.Orders.Discounts
- Assembly
- Dynamicweb.Ecommerce.dll
Implement this interface on a DiscountExtenderBase implementation to take over the calculation of a discount for a product
public interface IDiscountExtenderCalculateProductDiscount
Examples
using System;
using Dynamicweb.Core;
using Dynamicweb.Ecommerce.International;
using Dynamicweb.Ecommerce.Prices;
using Dynamicweb.Ecommerce.Products;
using Dynamicweb.Extensibility.AddIns;
using Dynamicweb.Extensibility.Editors;
namespace Dynamicweb.Ecommerce.Orders.Discounts;
public sealed class SetAmountFromProductAsFinalPriceExtender : DiscountExtenderBase, IDiscountExtenderCalculateProductDiscount
{
[
AddInParameter("Calculate discount based on amount field"),
AddInDescription("Will set the final discounted price of a product to the value specified on the product custom field."),
AddInParameterEditor(typeof(YesNoParameterEditor), "")
]
public bool CalculateDiscountToReachSpecifiedDiscountPrice { get; set; }
PriceInfo IDiscountExtenderCalculateProductDiscount.GetDiscount(Product product, Currency currency, Country country)
{
ArgumentNullException.ThrowIfNull(product, nameof(product));
ArgumentNullException.ThrowIfNull(currency, nameof(currency));
ArgumentNullException.ThrowIfNull(country, nameof(country));
//Locating the amount set on the product in the custom field. We want to use this value as the final price after discount for this product.
double amountFromProductField = Converter.ToDouble(product.ProductFieldValues.GetProductFieldValue(Discount.AmountProductFieldName).Value);
if (amountFromProductField > 0)
{
//Load the price information located on the product in a custom field into a price calculated to handle vat etc.
PriceCalculated priceFromCustomField = PriceCalculated.Create(currency, country, new PriceRaw(amountFromProductField, currency));
priceFromCustomField.Calculate();
if (CalculateDiscountToReachSpecifiedDiscountPrice)
{
//Find the calculated price for this product
var priceContext = new PriceContext(currency, country);
PriceInfo priceFromProduct = product.GetPrice(priceContext);
//calculate what the discount must be in order to achieve a product price with discount that reflects what is in the custom field on the product
PriceInfo theDiscount = priceFromProduct.Substract(priceFromCustomField);
return theDiscount;
}
else
return priceFromCustomField;
}
else
{
var calculated = PriceCalculated.Create(currency, country, new PriceRaw(0d, currency));
calculated.Calculate();
return calculated;
}
}
public override bool DiscountValidForProduct(Product product)
{
ArgumentNullException.ThrowIfNull(product, nameof(product));
//This discount needs a field name specified in order to work
if (string.IsNullOrEmpty(Discount.AmountProductFieldName))
return false;
//This discount only works if the field has a positive value
double fieldValue = Converter.ToDouble(product.ProductFieldValues.GetProductFieldValue(Discount.AmountProductFieldName).Value);
if (fieldValue > 0)
return true;
return false;
}
public override bool DiscountValidForOrder(Order order)
{
//this discount type only applies for products
return false;
}
}
Remarks
If this interface is implemented it takes over discount calculation for a product.
Methods
GetDiscount(Product, Currency, Country)
Return the discount amount as a priceinfo that should be given to the passed product
PriceInfo GetDiscount(Product product, Currency currency, Country country)
Parameters
Returns
- PriceInfo
The amount that is wanted to be given in discount