Browse Source

Added Digital forms functionality to Design Management

frogsoftware 4 days ago
parent
commit
afc555e052

+ 3 - 0
prs.classes/ComalUtils.cs

@@ -30,6 +30,9 @@ namespace Comal.Classes
             LookupFactory.RegisterChildGenerator<TimeSheet, DigitalForm, DigitalFormTimeSheetLookup>();
             LookupFactory.RegisterLookupGenerator<TimeSheetForm, DigitalForm, DigitalFormLink, DigitalFormTimeSheetFormLookup>(x => x.Form);
             LookupFactory.RegisterLookupGenerator<CostSheet, DigitalForm, DigitalFormLink, DigitalFormCostSheetLookup>(x => x.Form);
+            
+            LookupFactory.RegisterChildGenerator<StagingSetout, DigitalForm, DigitalFormStagingSetoutLookup>();
+            LookupFactory.RegisterLookupGenerator<StagingSetoutForm, DigitalForm, DigitalFormLink, DigitalFormStagingSetoutFormLookup>(x => x.Form);
 
             //LicenseUtils.Reset();
 

+ 1 - 0
prs.classes/Entities/DigitalFormInstance/DigitalFormInstance.cs

@@ -15,6 +15,7 @@ namespace Comal.Classes
             AddTable<JobForm>();
             AddTable<LeaveRequestForm>();
             AddTable<PurchaseOrderItemForm>();
+            AddTable<StagingSetoutForm>();
             AddTable<TimeSheetForm>();
             AddTable<QuoteCostSheet>();
         }

+ 39 - 0
prs.classes/Entities/Staging/Setout/StagingSetout.cs

