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); }
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; } }
public void CoinAndStateInfo(CoinEntity coin, CurrentStateEntity state) { CoinInfo(coin); StateInfo(state); }
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); }