/// <summary> /// Prepare the customer reward points model /// </summary> /// <param name="page">Number of items page; pass null to load the first page</param> /// <returns>Customer reward points model</returns> public virtual CustomerRewardPointsModel PrepareCustomerRewardPoints(int?page) { //get reward points history var customer = _workContext.CurrentCustomer; var store = _storeContext.CurrentStore; var pageSize = _rewardPointsSettings.PageSize; var rewardPoints = _rewardPointService.GetRewardPointsHistory(customer.Id, store.Id, true, pageIndex: --page ?? 0, pageSize: pageSize); //prepare model var model = new CustomerRewardPointsModel { RewardPoints = rewardPoints.Select(historyEntry => { var activatingDate = _dateTimeHelper.ConvertToUserTime(historyEntry.CreatedOnUtc, DateTimeKind.Utc); return(new CustomerRewardPointsModel.RewardPointsHistoryModel { Points = historyEntry.Points, PointsBalance = historyEntry.PointsBalance.HasValue ? historyEntry.PointsBalance.ToString() : string.Format(_localizationService.GetResource("RewardPoints.ActivatedLater"), activatingDate), Message = historyEntry.Message, CreatedOn = activatingDate, EndDate = !historyEntry.EndDateUtc.HasValue ? null : (DateTime?)_dateTimeHelper.ConvertToUserTime(historyEntry.EndDateUtc.Value, DateTimeKind.Utc) }); }).ToList(), PagerModel = new PagerModel { PageSize = rewardPoints.PageSize, TotalRecords = rewardPoints.TotalCount, PageIndex = rewardPoints.PageIndex, ShowTotalSummary = true, RouteActionName = "CustomerRewardPointsPaged", UseRouteLinks = true, RouteValues = new RewardPointsRouteValues { pageNumber = page ?? 0 } } }; //current amount/balance var rewardPointsBalance = _rewardPointService.GetRewardPointsBalance(customer.Id, _storeContext.CurrentStore.Id); var rewardPointsAmountBase = _orderTotalCalculationService.ConvertRewardPointsToAmount(rewardPointsBalance); var rewardPointsAmount = _currencyService.ConvertFromPrimaryStoreCurrency(rewardPointsAmountBase, _workContext.WorkingCurrency); model.RewardPointsBalance = rewardPointsBalance; model.RewardPointsAmount = _priceFormatter.FormatPrice(rewardPointsAmount, true, false); //minimum amount/balance var minimumRewardPointsBalance = _rewardPointsSettings.MinimumRewardPointsToUse; var minimumRewardPointsAmountBase = _orderTotalCalculationService.ConvertRewardPointsToAmount(minimumRewardPointsBalance); var minimumRewardPointsAmount = _currencyService.ConvertFromPrimaryStoreCurrency(minimumRewardPointsAmountBase, _workContext.WorkingCurrency); model.MinimumRewardPointsBalance = minimumRewardPointsBalance; model.MinimumRewardPointsAmount = _priceFormatter.FormatPrice(minimumRewardPointsAmount, true, false); return(model); }
public ActionResult CustomerRewardPoints(int?page) { if (!_workContext.CurrentCustomer.IsRegistered()) { return(new HttpUnauthorizedResult()); } if (!_rewardPointsSettings.Enabled) { return(RedirectToRoute("CustomerInfo")); } var customer = _workContext.CurrentCustomer; var pageSize = _rewardPointsSettings.PageSize; var model = new CustomerRewardPointsModel(); var list = _rewardPointService.GetRewardPointsHistory(customer.Id, pageIndex: --page ?? 0, pageSize: pageSize); model.RewardPoints = list.Select(rph => new CustomerRewardPointsModel.RewardPointsHistoryModel { Points = rph.Points, PointsBalance = rph.PointsBalance, Message = rph.Message, CreatedOn = _dateTimeHelper.ConvertToUserTime(rph.CreatedOnUtc, DateTimeKind.Utc) }).ToList(); model.PagerModel = new PagerModel { PageSize = list.PageSize, TotalRecords = list.TotalCount, PageIndex = list.PageIndex, ShowTotalSummary = true, RouteActionName = "CustomerRewardPointsPaged", UseRouteLinks = true, RouteValues = new RewardPointsRouteValues { page = page ?? 0 } }; //current amount/balance int rewardPointsBalance = _rewardPointService.GetRewardPointsBalance(customer.Id, _storeContext.CurrentStore.Id); decimal rewardPointsAmountBase = _orderTotalCalculationService.ConvertRewardPointsToAmount(rewardPointsBalance); decimal rewardPointsAmount = _currencyService.ConvertFromPrimaryStoreCurrency(rewardPointsAmountBase, _workContext.WorkingCurrency); model.RewardPointsBalance = rewardPointsBalance; model.RewardPointsAmount = _priceFormatter.FormatPrice(rewardPointsAmount, true, false); //minimum amount/balance int minimumRewardPointsBalance = _rewardPointsSettings.MinimumRewardPointsToUse; decimal minimumRewardPointsAmountBase = _orderTotalCalculationService.ConvertRewardPointsToAmount(minimumRewardPointsBalance); decimal minimumRewardPointsAmount = _currencyService.ConvertFromPrimaryStoreCurrency(minimumRewardPointsAmountBase, _workContext.WorkingCurrency); model.MinimumRewardPointsBalance = minimumRewardPointsBalance; model.MinimumRewardPointsAmount = _priceFormatter.FormatPrice(minimumRewardPointsAmount, true, false); return(View(model)); }
public virtual CustomerRewardPointsModel PrepareCustomerRewardPoints(int?page) { var customer = _workContext.CurrentCustomer; var pageSize = _rewardPointsSettings.PageSize; var model = new CustomerRewardPointsModel(); var list = _rewardPointService.GetRewardPointsHistory(customer.Id, showNotActivated: true, pageIndex: --page ?? 0, pageSize: pageSize); model.RewardPoints = list.Select(rph => { var activatingDate = _dateTimeHelper.ConvertToUserTime(rph.CreatedOnUtc, DateTimeKind.Utc); return(new CustomerRewardPointsModel.RewardPointsHistoryModel { Points = rph.Points, PointsBalance = rph.PointsBalance.HasValue ? rph.PointsBalance.ToString() : string.Format(_localizationService.GetResource("RewardPoints.ActivatedLater"), activatingDate), Message = rph.Message, CreatedOn = activatingDate }); }).ToList(); model.PagerModel = new PagerModel { PageSize = list.PageSize, TotalRecords = list.TotalCount, PageIndex = list.PageIndex, ShowTotalSummary = true, RouteActionName = "CustomerRewardPointsPaged", UseRouteLinks = true, RouteValues = new RewardPointsRouteValues { page = page ?? 0 } }; //current amount/balance int rewardPointsBalance = _rewardPointService.GetRewardPointsBalance(customer.Id, _storeContext.CurrentStore.Id); decimal rewardPointsAmountBase = _orderTotalCalculationService.ConvertRewardPointsToAmount(rewardPointsBalance); decimal rewardPointsAmount = _currencyService.ConvertFromPrimaryStoreCurrency(rewardPointsAmountBase, _workContext.WorkingCurrency); model.RewardPointsBalance = rewardPointsBalance; model.RewardPointsAmount = _priceFormatter.FormatPrice(rewardPointsAmount, true, false); //minimum amount/balance int minimumRewardPointsBalance = _rewardPointsSettings.MinimumRewardPointsToUse; decimal minimumRewardPointsAmountBase = _orderTotalCalculationService.ConvertRewardPointsToAmount(minimumRewardPointsBalance); decimal minimumRewardPointsAmount = _currencyService.ConvertFromPrimaryStoreCurrency(minimumRewardPointsAmountBase, _workContext.WorkingCurrency); model.MinimumRewardPointsBalance = minimumRewardPointsBalance; model.MinimumRewardPointsAmount = _priceFormatter.FormatPrice(minimumRewardPointsAmount, true, false); return(model); }
public ActionResult CustomerRewardPoints() { if (!_workContext.CurrentCustomer.IsRegistered()) { return(new HttpUnauthorizedResult()); } if (!_rewardPointsSettings.Enabled) { return(RedirectToRoute("CustomerInfo")); } var customer = _workContext.CurrentCustomer; var model = new CustomerRewardPointsModel(); foreach (var rph in _rewardPointService.GetRewardPointsHistory(customer.Id)) { model.RewardPoints.Add(new CustomerRewardPointsModel.RewardPointsHistoryModel { Points = rph.Points, PointsBalance = rph.PointsBalance, Message = rph.Message, CreatedOn = _dateTimeHelper.ConvertToUserTime(rph.CreatedOnUtc, DateTimeKind.Utc) }); } //current amount/balance int rewardPointsBalance = _rewardPointService.GetRewardPointsBalance(customer.Id, _storeContext.CurrentStore.Id); decimal rewardPointsAmountBase = _orderTotalCalculationService.ConvertRewardPointsToAmount(rewardPointsBalance); decimal rewardPointsAmount = _currencyService.ConvertFromPrimaryStoreCurrency(rewardPointsAmountBase, _workContext.WorkingCurrency); model.RewardPointsBalance = rewardPointsBalance; model.RewardPointsAmount = _priceFormatter.FormatPrice(rewardPointsAmount, true, false); //minimum amount/balance int minimumRewardPointsBalance = _rewardPointsSettings.MinimumRewardPointsToUse; decimal minimumRewardPointsAmountBase = _orderTotalCalculationService.ConvertRewardPointsToAmount(minimumRewardPointsBalance); decimal minimumRewardPointsAmount = _currencyService.ConvertFromPrimaryStoreCurrency(minimumRewardPointsAmountBase, _workContext.WorkingCurrency); model.MinimumRewardPointsBalance = minimumRewardPointsBalance; model.MinimumRewardPointsAmount = _priceFormatter.FormatPrice(minimumRewardPointsAmount, true, false); return(View(model)); }
/// <summary> /// Update subscription totals /// </summary> /// <param name="updateSubscriptionParameters">Parameters for the updating subscription</param> /// <param name="restoredCart">Shopping cart</param> public virtual void UpdateSubscriptionTotals(UpdateSubscriptionParameters updateSubscriptionParameters, IList <ShoppingCartItem> restoredCart) { var updatedSubscription = updateSubscriptionParameters.UpdatedSubscription; var updatedSubscriptionItem = updateSubscriptionParameters.UpdatedSubscriptionItem; //get the customer var customer = restoredCart.GetCustomer(); #region Sub total var subTotalExclTax = decimal.Zero; var subTotalInclTax = decimal.Zero; var subTotalTaxRates = new SortedDictionary <decimal, decimal>(); foreach (var shoppingCartItem in restoredCart) { var itemSubTotalExclTax = decimal.Zero; var itemSubTotalInclTax = decimal.Zero; var taxRate = decimal.Zero; //calculate subtotal for the updated subscription item if (shoppingCartItem.Id == updatedSubscriptionItem.Id) { //update subscription item updatedSubscriptionItem.UnitPriceExclTax = updateSubscriptionParameters.PriceExclTax; updatedSubscriptionItem.UnitPriceInclTax = updateSubscriptionParameters.PriceInclTax; updatedSubscriptionItem.DiscountAmountExclTax = updateSubscriptionParameters.DiscountAmountExclTax; updatedSubscriptionItem.DiscountAmountInclTax = updateSubscriptionParameters.DiscountAmountInclTax; updatedSubscriptionItem.PriceExclTax = itemSubTotalExclTax = updateSubscriptionParameters.SubTotalExclTax; updatedSubscriptionItem.PriceInclTax = itemSubTotalInclTax = updateSubscriptionParameters.SubTotalInclTax; updatedSubscriptionItem.Quantity = shoppingCartItem.Quantity; taxRate = Math.Round((100 * (itemSubTotalInclTax - itemSubTotalExclTax)) / itemSubTotalExclTax, 3); } else { //get the already calculated subtotal from the subscription item itemSubTotalExclTax = updatedSubscription.SubscriptionItems.FirstOrDefault(item => item.Id == shoppingCartItem.Id).PriceExclTax; itemSubTotalInclTax = updatedSubscription.SubscriptionItems.FirstOrDefault(item => item.Id == shoppingCartItem.Id).PriceInclTax; taxRate = Math.Round((100 * (itemSubTotalInclTax - itemSubTotalExclTax)) / itemSubTotalExclTax, 3); } subTotalExclTax += itemSubTotalExclTax; subTotalInclTax += itemSubTotalInclTax; //tax rates var itemTaxValue = itemSubTotalInclTax - itemSubTotalExclTax; if (taxRate > decimal.Zero && itemTaxValue > decimal.Zero) { if (!subTotalTaxRates.ContainsKey(taxRate)) { subTotalTaxRates.Add(taxRate, itemTaxValue); } else { subTotalTaxRates[taxRate] = subTotalTaxRates[taxRate] + itemTaxValue; } } } if (subTotalExclTax < decimal.Zero) { subTotalExclTax = decimal.Zero; } if (subTotalInclTax < decimal.Zero) { subTotalInclTax = decimal.Zero; } //We calculate discount amount on subscription subtotal excl tax (discount first) //calculate discount amount ('Applied to subscription subtotal' discount) //add tax for shopping items var tempTaxRates = new Dictionary <decimal, decimal>(subTotalTaxRates); foreach (var kvp in tempTaxRates) { if (kvp.Value != decimal.Zero && subTotalExclTax > decimal.Zero) { subTotalTaxRates[kvp.Key] = kvp.Value; } } //rounding if (_shoppingCartSettings.RoundPricesDuringCalculation) { subTotalExclTax = RoundingHelper.RoundPrice(subTotalExclTax); subTotalInclTax = RoundingHelper.RoundPrice(subTotalInclTax); } updatedSubscription.SubscriptionSubtotalExclTax = subTotalExclTax; updatedSubscription.SubscriptionSubtotalInclTax = subTotalInclTax; #endregion #region Tax rates var taxRates = new SortedDictionary <decimal, decimal>(); //subscription subtotal taxes var subTotalTax = decimal.Zero; foreach (var kvp in subTotalTaxRates) { subTotalTax += kvp.Value; if (kvp.Key > decimal.Zero && kvp.Value > decimal.Zero) { if (!taxRates.ContainsKey(kvp.Key)) { taxRates.Add(kvp.Key, kvp.Value); } else { taxRates[kvp.Key] = taxRates[kvp.Key] + kvp.Value; } } } //payment method additional fee tax var paymentMethodAdditionalFeeTax = decimal.Zero; if (_taxSettings.PaymentMethodAdditionalFeeIsTaxable) { paymentMethodAdditionalFeeTax = updatedSubscription.PaymentMethodAdditionalFeeInclTax - updatedSubscription.PaymentMethodAdditionalFeeExclTax; if (paymentMethodAdditionalFeeTax < decimal.Zero) { paymentMethodAdditionalFeeTax = decimal.Zero; } if (updatedSubscription.PaymentMethodAdditionalFeeExclTax > decimal.Zero) { var paymentTaxRate = Math.Round(100 * paymentMethodAdditionalFeeTax / updatedSubscription.PaymentMethodAdditionalFeeExclTax, 3); if (paymentTaxRate > decimal.Zero && paymentMethodAdditionalFeeTax > decimal.Zero) { if (!taxRates.ContainsKey(paymentTaxRate)) { taxRates.Add(paymentTaxRate, paymentMethodAdditionalFeeTax); } else { taxRates[paymentTaxRate] = taxRates[paymentTaxRate] + paymentMethodAdditionalFeeTax; } } } } //add at least one tax rate (0%) if (!taxRates.Any()) { taxRates.Add(decimal.Zero, decimal.Zero); } //summarize taxes var taxTotal = subTotalTax + paymentMethodAdditionalFeeTax; if (taxTotal < decimal.Zero) { taxTotal = decimal.Zero; } //round tax if (_shoppingCartSettings.RoundPricesDuringCalculation) { taxTotal = RoundingHelper.RoundPrice(taxTotal); } updatedSubscription.SubscriptionTax = taxTotal; updatedSubscription.TaxRates = taxRates.Aggregate(string.Empty, (current, next) => string.Format("{0}{1}:{2}; ", current, next.Key.ToString(CultureInfo.InvariantCulture), next.Value.ToString(CultureInfo.InvariantCulture))); #endregion #region Total var total = (subTotalExclTax) + updatedSubscription.PaymentMethodAdditionalFeeExclTax + taxTotal; //reward points var rewardPointsOfSubscription = _rewardPointService.GetRewardPointsHistory(customer.Id, true).FirstOrDefault(history => history.UsedWithSubscription == updatedSubscription); if (rewardPointsOfSubscription != null) { var rewardPoints = -rewardPointsOfSubscription.Points; var rewardPointsAmount = ConvertRewardPointsToAmount(rewardPoints); if (total < rewardPointsAmount) { rewardPoints = ConvertAmountToRewardPoints(total); rewardPointsAmount = total; } if (total > decimal.Zero) { total -= rewardPointsAmount; } //uncomment here for the return unused reward points if new subscription total less redeemed reward points amount //if (rewardPoints < -rewardPointsOfSubscription.Points) // _rewardPointService.AddRewardPointsHistoryEntry(customer, -rewardPointsOfSubscription.Points - rewardPoints, _storeContext.CurrentStore.Id, "Return unused reward points"); if (rewardPointsAmount != rewardPointsOfSubscription.UsedAmount) { rewardPointsOfSubscription.UsedAmount = rewardPointsAmount; rewardPointsOfSubscription.Points = -rewardPoints; _rewardPointService.UpdateRewardPointsHistoryEntry(rewardPointsOfSubscription); } } //rounding if (total < decimal.Zero) { total = decimal.Zero; } if (_shoppingCartSettings.RoundPricesDuringCalculation) { total = RoundingHelper.RoundPrice(total); } #endregion }