Hello friends,
today I will show a Price Calculation Service implementation for NopCommerce plugin.
We will need a class that inherits Nop.Services.Catalog.PriceCalculationService and single method for price calculation.
Here is the code:
public class MyPriceCalc:Nop.Services.Catalog.PriceCalculationService
{
#region Fields
private readonly CatalogSettings _catalogSettings;
private readonly CurrencySettings _currencySettings;
private readonly ICategoryService _categoryService;
private readonly ICurrencyService _currencyService;
private readonly IDiscountService _discountService;
private readonly IManufacturerService _manufacturerService;
private readonly IProductAttributeParser _productAttributeParser;
private readonly IProductService _productService;
private readonly IStaticCacheManager _cacheManager;
private readonly IStoreContext _storeContext;
private readonly IWorkContext _workContext;
private readonly ShoppingCartSettings _shoppingCartSettings;
private readonly IGenericAttributeService _genericAttributeService;
private readonly Nop.Services.Shipping.Date.IDateRangeService _dateRangeService;
#endregion
#region Ctor
public MyPriceCalc(CatalogSettings catalogSettings,
CurrencySettings currencySettings,
ICategoryService categoryService,
ICurrencyService currencyService,
IDiscountService discountService,
IManufacturerService manufacturerService,
IProductAttributeParser productAttributeParser,
IProductService productService,
IStaticCacheManager cacheManager,
IStoreContext storeContext,
IWorkContext workContext,
ShoppingCartSettings shoppingCartSettings,
IGenericAttributeService genericAttributeService,
Nop.Services.Shipping.Date.IDateRangeService dateRangeService) :base(catalogSettings,
currencySettings,
categoryService,
currencyService,
discountService,
manufacturerService,
productAttributeParser,
productService,
cacheManager,
storeContext,
workContext,
shoppingCartSettings)
{
this._catalogSettings = catalogSettings;
this._currencySettings = currencySettings;
this._categoryService = categoryService;
this._currencyService = currencyService;
this._discountService = discountService;
this._manufacturerService = manufacturerService;
this._productAttributeParser = productAttributeParser;
this._productService = productService;
this._cacheManager = cacheManager;
this._storeContext = storeContext;
this._workContext = workContext;
this._shoppingCartSettings = shoppingCartSettings;
this._genericAttributeService = genericAttributeService;
this._dateRangeService = dateRangeService;
}
#endregion
public override decimal GetFinalPrice(Product product,
Customer customer,
decimal? overriddenProductPrice,
decimal additionalCharge,
bool includeDiscounts,
int quantity,
DateTime? rentalStartDate,
DateTime? rentalEndDate,
out decimal discountAmount,
out List<DiscountForCaching> appliedDiscounts)
{
//get base price in case anything will go wrong in your logic
decimal fprice = base.GetFinalPrice(product,
customer,
overriddenProductPrice,
additionalCharge,
includeDiscounts,
quantity,
rentalStartDate,
rentalEndDate,
out discountAmount,
out appliedDiscounts);
if (_storeContext.CurrentStore.Id == 3/*your store id in multiple-store configuration*/)
{
try
{
//... your price calculation logic
}
catch (Exception ex)
{
var logger = EngineContext.Current.Resolve<Nop.Services.Logging.ILogger>();
logger.Error(ex.Message, ex, customer);
}
}
return fprice;
}
}
So, this class and the single method will be called every time any product requested (on home page, in any list, on product details page, etc.)
Firstly I call base method just in case anything will go wrong in my own logic and return the base price.
After you published this plugin your calculation class will picked up by NopCommerce immediately.
Thank you and see you there: NopCommerce customization - Events

1vqHSTrq1GEoEF7QsL8dhmJfRMDVxhv2y