Browse Source

Changed DigitalFormInstance.Processed to FormProcessed/FormCancelled

frogsoftware 1 year ago
parent
commit
9bd1a05db7

+ 3 - 3
prs.classes/Entities/DigitalFormInstance/DigitalFormInstance.cs

@@ -33,10 +33,10 @@ namespace Comal.Classes
         public DigitalFormLink Form { get; set; }
         
         public DateTime FormStarted { get; set; }
-        
+        public TimeSpan FormOpen { get; set; }        
         public DateTime FormCompleted { get; set; }
-        
-        public TimeSpan FormOpen { get; set; }
+        public DateTime FormProcessed { get; set; }
+        public DateTime FormCancelled { get; set; }
         
         protected override void Init()
         {

+ 2 - 0
prs.classes/Entities/Manufacturing/ManufacturingPacket/ManufacturingPacketStage.cs

@@ -146,6 +146,8 @@ namespace Comal.Classes
         public TimeSpan FormOpen { get; set; }
 
         public DateTime FormCompleted { get; set; }
+        public DateTime FormProcessed { get; set; }
+        public DateTime FormCancelled { get; set; }
 
         [NullEditor]
         [Obsolete("Being Replaced by FormCompletedBy")]

+ 7 - 4
prs.desktop/Dashboards/Common/DigitalFormsDashboard.xaml.cs

@@ -876,7 +876,8 @@ namespace PRSDesktop
 
             var filter = new Filter<T>(x => x.FormCompleted).IsGreaterThanOrEqualTo(From)
                 .And(x => x.FormCompleted).IsLessThan(To.AddDays(1))
-                .And(x => x.Form.ID).IsEqualTo(Form!.ID);
+                .And(x => x.Form.ID).IsEqualTo(Form!.ID)
+                .And(x => x.FormCancelled).IsEqualTo(DateTime.MinValue);
             
             if (Properties.JobID != Guid.Empty && Properties.ShowJobFilter)
             {
@@ -892,10 +893,14 @@ namespace PRSDesktop
                 .Add(x => x.FormData)
                 .Add(x => x.FormCompleted)
                 .Add(x => x.FormCompletedBy.UserID)
+                .Add(x => x.FormProcessed)
                 .Add(x => x.Location.Timestamp)
                 .Add(x => x.Location.Latitude)
                 .Add(x => x.Location.Longitude);
 
+            if (IsEntityForm)
+                columns.Add(x => x.FormProcessed); //"Processed");
+            
             var parentcols = LookupFactory.DefineColumns(ParentType!);
             foreach (var col in parentcols.ColumnNames())
                 columns.Add("Parent." + col);
@@ -907,8 +912,6 @@ namespace PRSDesktop
                 }
             }
 
-            if (IsEntityForm)
-                columns.Add("Processed");
             if (!string.IsNullOrWhiteSpace(jobLink))
                 columns.Add(jobLink + ".ID");
 
@@ -1015,7 +1018,7 @@ namespace PRSDesktop
                     dataRow["Completed By"] = form.FormCompletedBy.UserID;
 
                     if (IsEntityForm)
