示例#1
0
        public static List <GroupMemberViewModel> BuildGroupMemberViewListFromGroupMemberList(ApplicationDbContext db, List <GroupMember> groupMemberList)
        {
            List <GroupMemberViewModel> list = new List <GroupMemberViewModel>();

            foreach (GroupMember member in groupMemberList)
            {
                Organisation organisaion     = OrganisationHelpers.GetOrganisation(db, member.OrganisationId);
                AppUser      addedBy         = AppUserHelpers.GetAppUser(db, member.AddedBy);
                AppUser      recordChangedBy = AppUserHelpers.GetAppUser(db, member.RecordChangeBy);

                GroupMemberViewModel item = new GroupMemberViewModel()
                {
                    GroupMemberId       = member.GroupMemberId,
                    GroupId             = member.GroupId,
                    OrganisationDetails = organisaion,
                    AddedBy             = addedBy,
                    AddedDateTime       = member.AddedDateTime,
                    Status         = member.Status,
                    RecordChange   = member.RecordChange,
                    RecordChangeOn = member.RecordChangeOn,
                    RecordChangeBy = recordChangedBy
                };

                list.Add(item);
            }

            return(list);
        }
示例#2
0
        public static OrganisationAdminView GetOrganisationAdminView(ApplicationDbContext db, Guid organisationId)
        {
            Organisation org = OrganisationHelpers.GetOrganisation(db, organisationId);

            OrganisationAdminView view = new OrganisationAdminView()
            {
                OrganisationId             = org.OrganisationId,
                OrganisationName           = org.OrganisationName,
                BusinessType               = org.BusinessType,
                AddressLine1               = org.AddressLine1,
                AddressLine2               = org.AddressLine2,
                AddressLine3               = org.AddressLine3,
                AddressTownCity            = org.AddressTownCity,
                AddressCounty              = org.AddressCounty,
                AddressPostcode            = org.AddressPostcode,
                TelephoneNumber            = org.TelephoneNumber,
                Email                      = org.Email,
                Website                    = org.Website,
                ContactName                = org.ContactName,
                CompanyRegistrationDetails = org.CompanyRegistrationDetails,
                CharityRegistrationDetails = org.CharityRegistrationDetails,
                VATRegistrationDetails     = org.VATRegistrationDetails,
                ListingPrivacyLevel        = org.ListingPrivacyLevel,
                PrivacyLevel               = org.PrivacyLevel,
                GroupPrivacyLevel          = org.GroupPrivacyLevel
            };

            return(view);
        }
示例#3
0
        public static RequiredListing CreateListing(ApplicationDbContext db, RequiredListingManageCreateViewModel model, IPrincipal user)
        {
            AppUser      thisUser = AppUserHelpers.GetAppUser(db, user);
            Organisation thisOrg  = OrganisationHelpers.GetOrganisation(db, thisUser.OrganisationId);

            RequiredListing listing = new RequiredListing()
            {
                ListingId           = Guid.NewGuid(),
                ItemDescription     = model.ItemDescription,
                ItemCategory        = model.ItemCategory,
                ItemType            = model.ItemType,
                QuantityRequired    = model.QuantityRequired.Value,
                QuantityOutstanding = model.QuantityRequired.Value,
                UoM                             = model.UoM,
                RequiredFrom                    = model.RequiredFrom,
                RequiredTo                      = model.RequiredTo,
                AcceptDamagedItems              = model.AcceptDamagedItems,
                AcceptOutOfDateItems            = model.AcceptOutOfDateItems,
                CollectionAvailable             = model.CollectionAvailable,
                ListingStatus                   = ItemEnums.ItemRequiredListingStatusEnum.Open,
                ListingOrganisationPostcode     = thisOrg.AddressPostcode,
                RecordChange                    = GeneralEnums.RecordChangeEnum.NewRecord,
                RecordChangeBy                  = thisUser.AppUserId,
                RecordChangeOn                  = DateTime.Now,
                ListingOriginatorAppUserId      = thisUser.AppUserId,
                ListingOriginatorOrganisationId = thisOrg.OrganisationId,
                ListingOriginatorDateTime       = DateTime.Now
            };

            db.RequiredListings.Add(listing);
            db.SaveChanges();

            return(listing);
        }
示例#4
0
        public static List <GroupMemberViewCreateModel> BuildGroupMemberViewCreateListFromGroupMemberList(ApplicationDbContext db, List <GroupMember> groupMemberList)
        {
            List <GroupMemberViewCreateModel> list = new List <GroupMemberViewCreateModel>();

            foreach (GroupMember member in groupMemberList)
            {
                Organisation organisaion = OrganisationHelpers.GetOrganisation(db, member.OrganisationId);

                GroupMemberViewCreateModel item = new GroupMemberViewCreateModel()
                {
                    GroupMemberId    = member.GroupMemberId,
                    GroupId          = member.GroupId,
                    OrganisationId   = member.OrganisationId,
                    OrganisationName = organisaion.OrganisationName,
                    BusinessType     = organisaion.BusinessType,
                    AddressLine1     = organisaion.AddressLine1,
                    AddressTownCity  = organisaion.AddressTownCity,
                    AddressPostcode  = organisaion.AddressPostcode
                };

                list.Add(item);
            }

            return(list);
        }
