Browse Source

Added Ability to convert Dimensions when Receiving PO's

frogsoftware 1 năm trước cách đây
mục cha
commit
17517936c9

+ 23 - 0
prs.classes/EnclosedEntities/Dimensions/DimensionUnit.cs

@@ -1,10 +1,12 @@
 using InABox.Core;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
 
 namespace Comal.Classes
 {
+    
     public abstract class DimensionUnit : Entity, IRemotable, IPersistent, ISequenceable, IDimensionUnit
     {
         
@@ -43,7 +45,28 @@ namespace Comal.Classes
         [ExpressionEditor(null, typeof(DimensionsExpressionModelGenerator))]
         [EditorSequence(9)]
         public virtual string Format { get; set; } = "\"EACH\"";
+        
+        
+        [ScriptEditor]
+        [EditorSequence(10)]
+        public virtual string Conversion { get; set; } = "";
+        
+        public static string ConvertDimensionsMethodName() => "ConvertDimensions";
 
+        public static string DefaultConvertDimensionsScript()
+        {
+            return
+                "using Comal.Classes;\n"+
+                "\n"+
+                "public class Module\n"+
+                "{\n"+
+                "    public void " + ConvertDimensionsMethodName() + "(PurchaseOrderItem item)\n"+
+                "    {\n"+
+        
+                "    }\n"+
+                "}\n";
+        }
+        
         [NullEditor]
         public long Sequence { get; set; }
 

+ 4 - 0
prs.classes/EnclosedEntities/Dimensions/DimensionUnitLink.cs

@@ -44,5 +44,9 @@ namespace Comal.Classes
         [RequiredColumn]
         public string Format { get; set; }
         
+        [NullEditor]
+        [RequiredColumn]
+        public virtual string Conversion { get; set; }
+        
     }
 }

+ 23 - 0
prs.desktop/Grids/ProductDimensionUnitGrid.cs

@@ -1,5 +1,7 @@
 using System.Collections.Generic;
+using System.Linq;
 using Comal.Classes;
+using InABox.Core;
 using InABox.DynamicGrid;
 
 namespace PRSDesktop.Grids
@@ -12,5 +14,26 @@ namespace PRSDesktop.Grids
             foreach (var item in items)
                 item.Validate(errors);
         }
+
+        protected override void CustomiseEditor(ProductDimensionUnit[] items, DynamicGridColumn column, BaseEditor editor)
+        {
+            base.CustomiseEditor(items, column, editor);
+            if (column.ColumnName == nameof(ProductDimensionUnit.Conversion) && editor is ScriptEditor scriptEditor)
+            {
+                scriptEditor.Type = ScriptEditorType.TemplateEditor;
+                scriptEditor.OnEditorClicked += () =>
+                {
+                    var script = items.FirstOrDefault()?.Conversion.NotWhiteSpaceOr()
+                                 ?? DimensionUnit.DefaultConvertDimensionsScript();
+
+                    var editor = new ScriptEditorWindow(script, SyntaxLanguage.CSharp);
+                    if (editor.ShowDialog() == true)
+                    {
+                        foreach (var item in items)
+                            SetEditorValue(item, column.ColumnName, editor.Script);
+                    }
+                };
+            }
+        }
     }
 }

+ 1 - 4
prs.shared/PRS.Shared.csproj

@@ -25,9 +25,6 @@
       <AutoGen>True</AutoGen>
       <DependentUpon>Resources.resx</DependentUpon>
     </Compile>
-    <Compile Include="..\prs.stores\StockHoldingStore.cs">
-      <Link>prs.stores\StockHoldingStore.cs</Link>
-    </Compile>
   </ItemGroup>
 
   <ItemGroup>
@@ -56,5 +53,5 @@
   </ItemGroup>
 
   <Import Project="..\prs.stores\PRSStores.projitems" Label="Shared" />
-
+  
 </Project>

+ 44 - 1
prs.stores/PurchaseOrderItemStore.cs

@@ -5,6 +5,8 @@ using Comal.Classes;
 using InABox.Core;
 using PRSStores;
 using System;
+using InABox.Database;
+using InABox.Scripting;
 using NPOI.SS.Formula.Functions;
 using Columns = InABox.Core.Columns;
 
@@ -13,6 +15,44 @@ namespace Comal.Stores;
 internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
 {
 
+    static PurchaseOrderItemStore()
+    {
+        RegisterListener<ProductDimensionUnit>(ReloadProductDimensionUnitCache);
+    }
+    
+    private static Dictionary<Guid, ScriptDocument>? _productdimensionunitcache = null;
+    
+    private static void ReloadProductDimensionUnitCache(Guid[]? ids)
+    {
+        if (_productdimensionunitcache == null)
+            _productdimensionunitcache = new Dictionary<Guid, ScriptDocument>();
+        
+        var scripts = DbFactory.Provider.Query(
+            ids != null
+                ? new Filter<ProductDimensionUnit>(x => x.ID).InList(ids)
+                : null,
+            Columns.None<ProductDimensionUnit>()
+                .Add(x => x.ID)
+                .Add(x => x.Conversion)
+        ).ToDictionary<ProductDimensionUnit, Guid, String>(x => x.ID, x => x.Conversion);
+        
+        foreach (var id in scripts.Keys)
+        {
+                var doc = !String.IsNullOrWhiteSpace(scripts[id]) ? new ScriptDocument(scripts[id]) : null;
+                if (doc?.Compile() == true)
+                    _productdimensionunitcache[id] = doc;
+                else
+                    _productdimensionunitcache.Remove(id);
+        }
+    }
+    
+    private void TransformDimensions(PurchaseOrderItem item)
+    {
+        if (_productdimensionunitcache == null)
+            ReloadProductDimensionUnitCache(null);
+        if (_productdimensionunitcache?.TryGetValue(item.Dimensions.Unit.ID, out ScriptDocument? script) == true)
+            script.Execute("Module",DimensionUnit.ConvertDimensionsMethodName(), [item]);
+    }
 
     private void UpdateStockMovements(PurchaseOrderItem entity)
     {
@@ -26,7 +66,7 @@ internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
         }
         FindSubStore<StockMovement>().Save(movements, "Updated by purchase order modification");
     }
-
+    
     private void CreateStockMovements(PurchaseOrderItem entity)
     {
         if (!entity.Product.IsValid())
@@ -216,6 +256,8 @@ internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
             Logger.Send(LogType.Information, UserID, "PurchaseOrderItem.Unit Size is zero!");
             entity.Dimensions.CopyFrom(productrow.ToObject<Product>().DefaultInstance.Dimensions);
         }
+        
+        TransformDimensions(entity);
 
         if (entity.Job.ID == Guid.Empty)
         {
@@ -297,6 +339,7 @@ internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
         }
         
         FindSubStore<StockMovement>().Save(movements, "Updated by Purchase Order Modification");
+        entity.CancelChanges();
     }
 
     private static void CreateMovement(PurchaseOrderItem entity, Guid locationid, List<StockMovement> movements, JobRequisitionItem jri, double qty, double cost)