Browse Source

Fixed Broken Barcoide generation due to missing SetoutLink data in Manufacturing Packet
Set hardcoded "OptimiseData" flag to Manufacturing Packet Barcode Reports
Fixed some issues with Quote Diagrams
Fixed an issue when upgrading pre-7.56 databases to current

frogsoftware 2 days ago
parent
commit
2972717669

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

@@ -93,6 +93,7 @@ namespace Comal.Classes
 
         public RequisitionLink RequisitionLink { get; set; }
 
+        [RequiredColumn]
         public SetoutLink SetoutLink { get; set; }
 
         public ShipmentLink ShipmentLink { get; set; }

+ 1 - 0
prs.classes/Entities/Manufacturing/ManufacturingPacket/ManufacturingPacket.cs

@@ -92,6 +92,7 @@ namespace Comal.Classes
         [LookupDefinition(typeof(SetoutLookup))]
         [EditorSequence(3)]
         [EntityRelationship(DeleteAction.Cascade)]
+        [RequiredColumn]
         public SetoutLink SetoutLink { get; set; }
 
         private class JobITPLookup : LookupDefinitionGenerator<JobITP, ManufacturingPacket>

+ 2 - 0
prs.classes/Entities/Quote/QuoteDiagram/QuoteDiagramArea.cs

@@ -11,5 +11,7 @@ namespace Comal.Classes
         [ColorEditor]
         [EditorSequence(11)]
         public string LineColor { get; set; } = "#000000";
+        
+        public QuoteTakeOffUnitLink TakeoffUnit { get; set; }
     }
 }

+ 1 - 0
prs.classes/Entities/Setout/SetoutLink.cs

@@ -11,6 +11,7 @@ namespace Comal.Classes
         public override Guid ID { get; set; }
 
         [TextBoxEditor(Editable = Editable.Hidden)]
+        [RequiredColumn]
         public string Number { get; set; }
 
         [TextBoxEditor(Editable = Editable.Hidden)]

+ 4 - 1
prs.desktop/Panels/Manufacturing/ManufacturingPanelColumn.xaml.cs

@@ -1231,6 +1231,7 @@ namespace PRSDesktop
                 return;
             }
 
+            report.OptimiseData = true;
             ReportUtils.PreviewReport(report, datamodel, false, Security.IsAllowed<CanDesignReports>());
         }
 
@@ -1253,7 +1254,9 @@ namespace PRSDesktop
             foreach (var packet in pkts)
                 pktflt = pktflt == null ? new Filter<ManufacturingPacket>(x => x.ID).IsEqualTo(packet.ID) : pktflt.Or(x => x.ID).IsEqualTo(packet.ID);
 