@@ -6,6 +6,36 @@ using System.Text;
 
 namespace Comal.Classes
 {
+    
+    public class StagingSetoutFormsAggregate : CoreAggregate<StagingSetout, StagingSetoutForm, Guid>
+    {
+        public override Expression<Func<StagingSetoutForm, Guid>> Aggregate => x => x.ID;
+
+        public override AggregateCalculation Calculation => AggregateCalculation.Count;
+
+        public override Dictionary<Expression<Func<StagingSetoutForm, object>>, Expression<Func<StagingSetout, object>>> Links =>
+            new Dictionary<Expression<Func<StagingSetoutForm, object>>, Expression<Func<StagingSetout, object>>>()
+            {
+                { form => form.Parent.ID, setout => setout.ID }
+            };
+    }
+    
+    public class StagingSetoutOpenFormsAggregate : CoreAggregate<StagingSetout, StagingSetoutForm, Guid>
+    {
+        public override Expression<Func<StagingSetoutForm, Guid>> Aggregate => x => x.ID;
+
+        public override AggregateCalculation Calculation => AggregateCalculation.Count;
+        
+        public override Filter<StagingSetoutForm>? Filter => 
+            new Filter<StagingSetoutForm>(x => x.FormCompleted).IsEqualTo(DateTime.MinValue);
+
+        public override Dictionary<Expression<Func<StagingSetoutForm, object>>, Expression<Func<StagingSetout, object>>> Links =>
+            new Dictionary<Expression<Func<StagingSetoutForm, object>>, Expression<Func<StagingSetout, object>>>()
+            {
+                { form => form.Parent.ID, setout => setout.ID }
+            };
+    }
+    
     public class StagingSetoutPacketsAggregate : CoreAggregate<StagingSetout, StagingManufacturingPacket, Guid>
     {
         public override Expression<Func<StagingManufacturingPacket, Guid>> Aggregate => x => x.ID;
@@ -105,6 +135,15 @@ namespace Comal.Classes
 
         [NullEditor]
         public KanbanLink Task { get; set; }
+        
+        
+        [NullEditor]
+        [Aggregate(typeof(StagingSetoutFormsAggregate))]
+        public int Forms { get; set; }
+        
+        [NullEditor]
+        [Aggregate(typeof(StagingSetoutOpenFormsAggregate))]
+        public int OpenForms { get; set; }
        
         private class JobScopeLookup : LookupDefinitionGenerator<JobScope, StagingSetout>
         {

+ 17 - 0
prs.classes/Entities/Staging/Setout/StagingSetoutForm.cs

@@ -0,0 +1,17 @@
+using InABox.Core;
+
+namespace Comal.Classes
+{
+    [Caption("Digital Forms")]
+    [UserTracking("Digital Forms")]
+    public class StagingSetoutForm : MovableEntityForm<StagingSetout, StagingSetoutLink, StagingSetoutForm>, IDigitalForm<StagingSetout>
+    {
+        
+        [EditorSequence(998)]
+        [EntityRelationship(DeleteAction.Cascade)]
+        public override StagingSetoutLink Parent { get; }
+        
+        public override string AutoIncrementPrefix() => "SM";
+    }
+    
+}

+ 30 - 0
prs.classes/Entities/Staging/Setout/StagingSetoutFormLookups.cs

@@ -0,0 +1,30 @@
+using System;
+using System.Linq;
+using InABox.Core;
+
+namespace Comal.Classes
+{
+    public class StagingSetoutFormLookups : DigitalFormInstanceLookups<StagingSetout,StagingSetoutLink,StagingSetoutForm> { }
+
+    public class DigitalFormStagingSetoutLookup : LookupDefinitionGenerator<DigitalForm, StagingSetout>
+    {
+        public override Filter<DigitalForm> DefineFilter(StagingSetout[] items)
+        {
+            return new Filter<DigitalForm>(x => x.Active).IsEqualTo(true).And(x => x.AppliesTo).IsEqualTo("StagingSetout");
+        }
+
+        public override Columns<StagingSetout> DefineFilterColumns()
+            => Columns.None<StagingSetout>();
+    }
+    
+    public class DigitalFormStagingSetoutFormLookup : LookupDefinitionGenerator<DigitalForm, StagingSetoutForm>
+    {
+        public override Filter<DigitalForm> DefineFilter(StagingSetoutForm[] items)
+        {
+            return new Filter<DigitalForm>(x => x.Active).IsEqualTo(true).And(x => x.AppliesTo).IsEqualTo("StagingSetout");
+        }
+
+        public override Columns<StagingSetoutForm> DefineFilterColumns()
+            => Columns.None<StagingSetoutForm>().Add(x => x.Parent.ID);
+    }
+}

+ 53 - 2
prs.desktop/Panels/Staging/Setouts/StagingSetoutGrid.cs

@@ -105,7 +105,8 @@ public class StagingSetoutGrid : DynamicDataGrid<StagingSetout>
     private readonly BitmapImage packets = PRSDesktop.Resources.factory.AsBitmapImage();
     private readonly BitmapImage tick = PRSDesktop.Resources.tick.AsBitmapImage();
     private readonly BitmapImage warning = PRSDesktop.Resources.warning.AsBitmapImage();
-    private readonly BitmapImage rejected = PRSDesktop.Resources.disabled.AsBitmapImage();
+    private readonly BitmapImage rejected = PRSDesktop.Resources.disabled.AsBitmapImage();    
+    private readonly BitmapImage forms = PRSDesktop.Resources.quality.AsBitmapImage();
 
     private Button CopyPacketsButton;
     private Button PastePacketsButton;
@@ -128,7 +129,9 @@ public class StagingSetoutGrid : DynamicDataGrid<StagingSetout>
         HiddenColumns.Add(x => x.UnapprovedDocuments);
         HiddenColumns.Add(x => x.UnprocessedPackets);
         HiddenColumns.Add(x => x.Task.ID);
-
+        HiddenColumns.Add(x => x.Forms);
+        HiddenColumns.Add(x=>x.OpenForms);
+        
         ActionColumns.Add(new DynamicTickColumn<StagingSetout, Guid>(x => x.Setout.ID, revision, revision, null)
         {
             ToolTip = Revision_Tooltip,
@@ -140,6 +143,12 @@ public class StagingSetoutGrid : DynamicDataGrid<StagingSetout>
             ToolTip = Locked_Tooltip,
             Position = DynamicActionColumnPosition.End
         });
+        
+        ActionColumns.Add(new DynamicImageColumn(FormsImage)
+        {
+            ToolTip = Forms_Tooltip,
+            Position = DynamicActionColumnPosition.End
+        });
 
         ActionColumns.Add(new DynamicImageColumn(DesignImage)
         {
@@ -358,6 +367,8 @@ public class StagingSetoutGrid : DynamicDataGrid<StagingSetout>
         return false;
     }
 
+    
+    
     private void Menu_Build(DynamicMenuColumn column, CoreRow? row)
     {
         if (row is null)
@@ -366,6 +377,17 @@ public class StagingSetoutGrid : DynamicDataGrid<StagingSetout>
         }
 
         column.AddItem("Import Components", PRSDesktop.Resources.doc_xls, ImportComponents);
+        column.AddSeparator();
+        Guid designID = row.Get<StagingSetout, Guid>(x => x.ID);
+        var formsItem = column.AddItem("Digital Forms", PRSDesktop.Resources.quality, null);
+        DynamicGridUtils.PopulateFormMenu<StagingSetoutForm, StagingSetout, StagingSetoutLink>(
+            formsItem,
+            designID,
+            () => new Client<StagingSetout>().Query(
+                new Filter<StagingSetout>(x => x.ID).IsEqualTo(designID),
+                Columns.Required<StagingSetout>()).ToObjects<StagingSetout>()
+            .FirstOrDefault() ?? new StagingSetout()
+        );
     }
 
     private void ImportComponents(CoreRow? row)
@@ -411,6 +433,35 @@ public class StagingSetoutGrid : DynamicDataGrid<StagingSetout>
         return null;
     }
 
+    
+    
+    private BitmapImage? FormsImage(CoreRow? arg)
+    {
+        if (arg is null)
+            return forms;
+        if (arg.Get<StagingSetout, int>(x => x.Forms) == 0)
+            return null;
+        if (arg.Get<StagingSetout, int>(x => x.OpenForms) == 0)
+            return tick;
+        return warning;
+    }
+    
+    private FrameworkElement? Forms_Tooltip(DynamicActionColumn column, CoreRow? row)
+    {
+        if (row is null)
+            return column.TextToolTip("Are there Open Digital Forms?");
+
+        var openforms = row.Get<StagingSetout, int>(x => x.OpenForms);
+        if (openforms != 0)
+            return column.TextToolTip("There are open forms!");
+
+        var allforms = row.Get<StagingSetout, int>(x => x.Forms);
+        if (allforms != 0)
+            return column.TextToolTip("All forms have been completed!");
+
+        return column.TextToolTip($"There are no forms for this design.");
+    }
+    
     private BitmapImage? DesignImage(CoreRow? arg)
     {
         if (arg is null)

+ 18 - 9
prs.desktop/Panels/Staging/StagingPanel.xaml.cs

@@ -263,16 +263,25 @@ public partial class StagingPanel : UserControl, IPanel<StagingSetout>
 
     private List<byte[]> GetDocuments(StagingSetoutDocument? document)
     {
-        if(document is null)
-            return new List<byte[]>();
-        var table = new Client<Document>().Query(
-            new Filter<Document>(x => x.ID).IsEqualTo(document.DocumentLink.ID),
-            Columns.None<Document>().Add(x => x.Data));
-        var first = table.Rows.FirstOrDefault();
-        if (first is null)
+        try
+        {
+            if(document is null)
+                return new List<byte[]>();
+            var table = new Client<Document>().Query(
+                new Filter<Document>(x => x.ID).IsEqualTo(document.DocumentLink.ID),
+                Columns.None<Document>().Add(x => x.Data));
+            var first = table.Rows.FirstOrDefault();
+            if (first is null)
+                return new List<byte[]>();
+            _documentdata = first.Get<Document, byte[]>(x => x.Data);
+            return ImageUtils.RenderPDFToImageBytes(_documentdata);
+        }
+        catch (Exception e)
+        {
+            Logger.Send(LogType.Error, "", $"{e.Message}\n{e.StackTrace}");
             return new List<byte[]>();
-        _documentdata = first.Get<Document, byte[]>(x => x.Data);
-        return ImageUtils.RenderPDFToImageBytes(_documentdata);
+        }
+        
     }
     
     private void RenderDocuments(List<byte[]>? documents)