public GoodsBuyedEvent BuyGoods(IReadOnlyCollection<Coin> depositedAmount, GoodsIdentity goods) { Contract.Requires(depositedAmount != null); var availableGoods = _availableGoods.Retrieve(goods); var depositWallet = new Wallet(depositedAmount); var depositTotal = depositWallet.TotalFunds(); if (depositTotal < availableGoods.Price) { throw new InsufficientAmountForBuyingGoodsException(availableGoods.Price, depositTotal, goods); } var refundAmount = depositTotal - availableGoods.Price; _vendingMachineWallet = _vendingMachineWallet.Put(depositedAmount); _buyerWallet = _buyerWallet.Retrieve(depositedAmount); var refundCoins = Refund(refundAmount); var refundWallet = new Wallet(refundCoins); if (refundWallet.TotalFunds() != refundAmount) { throw new VendingMachineDoesNotHaveCoinsForRefundException(_vendingMachineWallet, refundAmount); } _vendingMachineWallet = _vendingMachineWallet.Retrieve(refundCoins); _buyerWallet = _buyerWallet.Put(refundCoins); return new GoodsBuyedEvent(_vendingMachineWallet, _buyerWallet, availableGoods, refundCoins); }
public BuyCommand(IReadOnlyCollection<Coin> deposit, GoodsIdentity goods) { Contract.Requires(deposit != null); Contract.Requires(!goods.Equals(default(GoodsIdentity))); Deposit = deposit; Goods = goods; }
public BuyCommand(IReadOnlyCollection <Coin> deposit, GoodsIdentity goods) { Contract.Requires(deposit != null); Contract.Requires(!goods.Equals(default(GoodsIdentity))); Deposit = deposit; Goods = goods; }
public InsufficientAmountForBuyingGoodsException(decimal expectedFunds, decimal actualFunds, GoodsIdentity goods) : base(string.Format("Insufficient amount for buying goods {0}. Expected funds: {1}, actual funds: {2}", goods, expectedFunds, actualFunds)) { Contract.Requires(expectedFunds > actualFunds); ExpectedFunds = expectedFunds; ActualFunds = actualFunds; Goods = goods; }
public JsonResult Buy(IEnumerable<CoinViewModel> deposit, Guid goodsIdentity) { Contract.Requires(deposit != null); Contract.Requires(goodsIdentity != default(Guid)); var depositCoins = deposit .Select(x => new Coin(x.ParValue, x.Count)) .ToArray(); var goods = new GoodsIdentity(goodsIdentity); Contract.Assume(!goods.Equals(default(GoodsIdentity))); var command = new BuyCommand(depositCoins, goods); var @event = _buyCommandHandler.Execute(command); return Json(@event); }
public JsonResult Buy(IEnumerable <CoinViewModel> deposit, Guid goodsIdentity) { Contract.Requires(deposit != null); Contract.Requires(goodsIdentity != default(Guid)); var depositCoins = deposit .Select(x => new Coin(x.ParValue, x.Count)) .ToArray(); var goods = new GoodsIdentity(goodsIdentity); Contract.Assume(!goods.Equals(default(GoodsIdentity))); var command = new BuyCommand(depositCoins, goods); var @event = _buyCommandHandler.Execute(command); return(Json(@event)); }