private void Prediction() { // Set sample size from (CurrentDate - 3 Months) to Current Date DateTime CurrentDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 0, 0, 0); int FirstDay = -90; DateTime SampleStartDate = DateUtil.AddDay(CurrentDate, FirstDay); //int i = 0; // Crop all dates by sample size; //foreach(ArrayList ar in AllDates) //{ // foreach (CalEvent ev in ar) // { // HoursArr[i] = ev.GetHoursBetweenStartAndEndTime(); // i++; // } //} // Set DateTime Array of 90 int timespan = (CurrentDate - SampleStartDate).Days; DateTime[] dates = new DateTime[timespan]; DayOccupied[] OccupDayArr = new DayOccupied[timespan]; // Initialise dates and OccupiedDay array; for (int j = 0; j < dates.Length; j++) { dates[j] = new DateTime(); dates[j] = DateUtil.AddDay(SampleStartDate, j); OccupDayArr[j] = new DayOccupied(); OccupDayArr[j].DateStart = dates[j]; } ArrayList AllDates = new ArrayList(); //int i = 0; int DateIndex; foreach (CalEvent e in EvList) { int Incrementer = 0; //ArrayList EventDates = e.GetDates(SampleStartDate, CurrentDate); //AllDates.Add(EventDates); ArrayList EventDateTimes = e.GetDates(); ArrayList EventDates = new ArrayList(); EventDates = CutTimes(EventDateTimes); DateTime SampleStartDateTemp = new DateTime(SampleStartDate.Year, SampleStartDate.Month, SampleStartDate.Day, 0, 0, 0); while (Incrementer < 90) { //MessageBox.Show(SampleStartDate.ToString()); if (EventDates.Contains(SampleStartDateTemp)) { DateIndex = EventDates.IndexOf(SampleStartDateTemp); //MessageBox.Show(EventDates[DateIndex].ToString()); OccupDayArr[Incrementer].SetInterval(e.GetStartDate(), e.GetEndDate()); Incrementer++; SampleStartDateTemp = SampleStartDateTemp.AddDays(1); } else { Incrementer++; SampleStartDateTemp = SampleStartDateTemp.AddDays(1); } } } //foreach (var e in OccupDayArr) //{ // MessageBox.Show(e.GetHoursUsed().ToString() + " : " + e.DateStart.ToString()); //} bool FirstMonthOccupied = false; // First month from the sample is current month - 3 months bool SecondMonthOccupied = false; bool ThirdMonthOccupied = false; for (int i = 0; i < 28; i++) { if (OccupDayArr[i].GetHoursUsed() != 0) { FirstMonthOccupied = true; break; } } for (int i = 29; i < 56; i++) { if (OccupDayArr[i].GetHoursUsed() != 0) { SecondMonthOccupied = true; break; } } for (int i = 57; i < 84; i++) { if (OccupDayArr[i].GetHoursUsed() != 0) { ThirdMonthOccupied = true; break; } } if (ThirdMonthOccupied && SecondMonthOccupied && FirstMonthOccupied) { Alert("Three months taken"); for (int i = 0; i < HoursArr.Length; i++) { HoursArr[i] = OccupDayArr[i].GetHoursUsed() + OccupDayArr[i + 28].GetHoursUsed() // 28 is after 4 weeks + OccupDayArr[i + 56].GetHoursUsed(); HoursArr[i] = HoursArr[i] / 3; //MessageBox.Show(HoursArr[i].ToString() + " : " + i.ToString() + "\n" // + OccupDayArr[i].GetHoursUsed() + " : " + OccupDayArr[i].DateStart.ToString() + "\n" // + OccupDayArr[i + 29].GetHoursUsed() + " : " + OccupDayArr[i + 29].DateStart.ToString() + "\n" // + OccupDayArr[i + 59].GetHoursUsed() + " : " + OccupDayArr[i + 59].DateStart.ToString()); Points[i] = new ObservablePoint(i, HoursArr[i]); //this.Refresh(); } } else if (ThirdMonthOccupied && SecondMonthOccupied) { Alert("One two months taken"); for (int i = 0; i < HoursArr.Length; i++) { HoursArr[i] = OccupDayArr[i + 28].GetHoursUsed() // 28 is after 4 weeks + OccupDayArr[i + 56].GetHoursUsed(); HoursArr[i] = HoursArr[i] / 2; //MessageBox.Show(HoursArr[i].ToString() + " : " + i.ToString() + "\n" // + OccupDayArr[i].GetHoursUsed() + " : " + OccupDayArr[i].DateStart.ToString() + "\n" // + OccupDayArr[i + 29].GetHoursUsed() + " : " + OccupDayArr[i + 29].DateStart.ToString() + "\n" // + OccupDayArr[i + 59].GetHoursUsed() + " : " + OccupDayArr[i + 59].DateStart.ToString()); Points[i] = new ObservablePoint(i, HoursArr[i]); //this.Refresh(); } } else if (ThirdMonthOccupied) { Alert("One month taken"); for (int i = 0; i < HoursArr.Length; i++) { HoursArr[i] = OccupDayArr[i + 56].GetHoursUsed(); //MessageBox.Show(HoursArr[i].ToString() + " : " + i.ToString() + "\n" // + OccupDayArr[i].GetHoursUsed() + " : " + OccupDayArr[i].DateStart.ToString() + "\n" // + OccupDayArr[i + 29].GetHoursUsed() + " : " + OccupDayArr[i + 29].DateStart.ToString() + "\n" // + OccupDayArr[i + 59].GetHoursUsed() + " : " + OccupDayArr[i + 59].DateStart.ToString()); Points[i] = new ObservablePoint(i, HoursArr[i]); //this.Refresh(); } } else { for (int i = 0; i < Points.Length; i++) { Points[i] = new ObservablePoint(i, 0); Alert("No data."); } } //MessageBox.Show("Finished"); }
/* * take start date * see if the start date belongs * if it belongs add to the list * increment start date by 1 day * * how to know if it belongs: * getweekday -> compare it to all values of recurring array * */ public void CalcRecurringDates() { //Console.WriteLine("loop1"); DateTime tempDate = new DateTime(dateStart.Year, dateStart.Month, dateStart.Day, dateStart.Hour, dateStart.Minute, dateStart.Second); bool foundAll = false; // || recurringType[0] != "Weekly")) ; if (!recurring && (Object.Equals(recurringType, default(string[])))) { while (!foundAll) { recurringDates.Add(tempDate); tempDate = DateUtil.AddDay(tempDate); if (DateUtil.DatesEqual(tempDate.AddDays(-1), dateEnd)) { foundAll = true; } } } while (!foundAll) // what if start and end dates are reversed or equal? //what if selected weekly and daily and mondays for ex? { if (recurringType.Contains("Weekly")) { recurringDates.Add(tempDate); tempDate = DateUtil.AddDay(tempDate, 7); //Console.WriteLine("loop2"); } else if (((recurringType.Length > 1) && recurringType[1].ToString().Contains("Daily")) || !recurring) { recurringDates.Add(tempDate); tempDate = DateUtil.AddDay(tempDate); //Console.WriteLine("loop3"); } //else if (Array.Exists(recurringType, element => element == tempDate.DayOfWeek.ToString())) else if (recurringType.Contains(tempDate.DayOfWeek.ToString())) { DateTime recurringDay = new DateTime(tempDate.Year, tempDate.Month, tempDate.Day); recurringDates.Add(recurringDay); tempDate = DateUtil.AddDay(tempDate); if (DateUtil.DatesEqual(tempDate.AddDays(-1), dateEnd)) { foundAll = true; break; } } else { tempDate = DateUtil.AddDay(tempDate); } if (tempDate >= dateEnd) { foundAll = true; break; } } }