private async void LoadingModel(object sender, DoWorkEventArgs e) { try { using (me = new MedicalModel(ConfigurationManager.Connect())) { await me.Database.Connection.OpenAsync(); SurgeryTimeM.UserRegistrateDate = me.accountdata.Where(a => a.IdAD == GlobalVM.GlobalM.AccountID).Single().RegistrateTimeAD; for (int i = 1; i <= 7; i++) { usersschedule item = me.usersschedule.Where(u => u.UserDataIdUS == GlobalVM.GlobalM.UserID && u.DayOfWeekUS == i).OrderByDescending(u => u.WhenCreateUS).FirstOrDefault(); if (item != null) { SurgeryTimeM.GetType().GetProperty(DayOfWeek(item.DayOfWeekUS)).SetValue(SurgeryTimeM, true); SurgeryTimeM.GetType().GetProperty("Start" + DayOfWeek(item.DayOfWeekUS)).SetValue(SurgeryTimeM, item.StartTimeUS); SurgeryTimeM.GetType().GetProperty("Finish" + DayOfWeek(item.DayOfWeekUS)).SetValue(SurgeryTimeM, item.FinishTimeUS); SetActual(i, item.StartTimeUS, item.FinishTimeUS); } } foreach (SurgeryTimeM.Exception item in me.exceptedschedule.Where(ex => ex.UserDataIdES == GlobalVM.GlobalM.UserID).ToList(). Select(ex => new SurgeryTimeM.Exception() { DBId = ex.IdES, Included = ex.IncludedES, StartDateTime = ex.StartDateES, FinishDateTime = ex.FinishDateED, Valid = true })) { SurgeryTimeM.Exceptions.Add(item); } CollectionChange(); } workingConn = true; } catch (Exception ex) { Log.WriteException(ex); workingConn = false; } }
protected internal async Task <ObservableCollection <ChartM.Record> > WorkingHours() { return(await Task.Run(async() => { try { List <ChartM.Record> collection = new List <ChartM.Record>(); using (me = new MedicalModel(ConfigurationManager.Connect())) { await me.Database.Connection.OpenAsync(); List <object> users = Members.Count == 0 ? users = me.userdata.Select(u => new { u.IdUD, u.NameUD, me.accountdata.Where(a => a.IdAD == u.AccountDataIdUD).FirstOrDefault().RegistrateTimeAD }).ToList <object>() : me.userdata.Where(u => Members.Any(m => m == u.IdUD)).Select(u => new { u.IdUD, u.NameUD, me.accountdata.Where(a => a.IdAD == u.AccountDataIdUD).FirstOrDefault().RegistrateTimeAD }).ToList <object>(); List <DateTime> days = new List <DateTime>(); foreach (object user in users) { int userId = (int)user.GetType().GetProperty("IdUD").GetValue(user); List <usersschedule> schedule = me.usersschedule.Where(us => us.UserDataIdUS == userId).OrderBy(us => us.WhenCreateUS).ToList(); if (schedule.Count != 0) { DateTime regDate = ((DateTime)user.GetType().GetProperty("RegistrateTimeAD").GetValue(user)).Date; DateTime LocalStart = StartTime == null ? Correction(true, regDate).Date : Correction(true, (DateTime)StartTime).Date; DateTime LocalFinish = FinishTime == null ? (StartTime != null ? Correction(false, (DateTime)StartTime).Date : Correction(false, DateTime.Now).Date) : Correction(false, (DateTime)FinishTime).Date; while (LocalStart.Date < LocalFinish.Date) { int hours = 0; int day = 0; while (day < EndStep(LocalStart) && LocalStart.AddDays(day).Date < ((FinishTime == null) ? DateTime.Now.Date : LocalFinish.Date)) { usersschedule actualDay = schedule.Where(s => s.WhenCreateUS <= LocalStart.AddDays(day) && s.DayOfWeekUS == DayOfWeek(LocalStart.AddDays(day))).OrderByDescending(s => s.WhenCreateUS).FirstOrDefault(); if (actualDay != null) { if (regDate.Date > LocalStart.AddDays(day).Date) { if (DayOfWeek(regDate) == actualDay.DayOfWeekUS) { hours += (actualDay.FinishTimeUS).Hour - (actualDay.StartTimeUS).Hour; } } else { hours += (actualDay.FinishTimeUS).Hour - (actualDay.StartTimeUS).Hour; } } day++; } collection.Add(new ChartM.Record() { Id = users.IndexOf(user), Name = user.GetType().GetProperty("NameUD").GetValue(user) as string, Date = LocalStart, Value1 = hours }); LocalStart = NextStep(LocalStart); } LocalStart = StartTime == null ? Correction(true, regDate) : Correction(true, (DateTime)StartTime); foreach (exceptedschedule es in me.exceptedschedule.Where(ex => ex.UserDataIdES == userId && ex.StartDateES <LocalFinish && ex.FinishDateED> LocalStart).OrderBy(ex => ex.IncludedES).ToList()) { usersschedule tempUser = schedule.Where(sc => sc.DayOfWeekUS == DayOfWeek(es.StartDateES) && (sc.WhenCreateUS <= es.StartDateES || sc.WhenCreateUS <= es.FinishDateED)).OrderByDescending(sc => sc.WhenCreateUS).FirstOrDefault(); int extendedHours = 0; int currentHours; if (!es.IncludedES) { if (tempUser != null) { days.Add(es.StartDateES); if (es.StartDateES.Date == es.FinishDateED.Date && LocalStart.Date <= es.StartDateES.Date && LocalFinish.Date > es.StartDateES.Date) { extendedHours = (es.StartDateES.Hour <= tempUser.StartTimeUS.Hour ? tempUser.FinishTimeUS.Hour - tempUser.StartTimeUS.Hour : (tempUser.FinishTimeUS.Hour - tempUser.StartTimeUS.Hour) - (es.StartDateES.Hour - tempUser.StartTimeUS.Hour)) + es.FinishDateED.Hour - tempUser.FinishTimeUS.Hour; currentHours = collection.OrderByDescending(t => t.Date).FirstOrDefault(t => t.Date.Date <= es.StartDateES.Date && t.Id == users.IndexOf(user)).Value1; collection.OrderByDescending(t => t.Date).FirstOrDefault(t => t.Date.Date <= es.StartDateES.Date && t.Id == users.IndexOf(user)).Value1 = currentHours >= extendedHours ? currentHours - extendedHours : 0; } else { if (es.StartDateES.Date < LocalStart.Date) { es.StartDateES = LocalStart; es.StartDateES.AddHours(-es.StartDateES.Hour); } bool finishCorrection = false; if (es.FinishDateED.Date > LocalFinish.Date) { finishCorrection = true; es.FinishDateED = LocalFinish; es.FinishDateED.AddHours(-es.FinishDateED.Hour); } days.Add(es.FinishDateED); extendedHours += es.StartDateES.Hour <= tempUser.StartTimeUS.Hour ? tempUser.FinishTimeUS.Hour - tempUser.StartTimeUS.Hour : (tempUser.FinishTimeUS.Hour - tempUser.StartTimeUS.Hour) - (es.StartDateES.Hour - tempUser.StartTimeUS.Hour); if (Step == 0 || Step == 1) { currentHours = collection.OrderByDescending(t => t.Date).FirstOrDefault(t => Compare(t.Date, es.StartDateES) && t.Id == users.IndexOf(user)).Value1; collection.OrderByDescending(t => t.Date).FirstOrDefault(t => Compare(t.Date, es.StartDateES) && t.Id == users.IndexOf(user)).Value1 = currentHours >= extendedHours ? currentHours - extendedHours : 0; extendedHours = 0; } for (DateTime start = es.StartDateES.AddDays(1); start.Date < es.FinishDateED.Date; start = start.AddDays(1)) { days.Add(start); tempUser = null; tempUser = schedule.Where(sc => sc.DayOfWeekUS == DayOfWeek(start) && sc.WhenCreateUS <= start). OrderByDescending(sc => sc.WhenCreateUS).FirstOrDefault(); if (tempUser != null) { extendedHours += (tempUser.FinishTimeUS.Hour - tempUser.StartTimeUS.Hour); } if (CycleEnd(start)) { currentHours = collection.OrderByDescending(t => t.Date).FirstOrDefault(t => Compare(t.Date, start) && t.Id == users.IndexOf(user)).Value1; collection.OrderByDescending(t => t.Date).FirstOrDefault(t => Compare(t.Date, start) && t.Id == users.IndexOf(user)).Value1 = currentHours >= extendedHours ? currentHours - extendedHours : 0; extendedHours = 0; } } tempUser = null; tempUser = schedule.Where(sc => sc.DayOfWeekUS == DayOfWeek(es.FinishDateED) && sc.WhenCreateUS <= es.FinishDateED). OrderByDescending(sc => sc.WhenCreateUS).FirstOrDefault(); if (tempUser != null) { extendedHours += finishCorrection == true ? tempUser.FinishTimeUS.Hour - tempUser.StartTimeUS.Hour : (es.FinishDateED.Hour >= tempUser.FinishTimeUS.Hour ? tempUser.FinishTimeUS.Hour - tempUser.StartTimeUS.Hour : (es.FinishDateED.Hour <= tempUser.StartTimeUS.Hour ? 0 : tempUser.FinishTimeUS.Hour - tempUser.StartTimeUS.Hour)); } currentHours = collection.OrderByDescending(t => t.Date).FirstOrDefault(t => Compare(t.Date, es.FinishDateED) && t.Id == users.IndexOf(user)).Value1; collection.OrderByDescending(t => t.Date).FirstOrDefault(t => Compare(t.Date, es.FinishDateED) && t.Id == users.IndexOf(user)).Value1 = currentHours >= extendedHours ? currentHours - extendedHours : 0; } } } else //if (es.Included) { if (!days.Any(d => d.Date == es.StartDateES.Date) && tempUser != null) { extendedHours = ((es.StartDateES.Hour >= tempUser.StartTimeUS.Hour ? 0 : tempUser.StartTimeUS.Hour - es.StartDateES.Hour) + (es.FinishDateED.Hour <= tempUser.FinishTimeUS.Hour ? 0 : es.FinishDateED.Hour - tempUser.FinishTimeUS.Hour)); } else { extendedHours = es.FinishDateED.Hour - es.StartDateES.Hour; } collection.Where(t => t.Date.Date <= es.StartDateES.Date).OrderByDescending(t => t.Date).FirstOrDefault().Value1 += extendedHours; } } } } } workingConn = true; return new ObservableCollection <ChartM.Record>(collection); } catch (Exception ex) { Log.WriteException(ex); workingConn = false; return null; } }, CancellationToken.None).ContinueWith(task => { if (!workingConn) { Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => ConnectionMessage())); } else { return task.Result; } return null; })); }