Bladeren bron

EmployeePlanner improvements and employee planner and teams fixes

Kenric Nugteren 1 jaar geleden
bovenliggende
commit
67a0288598

+ 5 - 5
prs.desktop/Components/Calendar/Calendar.xaml.cs

@@ -843,7 +843,7 @@ namespace PRSDesktop
         public EmployeeRosterItem GetRoster(Guid employeeid, DateTime date)
         {
             var employee = _employees.FirstOrDefault(x => x.ID == employeeid);
-            var roster = RosterUtils.GetRoster(employee?.Roster, employee?.Start, date);
+            var roster = RosterUtils.GetRoster(employee?.Roster, employee?.RosterStart, date);
             return roster;
         }
 
@@ -883,7 +883,7 @@ namespace PRSDesktop
                 var employee = _employees.FirstOrDefault(x => x.ID == employeeid);
                 if (employee != null)
                 {
-                    var roster = RosterUtils.GetRoster(employee.Roster, employee.Start, date);
+                    var roster = RosterUtils.GetRoster(employee.Roster, employee.RosterStart, date);
                     if (roster != null)
                     {
                         var blocks = roster.GetBlocks(date, TimeSpan.MinValue, TimeSpan.MaxValue);
@@ -971,7 +971,7 @@ namespace PRSDesktop
                     if ((BackgroundType == CalendarBackgroundType.Roster) ||
                         ((BackgroundType == CalendarBackgroundType.Automatic) && (date >= DateTime.Today)))
                     {
-                        var roster = RosterUtils.GetRoster(employee?.Roster, employee?.Start, date);
+                        var roster = RosterUtils.GetRoster(employee?.Roster, employee?.RosterStart, date);
                         if (roster != null)
                         {
                             var blocks = roster.GetBlocks(date, TimeSpan.FromSeconds(0), TimeSpan.FromDays(1));
@@ -1046,7 +1046,7 @@ namespace PRSDesktop
                         var start = (date.Date == leave.From.Date) ? leave.FromTime : TimeSpan.FromSeconds(0);
                         var finish = (date.Date == leave.To.Date) ? leave.ToTime : TimeSpan.FromDays(1).Subtract(TimeSpan.FromSeconds(1));
 
-                        var roster = RosterUtils.GetRoster(employee?.Roster, employee?.Start, date);
+                        var roster = RosterUtils.GetRoster(employee?.Roster, employee?.RosterStart, date);
                         if (roster != null)
                         {
                             var blocks = roster.GetBlocks(date, start, finish);
@@ -1082,7 +1082,7 @@ namespace PRSDesktop
                 {
                     var employee = _employees.FirstOrDefault(x => x.ID == leave.EmployeeID);
                     
-                    var roster = RosterUtils.GetRoster(employee?.Roster, employee?.Start, date);
+                    var roster = RosterUtils.GetRoster(employee?.Roster, employee?.RosterStart, date);
                     if (roster != null)
                     {
                         var start = (date.Date == leave.From.Date) ? leave.FromTime : TimeSpan.FromSeconds(0);

+ 2 - 2
prs.desktop/Components/Calendar/Models/EmployeeResourceModel.cs

@@ -8,13 +8,13 @@ namespace PRSDesktop
     {
         public String? Name { get; }
         public EmployeeRosterItem[]? Roster { get; }
-        public DateTime Start { get; }
+        public DateTime RosterStart { get; }
 
         public EmployeeResourceModel(CoreRow row, EmployeeRosterItem[] roster) : base(row)
         {
             Name = Get(c => c.Name);
             Roster = roster;
-            Start = Get(c => c.RosterStart);            
+            RosterStart = Get(c => c.RosterStart);            
         }
 
         public override Columns<Employee> GetColumns()

+ 2 - 0
prs.desktop/Grids/EmployeeTeamGrid.cs

@@ -18,6 +18,8 @@ namespace PRSDesktop
         public EmployeeTeamGrid()
         {
             ColumnsTag = "EmployeeTeams";
+
+            HiddenColumns.Add(x => x.TeamLink.ID);
         }
 
         protected override void DoReconfigure(FluentList<DynamicGridOption> options)

+ 15 - 10
prs.desktop/Panels/EmployeePlanner/EmployeeResourcePlanner.xaml

@@ -207,28 +207,33 @@
  
             
             <local:EmployeeSelector x:Name="EmployeeSelector" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" SettingsChanged="_employees_OnSettingsChanged" SelectionChanged="_employees_OnSelectionChanged"/>
+            
+            <Label Content="View" Grid.Row="1" Margin="0,5,0,0" VerticalContentAlignment="Center" />
+            <ComboBox x:Name="ViewType" Grid.Row="1" Grid.Column="1" Margin="5,5,0,0" 
+                      SelectionChanged="ViewType_OnSelectionChanged" VerticalContentAlignment="Center">
+            </ComboBox>
 
-            <Label Content="From" Grid.Row="1" Margin="0,5,0,0" VerticalContentAlignment="Center" />
-            <Syncfusion:DateTimeEdit x:Name="FromDate" DateTimeChanged="DateTimeChanged" Grid.Row="1" Grid.Column="1"
+            <Label Content="From" Grid.Row="2" Margin="0,5,0,0" VerticalContentAlignment="Center" />
+            <Syncfusion:DateTimeEdit x:Name="FromDate" DateTimeChanged="DateTimeChanged" Grid.Row="2" Grid.Column="1"
                                      Pattern="CustomPattern" CustomPattern="dd MMMM yy" Margin="5,5,0,0" />
             
-            <Label Content="To" Grid.Row="2" Margin="0,5,0,0"  VerticalContentAlignment="Center" />
-            <Syncfusion:DateTimeEdit x:Name="ToDate" DateTimeChanged="DateTimeChanged"  Grid.Row="2" Grid.Column="1"
+            <Label Content="To" Grid.Row="3" Margin="0,5,0,0"  VerticalContentAlignment="Center" />
+            <Syncfusion:DateTimeEdit x:Name="ToDate" DateTimeChanged="DateTimeChanged"  Grid.Row="3" Grid.Column="1"
                                      Pattern="CustomPattern" CustomPattern="dd MMMM yy" Margin="5,5,0,0" />  
 
-            <Button Content="Jobs" Grid.Row="3" Margin="5,5,0,0"  VerticalContentAlignment="Center" Click="JobFilterButton_Click" />
-            <ComboBox x:Name="JobFilter" Grid.Row="3" Grid.Column="1" Margin="5,5,0,0" 
+            <Button Content="Jobs" Grid.Row="4" Margin="5,5,0,0"  VerticalContentAlignment="Center" Click="JobFilterButton_Click" />
+            <ComboBox x:Name="JobFilter" Grid.Row="4" Grid.Column="1" Margin="5,5,0,0" 
                       SelectionChanged="JobFilter_OnSelectionChanged" VerticalContentAlignment="Center"
                       DisplayMemberPath="Name" />
             
-            <Label Content="Leave" Grid.Row="4" Margin="0,5,0,0" VerticalContentAlignment="Center" />
-            <ComboBox x:Name="LeaveType" Grid.Row="4" Grid.Column="1" Margin="5,5,0,0" SelectionChanged="LeaveType_OnSelectionChanged" VerticalContentAlignment="Center">
+            <Label Content="Leave" Grid.Row="5" Margin="0,5,0,0" VerticalContentAlignment="Center" />
+            <ComboBox x:Name="LeaveType" Grid.Row="5" Grid.Column="1" Margin="5,5,0,0" SelectionChanged="LeaveType_OnSelectionChanged" VerticalContentAlignment="Center">
                 <ComboBoxItem Content="Approved Only" />
                 <ComboBoxItem Content="Show All" />
             </ComboBox>
             
-            <Label Content="Activity" Grid.Row="5" Margin="0,5,0,0" VerticalContentAlignment="Center" />
-            <ComboBox x:Name="ActivityType" Grid.Row="5" Grid.Column="1" Margin="5,5,0,0" 
+            <Label Content="Activity" Grid.Row="6" Margin="0,5,0,0" VerticalContentAlignment="Center" />
+            <ComboBox x:Name="ActivityType" Grid.Row="6" Grid.Column="1" Margin="5,5,0,0" 
                       SelectionChanged="ActivityType_OnSelectionChanged" VerticalContentAlignment="Center"
                       SelectedValuePath="ID" DisplayMemberPath="Name">
             </ComboBox>

+ 89 - 35
prs.desktop/Panels/EmployeePlanner/EmployeeResourcePlanner.xaml.cs

@@ -138,6 +138,12 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
             EmployeeSelector.Settings = Properties.EmployeeSettings;
             EmployeeSelector.Selection = Properties.EmployeeSelection;
 
+            ViewType.ItemsSource = Enum.GetValues<EmployeeResourcePlannerViewType>()
+                .Select(x => new KeyValuePair<EmployeeResourcePlannerViewType, string>(x, x.ToString()));
+            ViewType.SelectedValuePath = "Key";
+            ViewType.DisplayMemberPath = "Value";
+            ViewType.SelectedValue = Properties.ViewType;
+
             LeaveType.SelectedIndex = Properties.IncludeUnApprovedLeave ? 1 : 0;
 
             FromDate.DateTime = DateTime.Today;
@@ -186,6 +192,15 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
     {
     }
 
+    private TimeSpan GetPeriod()
+    {
+        return Properties.ViewType switch
+        {
+            EmployeeResourcePlannerViewType.Week => TimeSpan.FromDays(7),
+            EmployeeResourcePlannerViewType.Day or _ => TimeSpan.FromDays(1)
+        };
+    }
+
     public void Refresh()
     {
         using (new WaitCursor())
@@ -197,11 +212,18 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
             DateTime todate = ToDate.DateTime.HasValue ? ToDate.DateTime.Value.Date : DateTime.Today.AddYears(1);
 
             MultiQuery query = new MultiQuery();
+
+            var period = GetPeriod();
+            if(Properties.ViewType == EmployeeResourcePlannerViewType.Week)
+            {
+                fromdate = fromdate.AddDays(-(((int)fromdate.DayOfWeek - 1) % 7));
+                todate = todate.AddDays(-(((int)todate.DayOfWeek - 1) % 7));
+            }
             
             query.Add<Assignment>(
                 new Filter<Assignment>(x => x.EmployeeLink.ID).InList(empids)
                     .And(x => x.Date).IsGreaterThanOrEqualTo(fromdate)
-                    .And(x => x.Date).IsLessThanOrEqualTo(todate),
+                    .And(x => x.Date).IsLessThanOrEqualTo(todate + period),
                 AssignmentModel.Columns,
                 new SortOrder<Assignment>(x => x.EmployeeLink.ID).ThenBy(x => x.Date).ThenBy(x => x.Booked.Duration, SortDirection.Descending)
             );
@@ -212,6 +234,13 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
             var assignments = query.Get<Assignment>().Rows.Select(r => new AssignmentModel(r)).ToArray();
 
             var data = new DataTable();
+
+            var standardHours = Properties.ViewType switch
+            {
+                EmployeeResourcePlannerViewType.Week => 38.0,
+                EmployeeResourcePlannerViewType.Day or _ => 7.5
+            };
+
             if(Settings.DisplayMode == EmployeePlannerDisplayMode.EmployeeColumns)
             {
                 data.Columns.Add("Date", typeof(DateTime));
@@ -221,7 +250,7 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
                     data.Columns.Add(employee.ID.ToString(), typeof(object));
                 }
 
-                for (var curdate = fromdate; curdate <= todate; curdate = curdate.AddDays(1))
+                for (var curdate = fromdate; curdate <= todate; curdate += period)
                 {
                     var leavevalue = GetStandardLeave(curdate, _standardleaves);
                     var values = new List<object> { curdate };
@@ -229,10 +258,10 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
                     {
                         var value = new EmployeeResourcePlannerValue();
                         // Note use of short-circuiting here.
-                        var bOK = CheckAssignments(employee, curdate, assignments, value)
-                            || CheckRoster(employee, curdate, value)
+                        var bOK = CheckAssignments(employee, curdate, curdate + period, assignments, value)
                             || CheckStandardLeave(leavevalue, value)
-                            || CheckLeaveRequest(employee, curdate, _leaverequests, value);
+                            || CheckLeaveRequest(employee, curdate, curdate + period, _leaverequests, value)
+                            || CheckRoster(employee, curdate, curdate + period, standardHours, value);
 
                         values.Add(value);
                     }
@@ -245,7 +274,7 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
                 data.Columns.Add("Employee", typeof(object));
 
                 var dates = new List<DateTime>();
-                for (var curdate = fromdate; curdate <= todate; curdate = curdate.AddDays(1))
+                for (var curdate = fromdate; curdate <= todate; curdate += period)
                 {
                     data.Columns.Add(dates.Count.ToString(), typeof(object));
                     dates.Add(curdate);
@@ -255,14 +284,14 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
                 foreach (var employee in _employees)
                 {
                     var values = new List<object> { employee };
-                    for (var curdate = fromdate; curdate <= todate; curdate = curdate.AddDays(1))
+                    for (var curdate = fromdate; curdate <= todate; curdate += period)
                     {
                         var leavevalue = GetStandardLeave(curdate, _standardleaves);
                         var value = new EmployeeResourcePlannerValue();
-                        var bOK = CheckAssignments(employee, curdate, assignments, value);
-                        bOK = bOK || CheckRoster(employee, curdate, value);
-                        bOK = bOK || CheckStandardLeave(leavevalue, value);
-                        bOK = bOK || CheckLeaveRequest(employee, curdate, _leaverequests, value);
+                        var bOK = CheckAssignments(employee, curdate, curdate + period, assignments, value)
+                            || CheckStandardLeave(leavevalue, value)
+                            || CheckLeaveRequest(employee, curdate, curdate + period, _leaverequests, value)
+                            || CheckRoster(employee, curdate, curdate + period, standardHours, value);
 
                         values.Add(value);
                     }
@@ -276,16 +305,16 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
         }
     }
     
-    private static bool CheckAssignments(EmployeeResourceModel employee, DateTime curdate, AssignmentModel[] assignments, EmployeeResourcePlannerValue value)
+    private static bool CheckAssignments(EmployeeResourceModel employee, DateTime from, DateTime to, AssignmentModel[] assignments, EmployeeResourcePlannerValue value)
     {
-        var dateAssignments = assignments.Where(x => (x.EmployeeID == employee.ID) && (x.Date == curdate.Date)).ToArray();
+        var dateAssignments = assignments.Where(x => (x.EmployeeID == employee.ID) && (x.Date >= from.Date && x.Date < to.Date)).ToArray();
         if (dateAssignments.Length == 0)
             return false;
 
         value.IDs = assignments.Select(x => x.ID).ToArray();
         value.Text = dateAssignments.Length == 1
             ? (dateAssignments[0].ID != Guid.Empty ? (dateAssignments[0].JobNumber ?? "") : "XX")
-            : $"{dateAssignments.Length} jobs";
+            : $"{dateAssignments.Select(x => x.JobID).Distinct().Count()} jobs";
         value.Assignments = dateAssignments;
 
         value.Color = Colors.LightGreen.ToString();
@@ -293,24 +322,38 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
         return true;
     }
 
-    private static bool CheckRoster(EmployeeResourceModel employee, DateTime curdate, EmployeeResourcePlannerValue value)
+    private static bool CheckRoster(EmployeeResourceModel employee, DateTime from, DateTime to, double standardHours, EmployeeResourcePlannerValue value)
     {
         value.Text = "";
-        var roster = RosterUtils.GetRoster(employee.Roster, employee.Start, curdate);
 
-        var color1 = Colors.LightGray;
-        var color2 = Colors.LightGray;
-        if (roster?.Enabled == true)
+        var totalRostered = 0.0;
+
+        for(var date = from; date < to; date = date.AddDays(1))
         {
-            color1 = Colors.LightYellow;
-            if (roster.Duration >= 5.0F)
-                color2 = Colors.LightYellow;
+            var roster = RosterUtils.GetRoster(employee.Roster, employee.RosterStart, date);
+            if(roster?.Enabled == true)
+            {
+                totalRostered += roster.Duration;
+            }
         }
 
-        value.Foreground = new SolidColorBrush(ImageUtils.GetForegroundColor(ImageUtils.MixColors(color1, 0.5, color2))) { Opacity = 0.8 };
-        value.Background = new LinearGradientBrush(color1,color2,90.0F) { Opacity = 0.8 };
+        var color1 = Colors.LightGray;
+        var color2 = Colors.LightYellow;
+
+        var percent = Math.Min(totalRostered / standardHours, 1.0);
+
+        value.Foreground = new SolidColorBrush(ImageUtils.MixColors(color1, 1 - percent, color2)) { Opacity = 0.8 };
 
-        return roster?.Enabled == false;
+        var brush = new LinearGradientBrush { Opacity = 0.8 };
+        brush.StartPoint = new Point(0,0);
+        brush.GradientStops.Add(new GradientStop(Colors.LightYellow, 0.0));
+        brush.GradientStops.Add(new GradientStop(ImageUtils.MixColors(Colors.LightYellow, percent, Colors.LightGray), percent));
+        brush.GradientStops.Add(new GradientStop(Colors.LightGray, 1.0));
+        brush.EndPoint = new Point(1,0);
+
+        value.Background = brush;
+
+        return totalRostered.IsEffectivelyEqual(0.0);
     }
     
     private static EmployeeResourcePlannerValue? GetStandardLeave(DateTime curdate, StandardLeaveModel[] standardleaves)
@@ -333,12 +376,12 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
         return true;
     }
     
-    private bool CheckLeaveRequest(EmployeeResourceModel employee, DateTime curdate, LeaveRequestModel[] leaverequests, EmployeeResourcePlannerValue value)
+    private bool CheckLeaveRequest(EmployeeResourceModel employee, DateTime from, DateTime to, LeaveRequestModel[] leaverequests, EmployeeResourcePlannerValue value)
     {
         var leaverequest = leaverequests.FirstOrDefault(c => 
             (c.EmployeeID == employee.ID) 
-            && (c.From <= curdate) 
-            && (c.To.Add(c.ToTime) > curdate) 
+            && (c.From < to) 
+            && (c.To.Add(c.ToTime) >= from) 
             && (Properties.IncludeUnApprovedLeave || c.Status == LeaveRequestStatus.Approved));
 
         if (leaverequest == null)
@@ -592,6 +635,8 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
         var items = new List<Guid>();
         from = DateTime.MaxValue;
         to = DateTime.MinValue;
+
+        var period = GetPeriod();
         foreach (var cell in dataGrid.GetSelectedCells())
         {
             var row = (cell.RowData as DataRowView)!;
@@ -625,8 +670,8 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
             {
                 if (date < from)
                     from = date;
-                if (date > to)
-                    to = date;
+                if (date + period > to)
+                    to = date + period;
             }
 
             foreach(var id in (row[binding.Path.Path] as EmployeeResourcePlannerValue)!.IDs)
@@ -648,17 +693,17 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
         var updates = new List<Assignment>();
         foreach (var id in ids)
         {
-            for (DateTime curdate = from; curdate <= to; curdate = curdate.AddDays(1))
+            for (DateTime curdate = from; curdate < to; curdate = curdate.AddDays(1))
             {
                 var employee = _employees.FirstOrDefault(x => x.ID == id);
                 if (employee != null)
                 {
                     bool bAvail = 
                         (GetStandardLeave(curdate, _standardleaves) == null)
-                        && !CheckLeaveRequest(employee, curdate, _leaverequests, new EmployeeResourcePlannerValue());
+                        && !CheckLeaveRequest(employee, curdate, curdate.AddDays(1), _leaverequests, new EmployeeResourcePlannerValue());
                     
-                    var roster = bAvail ? RosterUtils.GetRoster(employee.Roster, employee.Start, curdate) : null;
-                    if (roster?.Enabled == true)
+                    var roster = bAvail ? RosterUtils.GetRoster(employee.Roster, employee.RosterStart, curdate) : null;
+                    if (roster?.Enabled == true && roster.Finish > roster.Start)
                     {
                         var assign = new Assignment();
                         assign.Date = curdate;
@@ -671,7 +716,7 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
                         updates.Add(assign);
                     }
 
-                    if (roster?.SplitShift == true)
+                    if (roster?.SplitShift == true && roster.Finish2 > roster.Start2)
                     {
                         var assign = new Assignment();
                         assign.Date = curdate;
@@ -736,6 +781,15 @@ public partial class EmployeeResourcePlanner : UserControl, IPropertiesPanel<Emp
         Refresh();
     }
 
+    private void ViewType_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+    {
+        if (EventSuppressor.IsSet(Suppress.This))
+            return;
+        Properties.ViewType = (EmployeeResourcePlannerViewType)ViewType.SelectedValue;
+        DoSaveSettings();
+        Refresh();
+    }
+
     private void LeaveType_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
     {
         if (EventSuppressor.IsSet(Suppress.This))

+ 1 - 0
prs.desktop/Panels/Employees/EmployeePanel.xaml

@@ -49,6 +49,7 @@
                                     </Border>
 
                                     <local:EmployeeRosterItemGrid x:Name="Rosters" Grid.Row="1" OnChanged="Rosters_OnOnChanged" SizeChanged="Rosters_OnSizeChanged"
+                                                                  EmployeeChanged="Rosters_EmployeeChanged"
                                                                   Margin="0,2,0,0"/>
 
                                     <syncfusion:SfGridSplitter Grid.Row="2" Grid.Column="0"

+ 5 - 0
prs.desktop/Panels/Employees/EmployeePanel.xaml.cs

@@ -287,5 +287,10 @@ namespace PRSDesktop
                 return;
             DoSaveSettings();
         }
+
+        private void Rosters_EmployeeChanged()
+        {
+            Employees.Refresh(false, true);
+        }
     }
 }

+ 4 - 0
prs.desktop/Panels/Employees/Rosters/EmployeeRosterItemGrid.cs

@@ -15,6 +15,8 @@ public class EmployeeRosterItemGrid : BaseEmployeeRosterItemGrid<Employee, Emplo
     
     private Button _select = null!;
     private Button _start = null!;
+
+    public event Action? EmployeeChanged;
     
     public EmployeeRosterItemGrid()
     {
@@ -53,6 +55,7 @@ public class EmployeeRosterItemGrid : BaseEmployeeRosterItemGrid<Employee, Emplo
             Item.RosterTemplate.Description = roster?.Description ?? "";
             Client.Save(Item, "Roster Template Updated");
             UpdateButtons();
+            EmployeeChanged?.Invoke();
         }
     }
 
@@ -100,6 +103,7 @@ public class EmployeeRosterItemGrid : BaseEmployeeRosterItemGrid<Employee, Emplo
         {
             Item.RosterStart = date;
             Client.Save(Item, "Updated Roster Start Date");
+            EmployeeChanged?.Invoke();
             DoChanged();
             return true;
         }

+ 3 - 3
prs.desktop/Panels/JobPlanner/JobResourcePlanner.xaml.cs

@@ -294,7 +294,7 @@ public partial class JobResourcePlanner : UserControl
 
                 foreach (var emp in _emps)
                 {
-                    var roster = RosterUtils.GetRoster(emp.Roster, emp.Start, date);
+                    var roster = RosterUtils.GetRoster(emp.Roster, emp.RosterStart, date);
 
                     var hours = roster.GetBlocks(date, TimeSpan.MinValue, TimeSpan.MaxValue)
                         .Aggregate<RosterBlock, TimeSpan>(TimeSpan.Zero, (value, block) => value + block.Duration);
@@ -532,7 +532,7 @@ public partial class JobResourcePlanner : UserControl
         {
             foreach (var date in dates)
             {
-                var roster = RosterUtils.GetRoster(emp.Roster, emp.Start, date);
+                var roster = RosterUtils.GetRoster(emp.Roster, emp.RosterStart, date);
                 var blocks = roster?.GetBlocks(date, TimeSpan.MinValue, TimeSpan.MaxValue) ?? new RosterBlock[] { };
                 var rostered = blocks.Aggregate(TimeSpan.Zero, (time, block) => time += block.Duration);
 
@@ -709,7 +709,7 @@ public partial class JobResourcePlanner : UserControl
                         var emp = _emps.FirstOrDefault(x => x.ID == available.ID);
                         if (emp != null)
                         {
-                            var roster = RosterUtils.GetRoster(emp.Roster, emp.Start, date);
+                            var roster = RosterUtils.GetRoster(emp.Roster, emp.RosterStart, date);
                             var blocks = roster?.GetBlocks(date, TimeSpan.MinValue, TimeSpan.MaxValue) ?? new RosterBlock[] { };
                             foreach (var block in blocks)
                                 CheckEdges(block.Start, block.Finish);