示例#5
0
        public static Offer AcceptOffer(ApplicationDbContext db, Guid offerId, IPrincipal user)
        {
            Offer   offer   = db.Offers.Find(offerId);
            AppUser appUser = AppUserHelpers.GetAppUser(db, user);

            Order order = OrderHelpers.CreateOrder(db, offer, user);

            offer.OfferStatus = OfferStatusEnum.Accepted;
            offer.AcceptedBy  = appUser.AppUserId;
            offer.AcceptedOn  = DateTime.Now;
            offer.OrderId     = order.OrderId;
            offer.OrderOriginatorAppUserId      = appUser.AppUserId;
            offer.OrderOriginatorOrganisationId = appUser.OrganisationId;
            offer.OrderOriginatorDateTime       = DateTime.Now;

            db.Entry(offer).State = EntityState.Modified;
            db.SaveChanges();

            //set any related actions to Closed
            NotificationHelpers.RemoveNotificationsForOffer(db, offerId, user);

            //set any related current offers to closed if there is no stock left (currentOfferQuantity = 0)
            if (offer.CurrentOfferQuantity == 0)
            {
                OfferHelpers.CloseOffersRelatedToListing(db, offer.ListingId, user);
            }

            //Create Action to show order ready
            Organisation org = OrganisationHelpers.GetOrganisation(db, offer.OfferOriginatorOrganisationId);

            NotificationHelpers.CreateNotification(db, NotificationTypeEnum.NewOrderReceived, "New order received from " + org.OrganisationName, order.OrderId, appUser.AppUserId, org.OrganisationId, user);

            return(offer);
        }
示例#6
0
        public static Offer CreateOffer(ApplicationDbContext db, Guid listingId, decimal?offerQty, ListingTypeEnum listingType, AppUser currentUser, IPrincipal user)
        {
            if (currentUser == null)
            {
                currentUser = AppUserHelpers.GetAppUser(db, user);
            }

            Guid     listingOrigAppUserId = Guid.Empty;
            Guid     listingOrigOrgId     = Guid.Empty;
            DateTime listingOrigDateTime  = DateTime.MinValue;
            string   itemDescription      = "";

            //Get originator information for the correct listing
            if (listingType == ListingTypeEnum.Available)
            {
                AvailableListing availableListing = AvailableListingHelpers.GetAvailableListing(db, listingId);
                listingOrigAppUserId = availableListing.ListingOriginatorAppUserId;
                listingOrigOrgId     = availableListing.ListingOriginatorOrganisationId;
                listingOrigDateTime  = availableListing.ListingOriginatorDateTime;
                itemDescription      = availableListing.ItemDescription;
            }
            else
            {
                RequiredListing requiredListing = RequiredListingHelpers.GetRequiredListing(db, listingId);
                listingOrigAppUserId = requiredListing.ListingOriginatorAppUserId;
                listingOrigOrgId     = requiredListing.ListingOriginatorOrganisationId;
                listingOrigDateTime  = requiredListing.ListingOriginatorDateTime;
                itemDescription      = requiredListing.ItemDescription;
            }

            //create offer
            Offer offer = new Offer()
            {
                OfferId                         = Guid.NewGuid(),
                ListingId                       = listingId,
                ListingType                     = listingType,
                OfferStatus                     = OfferStatusEnum.New,
                ItemDescription                 = itemDescription,
                CurrentOfferQuantity            = offerQty.Value,
                OfferOriginatorAppUserId        = currentUser.AppUserId,
                OfferOriginatorOrganisationId   = currentUser.OrganisationId,
                OfferOriginatorDateTime         = DateTime.Now,
                ListingOriginatorAppUserId      = listingOrigAppUserId,
                ListingOriginatorOrganisationId = listingOrigOrgId,
                ListingOriginatorDateTime       = listingOrigDateTime
            };

            db.Offers.Add(offer);
            db.SaveChanges();

            //Create Action
            Organisation org = OrganisationHelpers.GetOrganisation(db, currentUser.OrganisationId);

            NotificationHelpers.CreateNotification(db, NotificationTypeEnum.NewOfferReceived, "New offer received from " + org.OrganisationName, offer.OfferId, listingOrigAppUserId, listingOrigOrgId, user);

            return(offer);
        }
示例#7
0
        public static Offer UpdateOffer(ApplicationDbContext db, Guid offerid, OfferStatusEnum offerStatus, decimal?currentOfferQuantity, decimal?counterOfferQuantity, IPrincipal user)
        {
            Offer offer = OfferHelpers.GetOffer(db, offerid);

            switch (offerStatus)
            {
            case OfferStatusEnum.Reoffer:     //update offer value and move counter value to previous
                if (currentOfferQuantity.HasValue)
                {
                    offer.CurrentOfferQuantity         = currentOfferQuantity.Value;
                    offer.PreviousCounterOfferQuantity = offer.CounterOfferQuantity;
                    offer.CounterOfferQuantity         = null;
                    offer.LastOfferOriginatorAppUserId = AppUserHelpers.GetAppUserIdFromUser(user);
                    offer.LastOfferOriginatorDateTime  = DateTime.Now;
                    offer.OfferStatus = offerStatus;

                    db.Entry(offer).State = EntityState.Modified;
                    db.SaveChanges();
                }
                break;

            case OfferStatusEnum.Countered:     //update counter value and move current offer to previous offer
                if (counterOfferQuantity.HasValue)
                {
                    offer.CounterOfferQuantity  = counterOfferQuantity;
                    offer.PreviousOfferQuantity = offer.CurrentOfferQuantity;
                    offer.CurrentOfferQuantity  = 0.00M;
                    if (!offer.CounterOfferOriginatorOrganisationId.HasValue)
                    {
                        AppUser appUser = AppUserHelpers.GetAppUser(db, AppUserHelpers.GetAppUserIdFromUser(user));
                        offer.CounterOfferOriginatorAppUserId      = appUser.AppUserId;
                        offer.CounterOfferOriginatorDateTime       = DateTime.Now;
                        offer.CounterOfferOriginatorOrganisationId = appUser.OrganisationId;
                    }
                    else
                    {
                        offer.LastCounterOfferOriginatorAppUserId = AppUserHelpers.GetAppUserIdFromUser(user);
                        offer.LastCounterOfferOriginatorDateTime  = DateTime.Now;
                    }
                    offer.OfferStatus = offerStatus;

                    db.Entry(offer).State = EntityState.Modified;
                    db.SaveChanges();
                }
                break;
            }
            //Create Action
            Organisation org = OrganisationHelpers.GetOrganisation(db, AppUserHelpers.GetAppUser(db, AppUserHelpers.GetAppUserIdFromUser(user)).OrganisationId);

            NotificationHelpers.CreateNotification(db, NotificationTypeEnum.NewOfferReceived, "New offer received from " + org.OrganisationName, offer.OfferId, offer.ListingOriginatorAppUserId.Value, offer.ListingOriginatorOrganisationId.Value, user);

            return(offer);
        }