-            pkts = new Client<ManufacturingPacket>().Load(pktflt);
+            pkts = new Client<ManufacturingPacket>()
+                .Query(pktflt,new Columns<ManufacturingPacket>(ColumnTypeFlags.Local | ColumnTypeFlags.Required))
+                .ToArray<ManufacturingPacket>();
 
             for (var i = 0; i < pkts.Length; i++)
             {

+ 3 - 3
prs.desktop/Panels/Quotes/Diagrams/QuoteDiagramControl.xaml

@@ -9,7 +9,7 @@
              xmlns:stencil="clr-namespace:Syncfusion.UI.Xaml.Diagram.Stencil;assembly=Syncfusion.SfDiagram.WPF"
              xmlns:dynamicGrid="clr-namespace:InABox.DynamicGrid;assembly=InABox.Wpf"
              mc:Ignorable="d"
-             d:DesignHeight="450" d:DesignWidth="800" Background="Black">
+             d:DesignHeight="450" d:DesignWidth="800" Background="White">
     <UserControl.Resources>
 
         <ResourceDictionary>
@@ -166,7 +166,7 @@
             <RowDefinition Height="Auto" />
             <RowDefinition Height="*" />
         </Grid.RowDefinitions>
-        <dynamicGrid:DynamicTabControl x:Name="Stencils" TabStripPlacement="Bottom" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2">
+        <dynamicGrid:DynamicTabControl x:Name="Stencils" TabStripPlacement="Bottom" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" >
 
             <dynamicGrid:DynamicTabItem Header="Areas" Padding="5,2">
                 <stencil:Stencil
@@ -276,7 +276,7 @@
                 <syncfusion:Ruler Orientation="Vertical" />
             </local:CustomDiagram.VerticalRuler>
             <local:CustomDiagram.ScrollSettings>
-                <syncfusion:ScrollSettings ScrollLimit="Diagram" />
+                <syncfusion:ScrollSettings ScrollLimit="Diagram" ScrollableArea="0,0,21.0,29.7" />
             </local:CustomDiagram.ScrollSettings>
         </local:CustomDiagram>
 

+ 49 - 20
prs.desktop/Panels/Quotes/Diagrams/QuoteDiagramControl.xaml.cs

@@ -14,6 +14,7 @@ using InABox.Core;
 using InABox.DynamicGrid;
 using InABox.Wpf;
 using InABox.WPF;
+using NPOI.OpenXmlFormats.Spreadsheet;
 using Syncfusion.UI.Xaml.Diagram;
 using Syncfusion.UI.Xaml.Diagram.Stencil;
 
@@ -117,6 +118,21 @@ namespace PRSDesktop
                 symbol.ContentTemplate = cache.ContentTemplate;
             }
         }
+        
+        // private void LoadConnecterContent(QuoteDiagramConnectorModel connector, string? toString)
+        // {
+        //     var cache = QuoteDiagramSymbolCache.Symbols.FirstOrDefault(x => Equals(x.ID, connector.Key));
+        //     if (connector != null)
+        //     {
+        //         connector.Key = cache.ID;
+        //         //connector.ContentTemplate = cache.ContentTemplate;
+        //     }
+        // }
+
+        private void LoadScalerContent(QuoteDiagramScalerModel scaler)
+        {
+            scaler.ContentTemplate = QuoteDiagramSymbolCache.ScalerTemplate();
+        }
 
         private static void LoadConnectorContent(QuoteDiagramConnectorModel connector, string id)
         {
@@ -166,10 +182,14 @@ namespace PRSDesktop
                     }
 
                     foreach (var node in nodes)
-                        if (node is QuoteDiagramSymbolModel)
-                            LoadSymbolContent(node as QuoteDiagramSymbolModel, node.Key.ToString());
-                        else if (node is QuoteDiagramAreaModel)
-                            LoadAreaContent(node as QuoteDiagramAreaModel, node.Key.ToString());
+                        if (node is QuoteDiagramSymbolModel symbol)
+                            LoadSymbolContent(symbol, node.Key.ToString());
+                        else if (node is QuoteDiagramAreaModel area)
+                            LoadAreaContent(area, node.Key.ToString());
+                        else if (node is QuoteDiagramScalerModel scaler)
+                            LoadScalerContent(scaler);
+                        //else if (node is QuoteDiagramConnectorModel connector)
+                        //    LoadConnecterContent(connector, node.Key.ToString()); 
                 }
                 catch (Exception e)
                 {
@@ -177,7 +197,7 @@ namespace PRSDesktop
                 }
             }
         }
