示例#1
0
        public void Take(Client client, Bike bike, Deposit deposit)
        {
            if (client == null)
            {
                throw new ArgumentNullException(nameof(client));
            }

            if (bike == null)
            {
                throw new ArgumentNullException(nameof(bike));
            }

            if (deposit == null)
            {
                throw new ArgumentNullException(nameof(deposit));
            }

            if (bike.RentPoint == null)
            {
                throw new InvalidOperationException("Bike is not on rent point");
            }

            if (!bike.IsFree)
            {
                throw new InvalidOperationException("Bike is not free");
            }

            if (bike.ReservationEndedAt.CompareTo(DateTime.UtcNow) > 0 && !bike.ClientMekedReservation.Equals(client))
            {
                throw new InvalidOperationException("Bike was maked a resevation");
            }

            bike.ClientMekedReservation = null;
            bike.ReservationEndedAt     = DateTime.UtcNow;

            if (deposit.Type == DepositTypes.Money)
            {
                decimal depositSum = _depositCalculator.Calculate(bike);

                if (((MoneyDeposit)deposit).Sum < depositSum)
                {
                    throw new InvalidOperationException("Deposit sum is not enough");
                }
            }

            _depositService.PutDeposit(deposit, bike.RentPoint);

            Rent rent = new Rent(client, bike, deposit);

            _rentRepository.Add(rent);
        }
        public void Take(Client client, Bike bike, Deposit deposit)
        {
            if (client == null)
            {
                throw new ArgumentNullException(nameof(client));
            }

            if (bike == null)
            {
                throw new ArgumentNullException(nameof(bike));
            }

            if (deposit == null)
            {
                throw new ArgumentNullException(nameof(deposit));
            }

            if (bike.RentPoint == null)
            {
                throw new InvalidOperationException("Bike is not on rent point");
            }

            if (!bike.IsFree)
            {
                throw new InvalidOperationException("Bike is not free");
            }


            if (deposit.Type == DepositTypes.Money)
            {
                decimal depositSum = _depositCalculator.Calculate(bike);

                if (((MoneyDeposit)deposit).Sum < depositSum)
                {
                    throw new InvalidOperationException("Deposit sum is not enough");
                }
            }

            bike.RentPoint.PutDeposit(deposit);

            bike.Take();

            Rent rent = new Rent(client, bike, deposit);

            _rentRepository.Add(rent);
        }
示例#3
0
        public void Take(Client client, Bike bike, Deposit deposit)
        {
            if (client == null)
            {
                throw new ArgumentNullException(nameof(client));
            }

            if (bike == null)
            {
                throw new ArgumentNullException(nameof(bike));
            }

            if (deposit == null)
            {
                throw new ArgumentNullException(nameof(deposit));
            }

            if (bike.RentPoint == null)
            {
                throw new InvalidOperationException("Bike is not on rent point");
            }

            if (!bike.IsFree)
            {
                throw new InvalidOperationException("Bike is not free");
            }

            if (bike.IsBroken)
            {
                throw new Exception("Sorry, this bike is broken. Please, choose another.");
            }

            if (bike.IsReserved)
            {
                Reserve reserve = _reserveRepository.All().SingleOrDefault(x => x.Bike == bike);

                if (reserve.EndTime < DateTime.UtcNow)
                {
                    reserve.ExpireReserve();
                }
                else
                {
                    if (client != reserve.Client)
                    {
                        throw new InvalidOperationException("Bike in reserved");
                    }
                    else
                    {
                        reserve.EndReserve();
                    }
                }
            }

            if (deposit.Type == DepositTypes.Money)
            {
                decimal depositSum = _depositCalculator.Calculate(bike);

                if (((MoneyDeposit)deposit).Sum < depositSum)
                {
                    throw new InvalidOperationException("Deposit sum is not enough");
                }
            }

            bike.RentPoint.Safe.PutDeposit(deposit);

            Rent rent = new Rent(client, bike, deposit);

            bike.RentPoint.RemoveBike(bike);
            bike.Take();


            _rentRepository.Add(rent);
        }