public bool Assignable(Resident resident, Shift shift)
        {
            var shiftHours = shift.DateRange.Hours;
            var startConstraint = shift.EndTime.AddDays(-28).AddMinutes(1);
            var endConstraint = shift.StartTime.AddMinutes(-1);

            var assignedHours = resident.Shifts.Where(s => s.DateRange.Equals(new DateRange(startConstraint, endConstraint)))
                                               .Select(s => new DateRange(DateExtensions.Max(s.StartTime, startConstraint), DateExtensions.Min(s.EndTime, endConstraint)))
                                               .Sum(dr => dr.Hours);

            var resultingAverage = ((assignedHours + shiftHours) / 4m);
            return resultingAverage <= 80;
        }
        public void Assignable_AlreadyAssigned24_NotPGY1(ResidentYears residentYears)
        {
            //24HRShift
            var assignedShift = new Shift(DateTime.Today, TimeConstants.StartOfDay, TimeConstants.EndOfDay);
            var resident = new Resident { ResidentYear = residentYears };
            resident.Shifts.Add(assignedShift);
            Assert.AreEqual(24, assignedShift.DateRange.Hours);

            var unAssingableShift = new Shift(DateTime.Today.AddDays(1), TimeConstants.StartOfDay, TimeConstants.StartOfDay); //1 minute shift
            Assert.IsFalse(new ContinuousDutyHourConstraint().Assignable(resident, unAssingableShift));

            var assingableShift = new Shift(DateTime.Today.AddDays(1), TimeConstants.StartOfDay.AddMinutes(1), TimeConstants.StartOfDay.AddMinutes(1)); //1 minute shift non conitinous
            Assert.IsTrue(new ContinuousDutyHourConstraint().Assignable(resident, assingableShift));
        }
        public void Assignable_AlreadyAssigned16_PGY1()
        {
            //16HRShift
            var assignedShift = new Shift(DateTime.Today, TimeConstants.StartOfDay, TimeConstants.StartOfDay.AddHours(16).AddMinutes(-1));
            var resident = new Resident { ResidentYear = ResidentYears.PGY_1 };
            resident.Shifts.Add(assignedShift);
            Assert.AreEqual(16, assignedShift.DateRange.Hours);

            var unAssingableShift = new Shift(DateTime.Today, TimeConstants.StartOfDay.AddHours(16), TimeConstants.StartOfDay.AddHours(16)); //1 minute shift
            Assert.IsFalse(new ContinuousDutyHourConstraint().Assignable(resident, unAssingableShift));

            var assingableShift = new Shift(DateTime.Today, TimeConstants.StartOfDay.AddHours(16).AddMinutes(1), TimeConstants.StartOfDay.AddHours(16).AddMinutes(1)); //1 minute shift non conitinous
            Assert.IsTrue(new ContinuousDutyHourConstraint().Assignable(resident, assingableShift));
        }
        public void Assignable_ShiftWouldResultInMoreThan24_NotPGY1(ResidentYears residentYears)
        {
            //23.5HRShift
            var assignedShift = new Shift(DateTime.Today, TimeConstants.StartOfDay.AddMinutes(30), TimeConstants.EndOfDay);
            var resident = new Resident { ResidentYear = residentYears };
            resident.Shifts.Add(assignedShift);

            //31 minute shift
            var unAssingableShift = new Shift(DateTime.Today.AddDays(1), TimeConstants.StartOfDay, TimeConstants.StartOfDay.AddMinutes(30));
            Assert.IsFalse(new ContinuousDutyHourConstraint().Assignable(resident, unAssingableShift));

            //30 minute shift
            var assingableShift = new Shift(DateTime.Today.AddDays(1), TimeConstants.StartOfDay, TimeConstants.StartOfDay.AddMinutes(29));
            Assert.IsTrue(new ContinuousDutyHourConstraint().Assignable(resident, assingableShift));
        }
        public void Assignable_ShiftWouldResultInMoreThan16_PGY1()
        {
            //15.5HRShift
            var assignedShift = new Shift(DateTime.Today, TimeConstants.StartOfDay.AddMinutes(30), TimeConstants.StartOfDay.AddHours(16).AddMinutes(-1));
            var resident = new Resident { ResidentYear = ResidentYears.PGY_1 };
            resident.Shifts.Add(assignedShift);

            //31 minute shift
            var unAssingableShift = new Shift(DateTime.Today, TimeConstants.StartOfDay.AddHours(16), TimeConstants.StartOfDay.AddHours(16).AddMinutes(30));
            Assert.IsFalse(new ContinuousDutyHourConstraint().Assignable(resident, unAssingableShift));

            //30 minute shift
            var assingableShift = new Shift(DateTime.Today, TimeConstants.StartOfDay.AddHours(16), TimeConstants.StartOfDay.AddHours(16).AddMinutes(29));
            Assert.IsTrue(new ContinuousDutyHourConstraint().Assignable(resident, assingableShift));
        }
        public bool Assignable(Resident resident, Shift shift)
        {
            var maxHours = resident.MaxContinuousShiftHours;
            var shiftHours = shift.DateRange.Hours;
            if (shiftHours > maxHours) return false;

            var startConstraint = shift.EndTime.AddHours(-maxHours); // Period of 'maxHours' hours and 1 minute from end of shift
            var endConstraint = shift.StartTime.AddMinutes(-1);

            var assignedHours = resident.Shifts.Where(s => s.DateRange.Equals(new DateRange(startConstraint, endConstraint)))//shifts in 'maxHours' hour period
                                               .Select(s => new DateRange(DateExtensions.Max(s.StartTime, startConstraint), DateExtensions.Min(s.EndTime, endConstraint)))
                                               .Sum(dr => dr.Hours);

            return assignedHours + shiftHours <= maxHours;
        }
Пример #7
0
 public void Name()
 {
     var resident = new Resident { FirstName = "Bob", LastName = "Hemphill", ResidentYear = ResidentYears.PGY_1 };
       Assert.AreEqual("Hemphill, Bob(PGY_1)\n", resident.ToString());
 }
 public bool Assignable(Resident resident, Shift shift)
 {
     throw new System.NotImplementedException();
 }
 public bool Assignable(Resident resident, Shift shift)
 {
     var lastShift = resident.Shifts.OrderByDescending(s=>s.EndTime).FirstOrDefault();
     return lastShift == null ||
            (new DateRange(lastShift.EndTime.AddMinutes(1), shift.StartTime.AddMinutes(-1)).Hours //Actual time between last shift and this shift
            >= (lastShift.DateRange.Hours >= 24 ? 14 : 8)); // ACGME required time off between shifts depending on duration of last shift
 }