-
+        
         private void LoadDiagram()
         {
             (diagram.Info as IGraphInfo).ItemAdded -= ItemAddedEvent;
@@ -222,7 +242,7 @@ namespace PRSDesktop
             if (scaler != null)
             {
                 var pixelwidth = scaler.UnitWidth;
-                var sText = (scaler.Annotations as AnnotationCollection).FirstOrDefault()?.Content as string;
+                var sText = (scaler.Annotations as AnnotationCollection)?.FirstOrDefault()?.Content as string;
                 if (double.TryParse(sText, out var measured))
                     result = Math.Round(measured / (scaler.UnitWidth * 10.0F));
             }
@@ -233,16 +253,21 @@ namespace PRSDesktop
         private void CheckScalers()
         {
             ScaleBox.Text = string.Format("1:{0:F2}", GetDiagramScale());
-            ScaleButton.IsEnabled = !(diagram.Nodes as NodeCollection).OfType<QuoteDiagramScalerModel>().Any();
+            ScaleButton.IsEnabled = (diagram.Nodes as NodeCollection)?.OfType<QuoteDiagramScalerModel>().Any() != true;
         }
 
         private void ScaleButton_Click(object sender, RoutedEventArgs e)
         {
             var scaler = QuoteDiagramSymbolCache.CreateScaler();
-            scaler.OffsetX = 100;
-            scaler.OffsetY = 100;
-            (diagram.Nodes as NodeCollection).Add(scaler);
+            scaler.OffsetX = 5.0;
+            scaler.OffsetY = 1.0;
+            scaler.UnitHeight = 0.1;
+            scaler.UnitWidth = 0.5;
+            scaler.ContentTemplate = QuoteDiagramSymbolCache.ScalerTemplate();
+            if (diagram.Nodes is NodeCollection nodes)
+                nodes.Add(scaler);
             CheckScalers();
+            SaveDiagram();
         }
 
 
@@ -276,18 +301,21 @@ namespace PRSDesktop
             {
                 _disablesave = true;
 
-                var node = args.Item as NodeViewModel;
-                if (node != null)
+                if ((sender as CustomDiagram)?.Nodes is not NodeCollection nodes)
+                    return;
+                
+                if (args.Item is NodeViewModel node)
                 {
                     if (node is QuoteDiagramScalerModel)
+                        node.ContentTemplate = QuoteDiagramSymbolCache.ScalerTemplate();
+                    else if (args.OriginalSource is NodeViewModel _item)
                     {
-                        node.ContentTemplate = QuoteDiagramSymbolCache.Scalers.FirstOrDefault()?.ContentTemplate;
-                    }
-                    else
-                    {
-                        node.Key = (args.OriginalSource as NodeViewModel).ID;
-                        node.Content = (args.OriginalSource as NodeViewModel).Content;
-                        node.ContentTemplate = (args.OriginalSource as NodeViewModel).ContentTemplate;
+                        node.Key = _item.ID;
+                        node.Content = _item.Content;
+                        node.ContentTemplate = _item.ContentTemplate;
+                        var _others = nodes.Where(x => string.Equals(x.Key, node.Key)).ToArray();
+                        if ((node.Annotations as AnnotationCollection)?.FirstOrDefault() is AnnotationEditorViewModel _annotation)
+                            _annotation.Content = $"{_others.Length + 1}";
                     }
 
                     //    LoadSymbolContent(node, x => String.Equals((args.OriginalSource as NodeViewModel).ID.ToString(), x.ID));
@@ -375,7 +403,7 @@ namespace PRSDesktop
                 {
                     var header = new QuoteCostSheetItem();
                     header.Type = QuoteCostSheetItemLineType.Header;
-                    header.Description = symbol.Name;
+                    header.Description = $"{symbol.Name} {(symbol.Annotations as AnnotationCollection)?.FirstOrDefault()?.Content}".Trim();
                     header.CostSheet.ID = costsheet.ID;
                     header.Sequence = i++;
                     updates.Add(header);
@@ -392,6 +420,7 @@ namespace PRSDesktop
                             item.Product.Synchronise(kititem.Product);
                             item.Description = item.Product.Name;
                             item.CostSheet.ID = costsheet.ID;
+                            item.Qty = kititem.Multiplier;
                             item.Sequence = i++;
                             updates.Add(item);
                         }

+ 23 - 11
prs.desktop/Panels/Quotes/Diagrams/QuoteDiagramSymbolCache.cs

@@ -5,6 +5,7 @@ using System.Drawing.Imaging;
 using System.IO;
 using System.Linq;
 using System.Windows;
+using System.Windows.Controls;
 using System.Windows.Media;
 using System.Windows.Shapes;
 using Comal.Classes;
@@ -26,6 +27,7 @@ namespace PRSDesktop
 
     public class QuoteDiagramAreaModel : NodeViewModel
     {
+        public Guid TakeoffUnitID { get; set; }
     }
 
     public class QuoteDiagramConnectorModel : ConnectorViewModel
@@ -162,6 +164,7 @@ namespace PRSDesktop
                 {
                     new AnnotationEditorViewModel
                     {
+                        FontSize = 8.0,
                         Content = row.Get<QuoteDiagramSymbol, string>(x => x.Caption)
                     }
                 };
@@ -187,6 +190,7 @@ namespace PRSDesktop
         private static QuoteDiagramAreaModel CreateArea(CoreRow row)
         {
             var result = CreateModel<QuoteDiagramAreaModel, QuoteDiagramArea>(row);
+            //result.Un
             result.UnitHeight = row.Get<QuoteDiagramArea, int>(x => x.Length) / 100F;
             result.UnitWidth = row.Get<QuoteDiagramArea, int>(x => x.Width) / 100F;
             result.ContentTemplate = TemplateGenerator.CreateDataTemplate(() =>
@@ -206,6 +210,7 @@ namespace PRSDesktop
             {
                 new AnnotationEditorViewModel
                 {
+                    FontSize = 8.0,
                     Content = row.Get<QuoteDiagramArea, string>(x => x.Caption)
                 }
             };
@@ -259,17 +264,7 @@ namespace PRSDesktop
             result.UnitHeight = 10F;
             result.UnitWidth = 100F;
 
-            result.ContentTemplate = TemplateGenerator.CreateDataTemplate(() =>
-            {
-                var svg = new Path();
-                svg.Data = svg.Data =
-                    Geometry.Parse(
-                        "M 000 000 L 000 100 M 050 025 L 000 050 L 050 075 M 000 050 L 400 050 L 400 075 L 600 075 L 600 025 L 400 025 L 400 050 M 600 050 L 1000 050 M 1000 000 L 1000 100 M 950 25 L 1000 050 L 950 075");
-                svg.Stretch = Stretch.Fill;
-                svg.Stroke = new SolidColorBrush(Colors.Firebrick);
-                svg.StrokeThickness = 1.0F;
-                return svg;
-            });
+            result.ContentTemplate = ScalerTemplate();
 
             result.Constraints = NodeConstraints.AllowDrop | NodeConstraints.ResizeWest | NodeConstraints.ResizeEast | NodeConstraints.Draggable |
                                  NodeConstraints.Selectable | NodeConstraints.Rotatable | NodeConstraints.Delete;
@@ -278,6 +273,7 @@ namespace PRSDesktop
             {
                 new AnnotationEditorViewModel
                 {
+                    FontSize = 8.0,
                     Content = "1000"
                 }
             };
@@ -285,6 +281,21 @@ namespace PRSDesktop
             return result;
         }
 
+        public static DataTemplate ScalerTemplate()
+        {
+            return TemplateGenerator.CreateDataTemplate(() =>
+            {
+                var svg = new Path();
+                svg.Data = Geometry.Parse(
+                    "M 000 000 L 000 100 M 000 050 L 300 050 L 300 080 L 700 080 L 700 020 L 300 020 L 300 050 M 700 050 L 1000 050 M 1000 000 L 1000 100"
+                );
+                svg.Stretch = Stretch.Fill;
+                svg.Stroke = new SolidColorBrush(Colors.Firebrick);
+                svg.StrokeThickness = 1.0F;
+                return svg;
+            });
+        }
+
         private static void CheckCache()
         {
             if (_symbols == null)
@@ -327,6 +338,7 @@ namespace PRSDesktop
             _documents = null;
             _symbols = null;
             _resources = null;
+            CheckCache();
         }
     }
 }

+ 3 - 3
prs.desktop/Panels/Quotes/Diagrams/QuoteDiagrams.xaml

@@ -17,13 +17,13 @@
                         <DockPanel LastChildFill="True">
 
                             <Button DockPanel.Dock="Left" Width="30" BorderBrush="Gray" Padding="1"
-                                    BorderThickness="0.75" Background="Silver" Margin="0,2,0,0"
+                                    BorderThickness="0.75" Background="White" Margin="0,2,0,0"
                                     Click="AddDiagram_Click">
                                 <Image Source="pack://application:,,,/InABox.Wpf;component/Resources/add.png" Margin="2" />
                             </Button>
 
                             <Button DockPanel.Dock="Right" Width="30" BorderBrush="Gray" Padding="1"
-                                    BorderThickness="0.75" Background="Silver" Margin="0,2,0,0"
+                                    BorderThickness="0.75" Background="White" Margin="0,2,0,0"
                                     Click="DeleteDiagram_Click">
                                 <Image Source="pack://application:,,,/InABox.Wpf;component/Resources/delete.png" Margin="2" />
                             </Button>
@@ -118,7 +118,7 @@
         TabStripPlacement="Bottom"
         ShowTabItemContextMenu="False"
         FullScreenMode="None"
-        Background="Silver"
+        Background="White"
         TabPanelBackground="WhiteSmoke"
         CloseMode="Delete"
         AfterLabelEdit="AfterRenameTab"

+ 23 - 15
prs.shared/Database Update Scripts/Update_7_56.cs

@@ -73,26 +73,34 @@ internal class Update_7_56 : DatabaseUpdateScript
         if (movements.Rows.Count % 1000 != 0)
             Logger.Send(LogType.Information, "", $"Processed {movements.Rows.Count} movements / {allholdings.Count} holdings");
 
-        var nonempty = allholdings.Where(x => Math.Abs(x.Units) >= 0.000001F).ToList();
-        Logger.Send(LogType.Information, "", $"Saving {nonempty.Count} non-empty Stock Holdings");
-        var updates = new List<StockHolding>();
-        int i = 0;
-        while (i < nonempty.Count)
+        try
         {
-            updates.Add(nonempty[i]);
-            if (updates.Count == 1000)
+            var nonempty = allholdings.Where(x => Math.Abs(x.Units) >= 0.000001F).ToList();
+            Logger.Send(LogType.Information, "", $"Saving {nonempty.Count} non-empty Stock Holdings");
+            var updates = new List<StockHolding>();
+            int i = 0;
+            while (i < nonempty.Count)
             {
-                DbFactory.NewProvider(Logger.Main).Save(updates);
-                Logger.Send(LogType.Information, "", $"Saved {i+1}/{nonempty.Count} Stock Holdings");
-                updates.Clear();
+                updates.Add(nonempty[i]);
+                if (updates.Count == 1000)
+                {
+                    DbFactory.NewProvider(Logger.Main).Save(updates);
+                    Logger.Send(LogType.Information, "", $"Saved {i+1}/{nonempty.Count} Stock Holdings");
+                    updates.Clear();
+                }
+                i++;
             }
-            i++;
+            if (updates.Any())
+            {
+                DbFactory.NewProvider(Logger.Main).Save(updates);
+                Logger.Send(LogType.Information, "", $"Saved {nonempty.Count}/{nonempty.Count} Stock Holdings");
+            }             
         }
-        if (updates.Any())
+        catch (Exception e)
         {
-            DbFactory.NewProvider(Logger.Main).Save(updates);
-            Logger.Send(LogType.Information, "", $"Saved {nonempty.Count}/{nonempty.Count} Stock Holdings");
-        }  
+            Logger.Send(LogType.Error, "", e.Message);
+        }
+
 
         return true;
     }