private void setPreviousWeekliesToFalse()
        {
            TutorMasterDBEntities4 db = new TutorMasterDBEntities4();                                         //connect to the database

            List <Commitment> cmtList = (from stucmt in db.StudentCommitments                                 //get the commit list of the signed in student
                                         where stucmt.ID == id
                                         join cmt in db.Commitments on stucmt.CmtID equals cmt.CmtID
                                         select cmt).ToList();

            List <DateTime> searchList = new List <DateTime>();                                                 //initialize search list

            SortsAndSearches.QuickSort(ref cmtList, cmtList.Count());

            searchList = getStartTimes();                                                                     //get the startTimes from the listview

            for (int i = 0; i < cmtList.Count(); i++)                                                         //for each commitment in the commit list
            {
                if (DateTimeMethods.weeklyAndFound(cmtList[i], searchList))                                   //if the commitment is in the search list and weekly
                {
                    DateTime startSemes = new DateTime(2017, 1, 1, 0, 0, 0);
                    DateTime weekBack   = Convert.ToDateTime(cmtList[i].StartTime).AddDays(-7);               //go a week back in time
                    while (DateTime.Compare(startSemes, weekBack) <= 0)                                       //perform a binary search here
                    {
                        bool found = false;
                        int  first = 0;
                        int  last  = cmtList.Count() - 1;
                        while (first <= last && !found)
                        {
                            int midpoint = (first + last) / 2;
                            if (DateTimeMethods.sameTime(cmtList[midpoint], weekBack))                        //if you find the weekBack date time
                            {
                                if (cmtList[midpoint].Open == true)                                           //if the commitment is open
                                {
                                    cmtList[midpoint].Weekly = false;                                         //set its weekly to false
                                    db.SaveChanges();                                                         //save the changes to the database
                                }
                                found = true;
                            }
                            else
                            {
                                if (DateTimeMethods.weekBackEarlier(weekBack, cmtList[midpoint]))                                    //if weekback is earlier, search first half of list
                                {
                                    last = midpoint - 1;
                                }
                                else                                                                          //else, search the second half of the list
                                {
                                    first = midpoint + 1;
                                }
                            }
                        }
                        weekBack = weekBack.AddDays(-7);                                                      //go a week back in time
                    }
                }
            }
        }
