public BookingResponse ReleaseItem(BookingDetailInfor bookingDetailInfor)
        {
            using (StageBitzDB dataContext = new StageBitzDB())
            {
                InventoryBL     inventoryBL     = new InventoryBL(dataContext);
                ItemBooking     itemBooking     = inventoryBL.GetItemBooking(bookingDetailInfor.ItemBookingId);
                BookingResponse bookingResponse = new BookingResponse();
                if (itemBooking != null)
                {
                    if (itemBooking != null &&
                        (!(Utils.IsCompanyInventoryAdmin(itemBooking.Item.CompanyId.Value, bookingDetailInfor.UserId) ||
                           Utils.IsCompanyInventoryStaffMember(itemBooking.Item.CompanyId.Value, bookingDetailInfor.UserId, itemBooking.Item.LocationId, dataContext))))
                    {
                        bookingResponse.Status    = "NOTOK";
                        bookingResponse.ErrorCode = (int)ErrorCodes.NoEditPermissionForInventory;
                        bookingResponse.Message   = "Could not release the Item.";
                        return(bookingResponse);
                    }

                    bool isSuccess = inventoryBL.RemoveInUseItemFromItemBrief(itemBooking.RelatedId, bookingDetailInfor.UserId);
                    bookingResponse.Status = isSuccess ? "OK" : "NOTOK";
                }
                else
                {
                    bookingResponse.Status = "NOTOK";
                }

                return(bookingResponse);
            }
        }
        /// <summary>
        /// Sends the booking overdue emails.
        /// </summary>
        /// <param name="dateToConsider">The date to consider.</param>
        public static void SendBookingOverdueEmails(DateTime dateToConsider)
        {
            using (StageBitzDB dataContext = new StageBitzDB())
            {
                InventoryBL inventoryBL        = new InventoryBL(dataContext);
                int         overdueEmailCodeId = Utils.GetCodeIdByCodeValue("EmailTemplateTypeCode", "BOOKINGOVERDUE");

                var overdueBookings = (from ibs in dataContext.ItemBookings.Where(ibs => dataContext.IsItemBookingOverdueByDate(ibs.ItemBookingId, dateToConsider))
                                       from eh in dataContext.EmailHistories.Where(eh => ibs.ItemBookingId == eh.RelatedId &&
                                                                                   eh.RelatedTable == "ItemBooking" && eh.EmailTemplateTypeCodeId == overdueEmailCodeId).DefaultIfEmpty().Take(1)
                                       //join ib in dataContext.ItemBriefs on ibs.RelatedId equals ib.ItemBriefId
                                       join b in dataContext.Bookings on ibs.BookingId equals b.BookingId
                                       from ib in dataContext.ItemBriefs.Where(ib => ib.ItemBriefId == ibs.RelatedId && b.RelatedTable == "Project").DefaultIfEmpty().Take(1)
                                       join i in dataContext.Items on ibs.ItemId equals i.ItemId
                                       //                                       join b in dataContext.Bookings on ib.ProjectId equals b.RelatedId
                                       join cbn in dataContext.CompanyBookingNumbers on b.BookingId equals cbn.BookingId
                                       //join p in dataContext.Projects on ib.ProjectId equals p.ProjectId
                                       from p in dataContext.Projects.Where(p => p.ProjectId == b.RelatedId && b.RelatedTable == "Project").DefaultIfEmpty().Take(1)
                                       from np in dataContext.NonProjectBookings.Where(npb => npb.NonProjectBookingId == b.RelatedId && b.RelatedTable == "NonProject").DefaultIfEmpty().Take(1)
                                       where eh == null && ibs.IsActive && i.CompanyId.HasValue && i.CompanyId.Value == cbn.CompanyId
                                       group new { Booking = b, CompayBookingNumber = cbn, Project = p, NonProject = np, ItemBooking = ibs } by cbn.CompanyId into grp
                                       select new
                {
                    BookingInfo = grp.GroupBy(g => g.Booking.BookingId).
                                  Select(g => new
                    {
                        Booking = g.FirstOrDefault().Booking,
                        CompayBookingNumber = g.FirstOrDefault().CompayBookingNumber,
                        BookingName = g.FirstOrDefault().Project != null ? g.FirstOrDefault().Project.ProjectName : g.FirstOrDefault().NonProject.Name,
                        ItemBookingIds = g.Select(gx => gx.ItemBooking.ItemBookingId),
                        CompanyId = grp.Key
                    }),
                    CompanyId = grp.Key
                }).ToList();

                string userWebUrl = Utils.GetSystemValue("SBUserWebURL");

                Dictionary <User, List <dynamic> > userBookings = new Dictionary <User, List <dynamic> >();

                foreach (var companyBookings in overdueBookings)
                {
                    foreach (var bookingInfo in companyBookings.BookingInfo)
                    {
                        foreach (var itemBookingId in bookingInfo.ItemBookingIds)
                        {
                            ItemBooking itemBooking = inventoryBL.GetItemBooking(itemBookingId);
                            if (itemBooking != null)
                            {
                                User locationManager = inventoryBL.GetContactBookingManager(itemBooking.Item.CompanyId.Value, itemBooking.Item.LocationId);
                                if (locationManager != null)
                                {
                                    if (userBookings.Keys.Where(ul => ul.UserId == locationManager.UserId).FirstOrDefault() == null)
                                    {
                                        userBookings[locationManager] = new List <dynamic>();
                                    }

                                    User key = userBookings.Keys.Where(ul => ul.UserId == locationManager.UserId).FirstOrDefault();
                                    if (userBookings[key].Where(bi => bi.Booking.BookingId == bookingInfo.Booking.BookingId).FirstOrDefault() == null)
                                    {
                                        userBookings[key].Add(bookingInfo);
                                    }

                                    Data.EmailHistory emailHistory = new EmailHistory
                                    {
                                        EmailTemplateTypeCodeId = overdueEmailCodeId,
                                        RelatedId    = itemBookingId,
                                        RelatedTable = "ItemBooking",
                                        CreatedDate  = Utils.Now
                                    };

                                    dataContext.EmailHistories.AddObject(emailHistory);
                                }
                            }
                        }

                        dataContext.SaveChanges();
                    }
                }

                foreach (User user in userBookings.Keys)
                {
                    StringBuilder  bookingLinks = new StringBuilder();
                    List <dynamic> bookingInfos = userBookings[user];
                    foreach (dynamic bookingInfo in bookingInfos)
                    {
                        if (bookingInfo != null)
                        {
                            string url  = string.Format("{0}/Inventory/BookingDetails.aspx?BookingId={1}&CompanyId={2}", userWebUrl, bookingInfo.Booking.BookingId, bookingInfo.CompanyId);
                            string link = string.Format("Booking name: <a href='{0}' target='_blank'>{1}</a> - Booking ID: {2} <br />", url, bookingInfo.BookingName, bookingInfo.CompayBookingNumber.BookingNumber);
                            bookingLinks.Append(link);
                        }
                    }

                    EmailSender.SendBookingOverdueEmail(user.Email1, user.FirstName, bookingLinks.ToString());
                }
            }
        }