示例#8
0
        public static List <GroupViewModel> GetGroupsViewContainingOrg(ApplicationDbContext db, EntityStatusEnum memberStatus, IPrincipal user)
        {
            List <GroupViewModel> groupsViewContainingOrg = new List <GroupViewModel>();

            //get organisation from User
            Organisation organisation = OrganisationHelpers.GetOrganisation(db, AppUserHelpers.GetOrganisationIdFromUser(db, user));

            //get list of groups containing this organisation
            List <Group> groupsContainingOrg = GroupHelpers.GetGroupsContainingOrg(db, organisation.OrganisationId, memberStatus);

            //build view
            foreach (Group group in groupsContainingOrg)
            {
                //Build members view for this group (NOTE, this will not be added to for this list as this is just a list of groups we are part of, no need currently to show the members.
                List <GroupMemberViewModel> membersView = new List <GroupMemberViewModel>();  //If we do need to show the members then change this to "List<GroupMemberViewModel> membersView = GroupMembersViewHelpers.GetGroupMembersViewForGroup(db, group.GroupId);"

                //Build objects of guid details
                AppUser      recordChangedBy             = AppUserHelpers.GetAppUser(db, group.RecordChangeBy);
                AppUser      groupOriginatorAppUser      = AppUserHelpers.GetAppUser(db, group.GroupOriginatorAppUserId);
                Organisation groupOriginatorOrganisation = OrganisationHelpers.GetOrganisation(db, group.GroupOriginatorOrganisationId);

                //Build group view
                GroupViewModel groupView = new GroupViewModel()
                {
                    GroupId                     = group.GroupId,
                    Name                        = group.Name,
                    InviteLevel                 = group.InviteLevel,
                    VisibilityLevel             = group.VisibilityLevel,
                    AcceptanceLevel             = group.AcceptanceLevel,
                    EntityStatus                = group.EntityStatus,
                    RecordChange                = group.RecordChange,
                    RecordChangeOn              = group.RecordChangeOn,
                    RecordChangeBy              = recordChangedBy,
                    GroupOriginatorAppUser      = groupOriginatorAppUser,
                    GroupOriginatorOrganisation = groupOriginatorOrganisation,
                    GroupOriginatorDateTime     = group.GroupOriginatorDateTime,
                    GroupMembers                = membersView
                };

                groupsViewContainingOrg.Add(groupView);
            }

            return(groupsViewContainingOrg);
        }
示例#9
0
        public static List <GroupViewModel> GetGroupsViewCreatedByOrg(ApplicationDbContext db, IPrincipal user)
        {
            List <GroupViewModel> groupsViewCreatedByOrg = new List <GroupViewModel>();

            //get organisation from User
            Organisation organisation = OrganisationHelpers.GetOrganisation(db, AppUserHelpers.GetOrganisationIdFromUser(db, user));

            //get list of groups created by this organisation
            List <Group> groupsCreatedByOrg = GroupHelpers.GetGroupsCreatedByOrg(db, organisation.OrganisationId);

            //build view
            foreach (Group group in groupsCreatedByOrg)
            {
                //Build members view for this group
                List <GroupMemberViewModel> membersView = GroupMembersViewHelpers.GetGroupMembersViewForGroup(db, group.GroupId);

                //Build objects of guid details
                AppUser      recordChangedBy             = AppUserHelpers.GetAppUser(db, group.RecordChangeBy);
                AppUser      groupOriginatorAppUser      = AppUserHelpers.GetAppUser(db, group.GroupOriginatorAppUserId);
                Organisation groupOriginatorOrganisation = OrganisationHelpers.GetOrganisation(db, group.GroupOriginatorOrganisationId);

                //Build group view
                GroupViewModel groupView = new GroupViewModel()
                {
                    GroupId                     = group.GroupId,
                    Name                        = group.Name,
                    InviteLevel                 = group.InviteLevel,
                    VisibilityLevel             = group.VisibilityLevel,
                    AcceptanceLevel             = group.AcceptanceLevel,
                    EntityStatus                = group.EntityStatus,
                    RecordChange                = group.RecordChange,
                    RecordChangeOn              = group.RecordChangeOn,
                    RecordChangeBy              = recordChangedBy,
                    GroupOriginatorAppUser      = groupOriginatorAppUser,
                    GroupOriginatorOrganisation = groupOriginatorOrganisation,
                    GroupOriginatorDateTime     = group.GroupOriginatorDateTime,
                    GroupMembers                = membersView
                };

                groupsViewCreatedByOrg.Add(groupView);
            }

            return(groupsViewCreatedByOrg);
        }
示例#10
0
        public static SelectList OrganisationsListForGroupDropDown(ApplicationDbContext db, Guid groupId)
        {
            List <Organisation> allOrganisations = OrganisationHelpers.GetAllOrganisations(db);
            List <GroupMember>  members          = GroupMembersHelpers.GetGroupMembersForGroup(db, groupId);

            //remove the group orgs from the allOrganisation list
            foreach (GroupMember member in members)
            {
                Organisation org = OrganisationHelpers.GetOrganisation(db, member.OrganisationId);
                allOrganisations.Remove(org);
            }

            //Build custom selectable data to hold org name and address
            return(new SelectList(
                       allOrganisations.Select(
                           o => new
            {
                OrganisationId = o.OrganisationId,
                OrganisationDetails = o.OrganisationName + ": " + o.AddressLine1 + ", " + o.AddressTownCity
            }), "OrganisationId", "OrganisationDetails"));
        }