Esempio n. 2
0
        private void btnRequest_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(combCourseName.Text))                                                                         //check if anything necessary is null
            {
                MessageBox.Show("Please select a course for the session.");
            }
            else if (string.IsNullOrWhiteSpace(combHours.Text) || string.IsNullOrWhiteSpace(combMins.Text))
            {
                MessageBox.Show("Please input values for the hours and minutes dropdown boxes");
            }
            else if (((Convert.ToInt32(combHours.Text) * 4 + (Convert.ToInt32(combMins.Text) / 15)) == 0) ||                            //check that the appointment is between 15 minutes and 3 hours
                     ((Convert.ToInt32(combHours.Text) * 4 + (Convert.ToInt32(combMins.Text) / 15)) > 12))
            {
                MessageBox.Show("Please input values for the hours and minutes that are between a length of 15 minutes and 3 hours");
            }
            else
            {
                bool     weekly           = cbxWeekly.Checked;                                                                                 //get whether this is weekly
                DateTime start            = DateTime.Now;                                                                                      //set start to now
                TutorMasterDBEntities4 db = new TutorMasterDBEntities4();                                                                      //connect to database

                string classCode = (from row in db.Classes where combCourseName.Text == row.ClassName select row.ClassCode).First();           //get the class code

                var approvedTutorIds = (from row in db.StudentClasses.AsEnumerable() where classCode == row.ClassCode select row.ID).ToList(); //get all of the approved tutors
                if (approvedTutorIds.Count() == 0)
                {
                    MessageBox.Show("There are currently no tutors approved to tutor this course. Sorry.");
                }
                else
                {
                    List <Commitment> tuteeCommits = (from stucmt in db.StudentCommitments.AsEnumerable()                               //get the tutee commitments
                                                      where stucmt.ID == id
                                                      join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                                      select cmt).ToList();


                    int sessionLength = Convert.ToInt32(combHours.Text) * 4 + (Convert.ToInt32(combMins.Text) / 15);                   //get the number of 15 minute time blocks of the session

                    SortsAndSearches.QuickSort(ref tuteeCommits, tuteeCommits.Count());                                                //sort the tutee commit list

                    checkMax(ref tuteeCommits);                                                                                        //check if there are any 3 hour time blocks

                    removeNotOpens(ref tuteeCommits, start, weekly);                                                                   //remove the commitments that are not open

                    if (tuteeCommits.Count == 0)
                    {
                        MessageBox.Show("You currently have no available slots, please add some availability before attempting to schedule a session of this length");
                    }
                    else
                    {
                        List <string> tuteeValidSlots = getValidSlots(ref tuteeCommits, sessionLength);                                //get the tutee's valid time slots for the length of the session we're looking for

                        bool done = false;
                        for (int i = 0; i < approvedTutorIds.Count(); i++)                                                            //go through each tutor in the approved tutor list
                        {
                            if (approvedTutorIds[i] != id)                                                                            //don't let a tutor tutor him/herself
                            {
                                var tutorFirstName = (from row in db.Users.AsEnumerable() where row.ID == approvedTutorIds[i] select row.FirstName).First();
                                var tutorLastName  = (from row in db.Users.AsEnumerable() where row.ID == approvedTutorIds[i] select row.LastName).First();

                                List <TutorMaster.Commitment> tutorCommits = (from stucmt in db.StudentCommitments.AsEnumerable()     //get the tutor's commitments
                                                                              where stucmt.ID == approvedTutorIds[i]
                                                                              join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                                                              select cmt).ToList();

                                SortsAndSearches.QuickSort(ref tutorCommits, tutorCommits.Count());                                   //sort them

                                checkMax(ref tutorCommits);                                                                           //check for 3 tutoring blocks

                                removeNotOpens(ref tutorCommits, start, weekly);                                                      //remove the not opens

                                List <string> tutorValidSlots = getValidSlots(ref tutorCommits, sessionLength);                       //get the valid time slots for the tutors

                                for (int j = 0; j < tutorValidSlots.Count(); j++)                                                     //iterate through the valid tutor time slots
                                {
                                    if (SortsAndSearches.BinarySearch(tuteeValidSlots, tutorValidSlots[j]))                           //see if the tutorvalid slot is in the tutee list
                                    {                                                                                                 //if it is, ask the user if they'd this appointment
                                        DialogResult choice = MessageBox.Show("You have been matched with " + tutorFirstName + " " + tutorLastName +
                                                                              " for a time at: " + tutorValidSlots[j].Split(',')[0] + " - " + tutorValidSlots[j].Split(',')[1], "You've got a match!", MessageBoxButtons.YesNo);
                                        if (choice == DialogResult.Yes)                                                               //if they say yes, get their ids and add the commitments to their schedules
                                        {
                                            int tutorId = Convert.ToInt32(approvedTutorIds[i]);
                                            int tuteeId = Convert.ToInt32(id);
                                            addCommits(tutorValidSlots[j], tutorId, tuteeId, tutorCommits, tuteeCommits, classCode, db, weekly, sessionLength);
                                            done = true;
                                            break;
                                        }
                                        else if (choice == DialogResult.No)                                                           //if no, break out of this loop and repeat the same process with another approved tutor if there is one
                                        {
                                            break;
                                        }
                                    }
                                }
                                if (done)                                                                                             //if they picked this tutor and we're done, break out of this large for loop
                                {
                                    break;
                                }
                            }
                        }
                        if (!done)                                                                                                    //if we go through every tutor and do not pick one, put the message up
                        {
                            MessageBox.Show("There are no more tutors that meet your request requirements.");
                        }
                    }
                    StudentMain g = new StudentMain(id);                                                                              //return to student main
                    g.Show();
                    this.Dispose();
                }
            }
        }
        //Match Function and it's helpers
        private void MatchTimes(ComboBox TutBox, ComboBox ClsBox)
        {
            TutorMasterDBEntities4 db = new TutorMasterDBEntities4();

            lvAvailableTimes.Items.Clear();
            lvAvailableTimes.Hide();

            //a. Name of Tutor, use it to find their ID
            int TutID = tutorIDs[TutBox.SelectedIndex];

            //b. Length of tutoring session in minutes
            int length = Convert.ToInt32(combStartHour.Text) * 4 + (Convert.ToInt32(combStartMinute.Text) / 15);

            //c. whether it is weekly
            bool weekly = cbxWeekly.Checked;

            //d. tutee ID (ACCID), use to match the availiblity
            int TuteeID = ACCID;


            DateTime start = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);

            string classCode = (from row in db.Classes where row.ClassName == ClsBox.Text select row.ClassCode).First();

            List <Commitment> tuteeCommits = (from stucmt in db.StudentCommitments.AsEnumerable()    // create a list of tutee's commitments
                                              where stucmt.ID == TuteeID
                                              join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                              select cmt).ToList();

            SortsAndSearches.QuickSort(ref tuteeCommits, tuteeCommits.Count()); //sort the tutee commits so that they are in chronological order

            checkMax(ref tuteeCommits);

            removeNotOpens(ref tuteeCommits, start, weekly); //remove all the things that are not open

            if (tuteeCommits.Count == 0)                     //If the tuttee doesn't have any compatible availibility then give a pop up box to let them know
            {
                MessageBox.Show("You currently have no available slots, please add some availability before attempting to schedule a session of this length");
            }
            else
            {
                List <string> tuteeValidSlots = getValidSlots(ref tuteeCommits, length);                          //this is returning 0 for some reason

                List <TutorMaster.Commitment> tutorCommits = (from stucmt in db.StudentCommitments.AsEnumerable() //This creates a list of all the tutor commitments.
                                                              where stucmt.ID == TutID
                                                              join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                                              select cmt).ToList();

                SortsAndSearches.QuickSort(ref tutorCommits, tutorCommits.Count());      //sort it so we can use it
                checkMax(ref tutorCommits);
                removeNotOpens(ref tutorCommits, start, weekly);                         //remove the occupied commitments

                List <string> tutorValidSlots = getValidSlots(ref tutorCommits, length); //create a list of all the valid tutor slots

                int numMatches = 0;
                lvAvailableTimes.Show();
                for (int j = 0; j < tutorValidSlots.Count(); j++) //iterate through all the available tutor slots
                {
                    if (SortsAndSearches.BinarySearch(tuteeValidSlots, tutorValidSlots[j]))
                    {
                        //add all the slots to the tutor availibility timeslot
                        ListViewItem item = new ListViewItem(new string[] { tutorValidSlots[j].Split(',')[0], tutorValidSlots[j].Split(',')[1] });
                        lvAvailableTimes.Items.Add(item);//adds the time slot to the combo box

                        numMatches++;
                    }
                }

                if (numMatches == 0)
                {
                    MessageBox.Show("This Tutor has no matching availibility.");
                }
                btnSendRequest.Click += (sender, e) => btnSendRequest_Click(sender, e, tutorValidSlots, TutID, TuteeID, tutorCommits, tuteeCommits, classCode, db, weekly, length);
            }
        }
        private void btnSubmit_Click(object sender, EventArgs e)
        {
            if (lvTimeMatches.CheckedItems.Count == 0)
            {
                MessageBox.Show("Please pick one time slot for the appointment.");
            }
            else if (string.IsNullOrWhiteSpace(tbxLocation.Text.ToString()))
            {
                MessageBox.Show("Please input a location for this appointment.");
            }
            else
            {
                TutorMasterDBEntities4 db = new TutorMasterDBEntities4();

                List <Commitment> tuteeCommits = new List <Commitment>();
                List <Commitment> tutorCommits = new List <Commitment>();


                if (!tutoring)                                                                                                                                      //if this person is not a tutor
                {
                    tuteeCommits = (from stucmt in db.StudentCommitments.AsEnumerable()                                                                             //get the tutee commitment list
                                    where stucmt.ID == id
                                    join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                    select cmt).ToList();
                    SortsAndSearches.QuickSort(ref tuteeCommits, tuteeCommits.Count);                                                                               //sort the tutee commitment list

                    tutorCommits = (from stucmt in db.StudentCommitments.AsEnumerable()                                                                             //get and sort the tutor commitment list
                                    where stucmt.ID == rememberStudIDs[chosenStudentIndex]
                                    join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                    select cmt).ToList();

                    SortsAndSearches.QuickSort(ref tutorCommits, tutorCommits.Count);
                    string classCode = (from row in db.Classes.AsEnumerable() where row.ClassName == cbxClasses.Text.ToString() select row.ClassCode).First();          //get the classcode

                    string timeSlot      = lvTimeMatches.CheckedItems[0].SubItems[0].Text.ToString() + "," + lvTimeMatches.CheckedItems[0].SubItems[1].Text.ToString(); //time slot of the commitment
                    int    sessionLength = Convert.ToInt32(cbxHour.Text) * 4 + (Convert.ToInt32(cbxMinutes.Text) / 15);                                                 //number of 15 minute time blocks

                    addCommits(timeSlot, rememberStudIDs[chosenStudentIndex], id, tutorCommits, tuteeCommits, classCode, db, cbWeekly.Checked, sessionLength);          //add the commitment to the student's schedules
                }
                else
                {
                    tutorCommits = (from stucmt in db.StudentCommitments.AsEnumerable()                                                                             //get and sort the tutor commitments
                                    where stucmt.ID == id
                                    join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                    select cmt).ToList();
                    SortsAndSearches.QuickSort(ref tutorCommits, tutorCommits.Count);

                    tuteeCommits = (from stucmt in db.StudentCommitments.AsEnumerable()                                                                             //get and sort the tutee commitments
                                    where stucmt.ID == rememberStudIDs[chosenStudentIndex]
                                    join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                    select cmt).ToList();

                    SortsAndSearches.QuickSort(ref tuteeCommits, tuteeCommits.Count);
                    string classCode = (from row in db.Classes.AsEnumerable() where row.ClassName == cbxClasses.Text.ToString() select row.ClassCode).First();          //get the classcode

                    string timeSlot      = lvTimeMatches.CheckedItems[0].SubItems[0].Text.ToString() + "," + lvTimeMatches.CheckedItems[0].SubItems[1].Text.ToString(); //get the time slot that has been chosen
                    int    sessionLength = Convert.ToInt32(cbxHour.Text) * 4 + (Convert.ToInt32(cbxMinutes.Text) / 15);                                                 //get the number of 15 minute time blocks

                    addCommits(timeSlot, id, rememberStudIDs[chosenStudentIndex], tutorCommits, tuteeCommits, classCode, db, cbWeekly.Checked, sessionLength);          //add commitments to student's schedules
                }

                if (edit)
                {
                    MessageBox.Show("The appointment has been updated for both students and availability schedules have been adjusted approriately.");
                }
                else
                {
                    MessageBox.Show("The appointment has been set and finalized in both student's schedules.");
                }

                AdminSeeSchedule g = new AdminSeeSchedule(id);
                g.Show();
                this.Dispose();
            }
        }
        private void loadMatchingTimeSlots()
        {
            TutorMasterDBEntities4 db = new TutorMasterDBEntities4();
            bool weekly = cbWeekly.Checked;

            if (rememberStudIDs.Count == 0)                                                                                     //if there are no valid students, print this message
            {
                MessageBox.Show("There are currently no students available for this course");
            }
            else
            {
                DateTime start         = DateTime.Now;
                string   classCode     = (from row in db.Classes where cbxClasses.Text == row.ClassName select row.ClassCode).First(); //get the classcode
                int      sessionLength = Convert.ToInt32(cbxHour.Text) * 4 + (Convert.ToInt32(cbxMinutes.Text) / 15);                  //calculate session length from the hour and minute dropdowns

                if (sessionLength > 12 || sessionLength == 0)                                                                          //make sure the length is of the appropriate size
                {
                    MessageBox.Show("Please pick a session legnth between 15 minutes and 3 hours.");
                }
                else
                {
                    List <TutorMaster.Commitment> studentCommits = (from stucmt in db.StudentCommitments.AsEnumerable()
                                                                    where stucmt.ID == id
                                                                    join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                                                    select cmt).ToList();                                      //get all of the signed in student's commitments

                    SortsAndSearches.QuickSort(ref studentCommits, studentCommits.Count);                                      //sort them

                    removeNotOpens(ref studentCommits, start, weekly);                                                         //remove the not opens

                    if (studentCommits.Count == 0)                                                                             //if the student we are signed in on has no open slots, print this message
                    {
                        MessageBox.Show("The student you are trying to create an appointment for currently has no open time slots with which to make an appointment.");
                    }
                    else
                    {
                        List <string> studentValidSlots = getValidSlots(ref studentCommits, sessionLength);                    //get all the slots of the appropriate length
                        int           partnerId         = rememberStudIDs[cbxStudents.SelectedIndex];                          //get the chosen partner id

                        List <TutorMaster.Commitment> partnerCommits = (from stucmt in db.StudentCommitments.AsEnumerable()
                                                                        where stucmt.ID == partnerId
                                                                        join cmt in db.Commitments.AsEnumerable() on stucmt.CmtID equals cmt.CmtID
                                                                        select cmt).ToList();

                        SortsAndSearches.QuickSort(ref partnerCommits, partnerCommits.Count);                                 //sort the partner's commitments

                        removeNotOpens(ref partnerCommits, start, weekly);                                                    //remove the not opens

                        if (partnerCommits.Count == 0)                                                                        //make sure they have some open available time
                        {
                            MessageBox.Show("The chosen partner currently has no open time slots with which to make an appointment.");
                        }
                        else
                        {
                            List <string> tuteeValidSlots = getValidSlots(ref partnerCommits, sessionLength);                  //get every possible valid slot

                            for (int c = 0; c < studentValidSlots.Count(); c++)
                            {
                                if (SortsAndSearches.BinarySearch(tuteeValidSlots, studentValidSlots[c]))                    //look for overlaps and then add them to the listview
                                {
                                    lvTimeMatches.Items.Add(new ListViewItem(new string[] { studentValidSlots[c].Split(',')[0], studentValidSlots[c].Split(',')[1] }));
                                }
                            }
                        }
                    }
                }
            }
        }
 public static bool weeklyAndFound(Commitment commit, List <DateTime> searchList)
 {//this function checks if a commitment is weekly and found in the commitment list
     return(commit.Weekly == true && SortsAndSearches.BinarySearch(searchList, Convert.ToDateTime(commit.StartTime)));
 }
        private void deleteAvail(bool week)
        {
            TutorMasterDBEntities4 db = new TutorMasterDBEntities4();                                        //connect to the database

            List <Commitment> cmtList = (from stucmt in db.StudentCommitments                                //get the student's commitments
                                         where stucmt.ID == id
                                         join cmt in db.Commitments on stucmt.CmtID equals cmt.CmtID
                                         select cmt).ToList();

            SortsAndSearches.QuickSort(ref cmtList, cmtList.Count());                                                         //sort the list by DateTime

            List <DateTime> searchList = new List <DateTime>();

            searchList = getStartTimes();                                                                    //get the starttimes from the listview

            if (week)
            {
                for (int i = 0; i < cmtList.Count(); i++)
                {
                    if (SortsAndSearches.BinarySearch(searchList, Convert.ToDateTime(cmtList[i].StartTime)))
                    {
                        if (cmtList[i].Weekly == true)
                        {                                                                               //ask the user if they want to delete the weekly commitment through the end of the semester
                            DateTime endSemes    = new DateTime(2017, 5, 1, 0, 0, 0);                   //get end of semester
                            DateTime weekForward = Convert.ToDateTime(cmtList[i].StartTime).AddDays(7); //go a week forward
                            while (DateTimeMethods.endOfSemesIsLater(endSemes, weekForward))            //if the end of the semester is later than our commitment start Time
                            {                                                                           //run a binary search
                                bool found = false;
                                int  first = 0;
                                int  last  = cmtList.Count() - 1;
                                while (first <= last && !found)
                                {
                                    int midpoint = (first + last) / 2;
                                    if (DateTimeMethods.sameTime(cmtList[midpoint], weekForward))             //if commitment time and weekforward time are the same
                                    {
                                        if (cmtList[midpoint].Open == true)                                   //and if the midpoint commitment is open
                                        {
                                            db.Commitments.DeleteObject(cmtList[midpoint]);                   //delete the commitment from the database
                                            cmtList.Remove(cmtList[midpoint]);                                //remove it from the commit list as well
                                            db.SaveChanges();
                                        }
                                        found = true;                                                         //say we found what we were looking for
                                        break;                                                                //break out of the search
                                    }
                                    else
                                    {
                                        if (DateTimeMethods.forwardEarlierThanStart(weekForward, cmtList[midpoint]))
                                        {
                                            last = midpoint - 1;
                                        }
                                        else
                                        {
                                            first = midpoint + 1;
                                        }
                                    }
                                }
                                weekForward = weekForward.AddDays(7);
                            }
                        }

                        searchList.Remove(Convert.ToDateTime(cmtList[i].StartTime));
                        db.Commitments.DeleteObject(cmtList[i]);
                        i--;
                        db.SaveChanges();
                    }
                }
                MessageBox.Show("The checked 15 minute time blocks have been removed from your availability until the end of the semster.");
            }
            else
            {
                for (int i = 0; i < cmtList.Count(); i++)
                {
                    if (SortsAndSearches.BinarySearch(searchList, Convert.ToDateTime(cmtList[i].StartTime)))
                    {
                        searchList.Remove(Convert.ToDateTime(cmtList[i].StartTime));
                        db.Commitments.DeleteObject(cmtList[i]);
                        i--;
                        db.SaveChanges();
                    }
                }
                MessageBox.Show("Only the checked 15 minute time blocks have been removed from your availability.");
            }
        }