public static Loan CreateLoanFrom(Book book, Member member)
 {
     Loan loan = new Loan();
     loan.Book = book;
     loan.Member = member;
     loan.LoanDate = DateTime.Now;
     loan.DateForReturn = DateTime.Now.AddDays(7);
     return loan;
 }
        public void Return(Book book)
        {
            Loan loan = FindCurrentOutstandingLoanFor(book);

            if (loan != null)
            {
                loan.MarkAsReturned();
                book.OnLoanTo = null;
            }
            else
                throw new ApplicationException(String.Format("Cannot return book '{0}'. Member '{1}' does not have this book on loan.", book.Id.ToString(), this.Id.ToString()));
        }
        public Loan Loan(Book book)
        {
            Loan loan = default(Loan);
            if (CanLoan(book))
            {
                loan = LoanFactory.CreateLoanFrom(book, this);
                Loans.Add(loan);
            }
            else
                throw new ApplicationException(String.Format("Cannot loan book '{0}'. Book is on to member '{1}'", book.Id.ToString(), book.OnLoanTo.Id.ToString()));

            return loan;
        }
        public AddBookResponse AddBook(AddBookRequest request)
        {
            AddBookResponse response = new AddBookResponse();

            BookTitle bookTitle = _bookTitleRepository.FindBy( request.ISBN); 
            Book book = new Book();
            book.Title = bookTitle;
            book.Id = Guid.NewGuid();
            _bookRepository.Add(book);
            _uow.Commit();

            response.Success = true;

            return response;
        }
 public bool CanLoan(Book book)
 {
     return book.OnLoanTo == null;
 }
 private Loan FindCurrentOutstandingLoanFor(Book book)
 {
     return Loans.FirstOrDefault(l => (l.Book.Id == book.Id && l.HasNotBeenReturned()));
 }