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; }
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 }