public void TestInitialise()
        {
            //ARRANGE
            var p = new Sickness.Sickness(); 
            //ACT

            //ASSERT
            
        }
        /// <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));
        }
 public List<Sickness> GetTestSicknesses(User user, int number)
 {
     var Sicknesses = new List<Sickness>();
     for (int i = 1; i <= number; i++)
     {
         var date = DateTime.Now.AddMonths(0 - i);
         var Sickness = new Sickness();
         string SicknessNumber = i.ToString();
         Sickness.Id = IlluminateDatabase.GenerateId<Sickness>();
         Sickness.Subject = new SimpleUser();
         Sickness.Subject.UserId = user.Id;
         Sickness.Subject.FullName = user.FirstName + " " + user.LastName;
         Sickness.StartOfProcess = date;
         Sickness.EndOfProcess = date.AddDays(1);
         Sicknesses.Add(Sickness);
     }
     return Sicknesses;
 }
        private void CreateTestSickness(IDocumentStore store)
        {

            using (var session = store.OpenSession())
            {
                //for user 1 generate sickness with same reason that should cause inference
                var startDate = DateTime.Today.AddDays(0 - _typeConfig.PeriodDays).AddDays(1);
                var sicknessReason1 = GetTestSicknessReason1();
                for (var count = 0; count < _typeConfig.NumberInPeriod + 1; count++)
                {
                    var sickness = new Sickness
                    {
                     StartOfProcess  = startDate,
                     SicknessReason = sicknessReason1,
                        Id = IlluminateDatabase.GenerateId<Sickness>(),
                        Subject = _user1.ToSimpleUser()
                    };
                    session.Store(sickness);
                    startDate = startDate.AddDays(1);
                }
                startDate = DateTime.Today.AddDays(0 - _typeConfig.PeriodDays).AddDays(1);

                //for user 2 add sickness but all with different reasons
                for (var count = 0; count < _typeConfig.NumberInPeriod - 1; count++)
                {
                    var sickness = new Sickness
                    {
                        StartOfProcess = startDate,
                        SicknessReason = new SicknessReasonSimple { FullName = IlluminateDatabase.GenerateId<SicknessReasonSimple>(), Id = IlluminateDatabase.GenerateId<SicknessReasonSimple>() },
                        Id = IlluminateDatabase.GenerateId<Sickness>(),
                        Subject = _user1.ToSimpleUser()
                    };
                    session.Store(sickness);
                    startDate = startDate.AddDays(1);
                }

                session.SaveChanges();
            }
        }
        private Sickness GenerateASickness(bool isCurrent,IUser user,Random rand)
        {
            
            var sicknessReason = _sicknessClassification.GetRandomReason(rand);
            var manager = user.Relationships.FirstOrDefault(r => r.RelationshipName == "LineManager");
            if (manager == null)
            {
                return null;
            }
            var sickness = new Sickness
                               {
                                   CurrentProcessOwner = manager,
                                   Id = IlluminateDatabase.GenerateId<Sickness>(),
                                   SicknessReason = SicknessReasonSimple.Create(sicknessReason),
                                   Subject = user.ToSimpleUser(),
                                   UserCreatedProcess = manager,
                                   Title = sicknessReason.FullName,
                                   Summary = sicknessReason.Description


                               };
            var now = DateTime.UtcNow.Date;
            if (isCurrent)
            {
                sickness.StartOfProcess = RandomDate(rand, now.AddDays(0 - _config.SicknessConfig.MaxDurationDays), now);
                sickness.ConsolidatedCompletionDate = now;
            }
            else
            {
                var startDate = RandomDate(rand, now.AddDays(0 - _config.DaysHistory), now);
                var endDate = startDate.AddDays(rand.Next(1, _config.SicknessConfig.MaxDurationDays));
                if (endDate >= now)
                    endDate = now.AddDays(-1);
                sickness.ConsolidatedCompletionDate = endDate;
                sickness.EndOfProcess = endDate;
                sickness.StartOfProcess = startDate;
            }
            
            return sickness;
        }
        public override void Import(Stream stream)
        {
            ErrorLines.Clear();

            var reader = new StreamReader(stream);
            string line;
            //ignore first line(s). 
            for (var i = 0; i < IgnoreLines; i++)
            {
                reader.ReadLine();
            }

            //parse each line
            var re =
                new Regex(
                    @"^(?<personnelnumber>[^\t]+)\t(?<startdate>[^\t]+)\t(?<enddate>[^\t]+)\t(?<code>[^\t]+)\t(?<description>[^\t]+)$");
                //TODO: more sophisticated regex for dates etc. 



            while ((line = reader.ReadLine()) != null)
            {
                var match = re.Match(line);
                if (match.Success)
                {
                    using (var Session = Store.OpenSession())
                    {
                        var personnelnumber = match.Groups["personnelnumber"].Captures[0].Value;
                        var user = Session.Query<User>().FirstOrDefault(u => u.PersonnelNumber == personnelnumber);
                        if (user == null)
                        {
                            ErrorLines.Add(line);
                            continue;
                        }

                        var reasoncode = match.Groups["code"].Captures[0].Value;
                        var reason = Session.Query<SicknessReason>().FirstOrDefault(r => r.Code == reasoncode);



                        if (reason == null)
                        {
                            //get default reason
                            reason =
                                Session.Query<SicknessReason>().FirstOrDefault(r => r.Code == "DEFAULT");
                            if (reason == null)
                            {
                                //!!
                                reason = new SicknessReason
                                             {
                                                 Code = "DEFAULT",
                                                 Description = "Default Sickness",
                                                 FullName = "Default Sickness",
                                                 Name = "Default Sickness"
                                             };
                                Session.Store(reason);
                            }
                        }


                        //save sickness
                        var s = new Sickness
                                    {
                                        Id = IlluminateDatabase.GenerateId<Sickness>(),
                                        Subject = user.ToSimpleUser(),
                                        StartOfProcess = DateTime.Parse(match.Groups["startdate"].Captures[0].Value),
                                        EndOfProcess = DateTime.Parse(match.Groups["enddate"].Captures[0].Value),
                                        ConsolidatedCompletionDate =
                                            DateTime.Parse(match.Groups["enddate"].Captures[0].Value),
                                        Title = "Sickness",
                                        Summary = match.Groups["description"].Captures[0].Value,
                                        SicknessReason = SicknessReasonSimple.Create(reason),

                                    };

                        Session.Store(s);


                        //should we save if there were errors?
                        Session.SaveChanges();
                    }
                }
                else
                {
                    ErrorLines.Add(line);
                }

                


            }
        }
 // need to create some sicknesses for each user
 public List<Sickness> GetTestSicknesses(User user, int number)
 {
     var Sicknesses = new List<Sickness>();
     for (int i = 1; i <= number; i++)
     {
         var Sickness = new Sickness();
         string SicknessNumber = i.ToString();
         Sickness.Id = user.FirstName + SicknessNumber;
         Sickness.Subject = new SimpleUser();
         Sickness.Subject.UserId = user.Id;
         Sickness.Subject.FullName = user.FirstName +" "+ user.LastName;
         Sicknesses.Add(Sickness);
     }
     return Sicknesses;
 }
 public void SicknessCostTest2()
 {
     var sickness1 = new Sickness();
     sickness1.StartOfProcess = new DateTime(2013, 1, 1);
     sickness1.EndOfProcess = new DateTime(2013, 9, 10);
     var store = CreateTestDatabase();
     using (var session = store.OpenSession())
     {
         session.Store(sickness1);
         session.SaveChanges();
     }
     var result = Sickness.GetSicknessCosts(store);
     //out of 31 days in january, 8 are on the weekend and 1 is a bank holiday. 28 days in feb, 8 weekend, no bank holidays, 15 working days in March
     var sicknessCosts = new int[12, 2] { { 1, 22 }, { 2, 20 }, { 3, 20 }, { 4, 21 }, { 5, 21 }, { 6, 20 }, { 7, 23 }, { 8, 21 }, { 9, 8 }, { 10, 0 }, { 11, 0 }, { 12, 0 }, };
     //sicknessCosts[0, 1] += 22;// business days in jan (1 bank holiday)
     //sicknessCosts[1, 1] += 20;//business days in feb
     //sicknessCosts[2, 1] += 20;// business days in march (1 bank holiday)
     //sicknessCosts[3, 1] += 21;// business days in april (1 bank holiday)// 21 work days in aug// 23 in july// 20 in june// 20 in may
     int number = 0;
     for (int i = 0; i < 12; i++)
     {
         number += sicknessCosts[i, 0] - result[i, 0];
         number += sicknessCosts[i, 1] - result[i, 1];
     }
     Assert.AreEqual(number, 0);
     var sickness2 = new Sickness();
     sickness2.StartOfProcess = new DateTime(2012, 12, 31);
     sickness2.EndOfProcess = new DateTime(2013, 1, 5);// should be two days, one in dec, one in jan
     using (var session = store.OpenSession())
     {
         session.Store(sickness2);
         session.SaveChanges();
     }
     sicknessCosts[11, 1] += 1;
     sicknessCosts[0, 1] += 3;
     //sicknessCosts[0, 1] += 1;- argh, does it ending on 2nd mean back to work on 2nd or 3rd?
     var result2 = Sickness.GetSicknessCosts(store);
     number = 0;
     for (int i = 0; i < 12; i++)
     {
         number += sicknessCosts[i, 0] - result2[i, 0];
         number += sicknessCosts[i, 1] - result2[i, 1];
     }
     Assert.AreEqual(number, 0);
     var sickness3 = new Sickness();
     sickness3.StartOfProcess = new DateTime(2012, 11, 11);// end of process being null means this one will only work today.
     sickness3.EndOfProcess = new DateTime(2013, 05, 11);// 1 day in december, 23 in jan, 20 feb, 18 in march, 20 in april, 8 in may
     using (var session = store.OpenSession())
     {
         session.Store(sickness3);
         session.SaveChanges();
     }
     sicknessCosts[0, 1] += 22;// business days in jan (1 bank holiday)
     sicknessCosts[1, 1] += 20;//business days in feb
     sicknessCosts[2, 1] += 20;// business days in march (1 bank holiday)
     sicknessCosts[3, 1] += 21;// business days in april (1 bank holiday)
     sicknessCosts[4, 1] += 7;
     sicknessCosts[11, 1] += 21;// last year bank holidays not included...
     sicknessCosts[10, 1] += 15;
     var result3 = Sickness.GetSicknessCosts(store);
     number = 0;
     for (int i = 0; i < 12; i++)
     {
         number += sicknessCosts[i, 0] - result3[i, 0];
         number += sicknessCosts[i, 1] - result3[i, 1];
     }
     Assert.AreEqual(number, 0);
 }