/// <summary> /// Совершить покупку /// </summary> /// <param name="itemProduct"></param> public void Buy(int numberProduct) { if (numberProduct >= 0 && shopWindow.ListProduct[numberProduct].IsEnabled) { Wallet reserveDeposit = walletDeposit.Copy(); // Сохранить депозит на случай отката(нет монет для сдачи) walletMachine.Add(walletDeposit.GetAllMoney()); // Забрать деньги из депозита в автомат uint sumChange = reserveDeposit.Sum() - shopWindow.ListProduct[numberProduct].Cost; // Вычисление суммы сдачи. if (sumChange > 0) // Если сдача требуетя { Wallet change = walletMachine.GetSum(sumChange); // Попытка получить сдачу if (change != null) // Если сдачу получили { walletDeposit.Add(change); // Зачислить сдачу на депозит shopWindow.ListProduct[numberProduct].DecCount(); // Уменьшить кол-во товара на 1 cart.Add(shopWindow.ListProduct[numberProduct]); // Добавить товар в корзину. } else //Если не удалось получить сдачу { walletDeposit.Add(reserveDeposit); // Вернуть д.с. на депозит return; } } else // Если сдача не требуется { shopWindow.ListProduct[numberProduct].DecCount(); // Уменьшить кол-во товара на 1. cart.Add(shopWindow.ListProduct[numberProduct]); // Добавить товар в корзину. } } }
/// <summary> /// Забрать все деньги из кошелька. /// </summary> /// <returns></returns> public Wallet GetAllMoney() { #region Проверки на корректность переданного значения if (Sum() <= 0) { throw new Exception("Бумажник пуст."); } #endregion var result = new Wallet(); foreach (var i in pack) { if (i.Count > 0) { result.Add(new Pack() { Coin = i.Coin, Count = i.Count }); i.Count = 0; } } ChangeSum?.Invoke(Sum()); return(result); }
/// <summary> /// Получить сумму денежных средств. Сдача. /// </summary> /// <param name="value"></param> /// <returns></returns> public Wallet GetSum(uint value) { #region Проверки на корректность переданного значения if (value == 0) { throw new Exception("Запрашиваемая сумма должна быть больше нуля"); } if (value > Sum()) { throw new Exception("Недостаточно денежных средств"); } #endregion var result = new Wallet(); foreach (var i in pack) { if (i.Count > 0) { uint div = value / i.Coin.Count; uint mod = value % i.Coin.Count; if (div == 0) { continue; } if (div <= i.Count) { result.Add(new Pack() { Coin = i.Coin, Count = div }); div = 0; } else { result.Add(new Pack() { Coin = i.Coin, Count = i.Count }); div -= i.Count; div *= i.Coin.Count; } value = div + mod; if (value == 0) { break; } } } if (value != 0) { result = null; } else { //Списание GetSum(result); ChangeSum?.Invoke(Sum()); } return(result); }