Browse Source

Final tweaks to assignment costing

Kenric Nugteren 3 weeks ago
parent
commit
feadd5d66a

+ 2 - 2
prs.classes/Entities/Assignment/Assignment.cs

@@ -109,9 +109,9 @@ namespace Comal.Classes
         public DateTime Completed { get; set; }
 
         [Editable(Editable.Disabled)]
-        [Comment("How many hours this Assignment was treated as taking for the purposes of evaluating 'Cost'")]
+        [Comment("The duration this Assignment was treated as having for costing purposes")]
         [EditorSequence("Processing", 1)]
-        public double AccountingHours { get; set; }
+        public double CostedHours { get; set; }
 
         [CurrencyEditor]
         [Editable(Editable.Disabled)]

+ 5 - 0
prs.classes/SecurityDescriptors/HumanResources_Descriptors.cs

@@ -72,4 +72,9 @@ namespace Comal.Classes
     public class IsJobOnlyEmployee : DisabledSecurityDescriptor<HumanResourcesLicense, User>
     {
     }
+
+    [Caption("Can Configure Assignment Costing")]
+    public class CanConfigureAssignmentCosting : EnabledSecurityDescriptor<HumanResourcesLicense, Assignment>
+    {
+    }
 }

+ 1 - 0
prs.desktop/Panels/Timesheets/TimesheetPanel.xaml.cs

@@ -90,6 +90,7 @@ public partial class TimesheetPanel : UserControl, IPanel<TimeSheet>
                 
             }
         });
+        HumanResourcesSetupActions.AssignmentCostingSettings(host);
 
         host.CreatePanelAction(new PanelAction() { Caption = "Process Leave", Image = PRSDesktop.Resources.leave, OnExecute = ProcessLeave });
 

+ 1 - 1
prs.desktop/Setups/HumanResourcesSetupActions.cs

