public DrinkOperationInfo BuyDrink(Guid id)
        {
            DrinkEntity        drink        = _drinkRepository.Get(id);
            CurrentStateEntity currentState = _stateRepository.GetFirst();

            _logger.Info(" before buy drink");
            _printer.DrinkAndStateInfo(drink, currentState);

            bool success = true;
            var  msg     = "";

            if (!_vengineMachine.BuyDrink(drink, currentState, _coinRepository.Queryable().ToList()))
            {
                success = false;
                msg     =
                    " Невозможно совершить покупку! В автомате нет сдачи! Деньги возвращены полностью в качестве сдачи";
                _logger.Warning(msg);
            }

            _logger.Info(" after buy drink");
            _printer.DrinkAndStateInfo(drink, currentState);

            _logger.Info(" before _db.SaveChanges()...");
            _drinkRepository.SaveChanges();

            return(new DrinkOperationInfo {
                Drink = drink, Change = currentState.Change, Success = success, Msg = msg
            });
        }
        /// <summary>
        /// Покупка напитка
        /// </summary>
        /// <param name="drink"></param>
        /// <param name="currentState"></param>
        /// <param name="coins"></param>
        /// <returns></returns>
        public bool BuyDrink(DrinkEntity drink, CurrentStateEntity currentState, IList <CoinEntity> coins)
        {
            //Если не можем купить выходим
            if (!IsCanBuy(drink, currentState))
            {
                return(false);
            }

            /*List<CoinEntity> coins = _coinsRepo.Queryable().ToList();*/
            var deposit = currentState.Deposit;
            var change  = deposit - drink.CostPrice;

            currentState.Deposit = 0;

            //Если сдача равна 0 или в атомате достаточное кол-во монет для выдачи, то позволяем купить, иначе просто отдаем внесенные деньги
            if (change == 0 || IsHaveCoinsForChange(coins, change))
            {
                drink.Count--;
                currentState.Change += change;
                return(true);
            }

            currentState.Change += deposit;

            return(false);
        }
示例#3
0
 public void StateInfo(CurrentStateEntity currentState)
 {
     _logger.Info(" ");
     _logger.Info("  StateInfo:");
     _logger.Info("    Deposit = " + currentState.Deposit);
     _logger.Info("    Change = " + currentState.Change);
     _logger.Info(" ");
 }
        public void GetChange()
        {
            CurrentStateEntity currentState = _stateRepository.GetFirst();

            _vengineMachine.GetChange(currentState, _coinRepository.Queryable().ToList());

            _logger.Info(" before _db.SaveChanges()...");
            _stateRepository.SaveChanges();
        }
        /*protected FakeRepository<DrinkEntity> RepositoryDrink;*/

        public virtual void Init()
        {
            Drink1 = new DrinkEntity()
            {
                CostPrice = 10,
                Count     = 2,
                Id        = Guid.Parse("FFDF9A9C-1FC1-4DEB-B552-45EB5E0EC48C"),
                ImagePath = "image1",
                Name      = "drink1"
            };

            Drink2 = new DrinkEntity()
            {
                CostPrice = 20,
                Count     = 4,
                Id        = Guid.NewGuid(),
                ImagePath = "image2",
                Name      = "drink2"
            };

            Coin1 = new CoinEntity()
            {
                Id         = Guid.NewGuid(),
                Count      = 10,
                IsBlocking = false,
                Value      = ValueCoins.One
            };

            Coin2 = new CoinEntity()
            {
                Id         = Guid.NewGuid(),
                Count      = 10,
                IsBlocking = true,
                Value      = ValueCoins.Two
            };

            CurrentState = new CurrentStateEntity()
            {
                Change  = 0,
                Deposit = 0
            };

            DrinkEntitiesList = new List <DrinkEntity> {
                Drink1, Drink2
            };
            CoinEntitiesList = new List <CoinEntity> {
                Coin1, Coin2
            };

            /*RepositoryDrink = new FakeRepository<DrinkEntity>(DrinkEntitiesList);
             * var repositoryCoin = new FakeRepository<CoinEntity>(CoinEntitiesList);*/

            VengineMachine = new VengineMachine(/*RepositoryDrink, repositoryCoin*/);
        }
        public JsonBase IsCanBuy(Guid id)
        {
            DrinkEntity        drink        = _drinkRepository.Get(id);
            CurrentStateEntity currentState = _stateRepository.GetFirst();

            _printer.DrinkAndStateInfo(drink, currentState);

            if (!_vengineMachine.IsCanBuy(drink, currentState))
            {
                var msg = " Сумма недостаточна для покупки!";
                _logger.Warning(msg);
                return(new JsonError(msg));
            }

            return(new JsonSuccess());
        }
        public int AddCoin(Guid id)
        {
            CoinEntity         coinEntity   = _coinRepository.Get(id);
            CurrentStateEntity currentState = _stateRepository.GetFirst();

            _logger.Info(" before add coin");
            _printer.CoinAndStateInfo(coinEntity, currentState);

            _vengineMachine.AddCoin(coinEntity, currentState);

            _logger.Info(" after add coin");
            _printer.CoinAndStateInfo(coinEntity, currentState);

            _logger.Info(" before _db.SaveChanges()...");
            _coinRepository.SaveChanges();

            return(currentState.Deposit);
        }
        /// <summary>
        /// Выдача сдачи
        /// </summary>
        /// <param name="currentState"></param>
        /// <param name="coins"></param>
        public void GetChange(CurrentStateEntity currentState, IList <CoinEntity> coins)
        {
            /*List<CoinEntity> coins = _coinsRepo.Queryable().ToList();*/
            var change = currentState.Change;

            //Подсчет монет  для сдачи
            IList <Coin> coinsForChange = GetCoinsForChange(coins, change);

            if (coinsForChange != null)
            {
                foreach (var coin in coinsForChange)
                {
                    CoinEntity coinEntity = coins.FirstOrDefault(c => (int)c.Value == coin.Value);
                    if (coinEntity != null)
                    {
                        coinEntity.Count -= coin.Count;
                    }
                }

                currentState.Change = 0;
            }
        }
示例#9
0
 public void CoinAndStateInfo(CoinEntity coin, CurrentStateEntity state)
 {
     CoinInfo(coin);
     StateInfo(state);
 }
示例#10
0
 public void DrinkAndStateInfo(DrinkEntity drink, CurrentStateEntity state)
 {
     DrinkInfo(drink);
     StateInfo(state);
 }
 /// <summary>
 /// Добавление монеты в автомат, возможно не самое лучшее название метода
 /// </summary>
 /// <param name="coinEntity"></param>
 /// <param name="currentState"></param>
 public void AddCoin(CoinEntity coinEntity, CurrentStateEntity currentState)
 {
     coinEntity.Count++;
     currentState.Deposit += (int)coinEntity.Value;
 }
 /// <summary>
 /// Проверка на возможность покупки
 /// Нельзя купит если напитка нет или кол-во внесенных средст меньше стоимости напитка
 /// </summary>
 /// <param name="drink"></param>
 /// <param name="currentState"></param>
 /// <returns></returns>
 public bool IsCanBuy(DrinkEntity drink, CurrentStateEntity currentState)
 {
     return(drink.Count > 0 && currentState.Deposit >= drink.CostPrice);
 }