예제 #1
0
        public virtual string CanBuySnack(int positon)
        {
            SnackPile snackPile = GetSnackPile(positon);

            if (snackPile.Quantity == 0)
            {
                return("The snack pile is empty");
            }

            if (MoneyInTransaction < snackPile.Price)
            {
                return("Not enough money");
            }

            if (!MoneyInside.CanAllocate(MoneyInTransaction - snackPile.Price))
            {
                return("Not enough change");
            }

            return(string.Empty);
        }
예제 #2
0
        public void BuySnack(int position)
        {
            if (!CanBuySnak(position))
            {
                throw new CannotBuySnakException();
            }

            var slot = GetSlot(position);

            slot.SubtractOneSnak();

            var allocatedCharge = MoneyInside.Allocate(
                MoneyInTransaction.Amount - slot.GetItemPrice());

            MoneyInside -= allocatedCharge;
            MoneyInside += MoneyInTransaction;

            SetToZeroAmountInTransaction();

            AddDomainEvent(new SnackBoughtDomainEvent(
                               slot.SnackType.Id, slot.GetItemPrice()));
        }
예제 #3
0
        public virtual void BuySnack(int position)
        {
            var slot = GetSlot(position);

            if (slot.SnackPile.Price > MoneyInTransaction)
            {
                throw new InvalidOperationException();
            }

            var change   = MoneyInTransaction - slot.SnackPile.Price;
            var allocate = MoneyInside.Allocate(change);

            if (allocate.Amount < change)
            {
                throw new InvalidOperationException();
            }

            slot.SnackPile = slot.SnackPile.SubtractOne();

            MoneyInside       -= allocate;
            MoneyInTransaction = 0;
        }
예제 #4
0
        public virtual void BuySnack(int position)
        {
            if (CanBuySnack(position) != string.Empty)
            {
                throw new InvalidOperationException();
            }

            Slot slot = GetSlot(position);

            // slot.Quantity--;
            //if (slot.SnackPile.Price > MoneyInTransaction) now we don't need these checks
            //    throw new InvalidOperationException();
            slot.SnackPile = slot.SnackPile.SubstractOne();
            // MoneyInside += MoneyInTransaction;
            // MoneyInTransaction = None;
            Money change = MoneyInside.Allocate(MoneyInTransaction - slot.SnackPile.Price);

            //if (change.Amount < MoneyInTransaction - slot.SnackPile.Price)  now we don't need these checks
            //    throw new InvalidOperationException();
            MoneyInside       -= change;
            MoneyInTransaction = 0;
        }
예제 #5
0
        public bool CanBuySnak(int position)
        {
            var slot = GetSlot(position);

            if (slot.GetItemsQuantity() < 0)
            {
                return(false);
            }

            if (MoneyInTransaction.Amount < slot.GetItemPrice())
            {
                return(false);
            }

            var chargeToAllocate = MoneyInTransaction.Amount - slot.GetItemPrice();

            if (!MoneyInside.CanAllocate(chargeToAllocate))
            {
                return(false);
            }

            return(true);
        }
예제 #6
0
        public void BuySnack(int position)
        {
            // Don't allow purchase if not enough money inserted
            if (GetSlot(position).SnackPile.Price > this.AmountInTransaction)
            {
                throw new InvalidOperationException();
            }

            Slot slot = GetSlot(position);

            slot.SnackPile = slot.SnackPile.SubtractOne();

            //find the amount of change to return
            Money change = MoneyInside.AllocateToReturn(AmountInTransaction - slot.SnackPile.Price);

            if (change.Amount < AmountInTransaction - slot.SnackPile.Price)
            {
                throw new CannotMakeChangeException();
            }

            MoneyInside        -= change;
            AmountInTransaction = 0;
        }
예제 #7
0
        public virtual bool CanWithdrawal(decimal amount)
        {
            ValidationMessages.Clear();

            if (amount <= 0m)
            {
                ValidationMessages.Add(Constants.InvalidAmount);
                return(false);
            }

            if (amount > MoneyInside.Amount)
            {
                ValidationMessages.Add(Constants.NotEnoughChange);
                return(false);
            }

            if (!MoneyInside.CanAllocate(amount))
            {
                ValidationMessages.Add(Constants.NotEnoughChange);
                return(false);
            }

            return(true);
        }
예제 #8
0
        public void BuySnack(int position)
        {
            var slot = GetSlot(position);

            if (slot.SnackPile.Price > MoneyInTransaction)
            {
                throw new InvalidOperationException();
            }

            slot.SnackPile = slot.SnackPile.SubtractOne();

            var change = MoneyInside.Allocate(MoneyInTransaction - slot.SnackPile.Price);

            if (change.Amount < MoneyInTransaction - slot.SnackPile.Price)
            {
                throw new InvalidOperationException();
            }

            MoneyInside -= change;

            MoneyInTransaction = 0;

            AddDomainEvent(new SnackBought(slot.Position, slot.SnackPile.Quantity, slot.SnackPile.Snack.Name));
        }
예제 #9
0
        public virtual void BuySnack(int position)
        {
            if (CanBuySnack(position) != string.Empty)
            {
                throw new InvalidOperationException();
            }
            //Slots.Single(x => x.Position == position).Quantity--;
            var slot = GetSlot(position);

            //if (slot.SnackPile.Price > MoneyInTransaction.Amount) throw new InvalidOperationException();
            //if (slot.SnackPile.Price > MoneyInTransaction) throw new InvalidOperationException();
            slot.SnackPile = slot.SnackPile.SubtractOne();

            //No longer needed the InsertMoney take care of it
            //MoneyInside += MoneyInTransaction;

            //MoneyInTransaction = None;
            Money change = MoneyInside.Allocate(MoneyInTransaction - slot.SnackPile.Price);

            //if (change.Amount < MoneyInTransaction - slot.SnackPile.Price) throw new InvalidOperationException();

            MoneyInside       -= change;
            MoneyInTransaction = 0;
        }
예제 #10
0
 public virtual void ReturnMoney()
 {
     MoneyInside       -= MoneyInside.Allocate(MoneyInTransaction);
     MoneyInTransaction = 0;
 }