Example #1
0
        /// <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));
        }
Example #2
0
        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));
            }
        }