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); }