-                        dataRow["Processed"] = (bool?)row["Processed"] ?? false;
+                        dataRow["Processed"] = ((DateTime?)row["FormProcessed"] ?? DateTime.MinValue) > DateTime.MinValue;
 
                     if (ParentType == typeof(JobITP))
                     {

+ 31 - 55
prs.desktop/Dashboards/Common/QADashboard.xaml.cs

@@ -28,6 +28,7 @@ using Syncfusion.Windows.Shared;
 using Syncfusion.XlsIO;
 using SelectionChangedEventArgs = System.Windows.Controls.SelectionChangedEventArgs;
 using System.ComponentModel;
+using Columns = InABox.Core.Columns;
 
 namespace PRSDesktop
 {
@@ -471,67 +472,44 @@ namespace PRSDesktop
                 var sort = LookupFactory.DefineSort(type);
 
                 var JobLink = GetJobLink("", type);
-
-                var filtertype = typeof(Filter<>).MakeGenericType(type);
-                var filter = Activator.CreateInstance(typeof(Filter<>).MakeGenericType(type));
-                CoreUtils.SetPropertyValue(filter, "Expression", CoreUtils.GetMemberExpression(type, "FormCompleted"));
-                CoreUtils.SetPropertyValue(filter, "Operator", Operator.IsGreaterThanOrEqualTo);
-                CoreUtils.SetPropertyValue(filter, "Value", _from);
-
-                var ands = filtertype.GetProperty("Ands").GetValue(filter) as IList;
-
-                var to = Activator.CreateInstance(filtertype);
-                CoreUtils.SetPropertyValue(to, "Expression", CoreUtils.GetMemberExpression(type, "FormCompleted"));
-                CoreUtils.SetPropertyValue(to, "Operator", Operator.IsLessThan);
-                CoreUtils.SetPropertyValue(to, "Value", _to.AddDays(1));
-                ands.Add(to);
-
-                var formid = Activator.CreateInstance(filtertype);
-                CoreUtils.SetPropertyValue(formid, "Expression", CoreUtils.GetMemberExpression(type, "Form.ID"));
-                CoreUtils.SetPropertyValue(formid, "Operator", Operator.IsEqualTo);
-                CoreUtils.SetPropertyValue(formid, "Value", form.Key);
-                ands.Add(formid);
-
+                
+                var filter = Filter.Create(type, "FormCompleted").IsGreaterThanOrEqualTo(_from)
+                    .And("FormCompleted").IsLessThan(_to.AddDays(1))
+                    .And("FormCancelled").IsEqualTo(DateTime.MinValue)
+                    .And("Form.ID").IsEqualTo(form.Key);
+                
                 if (jobid != Guid.Empty)
-                {
-                    var job = Activator.CreateInstance(filtertype);
-                    CoreUtils.SetPropertyValue(job, "Expression", CoreUtils.GetMemberExpression(type, JobLink + ".ID"));
-                    CoreUtils.SetPropertyValue(job, "Operator", Operator.IsEqualTo);
-                    CoreUtils.SetPropertyValue(job, "Value", jobid);
-                    ands.Add(job);
-                }
-
-                var colstype = typeof(Columns<>).MakeGenericType(type);
-                var cols = Activator.CreateInstance(colstype) as IColumns;
-                cols.Add("ID");
-                cols.Add("Number");
-                cols.Add("CreatedBy");
-                cols.Add("Created");
-
+                    filter = filter.And($"{JobLink}.ID").IsEqualTo(jobid);
+                
+                var cols = Columns.Create(type)
+                    .Add("ID")
+                    .Add("Number")
+                    .Add("CreatedBy")
+                    .Add("Created")
+                    .Add("Form.ID")
+                    .Add("FormData")
+                    .Add("FormCompleted")
+                    .Add("FormCompletedBy.UserID")
+                    .Add("Location.Timestamp")
+                    .Add("Location.Latitude")
+                    .Add("Location.Longitude");
+                
+                if(isEntityForm)
+                    cols.Add("FormProcessed");
+                
+                if (!string.IsNullOrWhiteSpace(JobLink))
+                    cols.Add(JobLink + ".JobNumber");
+                
                 foreach (var col in parentcols.ColumnNames())
                     cols.Add("Parent." + col);
                 if(parentColumns.TryGetValue(parentType, out var pColumns))
                 {
                     foreach(var (field, name) in pColumns)
-                    {
                         cols.Add(field);
-                    }
                 }
-
-                cols.Add("Form.ID");
-                cols.Add("FormData");
-                cols.Add("FormCompleted");
-                cols.Add("FormCompletedBy.UserID");
-
-                if(isEntityForm)
-                    cols.Add("Processed");
-                cols.Add("Location.Timestamp");
-                cols.Add("Location.Latitude");
-                cols.Add("Location.Longitude");
-                if (!string.IsNullOrWhiteSpace(JobLink))
-                    cols.Add(JobLink + ".JobNumber");
-
+                
                 var querytype = typeof(QueryDef<>).MakeGenericType(type);
+                
                 query.Add(Activator.CreateInstance(querytype, filter, cols, sort) as IQueryDef, type);
 
                 if(parentType == typeof(JobITP))
@@ -566,9 +544,7 @@ namespace PRSDesktop
                 if (pColumns != null)
                 {
                     foreach (var (field, name) in pColumns)
-                    {
                         data.Columns.Add(name, typeof(string));
-                    }
                 }
 
                 data.Columns.Add("Description", typeof(string));
@@ -641,7 +617,7 @@ namespace PRSDesktop
                         datarow["Completed By"] = (string)row["FormCompletedBy.UserID"];                
 
                         if (isEntityForm)
-                            datarow["Processed"] = (bool)row["Processed"];
+                            datarow["Processed"] = ((DateTime?)row["FormProcessed"] ?? DateTime.MinValue) > DateTime.MinValue;
 
                         if(parentType == typeof(JobITP))
                         {

+ 86 - 16
prs.desktop/DockPanels/DigitalFormsDock.xaml.cs

@@ -46,6 +46,9 @@ namespace PRSDesktop
 
         [NullEditor]
         public Type FormType { get; set; }
+        
+        [NullEditor]
+        public DateTime Processed { get; set; }
 
     }
     
@@ -91,10 +94,11 @@ namespace PRSDesktop
             _mappings = new CoreFieldMap<IDigitalFormInstance, DigitalFormDockModel>()
                 .Add(x => x.ID, x => x.ID)
                 .Add(x => x.Form.ID, x => x.FormID)
-                .Add(x=>x.Number, x=>x.Number)
+                .Add(x => x.Number, x => x.Number)
                 .Add(x => x.Form.Description, x => x.FormName)
                 .Add(x => x.FormCompleted, x => x.Completed)
-                .Add(x => x.FormCompletedBy.UserID, x => x.CompletedBy);
+                .Add(x => x.FormCompletedBy.UserID, x => x.CompletedBy)
+                .Add(x => x.FormProcessed, x => x.Processed);
             
             _query = new MultiQuery();
             
@@ -122,6 +126,17 @@ namespace PRSDesktop
             options.EndUpdate();
         }
 
+        protected override DynamicGridStyle GetRowStyle(CoreRow row, DynamicGridStyle style)
+        {
+            var result = base.GetRowStyle(row, style);
+            if (!row.Get<DigitalFormDockModel, DateTime>(x => x.Processed).IsEmpty())
+                result = new DynamicGridRowStyle(result)
+                {
+                    Background = new SolidColorBrush(Colors.LightGray),
+                };
+            return result;
+        }
+
         private bool TypeFilter(CoreRow row, string[] filter)
         {
             string typename = row.Get<DigitalFormDockModel, Type>(x => x.FormType).EntityName().Split('.').Last().SplitCamelCase();
@@ -149,28 +164,82 @@ namespace PRSDesktop
             var modules = new Client<CustomModule>().Query(
                 new Filter<CustomModule>(x => x.DataModel).IsEqualTo(model.Name)
                     .And(x => x.Section).IsEqualTo(formID.ToString())
+                    .And(x => x.Visible).IsEqualTo(true)
                 ).Rows.Select(x => x.ToObject<CustomModule>());
             foreach(var module in modules)
             {
-                column.AddItem(module.Name, PRSDesktop.Resources.edit, row =>
-                {
-                    try
+                column.AddItem(
+                    module.Name, 
+                    PRSDesktop.Resources.edit, 
+                    row =>
                     {
-                        if(ScriptDocument.RunCustomModule(model, new Dictionary<string, object[]>(), module.Script))
+                        try
                         {
-                            Refresh(true, true);
+                            if(ScriptDocument.RunCustomModule(model, new Dictionary<string, object[]>(), module.Script))
+                            {
+                                Refresh(false, true);
+                            }
                         }
-                    }
-                    catch(CompileException c)
+                        catch(CompileException c)
+                        {
+                            MessageBox.Show(c.Message);
+                        }
+                        catch(Exception e)
+                        {
+                            MessageBox.Show(CoreUtils.FormatException(e));
+                        }
+                    },
+                    null,
+                    row.Get<DigitalFormDockModel, DateTime>(x => x.Processed).IsEmpty()
+                );
+            }
+
+            
+            if (modules.Any())
+                column.AddSeparator();
+            
+            if (row.Get<DigitalFormDockModel, DateTime>(x => x.Processed).IsEmpty())
+            {
+                column.AddItem(
+                    "Mark As Processed",
+                    PRSDesktop.Resources.lock_sml,
+                    (row) =>
                     {
-                        MessageBox.Show(c.Message);
+                        var form = Activator.CreateInstance(formType) as IDigitalFormInstance;
+                        form.ID = row.Get<DigitalFormDockModel, Guid>(x => x.ID);
+                        form.FormProcessed = row.Get<DigitalFormDockModel, DateTime>(x => x.Processed);
+                        form.CommitChanges();
+                        form.FormProcessed = DateTime.Now;
+                        using (new WaitCursor())
+                        {
+                            ClientFactory.CreateClient(formType).Save(form, "Marked As Processed");
+                            Refresh(false, true);
+                        }
                     }
-                    catch(Exception e)
+                );
+            }
+            else
+            {
+                column.AddItem(
+                    "Clear Processed Flag",
+                    PRSDesktop.Resources.lock_sml,
+                    (row) =>
                     {
-                        MessageBox.Show(CoreUtils.FormatException(e));
+                        var form = Activator.CreateInstance(formType) as IDigitalFormInstance;
+                        form.ID = row.Get<DigitalFormDockModel, Guid>(x => x.ID);
+                        form.FormProcessed = row.Get<DigitalFormDockModel, DateTime>(x => x.Processed);
+                        form.CommitChanges();
+                        form.FormProcessed = DateTime.MinValue;
+                        using (new WaitCursor())
+                        {
+                            ClientFactory.CreateClient(formType).Save(form, "Processed Flag Cleared");
+                            Refresh(false, true);
+                        }
                     }
-                });
+                );
             }
+
+
             if (Security.IsAllowed<CanCustomiseModules>())
             {
                 column.AddSeparator();
@@ -207,8 +276,8 @@ namespace PRSDesktop
             foreach (var type in _types.Where(x => !ExcludedTypes.Contains(x)))
             {
 
-                var filter = Filter.Create<IDigitalFormInstance>(type, x => x.FormCompleted)
-                    .IsGreaterThanOrEqualTo(StartDate);
+                var filter = Filter.Create<IDigitalFormInstance>(type, x => x.FormCompleted).IsGreaterThanOrEqualTo(StartDate)
+                    .And<IDigitalFormInstance>(x=>x.FormCancelled).IsEqualTo(DateTime.MinValue);
 
                 var cols = Columns.Create<IDigitalFormInstance>(type)
                     .Add<IDigitalFormInstance>(c => c.ID)
@@ -216,7 +285,8 @@ namespace PRSDesktop
                     .Add<IDigitalFormInstance>(c => c.Number)
                     .Add<IDigitalFormInstance>(c => c.Form.Description)
                     .Add<IDigitalFormInstance>(c => c.FormCompleted)
-                    .Add<IDigitalFormInstance>(c => c.FormCompletedBy.UserID);
+                    .Add<IDigitalFormInstance>(c => c.FormCompletedBy.UserID)
+                    .Add<IDigitalFormInstance>(c => c.FormProcessed);
 
                 var sorts = SortOrder.Create<IDigitalFormInstance>(type, x => x.FormCompleted, SortDirection.Descending);
 

+ 1 - 1
prs.desktop/prsdesktop.iss

@@ -5,7 +5,7 @@
 #pragma verboselevel 9
 
 #define MyAppName "PRS Desktop"
-#define MyAppVersion "7.36a"
+#define MyAppVersion "7.37"
 #define MyAppPublisher "PRS Digital"
 #define MyAppURL "https://www.prs-software.com.au"
 #define MyAppExeName "PRSDesktop.exe"

+ 52 - 3
prs.shared/Database Update Scripts/Update_7_37.cs

@@ -1,7 +1,6 @@
 using Comal.Classes;
 using InABox.Core;
 using InABox.Database;
-using NPOI.SS.Formula.Functions;
 
 namespace PRS.Shared;
 
@@ -10,6 +9,57 @@ public class Update_7_37 : DatabaseUpdateScript
     public override VersionNumber Version => new VersionNumber(7, 37);
     
     public override bool Update()
+    {
+        UpdateDigitalFormFlags();
+        UpdateJobLeads();
+        return true;
+    }
+
+    private void UpdateDigitalFormFlags()
+    {
+        
+        // Find all classes that derive from EntityForm
+        var formtypes = CoreUtils.TypeList(
+            new[]
+            {
+                typeof(Setout).Assembly
+            },
+            myType =>
+                myType is { IsClass: true, IsAbstract: false, IsGenericType: false } 
+                && myType.IsSubclassOf(typeof(Entity)) 
+                && myType.GetInterfaces().Contains(typeof(IEntityForm))
+        ).ToArray();
+
+        foreach (var formtype in formtypes)
+        {
+            var filter = Filter.Create(formtype, "Processed").IsEqualTo(true)
+                .And("FormProcessed").IsEqualTo(DateTime.MinValue);
+            var columns = Columns.Create(formtype)
+                .Add("ID")
+                .Add("Processed")
+                .Add("FormProcessed")
+                .Add("LastUpdate");
+            var forms = DbFactory.Provider.Query(formtype, filter, columns)
+                .Rows
+                .Select(r => r.ToObject(formtype))
+                .OfType<Entity>()
+                .ToArray();
+
+            if (!forms.Any())
+                continue;
+            
+            foreach (var form in forms)
+            {
+                var lastupdate = CoreUtils.GetPropertyValue(form, "LastUpdate");
+                CoreUtils.SetPropertyValue(form,"FormProcessed", lastupdate);
+                CoreUtils.SetPropertyValue(form,"Processed", false);
+            }
+            DbFactory.Provider.Save(formtype, forms);
+            Logger.Send(LogType.Information, "", $"{forms.Length} {formtype.Name}s processed");
+        }
+    }
+
+    private static void UpdateJobLeads()
     {
         List<Job> jobs;
         IColumns columns = new Columns<Job>(x => x.ID)
@@ -21,7 +71,7 @@ public class Update_7_37 : DatabaseUpdateScript
             typeof(Job),
             null,
             columns
-            ).ToObjects<Job>().ToList();
+        ).ToObjects<Job>().ToList();
         foreach (var item in jobs)
         {
             item.ProjectLead.ID = CoreUtils.GetPropertyValue(item, "ManagerLink.ID") is Guid _mgr ? _mgr : Guid.Empty;
@@ -34,6 +84,5 @@ public class Update_7_37 : DatabaseUpdateScript
         if (updates.Any())
             DbFactory.Provider.Save(updates);
         Logger.Send(LogType.Information, "", $"{jobs.Count} {typeof(Job).Name}s processed");
-        return true;
     }
 }