소스 검색

Removed References to Employee.UsualStart/Finish/Activity
Fixed some Calendar / Daily Report inconsistencies

Frank van den Bos 2 년 전
부모
커밋
e6ec8c28b7

+ 4 - 13
prs.classes/Entities/Employee/Employee.cs

@@ -81,11 +81,8 @@ namespace Comal.Classes
         [EditorSequence("Payroll",5)]
         public OvertimeRuleLink OvertimeRuleLink { get; set; }
         
-        [EditorSequence("Payroll", 6)]
-        public EmployeeActivityLink UsualActivity { get; set; }
-        
         [CodeEditor(Editable = Editable.Enabled)]
-        [EditorSequence("Payroll",7)]
+        [EditorSequence("Payroll",6)]
         public string PayrollID { get; set; }
         
         [EditorSequence("Org Chart", 1)]
@@ -107,13 +104,13 @@ namespace Comal.Classes
 
         [NullEditor]
         public byte[]? Signature { get; set; }
-        
+
         [NullEditor]
-        [Obsolete("Replaced with EmployeeRoster class")]
+        [Obsolete("Replaced with EmployeeRoster class", true)]
         public TimeSpan UsualStart { get; set; }
 
         [NullEditor]
-        [Obsolete("Replaced with EmployeeRoster class")]
+        [Obsolete("Replaced with EmployeeRoster class", true)]
         public TimeSpan UsualFinish { get; set; }
 
         protected override void Init()
@@ -124,14 +121,8 @@ namespace Comal.Classes
             Name = "";
             Address = new Address();
 
-            //Photo = new ImageDataFile();
-
             Thumbnail = new ImageDocumentLink();
 
-            //Attachments = new List<MiscellaneousDataFile>();
-
-            //UsualActivity = new EmployeeActivityLink();
-
             Group = new EmployeeGroupLink();
 
             UserLink = new UserLink();

+ 1 - 1
prs.desktop/Components/Calendar/Calendar.xaml

@@ -6,7 +6,7 @@
              xmlns:local="clr-namespace:PRSDesktop"
              xmlns:syncfusion="http://schemas.syncfusion.com/wpf"
              mc:Ignorable="d"
-             d:DesignHeight="600" d:DesignWidth="800">
+             d:DesignHeight="600" d:DesignWidth="800" SizeChanged="Calendar_OnSizeChanged">
     
     <UserControl.Resources>
 

+ 24 - 0
prs.desktop/Components/Calendar/Calendar.xaml.cs

@@ -30,6 +30,24 @@ namespace PRSDesktop
             Refresh,   // Stop the Data from Being refreshed    
             Settings   // Dont allow settings to be updated
         }
+
+        private EventSuppressor suppressor = null;
+        public void DisableUpdate()
+        {
+            if (suppressor == null)
+                suppressor = new EventSuppressor(Suppress.Refresh, Suppress.Settings);
+        }
+
+        public void EnableUpdate()
+        {
+            if (suppressor != null)
+            {
+                suppressor.Dispose();
+                suppressor = null;
+            }
+
+            Refresh();
+        }
         
         private void DoSetValue<T>(DependencyProperty property, T value, Action? updateselector, Action? updateinterface)
         {
@@ -1404,5 +1422,11 @@ namespace PRSDesktop
         }
 
 
+        private void Calendar_OnSizeChanged(object sender, SizeChangedEventArgs e)
+        {
+            if (double.IsNaN(this.ActualHeight) || (this.ActualHeight == 0))
+                return;
+            UpdateZoom();
+        }
     }
 }

+ 11 - 7
prs.desktop/Dashboards/HumanResources/TimesheetWidget.xaml.cs

