/// <summary> /// FTC1.1.1 /// </summary> /// <returns></returns> public static Tuple <Item, Member, BookStatusView, LoanRequirement> TestCaseInput2() { var libraryMember = new Member { Member_id = 1, Library = new Library() { Member_id = 1, Name = "Library" }, Loan_Rule = GetNormalLoanRule() }; var itemId = 1; var item = new Item { Item_id = 1, Book = GetBook(itemId), ItemStatu = GetItemStatus(itemId, false), Subject = 1, Create_time = DateTime.Now, Item_type = 1, SerialItems = GetSerialItems(itemId) }; var bookStatus = new BookStatusView { CanLoanOut = false, IsAvailable = true, Isbn = isbn, ItemId = 1 }; var loanRequirement = new LoanRequirement { MemberId = 1, Isbn = isbn, CopyNumber = 1 }; return(Tuple.Create(item, libraryMember, bookStatus, loanRequirement)); }
public async Task <IHttpActionResult> LoanBookAsync(LoanRequirement loanRequirement) { try { if (!ModelState.IsValid || loanRequirement.CopyNumber <= 0) { return(BadRequest(ModelState)); } var member = await _context.Members.GetLibraryMemberAsync(loanRequirement.MemberId) .ConfigureAwait(false); if (member == null) { throw new MemberNotFoundException("Member not found"); } //using (var dbContextTransaction = _context.BeginTransaction()) //{ var availItems = await _context.Items.GetAvailableSerialItemsAsync(loanRequirement.CopyNumber, loanRequirement.Isbn).ConfigureAwait(false); var bookStatus = await _context.Books.GetBookStatusAsync(loanRequirement.Isbn).ConfigureAwait(false); if (availItems?.Count >= loanRequirement.CopyNumber && ((bookStatus.CanLoanOut && member.Library != null) || member.NormalMember != null)) { var memberReservedBooks = await _context.Items.GetReservedBooksAsync(loanRequirement.MemberId).ConfigureAwait(false); if (member.Loan_Rule.Max_loan_book != null && member.Loan_Rule.Max_loan_book < memberReservedBooks + loanRequirement.CopyNumber) { throw new ExceedLoanLimitException("Loan max limit exceeded."); } int batchId = Convert.ToInt32(await _context.ContextHelper.GetSequenceNoAsync("BatchId_Seq").ConfigureAwait(false)); List <Reservation> reservations = new List <Reservation>(); List <SerialItem> serialItems = new List <SerialItem>(); for (int i = 0; i < loanRequirement.CopyNumber; i++) { Reservation reservation = new Reservation { InsideReservation = new InsideReservation { Serial_item_id = availItems[i].Serial_item_id, Batch_id = batchId }, Batch_id = Convert.ToInt32(batchId), Member_id = member.Member_id, Reserve_time = DateTime.Now, Pickup_method = 1, Status = 1, Expected_return_date = member.Loan_Rule.Max_loan_day == null ? (DateTime?)null : DateTime.Now.Date.AddDays(member.Loan_Rule.Max_loan_day.Value) }; reservations.Add(reservation); availItems[i].Library_status = 2; serialItems.Add(availItems[i]); } _context.Reservations.AddRange(reservations); _context.SerialItems.SaveRange(serialItems); //dbContextTransaction.Commit(); var result = new ReservationResult { ReservationBatchId = batchId, ReservedItemIds = serialItems.Select(s => s.Serial_item_id).ToArray() }; return(Ok(result)); } else { throw new BookNotAvailableException("Required book is not available."); } //} } catch (MemberNotFoundException e) { return(Content(HttpStatusCode.NonAuthoritativeInformation, e.Message)); } catch (DbUpdateConcurrencyException) { return(Content(HttpStatusCode.Conflict, "Data has been modified, try again")); } catch (Exception e) { return(Content(HttpStatusCode.InternalServerError, e.Message)); } }