コード例 #1
0
        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());
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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;
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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());
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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;
        }
コード例 #9
0
        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());
        }