@@ -171,8 +171,12 @@ namespace PRSDesktop
                         if (emprow != null)
                         {
                             var userid = emprow.Get<Employee, string>(x => x.UserLink.UserID);
-                            var usualstart = emprow.Get<Employee, TimeSpan>(x => x.UsualStart);
-                            var usualfinish = emprow.Get<Employee, TimeSpan>(x => x.UsualFinish);
+                            var date = time.Get<TimeSheet, DateTime>(c => c.Date);
+                            var roster = EmployeeRosterItem.FromJSON(emprow.Get<Employee, String>(c => c.Roster));
+                            var rosterday = RosterUtils.GetRoster(roster, emprow.Get<Employee, DateTime>(c => c.RosterStart), date);
+                            var shifts = RosterUtils.GetBlocks(rosterday, date, TimeSpan.Zero, TimeSpan.FromDays(1));
+                            var shiftstart = shifts.Aggregate(TimeSpan.MaxValue, (time, block) => block.Start < time ? block.Start : time);
+                            var shiftend = shifts.Aggregate(TimeSpan.Zero, (time, block) => block.Finish > time ? block.Finish : time);
 
                             var rows = timesheets.Rows.Where(r => r.Get<TimeSheet, Guid>(c => c.EmployeeLink.ID).Equals(empid));
 
@@ -206,13 +210,13 @@ namespace PRSDesktop
                                     createdby = "";
 
 
-                                if (usualstart.Ticks != 0)
+                                if (shiftstart.Ticks != 0)
                                 {
                                     var thisstart = row.Get<TimeSheet, TimeSpan>(x => x.Start);
                                     if (thisstart < start)
                                     {
                                         start = thisstart;
-                                        if (start > usualstart)
+                                        if (start > shiftstart)
                                             late = !late.HasValue || start < late.Value ? start : late;
                                         else
                                             late = null;
@@ -220,12 +224,12 @@ namespace PRSDesktop
                                     }
                                 }
 
-                                if (usualfinish.Ticks != 0)
+                                if (shiftend.Ticks != 0)
                                 {
                                     var thisfinish = row.Get<TimeSheet, TimeSpan>(x => x.Finish);
                                     if (thisfinish.Ticks == 0)
                                     {
-                                        usualfinish = new TimeSpan(0);
+                                        shiftend = new TimeSpan(0);
                                         early = null;
                                     }
                                     else
@@ -233,7 +237,7 @@ namespace PRSDesktop
                                         if (thisfinish > finish)
                                         {
                                             finish = thisfinish;
-                                            if (finish < usualfinish)
+                                            if (finish < shiftend)
                                                 early = !early.HasValue || finish > early.Value ? finish : early;
                                             else
                                                 early = null;

+ 6 - 7
prs.desktop/Grids/TimesheetGrid.cs

@@ -248,8 +248,7 @@ namespace PRSDesktop
 
                 if (emp != null)
                 {
-                    //Progress.SetMessage(String.Format("Processing: {0} - {1:dd MMM yyyy}",name,date));
-
+                    
                     var times = new Client<TimeSheet>().Load(new Filter<TimeSheet>(x => x.Date).IsEqualTo(date)
                         .And(x => x.EmployeeLink.ID).IsEqualTo(empid)
                         .And(x => x.Approved).IsEqualTo(DateTime.MinValue)
@@ -268,10 +267,10 @@ namespace PRSDesktop
 
 
                         var first = times.OrderBy(x => x.Start).First();
-                        var EmployeeOverrideStart = emp.UsualStart.Ticks != 0 ? emp.UsualStart : first.Start.Round(new TimeSpan(0, 15, 0));
-
+                        var start = first.Start.Round(new TimeSpan(0, 15, 0));
+                        
                         var last = times.OrderBy(x => x.Finish).Last();
-                        var EmployeeOverrideEnd = emp.UsualFinish.Ticks != 0 ? emp.UsualFinish : last.Finish.Round(new TimeSpan(0, 15, 0));
+                        var finish = last.Finish.Round(new TimeSpan(0, 15, 0));
 
                         var jobfilter = new Filter<Job>(x => x.ID).IsEqualTo(Guid.Empty);
                         Array.ForEach(times, t => jobfilter.Ors.Add(new Filter<Job>(j => j.ID).IsEqualTo(t.JobLink.ID)));
@@ -283,8 +282,8 @@ namespace PRSDesktop
                             //Progress.SetMessage(String.Format("Checking Time Sheet({0:F2}% complete)", (i * 100.0F) / (double)times.Length));
                             var time = times[i];
 
-                            time.ApprovedStart = time == first || time.Start < EmployeeOverrideStart ? EmployeeOverrideStart : time.Start;
-                            time.ApprovedFinish = time == last || time.Finish > EmployeeOverrideEnd ? EmployeeOverrideEnd : time.Finish;
+                            time.ApprovedStart = time == first || time.Start < start ? start : time.Start;
+                            time.ApprovedFinish = time == last || time.Finish > finish ? finish : time.Finish;
 
                             var job = jobs.Rows.Where(r => r.Get<Job, Guid>(c => c.ID).Equals(time.JobLink.ID)
                                                            && Entity.IsEntityLinkValid<Job, ActivityLink>(x => x.UsualActivity, r)

+ 1 - 1
prs.desktop/Panels/Attendance/AttendancePanel.xaml.cs

@@ -562,7 +562,7 @@ namespace PRSDesktop
             request.From = DateTime.Today;
             request.FromTime = DateTime.Now.TimeOfDay;
             request.To = DateTime.Today;
-            request.ToTime = emp.UsualFinish != TimeSpan.FromMilliseconds(0) ? emp.UsualFinish : new TimeSpan(23, 59, 59);
+            request.ToTime = new TimeSpan(23, 59, 59);
             request.Status = LeaveRequestStatus.InProgress;
             request.LeaveType.ID = actrow.Get<Activity, Guid>(c => c.ID);
             request.Notes = string.Format("Marked As Sick at {0:hh\\:mm} by {1}", DateTime.Now, ClientFactory.UserID);

+ 73 - 58
prs.desktop/Panels/DailyReports/DailyReport.xaml.cs

@@ -204,7 +204,6 @@ namespace PRSDesktop
             settings.CalendarView = CalendarViewType.Day;
             settings.BackgroundType = CalendarBackgroundType.Automatic;
             settings.TimeInterval = CalendarTimeInterval.FifteenMinutes;
-            settings.Zoom = 40.0F;
             settings.EmployeeSelection = new EmployeeSelectorData(new Guid[] { Guid.Empty }, new Guid[] { Employee.ID });
             settings.Zoom = _settings.Zoom;
             return settings;
@@ -231,64 +230,74 @@ namespace PRSDesktop
         
         public void Setup()
         {
-            Parallel.ForEach(
-                new Action[]
-                {
-                    () => _settings = new UserConfiguration<DailyActivityScreenSettings>().Load(),
-                    () => Employee = new Client<Employee>().Load(new Filter<Employee>(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid)).FirstOrDefault(),
-                },
-                (a => a())
-            );
-
-            Calendar.Setup();
-            
-            LoadRequiredReports();
-            
-            if (!RequiredReports.Any())
+            Calendar.DisableUpdate();
+            try
             {
-                var start = TimeSpan.FromHours(6);
-                var finish = TimeSpan.FromHours(18);
-                var blocks = Calendar.GetRoster(Employee.ID, DateTime.Today)?.GetBlocks(DateTime.Today, TimeSpan.FromSeconds(0), TimeSpan.FromDays(1));
-                if (blocks?.Any() == true)
+
+
+                Parallel.ForEach(
+                    new Action[]
+                    {
+                        () => _settings = new UserConfiguration<DailyActivityScreenSettings>().Load(),
+                        () => Employee = new Client<Employee>().Load(new Filter<Employee>(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid)).FirstOrDefault(),
+                    },
+                    (a => a())
+                );
+
+                Calendar.Setup();
+                
+                LoadRequiredReports();
+                
+                if (!RequiredReports.Any())
                 {
-                    start = blocks.Aggregate(TimeSpan.FromDays(1), (time, block) => time.Ticks < block.Start.Ticks ? time : block.Start);
-                    finish = blocks.Aggregate(TimeSpan.Zero, (time, block) => time.Ticks > block.Finish.Ticks ? time : block.Start);
+                    var start = TimeSpan.FromHours(6);
+                    var finish = TimeSpan.FromHours(18);
+                    var blocks = Calendar.GetRoster(Employee.ID, DateTime.Today)?.GetBlocks(DateTime.Today, TimeSpan.FromSeconds(0), TimeSpan.FromDays(1));
+                    if (blocks?.Any() == true)
+                    {
+                        start = blocks.Aggregate(TimeSpan.FromDays(1), (time, block) => time.Ticks < block.Start.Ticks ? time : block.Start);
+                        finish = blocks.Aggregate(TimeSpan.Zero, (time, block) => time.Ticks > block.Finish.Ticks ? time : block.Start);
+                    }
+                    RequiredReports.Add(new RequiredReport(Guid.Empty, DateTime.Today, start, finish, ""));
+                    ConfirmDock.Visibility = Visibility.Collapsed;
                 }
-                RequiredReports.Add(new RequiredReport(Guid.Empty, DateTime.Today, start, finish, ""));
-                ConfirmDock.Visibility = Visibility.Collapsed;
-            }
 
-            ConfigureEditor(Title, new TextBoxEditor());
-            ConfigureEditor(ActivityNotes, new MemoEditor());
-            ConfigureEditor(Start, new TimeOfDayEditor());
-            ConfigureEditor(Duration, new TimeOfDayEditor());
-            ConfigureEditor(Finish, new TimeOfDayEditor());
-            ConfigureEditor(Notes, new MemoEditor());
-
-            Activity.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), CoreUtils.GetFullPropertyName<Assignment,Guid>(c=>c.ActivityLink.ID,".")).Editor;
-            Activity.OtherColumns["Color"] = CoreUtils.GetFullPropertyName<Assignment,String>(c=>c.ActivityLink.Color,".");
-            Activity.OtherColumns["Description"] = CoreUtils.GetFullPropertyName<Assignment,String>(c=>c.ActivityLink.Description,".");
-            ConfigureEditor(Activity);
-
-            ITP.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "ITP.ID").Editor;
-            ITP.OtherColumns["Code"] = "ITP.Code";
-            //ConfigureEditor(ITP);
-
-            Kanban.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "Task.ID").Editor;
-            Kanban.OtherColumns["JobLink.ID"] = "JobLink.ID";
-            Kanban.OtherColumns["JobLink.JobNumber"] = "JobLink.JobNumber";
-            Kanban.OtherColumns["JobLink.Name"] = "JobLink.Name";
-            ConfigureEditor(Kanban);
-
-            Job.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "JobLink.ID").Editor;
-            Job.OtherColumns["JobNumber"] = "JobLink.JobNumber";
-            Job.OtherColumns["Name"] = "JobLink.Name";
-            Job.OnDefineFilter += (sender, type) => { return LookupFactory.DefineFilter<Assignment, Job>(new[] { SelectedAssignment }); };
-            ConfigureEditor(Job);
-            
-            GotoCurrentRequiredReport();
-            
-            LoadKanbans("Open");
+                ConfigureEditor(Title, new TextBoxEditor());
+                ConfigureEditor(ActivityNotes, new MemoEditor());
+                ConfigureEditor(Start, new TimeOfDayEditor());
+                ConfigureEditor(Duration, new TimeOfDayEditor());
+                ConfigureEditor(Finish, new TimeOfDayEditor());
+                ConfigureEditor(Notes, new MemoEditor());
+
+                Activity.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), CoreUtils.GetFullPropertyName<Assignment,Guid>(c=>c.ActivityLink.ID,".")).Editor;
+                Activity.OtherColumns["Color"] = CoreUtils.GetFullPropertyName<Assignment,String>(c=>c.ActivityLink.Color,".");
+                Activity.OtherColumns["Description"] = CoreUtils.GetFullPropertyName<Assignment,String>(c=>c.ActivityLink.Description,".");
+                ConfigureEditor(Activity);
+
+                ITP.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "ITP.ID").Editor;
+                ITP.OtherColumns["Code"] = "ITP.Code";
+                //ConfigureEditor(ITP);
+
+                Kanban.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "Task.ID").Editor;
+                Kanban.OtherColumns["JobLink.ID"] = "JobLink.ID";
+                Kanban.OtherColumns["JobLink.JobNumber"] = "JobLink.JobNumber";
+                Kanban.OtherColumns["JobLink.Name"] = "JobLink.Name";
+                ConfigureEditor(Kanban);
+
+                Job.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "JobLink.ID").Editor;
+                Job.OtherColumns["JobNumber"] = "JobLink.JobNumber";
+                Job.OtherColumns["Name"] = "JobLink.Name";
+                Job.OnDefineFilter += (sender, type) => { return LookupFactory.DefineFilter<Assignment, Job>(new[] { SelectedAssignment }); };
+                ConfigureEditor(Job);
+                
+                GotoCurrentRequiredReport();
+                
+                LoadKanbans("Open");
+            }
+            finally
+            {
+                Calendar.EnableUpdate();
+            }
         }
 
         public void Shutdown()
