/// <summary>
        /// Create a new sickness absence
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public JsonResult Create(SicknessAbsenceViewModel data)
        {
            if (ModelState.IsValid)
            {
                using (var orgSession = OrgStore.OpenSession())
                {
                    var classification = orgSession.Query<SicknessClassification>().FirstOrDefault();
                    var subject = orgSession.Load<User>(data.UserId);
                    var reason = classification.GetReason(data.SicknessReasonId);
                    var sickness = new Sickness
                                       {
                                           Subject = subject.ToSimpleUser(),
                                           SicknessReason = SicknessReasonSimple.Create(reason),
                                           StartOfProcess = data.StartOfProcess,
                                           EndOfProcess = data.EndOfProcess,
                                           ConsolidatedCompletionDate = data.EndOfProcess ?? DateTime.Now,
                                           Title = data.Title,
                                           Summary = data.Summary,
                                           UserCreatedProcess = OrgUser.ToSimpleUser(),
                                           CurrentProcessOwner = OrgUser.ToSimpleUser(), //TODO: What if self created? Should be manager.
                                           Id = IlluminateDatabase.GenerateId<Sickness>()
                                       };

                    orgSession.Store(sickness);

                    //update the user state. 
                    if (sickness.StartOfProcess.Date <= DateTime.Today && sickness.ConsolidatedCompletionDate.Date  >= DateTime.Today)
                    {
                        subject.CurrentState = "onsick"; 
                    }

                    //get the workflow config
                    var config = SicknessWorkflowConfiguration.Generate(orgSession);
                    
                    //definition should already exist
                    //create a new default sickness workflow and assign it to the sickness
                    var workflow = new DefaultSicknessWorkflow(config);
                    sickness.Workflow = workflow;
                    //handle the created event of the sickness
                    sickness.HandleEvent(OrgStore,"Sickness", "Create", sickness);
                    orgSession.SaveChanges();

                    return JsonSuccess(sickness.ToTimelineItems(), "Sickness item created");
                }
            }
            return JsonError("Invalid data: " + ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1));
        }
        /// <summary>
        /// Update a sickness
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public JsonResult Update(SicknessAbsenceViewModel data)
        {

            //find task/process from the tasks. 
            using (var session = OrgStore.OpenSession())
            {
                var sickness = session.Load<Sickness>(data.Id);
                var classification = session.Query<SicknessClassification>().FirstOrDefault();
                var reason = classification.GetReason(data.SicknessReasonId);
                var subject = session.Load<User>(sickness.Subject.UserId);

                var originaldata =
                    new
                        {
                            start = sickness.StartOfProcess,
                            end = sickness.EndOfProcess,
                            consolidatedend = sickness.ConsolidatedCompletionDate
                        }; 


                //set values
                if (data.StartOfProcess != DateTime.MinValue)
                    sickness.StartOfProcess = data.StartOfProcess; 
                sickness.EndOfProcess = data.EndOfProcess;
                sickness.ConsolidatedCompletionDate = data.EndOfProcess ?? DateTime.Now;
                if ( data.EndOfProcess != null)
                {
                    
                    //handle the sickness complete event for this sickness
                    sickness.HandleEvent(OrgStore,"Sickness", "Complete", sickness);
                }
                if (sickness.EndOfProcess != null && data.EndOfProcess == null)
                {
                    
                    //handle the sickness reopen event for this sickness
                    sickness.HandleEvent(OrgStore, "Sickness", "Reopen", sickness);
                }

                if(reason!=null)
                    sickness.SicknessReason = SicknessReasonSimple.Create(reason);
                if (!string.IsNullOrEmpty(data.Title))
                    sickness.Title = data.Title;
                if (!string.IsNullOrEmpty(data.Summary))
                    sickness.Summary = data.Summary;

                //update the user state. 
                if (sickness.StartOfProcess.Date <= DateTime.Today && sickness.ConsolidatedCompletionDate.Date >= DateTime.Today)
                {
                    subject.CurrentState = "onsick";
                }
                if (data.EndOfProcess != null)
                {
                    subject.CurrentState = string.Empty;
                }

                session.SaveChanges();


                //TODO: what if new things created as part of the completion?
                return JsonSuccess(sickness.ToTimelineItems(), "Sickness Updated");
            }
        }