public void AdministerTreatment(int ID)
        {
            Schedule schedule = GetSchedules(ID).First();


            using (var context = new TreatmentEntities())
            {
                var result = context.schedule_DL.SingleOrDefault(s => s.id == ID);
                if (result != null)
                {
                    result.administered      = true;
                    result.administered_date = DateTime.Now;
                    context.SaveChanges();
                }
            }
        }
        public void DeleteSchedule(int id)
        {
            using (var context = new TreatmentEntities())
            {
                var forRemoving = context.schedule_DL.Find(id);
                if (forRemoving != null && forRemoving.administered == true)
                {
                    throw new InvalidOperationException("Cannot delete record when treatment has been administered");
                }

                if (forRemoving != null)
                {
                    context.schedule_DL.Remove(forRemoving);
                }
                context.SaveChanges();
            }
        }
 public List <Treatment> GetTreatments()
 {
     using (var context = new TreatmentEntities())
     {
         var query = context.treatment_DL.Select(r => new Treatment
         {
             Id             = r.id,
             Description    = r.treatment_description,
             Frequency      = (decimal)r.every_x_hours,
             MaxPerDay      = (int)r.max_per_day,
             StartTimeTicks = r.start_time * 10000000 ?? 0
         });
         var returnList = query.ToList();
         returnList.ForEach(t =>
                            t.StartTime = new TimeSpan(t.StartTimeTicks));
         return(returnList);
     }
 }
 public List <Schedule> GetSchedules(DateTime startDate, DateTime endDate)
 {
     using (var context = new TreatmentEntities())
     {
         var query = from r in context.schedule_DL
                     join t in context.treatment_DL
                     on r.treatment_id equals t.id
                     where r.administered_date >= startDate
                     select new Schedule
         {
             Id            = r.id,
             TreatmentTime = (DateTime)r.administered_date,
             TreatmentId   = (int)r.treatment_id,
             TreatmentName = (string)t.treatment_description,
             Administered  = (bool)r.administered
         };
         return(query.ToList());
     }
 }
        public void WriteSchedule()
        {
            List <Schedule> outputSchedule = new List <Schedule>();

            //required starting information.
            DateTime         now          = DateTime.Now;
            List <Treatment> treatment_DL = GetTreatments();

            //no reason to care. We can just rebuild.
            GetSchedules(now.AddDays(-7), now.AddDays(2))
            .Where(s => s.Administered == false)
            .ToList()
            .ForEach(s => DeleteSchedule(s.Id));

            //build out schedule for each treatment.
            foreach (Treatment t in treatment_DL)
            {
                //this is our starting cursor
                DateTime cursor = now;

                // if below minimum start time, let's bump it up to minimum start time.
                if (DateTime.Compare(cursor, DateTime.Now.Date.Add(t.StartTime)) < 0)
                {
                    cursor = DateTime.Now.Date.Add(t.StartTime);
                }

                // let's see when it was last given
                Schedule lastAdministeredNullable = GetSchedules(DateTime.Now.AddDays(-7), t.Description)
                                                    .Where(s => s.Administered == true)
                                                    .OrderByDescending(s => s.TreatmentTime)
                                                    .FirstOrDefault();


                DateTime lastAdministered = lastAdministeredNullable == null?DateTime.Now.AddDays(-8) : lastAdministeredNullable.TreatmentTime;

                // if administered too recently, bump it out appropriately
                if (DateTime.Compare(cursor, lastAdministered.AddMinutes((double)(t.Frequency * 60))) < 0)
                {
                    cursor = lastAdministered.AddMinutes((double)(t.Frequency * 60));
                }

                //how many treatment_DL have we done today?
                int completedtreatment_DL = GetSchedules(DateTime.Now.Date, t.Description)
                                            .Count(s => s.Administered == true);


                while (cursor < now.Date.AddHours(30) && completedtreatment_DL < t.MaxPerDay)
                {
                    outputSchedule.Add(new Schedule
                    {
                        Id            = -1,
                        TreatmentTime = cursor,
                        TreatmentId   = t.Id,
                        Administered  = false
                    });
                    cursor = cursor.AddMinutes(Convert.ToDouble(t.Frequency * 60));
                    completedtreatment_DL++;
                }
            }

            using (var context = new TreatmentEntities())
            {
                foreach (Schedule s in outputSchedule)
                {
                    context.schedule_DL.Add(new schedule_DL
                    {
                        administered      = s.Administered,
                        treatment_id      = s.TreatmentId,
                        administered_date = s.TreatmentTime
                    });
                }
                context.SaveChanges();
            }
        }