示例#11
0
        public static List <AvailableListing> FilterAvailableListingsByDistance(ApplicationDbContext db, List <AvailableListing> currentList, Guid organisationId, int maxDistanceFilter)
        {
            //get this organisation post code to match against those of the listed organisations
            Organisation thisOrganisation = OrganisationHelpers.GetOrganisation(db, organisationId);

            //hold list of organisationIds already checked - set to true if within range
            Dictionary <Guid, bool> listingOrgIds = new Dictionary <Guid, bool>();

            //hold new list from old
            List <AvailableListing> newList = new List <AvailableListing>();

            foreach (AvailableListing item in currentList)
            {
                //if we have checked this org before then just add or not depending on flag
                if (listingOrgIds.ContainsKey(item.ListingOriginatorOrganisationId))
                {
                    if (listingOrgIds[item.ListingOriginatorOrganisationId])
                    {
                        newList.Add(item);
                    }
                }
                else  //add the org to the dictionary with the flag set and add to new list if within range
                {
                    int distanceValue = DistanceHelpers.GetDistance(thisOrganisation.AddressPostcode, item.ListingOrganisationPostcode);
                    if (distanceValue <= maxDistanceFilter)
                    {
                        listingOrgIds.Add(item.ListingOriginatorOrganisationId, true);
                        newList.Add(item);
                    }
                    else
                    {
                        listingOrgIds.Add(item.ListingOriginatorOrganisationId, false);
                    }
                }
            }

            return(newList);
        }
        public static AvailableListing CreateListing(ApplicationDbContext db, AvailableListingManageCreateViewModel model, IPrincipal user)
        {
            AppUser      thisUser = AppUserHelpers.GetAppUser(db, user);
            Organisation thisOrg  = OrganisationHelpers.GetOrganisation(db, thisUser.OrganisationId);

            AvailableListing listing = new AvailableListing()
            {
                ListingId           = Guid.NewGuid(),
                ItemDescription     = model.ItemDescription,
                ItemCategory        = model.ItemCategory,
                ItemType            = model.ItemType,
                QuantityAvailable   = model.QuantityAvailable.Value,
                QuantityOutstanding = model.QuantityAvailable.Value,
                UoM                             = model.UoM,
                AvailableFrom                   = model.AvailableFrom,
                AvailableTo                     = model.AvailableTo,
                ItemCondition                   = model.ItemCondition,
                DisplayUntilDate                = model.DisplayUntilDate,
                SellByDate                      = model.SellByDate,
                UseByDate                       = model.UseByDate,
                DeliveryAvailable               = model.DeliveryAvailable,
                ListingStatus                   = ItemEnums.ItemRequiredListingStatusEnum.Open,
                ListingOrganisationPostcode     = thisOrg.AddressPostcode,
                RecordChange                    = GeneralEnums.RecordChangeEnum.NewRecord,
                RecordChangeBy                  = thisUser.AppUserId,
                RecordChangeOn                  = DateTime.Now,
                ListingOriginatorAppUserId      = thisUser.AppUserId,
                ListingOriginatorOrganisationId = thisOrg.OrganisationId,
                ListingOriginatorDateTime       = DateTime.Now
            };

            db.AvailableListings.Add(listing);
            db.SaveChanges();

            return(listing);
        }
示例#13
0
        //AppUser/Profile
        public static AppUserProfileView CreateAppUserProfileView(ApplicationDbContext db, Guid appUserId)
        {
            AppUser appUser = AppUserHelpers.GetAppUser(db, appUserId);

            if (appUser == null)
            {
                return(null);
            }

            AppUserProfileView view = new AppUserProfileView()
            {
                AppUserId              = appUser.AppUserId,
                FirstName              = appUser.FirstName,
                LastName               = appUser.LastName,
                EntityStatus           = appUser.EntityStatus,
                LoginEmail             = appUser.LoginEmail,
                PrivacyLevel           = appUser.PrivacyLevel,
                UserRole               = appUser.UserRole,
                SelectedOrganisationId = appUser.OrganisationId
            };

            if (appUser.OrganisationId != Guid.Empty)
            {
                Organisation org = OrganisationHelpers.GetOrganisation(db, appUser.OrganisationId);
                view.OrganisationName = org.OrganisationName;
                view.BusinessType     = org.BusinessType;
                view.AddressLine1     = org.AddressLine1;
                view.AddressLine2     = org.AddressLine2;
                view.AddressLine3     = org.AddressLine3;
                view.AddressTownCity  = org.AddressTownCity;
                view.AddressCounty    = org.AddressCounty;
                view.AddressPostcode  = org.AddressPostcode;
            }

            return(view);
        }
