private void PrepareGiftVouchers(AppliedGiftVoucher appliedGiftVoucher, OrderTotalsModel model, GetOrderTotals request) { var gcModel = new OrderTotalsModel.GiftVoucher { Id = appliedGiftVoucher.GiftVoucher.Id, CouponCode = appliedGiftVoucher.GiftVoucher.Code, }; gcModel.Amount = _priceFormatter.FormatPrice(-appliedGiftVoucher.AmountCanBeUsed, false); decimal remainingAmountBase = appliedGiftVoucher.GiftVoucher.GetGiftVoucherRemainingAmount() - appliedGiftVoucher.AmountCanBeUsed; gcModel.Remaining = _priceFormatter.FormatPrice(remainingAmountBase, false); model.GiftVouchers.Add(gcModel); }
GetShoppingCartTotal(IList <ShoppingCartItem> cart, bool?useLoyaltyPoints = null, bool usePaymentMethodAdditionalFee = true) { var redeemedLoyaltyPoints = 0; var redeemedLoyaltyPointsAmount = decimal.Zero; var customer = _workContext.CurrentCustomer; string paymentMethodSystemName = ""; if (customer != null) { paymentMethodSystemName = customer.GetUserFieldFromEntity <string>( SystemCustomerFieldNames.SelectedPaymentMethod, _workContext.CurrentStore.Id); } //subtotal without tax var subTotal = await GetShoppingCartSubTotal(cart, false); decimal subTotalWithDiscountBase = subTotal.subTotalWithDiscount; //subtotal with discount decimal subtotalBase = subTotalWithDiscountBase; //shipping without tax var shippingTotal = await GetShoppingCartShippingTotal(cart, false); decimal?shoppingCartShipping = shippingTotal.shoppingCartShippingTotal; //payment method additional fee without tax decimal paymentMethodAdditionalFeeWithoutTax = decimal.Zero; if (usePaymentMethodAdditionalFee && !string.IsNullOrEmpty(paymentMethodSystemName)) { var paymentMethodAdditionalFee = await _paymentService.GetAdditionalHandlingFee(cart, paymentMethodSystemName); paymentMethodAdditionalFeeWithoutTax = (await _taxService.GetPaymentMethodAdditionalFee(paymentMethodAdditionalFee, false, customer)).paymentPrice; } //tax decimal shoppingCartTax = (await GetTaxTotal(cart, usePaymentMethodAdditionalFee)).taxtotal; //order total decimal resultTemp = decimal.Zero; resultTemp += subtotalBase; if (shoppingCartShipping.HasValue) { resultTemp += shoppingCartShipping.Value; } resultTemp += paymentMethodAdditionalFeeWithoutTax; resultTemp += shoppingCartTax; if (_shoppingCartSettings.RoundPrices) { resultTemp = RoundingHelper.RoundPrice(resultTemp, _workContext.WorkingCurrency); } #region Order total discount var totalDiscount = await GetOrderTotalDiscount(customer, _workContext.WorkingCurrency, resultTemp); var discountAmount = totalDiscount.orderTotalDiscount; var appliedDiscounts = totalDiscount.appliedDiscounts; //sub totals with discount if (resultTemp < discountAmount) { discountAmount = resultTemp; } //reduce subtotal resultTemp -= discountAmount; if (resultTemp < decimal.Zero) { resultTemp = decimal.Zero; } if (_shoppingCartSettings.RoundPrices) { resultTemp = RoundingHelper.RoundPrice(resultTemp, _workContext.WorkingCurrency); } #endregion #region Applied gift vouchers var appliedGiftVouchers = new List <AppliedGiftVoucher>(); //we don't apply gift vouchers for recurring products var giftVouchers = await GetActiveGiftVouchers(customer, _workContext.WorkingCurrency); if (giftVouchers != null) { foreach (var gc in giftVouchers) { if (resultTemp > decimal.Zero) { decimal remainingAmount = gc.GetGiftVoucherRemainingAmount(); decimal amountCanBeUsed = resultTemp > remainingAmount ? remainingAmount : resultTemp; //reduce subtotal resultTemp -= amountCanBeUsed; var appliedGiftVoucher = new AppliedGiftVoucher { GiftVoucher = gc, AmountCanBeUsed = amountCanBeUsed }; appliedGiftVouchers.Add(appliedGiftVoucher); } } } #endregion if (resultTemp < decimal.Zero) { resultTemp = decimal.Zero; } if (_shoppingCartSettings.RoundPrices) { resultTemp = RoundingHelper.RoundPrice(resultTemp, _workContext.WorkingCurrency); } if (!shoppingCartShipping.HasValue) { //we have errors return(null, discountAmount, appliedDiscounts, appliedGiftVouchers, redeemedLoyaltyPoints, redeemedLoyaltyPointsAmount); } decimal orderTotal = resultTemp; #region Loyalty points if (_loyaltyPointsSettings.Enabled) { if (!useLoyaltyPoints.HasValue) { useLoyaltyPoints = customer.GetUserFieldFromEntity <bool>(SystemCustomerFieldNames.UseLoyaltyPointsDuringCheckout, _workContext.CurrentStore.Id); } if (useLoyaltyPoints.Value) { int loyaltyPointsBalance = await _loyaltyPointsService.GetLoyaltyPointsBalance(customer.Id, _workContext.CurrentStore.Id); if (CheckMinimumLoyaltyPointsToUseRequirement(loyaltyPointsBalance)) { decimal loyaltyPointsBalanceAmount = await ConvertLoyaltyPointsToAmount(loyaltyPointsBalance); if (orderTotal > decimal.Zero) { if (orderTotal > loyaltyPointsBalanceAmount) { redeemedLoyaltyPoints = loyaltyPointsBalance; redeemedLoyaltyPointsAmount = await _currencyService.ConvertFromPrimaryStoreCurrency(loyaltyPointsBalanceAmount, _workContext.WorkingCurrency); } else { redeemedLoyaltyPointsAmount = orderTotal; redeemedLoyaltyPoints = ConvertAmountToLoyaltyPoints(await _currencyService.ConvertToPrimaryStoreCurrency(redeemedLoyaltyPointsAmount, _workContext.WorkingCurrency)); } } } } } #endregion orderTotal -= redeemedLoyaltyPointsAmount; if (_shoppingCartSettings.RoundPrices) { orderTotal = RoundingHelper.RoundPrice(orderTotal, _workContext.WorkingCurrency); } return(orderTotal, discountAmount, appliedDiscounts, appliedGiftVouchers, redeemedLoyaltyPoints, redeemedLoyaltyPointsAmount); }