@@ -954,9 +963,15 @@ namespace PRSDesktop
 
                 if (!RequiredReports.Any())
                 {
-                    RequiredReports.Add(new RequiredReport(Guid.Empty, DateTime.Today,
-                        Employee.UsualStart.Ticks != 0L ? Employee.UsualStart : new TimeSpan(8, 0, 0),
-                        Employee.UsualFinish.Ticks != 0L ? Employee.UsualFinish : new TimeSpan(17, 0, 0), ""));
+                    var start = TimeSpan.FromSeconds(0);
+                    var finish = TimeSpan.FromDays(1);
+                    var blocks = Calendar.GetRoster(Employee.ID, DatePicker.SelectedDate.Value)?.GetBlocks(DatePicker.SelectedDate.Value, start, finish);
+                    if (blocks?.Any() == true)
+                    {
+                        start = blocks.Aggregate(start, (time, block) => time.Ticks < block.Start.Ticks ? time : block.Start);
+                        finish = blocks.Aggregate(finish, (time, block) => time.Ticks > block.Finish.Ticks ? time : block.Start);
+                    }
+                    RequiredReports.Add(new RequiredReport(Guid.Empty, DateTime.Today, start, finish, ""));
                     ConfirmDock.Visibility = Visibility.Collapsed;
                 }
 

