Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        public BuyCommand(IReadOnlyCollection<Coin> deposit, GoodsIdentity goods)
        {
            Contract.Requires(deposit != null);
            Contract.Requires(!goods.Equals(default(GoodsIdentity)));

            Deposit = deposit;
            Goods = goods;
        }
Ejemplo n.º 3
0
        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 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;
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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));
        }