示例#14
0
        public static HomeDashboardView CreateHomeDashboardView(ApplicationDbContext db, IPrincipal user)
        {
            HomeDashboardView view = new HomeDashboardView();

            Organisation currentOrg = OrganisationHelpers.GetOrganisation(db, AppUserHelpers.GetOrganisationIdFromUser(db, user));
            DateTime     weekAgo    = DateTime.Now.AddDays(-7);
            DateTime     dayAgo     = DateTime.Now.AddDays(-1);

            List <Notification> openNotifications = NotificationHelpers.GetNotificationsForOrganisationFromUser(db, user, false);

            view.OpenNotifications         = openNotifications.Count;
            view.OpenNotificationsThisWeek = (from oN in openNotifications where oN.RecordChangeOn >= weekAgo select oN).Count();
            if (view.OpenNotificationsThisWeek == 0)
            {
                view.OpenNotificationsThisWeekPercent = 0;
            }
            else
            {
                view.OpenNotificationsThisWeekPercent = (Convert.ToDecimal(view.OpenNotificationsThisWeek) / Convert.ToDecimal(view.OpenNotifications)) * 100;
            }
            view.OpenNotificationsPastDay = (from oN in openNotifications where oN.RecordChangeOn >= dayAgo select oN).Count();
            if (view.OpenNotificationsPastDay == 0)
            {
                view.OpenNotificationsPastDayPercent = 0;
            }
            else
            {
                view.OpenNotificationsPastDayPercent = (Convert.ToDecimal(view.OpenNotificationsPastDay) / Convert.ToDecimal(view.OpenNotifications)) * 100;
            }

            List <UserTask> openUserTasks = UserTasksHelpers.GetUserTasksForOrganisationFromUser(db, user, false);

            view.OpenTasks         = openUserTasks.Count;
            view.OpenTasksThisWeek = (from oT in openUserTasks where oT.RecordChangeOn >= weekAgo select oT).Count();
            if (view.OpenTasksThisWeek == 0)
            {
                view.OpenTasksThisWeekPercent = 0;
            }
            else
            {
                view.OpenTasksThisWeekPercent = (Convert.ToDecimal(view.OpenTasksThisWeek) / Convert.ToDecimal(view.OpenTasks)) * 100;
            }
            view.OpenTasksPastDay = (from oT in openUserTasks where oT.RecordChangeOn >= dayAgo select oT).Count();
            if (view.OpenTasksPastDay == 0)
            {
                view.OpenTasksPastDayPercent = 0;
            }
            else
            {
                view.OpenTasksPastDayPercent = (Convert.ToDecimal(view.OpenTasksPastDay) / Convert.ToDecimal(view.OpenTasks)) * 100;
            }

            List <Offer> offersCreated = OfferHelpers.GetOpenOffersCreatedForOrganisation(db, currentOrg.OrganisationId);

            view.OffersCreatedOpen      = offersCreated.Count;
            view.OffersCreatedCountered = (from oC in offersCreated where oC.OfferStatus == OfferStatusEnum.Countered select oC).Count();
            if (view.OffersCreatedCountered == 0)
            {
                view.OffersCreatedCounteredPercent = 0;
            }
            else
            {
                view.OffersCreatedCounteredPercent = (Convert.ToDecimal(view.OffersCreatedCountered) / Convert.ToDecimal(view.OffersCreatedOpen)) * 100;
            }
            view.OffersCreatedReOffered = (from oC in offersCreated where oC.OfferStatus == OfferStatusEnum.Reoffer select oC).Count();
            if (view.OffersCreatedReOffered == 0)
            {
                view.OffersCreatedReOfferedPercent = 0;
            }
            else
            {
                view.OffersCreatedReOfferedPercent = (Convert.ToDecimal(view.OffersCreatedReOffered) / Convert.ToDecimal(view.OffersCreatedOpen)) * 100;
            }
            List <Offer> offersCreatedClosed = OfferHelpers.GetAllOffersCreatedClosedForWeekForOrganisation(db, currentOrg.OrganisationId);

            view.OffersCreatedAcceptedThisWeek    = (from oCC in offersCreatedClosed where oCC.OfferStatus == OfferStatusEnum.Accepted select oCC).Count();
            view.OffersCreatedRejectedThisWeek    = (from oCC in offersCreatedClosed where oCC.OfferStatus == OfferStatusEnum.Rejected select oCC).Count();
            view.OffersCreatedClosedThisWeek      = (from oCC in offersCreatedClosed where oCC.OfferStatus == OfferStatusEnum.ClosedNoStock select oCC).Count();
            view.OffersCreatedClosedTotalThisWeek = view.OffersCreatedAcceptedThisWeek + view.OffersCreatedRejectedThisWeek + view.OffersCreatedClosedThisWeek;
            if (view.OffersCreatedAcceptedThisWeek == 0)
            {
                view.OffersCreatedAcceptedThisWeekPercent = 0;
            }
            else
            {
                view.OffersCreatedAcceptedThisWeekPercent = (Convert.ToDecimal(view.OffersCreatedAcceptedThisWeek) / Convert.ToDecimal(view.OffersCreatedClosedTotalThisWeek)) * 100;
            }
            if (view.OffersCreatedRejectedThisWeek == 0)
            {
                view.OffersCreatedRejectedThisWeekPercent = 0;
            }
            else
            {
                view.OffersCreatedRejectedThisWeekPercent = (Convert.ToDecimal(view.OffersCreatedRejectedThisWeek) / Convert.ToDecimal(view.OffersCreatedClosedTotalThisWeek)) * 100;
            }
            if (view.OffersCreatedClosedThisWeek == 0)
            {
                view.OffersCreatedClosedThisWeekPercent = 0;
            }
            else
            {
                view.OffersCreatedClosedThisWeekPercent = (Convert.ToDecimal(view.OffersCreatedClosedThisWeek) / Convert.ToDecimal(view.OffersCreatedClosedTotalThisWeek)) * 100;
            }

            List <Offer> offersReceived = OfferHelpers.GetOpenOffersReceivedForOrganisation(db, currentOrg.OrganisationId);

            view.OffersReceivedOpen      = offersReceived.Count;
            view.OffersReceivedCountered = (from oR in offersReceived where oR.OfferStatus == OfferStatusEnum.Countered select oR).Count();
            if (view.OffersReceivedCountered == 0)
            {
                view.OffersReceivedCounteredPercent = 0;
            }
            else
            {
                view.OffersReceivedCounteredPercent = (Convert.ToDecimal(view.OffersReceivedCountered) / Convert.ToDecimal(view.OffersReceivedOpen)) * 100;
            }
            view.OffersReceivedReOffered = (from oR in offersReceived where oR.OfferStatus == OfferStatusEnum.Reoffer select oR).Count();
            if (view.OffersReceivedReOffered == 0)
            {
                view.OffersReceivedReOfferedPercent = 0;
            }
            else
            {
                view.OffersReceivedReOfferedPercent = (Convert.ToDecimal(view.OffersReceivedReOffered) / Convert.ToDecimal(view.OffersReceivedOpen)) * 100;
            }
            List <Offer> offersReceivedClosed = OfferHelpers.GetAllOffersReceivedClosedForWeekForOrganisation(db, currentOrg.OrganisationId);

            view.OffersReceivedAcceptedThisWeek    = (from oRC in offersReceived where oRC.OfferStatus == OfferStatusEnum.Accepted select oRC).Count();
            view.OffersReceivedRejectedThisWeek    = (from oRC in offersReceived where oRC.OfferStatus == OfferStatusEnum.Rejected select oRC).Count();
            view.OffersReceivedClosedThisWeek      = (from oRC in offersReceived where oRC.OfferStatus == OfferStatusEnum.ClosedNoStock select oRC).Count();
            view.OffersReceivedClosedTotalThisWeek = view.OffersReceivedAcceptedThisWeek + view.OffersReceivedRejectedThisWeek + view.OffersReceivedClosedThisWeek;
            if (view.OffersReceivedAcceptedThisWeek == 0)
            {
                view.OffersReceivedAcceptedThisWeekPercent = 0;
            }
            else
            {
                view.OffersReceivedAcceptedThisWeekPercent = (Convert.ToDecimal(view.OffersReceivedAcceptedThisWeek) / Convert.ToDecimal(view.OffersReceivedClosedTotalThisWeek)) * 100;
            }
            if (view.OffersReceivedRejectedThisWeek == 0)
            {
                view.OffersReceivedRejectedThisWeekPercent = 0;
            }
            else
            {
                view.OffersReceivedRejectedThisWeekPercent = (Convert.ToDecimal(view.OffersReceivedRejectedThisWeek) / Convert.ToDecimal(view.OffersReceivedClosedTotalThisWeek)) * 100;
            }
            if (view.OffersReceivedClosedThisWeek == 0)
            {
                view.OffersReceivedClosedThisWeekPercent = 0;
            }
            else
            {
                view.OffersReceivedClosedThisWeekPercent = (Convert.ToDecimal(view.OffersReceivedClosedThisWeek) / Convert.ToDecimal(view.OffersReceivedClosedTotalThisWeek)) * 100;
            }

            view.OrdersInOpen = OrderHelpers.GetOrdersInForOganisationCount(db, currentOrg.OrganisationId);
            List <Order> ordersIn = OrderHelpers.GetOrdersInForWeekForOrganisation(db, currentOrg.OrganisationId);

            view.OrdersInCollectedThisWeek = (from oI in ordersIn where oI.OrderInStatus == OrderInStatusEnum.Collected select oI).Count();
            view.OrdersInReceivedThisWeek  = (from oI in ordersIn where oI.OrderInStatus == OrderInStatusEnum.Received select oI).Count();
            view.OrdersInClosedThisWeek    = (from oI in ordersIn where oI.OrderInStatus == OrderInStatusEnum.Closed select oI).Count();
            int ordersInClosedCount = view.OrdersInCollectedThisWeek + view.OrdersInReceivedThisWeek + view.OrdersInClosedThisWeek;

            if (view.OrdersInCollectedThisWeek == 0)
            {
                view.OrdersInCollectedThisWeekPercent = 0;
            }
            else
            {
                view.OrdersInCollectedThisWeekPercent = (Convert.ToDecimal(view.OrdersInCollectedThisWeek) / Convert.ToDecimal(ordersInClosedCount)) * 100;
            }
            if (view.OrdersInReceivedThisWeek == 0)
            {
                view.OrdersInReceivedThisWeekPercent = 0;
            }
            else
            {
                view.OrdersInReceivedThisWeekPercent = (Convert.ToDecimal(view.OrdersInReceivedThisWeek) / Convert.ToDecimal(ordersInClosedCount)) * 100;
            }
            if (view.OrdersInClosedThisWeek == 0)
            {
                view.OrdersInClosedThisWeekPercent = 0;
            }
            else
            {
                view.OrdersInClosedThisWeekPercent = (Convert.ToDecimal(view.OrdersInClosedThisWeek) / Convert.ToDecimal(ordersInClosedCount)) * 100;
            }

            view.OrdersOutOpen = OrderHelpers.GetOrdersOutForOganisationCount(db, currentOrg.OrganisationId);
            List <Order> ordersOut = OrderHelpers.GetOrdersOutForWeekForOganisation(db, currentOrg.OrganisationId);

            view.OrdersOutDespatchedThisWeek = (from oO in ordersOut where oO.OrderOutStatus == OrderOutStatusEnum.Dispatched select oO).Count();
            view.OrdersOutDeliveredThisWeek  = (from oO in ordersOut where oO.OrderOutStatus == OrderOutStatusEnum.Delivered select oO).Count();
            view.OrdersOutClosedThisWeek     = (from oO in ordersOut where oO.OrderOutStatus == OrderOutStatusEnum.Closed select oO).Count();
            int ordersOutClosedCount = view.OrdersOutDespatchedThisWeek + view.OrdersOutDeliveredThisWeek + view.OrdersOutClosedThisWeek;

            if (view.OrdersOutDespatchedThisWeek == 0)
            {
                view.OrdersOutDespatchedThisWeekPercent = 0;
            }
            else
            {
                view.OrdersOutDespatchedThisWeekPercent = (Convert.ToDecimal(view.OrdersOutDespatchedThisWeek) / Convert.ToDecimal(ordersOutClosedCount)) * 100;
            }
            if (view.OrdersOutDeliveredThisWeek == 0)
            {
                view.OrdersOutDeliveredThisWeekPercent = 0;
            }
            else
            {
                view.OrdersOutDeliveredThisWeekPercent = (Convert.ToDecimal(view.OrdersOutDeliveredThisWeek) / Convert.ToDecimal(ordersOutClosedCount)) * 100;
            }
            if (view.OrdersOutClosedThisWeek == 0)
            {
                view.OrdersOutClosedThisWeekPercent = 0;
            }
            else
            {
                view.OrdersOutClosedThisWeekPercent = (Convert.ToDecimal(view.OrdersOutClosedThisWeek) / Convert.ToDecimal(ordersOutClosedCount)) * 100;
            }

            return(view);
        }
        public static AvailableListingDetailsViewModel CreateAvailableListingDetailsViewModel(ApplicationDbContext db, Guid listingId, string breadcrumb, bool displayOnly, HttpRequestBase request, string controllerValue, string actionValue, string callingActionDisplayName, Dictionary <int, string> breadcrumbDictionary, bool?recalled, IPrincipal user, int?maxDistance, double?maxAge)
        {
            AvailableListing listing = AvailableListingHelpers.GetAvailableListing(db, listingId);

            if (listing != null)
            {
                //Set up the calling fields
                if (!recalled.HasValue)
                {
                    GeneralHelpers.GetCallingDetailsFromRequest(request, controllerValue, actionValue, out controllerValue, out actionValue);
                }

                AppUser recordChangedBy          = AppUserHelpers.GetAppUser(db, listing.RecordChangeBy);
                AppUser listingOriginatorAppUser = AppUserHelpers.GetAppUser(db, listing.ListingOriginatorAppUserId);

                AvailableListingDetailsViewModel model = new AvailableListingDetailsViewModel()
                {
                    MaxDistance         = maxDistance,
                    MaxAge              = maxAge,
                    Breadcrumb          = breadcrumb,
                    DisplayOnly         = displayOnly,
                    ListingId           = listing.ListingId,
                    ItemDescription     = listing.ItemDescription,
                    ItemCategory        = listing.ItemCategory,
                    ItemType            = listing.ItemType,
                    QuantityAvailable   = listing.QuantityAvailable,
                    QuantityFulfilled   = listing.QuantityFulfilled,
                    QuantityOutstanding = listing.QuantityOutstanding,
                    UoM                           = listing.UoM,
                    AvailableFrom                 = listing.AvailableFrom,
                    AvailableTo                   = listing.AvailableTo,
                    ItemCondition                 = listing.ItemCondition,
                    DisplayUntilDate              = listing.DisplayUntilDate,
                    SellByDate                    = listing.SellByDate,
                    UseByDate                     = listing.UseByDate,
                    DeliveryAvailable             = listing.DeliveryAvailable,
                    ListingStatus                 = listing.ListingStatus,
                    ListingOrganisationPostcode   = listing.ListingOrganisationPostcode,
                    RecordChange                  = listing.RecordChange,
                    RecordChangeOn                = listing.RecordChangeOn,
                    RecordChangeByName            = recordChangedBy.FirstName + " " + recordChangedBy.LastName,
                    RecordChangeByEmail           = recordChangedBy.LoginEmail,
                    ListingOriginatorAppUserName  = listingOriginatorAppUser.FirstName + " " + listingOriginatorAppUser.LastName,
                    ListingOriginatorAppUserEmail = listingOriginatorAppUser.LoginEmail,
                    ListingOriginatorDateTime     = listing.ListingOriginatorDateTime,
                    CallingController             = controllerValue,
                    CallingAction                 = actionValue,
                    CallingActionDisplayName      = callingActionDisplayName,
                    BreadcrumbTrail               = breadcrumbDictionary
                };

                if (controllerValue == "GeneralInfo" && actionValue == "Available")
                {
                    //Get user info for the offer side of the display
                    AppUser      currentUser = AppUserHelpers.GetAppUser(db, user);
                    Organisation currentOrg  = OrganisationHelpers.GetOrganisation(db, currentUser.OrganisationId);

                    Offer offer = OfferHelpers.GetOfferForListingByUser(db, listing.ListingId, currentUser.AppUserId, currentOrg.OrganisationId, currentOrg.ListingPrivacyLevel);

                    if (offer == null)
                    {
                        model.OfferDescription = "Make an offer";
                    }
                    else
                    {
                        model.OfferDescription = "Current offer";
                        model.OfferId          = offer.OfferId;
                        model.OfferQty         = offer.CurrentOfferQuantity;
                        model.OfferCounterQty  = offer.CounterOfferQuantity;
                        model.OfferStatus      = offer.OfferStatus;
                    }
                }

                return(model);
            }
            else
            {
                return(null);
            }
        }
        public static AvailableListingGeneralViewListModel GetAvailableListingGeneralViewListModel(ApplicationDbContext db, IPrincipal user, int?maxDistance, double?maxAge)
        {
            List <AvailableListingGeneralViewModel> list = new List <AvailableListingGeneralViewModel>();

            //Get user so we can get the settings to initialise the search on the screen
            AppUser      currentUser = AppUserHelpers.GetAppUser(db, user);
            Organisation currentOrg  = OrganisationHelpers.GetOrganisation(db, currentUser.OrganisationId);

            //set the search criteria.  If nothing passed in then take the values from the settings.  If values past in then this is the dynamic changes made on the list screen and resubmitted
            int?   maxDistanceFilter = maxDistance ?? currentUser.MaxDistanceFilter ?? 1500;
            double?maxAgeFilter      = maxAge ?? currentUser.MaxAgeFilter ?? 9999;

            //Get the group Member IDs from groups that this user/organisation are part of, so we can remove them from the list
            List <Guid> groupMemberOrgIds = null;

            if (currentUser.SelectionLevelFilter == ExternalSearchLevelEnum.Group)
            {
                groupMemberOrgIds = GroupMembersHelpers.GetGroupsMembersOrgGuidsForGroupsFromOrg(db, currentOrg.OrganisationId);
            }

            //build the age filter to apply when building list
            double negativeDays = 0 - maxAgeFilter.Value;
            var    dateCheck    = DateTime.Now.AddDays(negativeDays);

            //build list depending on whether to filter on groups or not (settings, search level = groups)
            if (groupMemberOrgIds == null)
            {
                list = (from al in db.AvailableListings
                        join org in db.Organisations on al.ListingOriginatorOrganisationId equals org.OrganisationId
                        where (al.ListingOriginatorOrganisationId != currentUser.OrganisationId && (al.ListingStatus == ItemEnums.ItemRequiredListingStatusEnum.Open || al.ListingStatus == ItemEnums.ItemRequiredListingStatusEnum.Partial) &&
                               al.ListingOriginatorDateTime >= dateCheck)
                        select new AvailableListingGeneralViewModel()
                {
                    ListingId = al.ListingId,
                    ItemDescription = al.ItemDescription,
                    ItemType = al.ItemType,
                    QuantityOutstanding = al.QuantityOutstanding,
                    UoM = al.UoM,
                    AvailableTo = al.AvailableTo,
                    ItemCondition = al.ItemCondition,
                    ExpiryDate = al.SellByDate ?? al.UseByDate,
                    DeliveryAvailable = al.DeliveryAvailable,
                    SupplierDetails = org.OrganisationName,
                    ListingOriginatorOrganisationId = al.ListingOriginatorOrganisationId,
                    ListingOrganisationPostcode = al.ListingOrganisationPostcode
                }).Distinct().ToList();
            }
            else
            {
                list = (from al in db.AvailableListings
                        join org in db.Organisations on al.ListingOriginatorOrganisationId equals org.OrganisationId
                        join grpmem in groupMemberOrgIds on al.ListingOriginatorOrganisationId equals grpmem
                        where (al.ListingOriginatorOrganisationId != currentUser.OrganisationId && (al.ListingStatus == ItemEnums.ItemRequiredListingStatusEnum.Open || al.ListingStatus == ItemEnums.ItemRequiredListingStatusEnum.Partial) &&
                               al.ListingOriginatorDateTime >= dateCheck)
                        select new AvailableListingGeneralViewModel()
                {
                    ListingId = al.ListingId,
                    ItemDescription = al.ItemDescription,
                    ItemType = al.ItemType,
                    QuantityOutstanding = al.QuantityOutstanding,
                    UoM = al.UoM,
                    AvailableTo = al.AvailableTo,
                    ItemCondition = al.ItemCondition,
                    ExpiryDate = al.SellByDate ?? al.UseByDate,
                    DeliveryAvailable = al.DeliveryAvailable,
                    SupplierDetails = org.OrganisationName,
                    ListingOriginatorOrganisationId = al.ListingOriginatorOrganisationId,
                    ListingOrganisationPostcode = al.ListingOrganisationPostcode
                }).Distinct().ToList();
            }

            //Filter by DISTANCE and add OFFER info also.

            //hold list of organisationIds already checked - set to true if within range
            Dictionary <Guid, bool> listingOrgIds = new Dictionary <Guid, bool>();

            //hold new list from old
            List <AvailableListingGeneralViewModel> newList = new List <AvailableListingGeneralViewModel>();

            foreach (AvailableListingGeneralViewModel item in list)
            {
                //if we have checked this org before then just add or not depending on flag
                if (listingOrgIds.ContainsKey(item.ListingOriginatorOrganisationId))
                {
                    if (listingOrgIds[item.ListingOriginatorOrganisationId])
                    {
                        //quick check for offer
                        Offer offer = OfferHelpers.GetOfferForListingByUser(db, item.ListingId, currentUser.AppUserId, currentOrg.OrganisationId, currentOrg.ListingPrivacyLevel);

                        if (offer == null)
                        {
                            item.OfferQty = 0.00M;
                        }
                        else
                        {
                            item.OfferId  = offer.OfferId;
                            item.OfferQty = offer.CurrentOfferQuantity;
                        }

                        newList.Add(item);
                    }
                }
                else  //add the org to the dictionary with the flag set and add to new list if within range
                {
                    int distanceValue = DistanceHelpers.GetDistance(currentOrg.AddressPostcode, item.ListingOrganisationPostcode);
                    if (distanceValue <= maxDistanceFilter)
                    {
                        listingOrgIds.Add(item.ListingOriginatorOrganisationId, true);

                        //quick check for offer
                        Offer offer = OfferHelpers.GetOfferForListingByUser(db, item.ListingId, currentUser.AppUserId, currentOrg.OrganisationId, currentOrg.ListingPrivacyLevel);

                        if (offer == null)
                        {
                            item.OfferQty = 0.00M;
                        }
                        else
                        {
                            item.OfferId  = offer.OfferId;
                            item.OfferQty = offer.CurrentOfferQuantity;
                        }

                        newList.Add(item);
                    }
                    else
                    {
                        listingOrgIds.Add(item.ListingOriginatorOrganisationId, false);
                    }
                }
            }

            AvailableListingGeneralViewListModel model = new AvailableListingGeneralViewListModel()
            {
                MaxDistance    = maxDistanceFilter,
                MaxAge         = maxAgeFilter,
                EditableFields = newList.Any(x => x.OfferId == null),  //only set if there are no offers in the list
                Listing        = newList
            };

            return(model);
        }