+ 1 - 1
prs.desktop/Panels/Jobs/EmailInterfaceForm.xaml.cs

@@ -341,7 +341,7 @@ namespace PRSDesktop
 
             var me = new Client<Employee>().Load(new Filter<Employee>(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid)).FirstOrDefault();
             Emails.EmployeeID = me?.ID ?? Guid.Empty;
-            Emails.ActivityID = me != null ? me.UsualActivity.ID : Guid.Empty;
+            Emails.ActivityID = Guid.Empty;
             Employee.Content = me != null ? me.Name : "(No Employee Found)";
         }
 

+ 2 - 2
prs.desktop/Panels/Timesheets/RosterUtils.cs

@@ -30,7 +30,7 @@ namespace PRSDesktop
         {
             List<RosterBlock> result = new List<RosterBlock>();
             
-            if ((roster.Finish > start) && (roster.Start <= finish))
+            if (roster.Enabled && (roster.Finish > start) && (roster.Start <= finish))
             {
                 result.Add(new RosterBlock(
                     date,
@@ -39,7 +39,7 @@ namespace PRSDesktop
                 ));
             }
             
-            if ((roster.Finish2 > start) && (roster.Start2 <= finish))
+            if ( roster.Enabled && roster.SplitShift && (roster.Finish2 > start) && (roster.Start2 <= finish))
             {
                 result.Add(new RosterBlock(
                     date,