public StandartDiscount GetStandartDiscountByBalanceAsync(CustomersBalance balance, decimal amount) { var discounts = balance.Partner.StandartDiscounts.OrderBy(x => x.AmountOfDiscount); var discount = discounts.LastOrDefault(d => d.AmountOfDiscount > amount); return(discount ?? discounts.Last()); }
public PremiumDiscount GetPremiumDiscountByBalanceAsync(CustomersBalance balance) { var discounts = balance.Partner.PremiumDiscounts.OrderBy(x => x.PriceOfDiscount); var discount = discounts.LastOrDefault(p => p.PriceOfDiscount < balance.Amount); return(discount ?? discounts.Last()); }
public async Task CreateTransactionAsync(Customer customer, Filial filial, decimal amount, DateTime?date = null) { var transaction = new Transaction() { AllAmount = amount, Filial = filial, Customer = customer, DateTime = date ?? DateTime.Now, PartnerName = filial.Partner.Name, CategoryId = filial.Partner.CategoryId, SubcategoryId = filial.Partner.SubcategoryId, FilialAddress = filial.Street + ' ' + filial.HouseNumber }; var balance = await _context.CustomersBalances.Where(x => x.PartnerId == filial.PartnerId && x.CustomerId == customer.Id).SingleOrDefaultAsync(); if (balance == null) { var newBalance = new CustomersBalance() { ResetDate = DateTime.Today, IsPremium = false, Partner = filial.Partner }; customer.CustomersBalances.Add(newBalance); } if (balance.IsPremium) { await CalculatePremiumDiscount(transaction, balance); } else { await CalculateStandartDiscount(transaction, balance); } await _context.Transactions.AddAsync(transaction); }
private async Task CalculatePremiumDiscount(Transaction transaction, CustomersBalance balance) { var discount = await _discountService.GetPremiumDiscountByBalanceAsync(balance); transaction.AccumulationAmount = transaction.AllAmount * discount.AccumulatingPercent / 100; transaction.DiscountAmount = transaction.AllAmount * discount.DiscountPercent / 100; transaction.AmountForPay = transaction.AllAmount - transaction.DiscountAmount; balance.Amount += transaction.AccumulationAmount; }
public async Task <decimal> GetPremiumPrice(CustomersBalance balance) { var price = (await _context.Partners .Where(i => i.Id == balance.PartnerId) .SelectMany(s => s.PremiumDiscounts) .OrderBy(x => x.PriceOfDiscount) .FirstAsync()).PriceOfDiscount; return(price); }
public async Task <Domain.PremiumDiscount> GetPremiumDiscountByBalanceAsync(CustomersBalance balance) { var discounts = _context.Partners .Where(i => i.Id == balance.PartnerId) .SelectMany(s => s.PremiumDiscounts) .OrderBy(x => x.PriceOfDiscount); var discount = await discounts.LastOrDefaultAsync(p => p.PriceOfDiscount < balance.Amount); return(discount ?? await discounts.LastAsync()); }
private async Task CalculateStandartDiscount(Transaction transaction, CustomersBalance balance) { var discount = await _discountService.GetStandartDiscountByBalanceAsync(balance, transaction.AllAmount); transaction.AccumulationAmount = 0; transaction.DiscountAmount = transaction.AllAmount * discount.DiscountPercent / 100; transaction.AmountForPay = transaction.AllAmount - transaction.DiscountAmount; balance.Amount += transaction.AmountForPay; await _balanceService.CheckBalance(balance); }
public async Task CheckBalance(CustomersBalance balance) { var price = await _discountService.GetPremiumPrice(balance.Id); if (price < balance.Amount) { balance.IsPremium = true; balance.Amount -= price; balance.ResetDate = null; } return; }
public async Task <Domain.StandartDiscount> GetStandartDiscountByBalanceAsync(CustomersBalance balance, decimal amount) { var discounts = _context.Partners .Where(i => i.Id == balance.PartnerId) .SelectMany(s => s.StandartDiscounts) .OrderBy(x => x.AmountOfDiscount); var discount = await discounts.LastOrDefaultAsync(d => d.AmountOfDiscount > amount); return(discount ?? await discounts.LastAsync()); }