@@ -125,7 +125,7 @@ public static class HumanResourcesSetupActions
 
     public static void AssignmentCostingSettings(IPanelHost host)
     {
-        host.CreateSetupActionIfCanView<Assignment>("Assignment Costing Settings", PRSDesktop.Resources.edit, (action) =>
+        host.CreateSetupActionIf<CanConfigureAssignmentCosting>("Assignment Costing Settings", PRSDesktop.Resources.edit, (action) =>
         {
             var settings = new GlobalConfiguration<AssignmentCostSettings>().Load();
             if (DynamicGridUtils.EditObject(settings, customiseGrid: grid =>

+ 50 - 40
prs.stores/AssignmentCostingUtils.cs

@@ -799,45 +799,55 @@ public class Module: " + nameof(IAssignmentCostingScript) + @"
 
             if (employeeID == Guid.Empty) return;
 
-            var assignments = store.Provider.Query(
-                Filter<Assignment>.Where(x => x.Date).IsEqualTo(date)
-                    .And(x => x.EmployeeLink.ID).IsEqualTo(employeeID),
-                Columns.Required<Assignment>()
-                    .Add(x => x.ID)
-                    .Add(x => x.Cost)
-                    .Add(x => x.Actual.Start)
-                    .Add(x => x.Actual.Finish)
-                    .Add(x => x.Actual.Duration)
-                    .Add(x => x.Booked.Start)
-                    .Add(x => x.Booked.Finish)
-                    .Add(x => x.Booked.Duration))
-                .ToArray<Assignment>();
-            var timesheets = store.Provider.Query(
-                Filter<TimeSheet>.Where(x => x.Date).IsEqualTo(date)
-                    .And(x => x.EmployeeLink.ID).IsEqualTo(employeeID),
-                Columns.None<TimeSheet>()
-                    .Add(x => x.Approved)
-                    .Add(x => x.Start)
-                    .Add(x => x.Finish)
-                    .Add(x => x.ApprovedStart)
-                    .Add(x => x.ApprovedFinish))
-                .ToArray<TimeSheet>();
-            if (timesheets.Length == 0) return;
-
-            var employee = store.Provider.Query(
-                Filter<Employee>.Where(x => x.ID).IsEqualTo(employeeID),
-                Columns.None<Employee>()
-                    .Add(x => x.RosterStart)
-                    .Add(x => x.HourlyRate))
-                .ToObjects<Employee>().FirstOrDefault();
-            if (employee is null) return;
-
-            var rosterItems = store.Provider.Query(
-                Filter<EmployeeRosterItem>.Where(x => x.Employee.ID).IsEqualTo(employeeID),
-                Columns.None<EmployeeRosterItem>()
-                    .Add(x => x.Overtime.ID),
-                new SortOrder<EmployeeRosterItem>(x => x.Day))
-                .ToArray<EmployeeRosterItem>();
+            var assignmentTask = Task.Run(() =>
+                store.Provider.Query(
+                    Filter<Assignment>.Where(x => x.Date).IsEqualTo(date)
+                        .And(x => x.EmployeeLink.ID).IsEqualTo(employeeID),
+                    Columns.Required<Assignment>()
+                        .Add(x => x.ID)
+                        .Add(x => x.Cost)
+                        .Add(x => x.Actual.Start)
+                        .Add(x => x.Actual.Finish)
+                        .Add(x => x.Actual.Duration)
+                        .Add(x => x.Booked.Start)
+                        .Add(x => x.Booked.Finish)
+                        .Add(x => x.Booked.Duration))
+                    .ToArray<Assignment>());
+            var timesheetTask = Task.Run(() =>
+                store.Provider.Query(
+                    Filter<TimeSheet>.Where(x => x.Date).IsEqualTo(date)
+                        .And(x => x.EmployeeLink.ID).IsEqualTo(employeeID),
+                    Columns.None<TimeSheet>()
+                        .Add(x => x.Approved)
+                        .Add(x => x.Start)
+                        .Add(x => x.Finish)
+                        .Add(x => x.ApprovedStart)
+                        .Add(x => x.ApprovedFinish))
+                    .ToArray<TimeSheet>());
+
+            var employeeTask = Task.Run(() =>
+                store.Provider.Query(
+                    Filter<Employee>.Where(x => x.ID).IsEqualTo(employeeID),
+                    Columns.None<Employee>()
+                        .Add(x => x.RosterStart)
+                        .Add(x => x.HourlyRate))
+                    .ToObjects<Employee>().FirstOrDefault());
+
+            var rosterItemsTask = Task.Run(() =>
+                store.Provider.Query(
+                    Filter<EmployeeRosterItem>.Where(x => x.Employee.ID).IsEqualTo(employeeID),
+                    Columns.None<EmployeeRosterItem>()
+                        .Add(x => x.Overtime.ID),
+                    new SortOrder<EmployeeRosterItem>(x => x.Day))
+                    .ToArray<EmployeeRosterItem>());
+
+            var timesheets = timesheetTask.Result;
+            var employee = employeeTask.Result;
+
+            if (timesheets.Length == 0 || employee is null) return;
+
+            var assignments = assignmentTask.Result;
+            var rosterItems = rosterItemsTask.Result;
 
             var overtimeID = RosterUtils.GetRoster(rosterItems, employee.RosterStart, date)?.Overtime.ID ?? Guid.Empty;
             if(overtimeID == Guid.Empty) return;
@@ -896,7 +906,7 @@ public class Module: " + nameof(IAssignmentCostingScript) + @"
             foreach(var assignment in assignments)
             {
                 assignment.Cost = totalHours.GetValueOrDefault(assignment) * employee.HourlyRate;
-                assignment.AccountingHours = totalAccountingHours.GetValueOrDefault(assignment);
+                assignment.CostedHours = totalAccountingHours.GetValueOrDefault(assignment);
             }
             ScriptAfterOvertime(script, timeSheet, blocks, overtime, assignments);