protected bool CanPayOrderAmount(PayPalInstalmentsSettings settings, PaymentFilterRequest request) { var cartTotal = ((decimal?)_orderTotalCalculationService.Value.GetShoppingCartTotal(request.Cart)) ?? decimal.Zero; if (cartTotal == decimal.Zero) { return(false); } return(cartTotal >= settings.FinancingMin && cartTotal <= settings.FinancingMax); }
public FinancingOptions GetFinancingOptions( PayPalInstalmentsSettings settings, PayPalSessionData session, string origin, decimal amount, PayPalPromotion?promotion = null) { Guard.NotNull(settings, nameof(settings)); Guard.NotNull(session, nameof(session)); Guard.NotEmpty(origin, nameof(origin)); var store = _services.StoreContext.CurrentStore; // Get promotion type. if (!promotion.HasValue) { switch (origin) { case "productpage": promotion = settings.ProductPagePromotion; break; case "cart": promotion = settings.CartPagePromotion; break; case "paymentinfo": promotion = settings.PaymentListPromotion; break; } } if (!promotion.HasValue || settings.ClientId.IsEmpty() || settings.Secret.IsEmpty()) { return(null); } // Get financing amount. if (origin == "cart" || origin == "paymentinfo") { var cart = _services.WorkContext.CurrentCustomer.GetCartItems(ShoppingCartType.ShoppingCart, store.Id); decimal?cartTotal = _orderTotalCalculationService.GetShoppingCartTotal(cart, usePaymentMethodAdditionalFee: false); if (!cartTotal.HasValue) { _orderTotalCalculationService.GetShoppingCartSubTotal(cart, out _, out _, out _, out amount); } else { amount = cartTotal.Value; } } if (!settings.IsAmountFinanceable(amount)) { return(null); } // Get financing options from API. var result = new FinancingOptions(origin) { Promotion = promotion, Lender = settings.Lender }; var sourceCurrency = store.PrimaryStoreCurrency; var targetCurrency = _services.WorkContext.WorkingCurrency; result.NetLoanAmount = new Money(_currencyService.ConvertCurrency(amount, sourceCurrency, targetCurrency, store), targetCurrency); if (promotion == PayPalPromotion.FinancingExample) { var response = EnsureAccessToken(session, settings); if (response.Success) { var index = 0; var dc = decimal.Zero; var data = new Dictionary <string, object>(); var transactionAmount = new Dictionary <string, object>(); transactionAmount.Add("value", amount.FormatInvariant()); transactionAmount.Add("currency_code", store.PrimaryStoreCurrency.CurrencyCode); var merchantCountry = _countryService.Value.GetCountryById(_companyInfoSettings.Value.CountryId) ?? _countryService.Value.GetAllCountries().FirstOrDefault(); data.Add("financing_country_code", merchantCountry.TwoLetterIsoCode); data.Add("transaction_amount", transactionAmount); response = CallApi("POST", "/v1/credit/calculated-financing-options", settings, session, JsonConvert.SerializeObject(data)); if (response.Success && response.Json.financing_options != null) { foreach (var fo in response.Json.financing_options[0].qualifying_financing_options) { var option = new FinancingOptions.Option(); option.MonthlyPayment = Parse((string)fo.monthly_payment.value, sourceCurrency, targetCurrency, store); if (option.MonthlyPayment.Amount > decimal.Zero) { if (decimal.TryParse(((string)fo.credit_financing.apr).EmptyNull(), NumberStyles.Number, CultureInfo.InvariantCulture, out dc)) { option.AnnualPercentageRate = dc; } if (decimal.TryParse(((string)fo.credit_financing.nominal_rate).EmptyNull(), NumberStyles.Number, CultureInfo.InvariantCulture, out dc)) { option.NominalRate = dc; } option.Term = ((string)fo.credit_financing.term).ToInt(); option.MinAmount = Parse((string)fo.min_amount.value, sourceCurrency, targetCurrency, store); option.TotalInterest = Parse((string)fo.total_interest.value, sourceCurrency, targetCurrency, store); option.TotalCost = Parse((string)fo.total_cost.value, sourceCurrency, targetCurrency, store); // PayPal review: do not display last instalment. //var instalments = fo.estimated_installments as JArray; //var lastInstalment = instalments?.LastOrDefault()?.SelectToken("total_payment.value")?.ToString(); //option.LastInstalment = Parse(lastInstalment, sourceCurrency, targetCurrency, store); //if (option.LastInstalment.Amount == decimal.Zero) //{ // option.LastInstalment = new Money(option.MonthlyPayment.Amount, targetCurrency); //} result.Qualified.Add(option); } } result.Qualified = result.Qualified .OrderBy(x => x.Term) .ThenBy(x => x.MonthlyPayment.Amount) .ToList(); result.Qualified.Each(x => x.Index = ++index); } } } return(result); }